@willbooster/wb 9.0.10 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import s,{spawn as o,spawnSync as i}from"node:child_process";import{createHash as a}from"node:crypto";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(e){const n=g.get(e);if(n)return n;const r=l({path:t.resolve(e),processEnv:{}}).parsed??{};return g.set(e,r),r}async function y(e,t,n){return new Promise((r,s)=>{try{const i=o(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),i.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(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"),s(e)}),i.on("close",(e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?s(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){s(e)}})}function
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import s,{spawn as o,spawnSync as i}from"node:child_process";import{createHash as a}from"node:crypto";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(e){const n=g.get(e);if(n)return n;const r=l({path:t.resolve(e),processEnv:{}}).parsed??{};return g.set(e,r),r}async function y(e,t,n){return new Promise((r,s)=>{try{const i=o(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),i.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(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"),s(e)}),i.on("close",(e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?s(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){s(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 $(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
|
|
2
2
|
/**
|
|
3
3
|
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
|
4
4
|
*
|
|
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
|
|
|
6
6
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
7
7
|
* @copyright Chen, Yi-Cyuan 2015-2023
|
|
8
8
|
* @license MIT
|
|
9
|
-
*/const k=[..."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+=k[s>>4&15]+k[15&s]+k[s>>12&15]+k[s>>8&15]+k[s>>20&15]+k[s>>16&15]+k[s>>28&15]+k[s>>24&15];i%e===0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=k[s>>4&15]+k[15&s],r>1&&(a+=k[s>>12&15]+k[s>>8&15]),r>2&&(a+=k[s>>20&15]+k[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,S,D,_,O,B,T,C,I,W,V,J,z,F,Y,L,U,M,G,q,H,K,X,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,S=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,L=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,K=e[23]<<10|e[22]>>>22,D=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,I=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,X=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,J=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,$=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,U=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,k=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&S,e[20]=T^~I&V,e[21]=C^~W&J,e[30]=U^~G&H,e[31]=M^~q&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&v,e[3]=b^~w&$,e[12]=P^~R&D,e[13]=j^~S&_,e[22]=I^~V&z,e[23]=W^~J&F,e[32]=G^~H&X,e[33]=q^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~v&k,e[5]=w^~$&E,e[14]=R^~D&O,e[15]=S^~_&B,e[24]=V^~z&Y,e[25]=J^~F&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=v^~k&f,e[7]=$^~E&h,e[16]=D^~O&A,e[17]=_^~B&x,e[26]=z^~Y&T,e[27]=F^~L&C,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=O^~A&P,e[19]=B^~x&j,e[28]=Y^~T&I,e[29]=L^~C&W,e[38]=Z^~U&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(D.decode(e))],create:([e])=>S.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)};return new Map([e,t,n,r,s,o,i].map(e=>[e.instance.name,e]))}(),S=new TextEncoder,D=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,s]of n.entries())t[r]=e(s)}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 C(e,t){return function(e){return new P(512,E,512).update(e).hex()}(_([e,t]))}const I=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=C}={}){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}}}({getCacheKey:C});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 k(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],$=!c,k=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(!$){var P={},j=[],R=E?"get":A||k?"set":"value";if(l?(u||k?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 S=e,D=g.length-1;D>=0;D-=n?2:1){var _=y(g[D],"A decorator","be",!0),O=n?g[D-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($)i=_.call(O,S,T),B.v=1,y(i,"class decorators","return")&&(S=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}),S=_.call(O,k?{get:P.get,set:P.set}:P[R],T),B.v=1,k){if("object"==typeof S&&S)(i=y(S.get,"accessor.get"))&&(P.get=i),(i=y(S.set,"accessor.set"))&&(P.set=i),(i=y(S.init,"accessor.init"))&&j.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(S,(u?"field":"method")+" decorators","return")&&(u?j.unshift(S):P[R]=S)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||$||(l?k?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[R]:y.call.bind(P[R])):m(e,r,P)),S}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;k(t?e:e.prototype,i,f,m?"#"+p:$(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=k(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[I,3,"isBunAvailable"],[I,3,"buildCommand"],[I,3,"rootDirPath"],[I,3,"dockerfile"],[I,3,"hasDockerfile"],[I,3,"hasSourceCode"],[I,3,"name"],[I,3,"dockerImageName"],[I,3,"env"],[I,3,"packageJson"],[I,3,"packageJsonPath"],[I,3,"hasPrisma"],[I,3,"hasVitest"],[I,3,"dockerPackageJson"],[I,3,"binExists"]]).e}argv=void W(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const o=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof o){if(0===s.length&&(s.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&s.push(t.join(n,".env"))}s=s.flatMap(e=>o?[`${e}.${o}.local`,`${e}.local`,`${e}.${o}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const i=[],a={};for(const e of s){let s=0;for(const[n,o]of Object.entries(b(t.join(r,e))))n in a||(a[n]=o,s++);i.push([e,s]),n.verbose&&s>0&&console.info(`Read ${s} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(b(t.join(r,n.checkEnv))||{}).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get hasVitest(){return!(!this.packageJson.dependencies?.vitest&&!this.packageJson.devDependencies?.vitest)}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function J(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new V(s,n,r)}async function z(n,r=!0,s){const o=function(n,r=!0,s){if(s??=process.cwd(),!e.existsSync(t.join(s,"package.json")))return;const o=new V(s,n,r);let i=o;if(!o.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const o=t.resolve(s,"..","..");e.existsSync(t.join(o,"package.json"))&&(i=new V(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await F(n,o.root,r):[o.self]}}async function F(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new V(r,n,s));return o}const Y=process.versions.bun||process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),L=Y?"bun --bun run":"node",U=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(n){await async function(n,r){const o=J(n,!0,r);if(!o)return console.error(c.red("No project found.")),!0;if(n={...n,command:n.command??(Y?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return q(o,n),!0;const[i,d,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const c=a("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!H.has(e)).sort(([e],[t])=>e.localeCompare(t)));c.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.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\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(K.some(t=>e.includes(t))||X.some(t=>e.endsWith(t)))&&!Q.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,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}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(c.green(`Skip to run '${n.command}' 💫`)),!1;if(!q(o,n))return;n.dryRun||await e.promises.writeFile(d,l,"utf8");return!0}(n)}};function q(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=s.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 K=["src/","public/"],X=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Q=["test/","tests/","__tests__/","test-fixtures/","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 ",Y?"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(e){Y||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await z(e,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=e.files??[];let s,o,i;if(r.length>0){const e=[],n=[],a=[];for(const s of r){const r=t.resolve(String(s));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):le.has(o)?e.push(r):ue.has(o)&&n.push(r)}s=e.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=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --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,e,{forceColor:!0})),e.format&&(o&&se(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await d,se(`bun --bun sort-package-json ${i}`,n.self,e,{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(n){const r=await z(n);r||(console.error(c.red("No project found.")),process.exit(1));for(const s of fe("optimizeForDockerBuild",r.descendants)){const r=s.packageJson,o=["dependencies","devDependencies"];for(const e of o){const t=r[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ge(n,r),be(r),ye(r),n.dryRun)continue;const i=n.outside?t.join(s.dirPath,"dist"):s.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(s.spawnSync(U,["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,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}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`${L} -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,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${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(n,r,s=""){const o="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${o}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(o)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:s,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${o}${t.resolve(n.dirPath,s,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${s?` ${s}`:""}`}},ve={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"]}},$e={},ke={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ee).command(Ne).command(xe).command(Pe).command(je).command(Re).command(Se).command(De).command(_e).command(Oe).demandCommand().strict(!1),handler(){}},Ee={command:"deploy",describe:"Apply migration to DB without initializing it",builder:$e,async handler(e){const t=await Be(e),n=Te(e);for(const r of fe("prisma deploy",t))await re(we.deploy(r,n),r,e)}},Ae={...$e,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Ne={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ae,async handler(e){const t=await Be(e);for(const n of fe("prisma deploy-force",t))await re(we.deployForce(n,e.backupPath),n,e)}},xe={command:"litestream",describe:"Setup DB for Litestream",builder:$e,async handler(e){const t=await Be(e);for(const n of fe("prisma litestream",t))await re(we.litestream(n),n,e)}},Pe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:$e,async handler(e){const t=await Be(e),n=Te(e);for(const r of fe("prisma migrate",t))await re(we.migrate(r,n),r,e)}},je={command:"migrate-dev",describe:"Create a migration file",builder:$e,async handler(e){const t=await Be(e),n=Te(e);for(const r of fe("prisma migrate-dev",t))await re(we.migrateDev(r,n),r,e)}},Re={command:"reset",describe:"Reset DB",builder:$e,async handler(e){const t=await Be(e),n=Te(e);for(const r of fe("prisma reset",t))await re(we.reset(r,n),r,e)}},Se={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ae,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(we.restore(n,e.backupPath,t),n,e)}}},De={command:"seed",describe:"Populate DB with seed data",builder:{...$e,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(we.seed(n,e.file),n,e)}},_e={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...$e,"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),n=Te(e,["db-url-or-path","restored"]);for(const r of fe("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await re(we.studio(r,t,n),r,e)}}},Oe={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(),Te(e,["args"])].filter(Boolean).join(" ");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}function Te(e,t=[]){const n=[],r=Object.keys(ve),s=Object.values(ve).flatMap(e=>"alias"in e&&e.alias?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),o=new Set([...t,...r,...s,"_","$0"]);for(const[t,r]of Object.entries(e))if(!o.has(t)){const s=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(s!==t&&void 0!==e[s])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Ce={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)}},Ie={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 r=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)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await re("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await se("poetry config virtualenvs.in-project true",t,e);const[,n]=s.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 r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await re(`${M} playwright install --with-deps`,r,e)}(e)}};function We(e){return e.silent?" > /dev/null":""}const Ve=new class{buildDevImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${e.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=()=>{if(Z.has(e))return;Z.add(e),ie(e,t);const{status:n}=i(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 Je{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Ve.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}${We(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test test/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 test/e2e/"===n&&t.target?n.replace("test/e2e/",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test test/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 test/e2e/"===n&&t.target?n.replace("test/e2e/",t.target):n}${o}"`}testUnit(e,t){return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"test/unit/"} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${t.target||"test/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 ze=new class extends Je{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??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`blitz dev -p 8080${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}};const Fe=new class extends Je{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)}${We(t)} && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${We(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${L} 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||"test/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||"test/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 Ye=new class extends Je{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).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n=`next dev --turbopack -p 8080${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}};const Le=new class extends Je{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)}${We(t)} && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${L} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Ue=new class extends Je{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,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}},Me=["express","fastify","elysia","hono"],Ge={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=ze;else if(t.next)s=Ye;else if(r["@remix-run/dev"])s=Ue;else if(Me.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Fe;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Le}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=qe(t,"development");await re(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=qe(t,"staging");await re(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=qe(t,"staging");await re(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=qe(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 qe(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 He={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"},silent:{description:"Reduce redundant outputs",type:"boolean"},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(n){await async function(n){const r=await z(n);r||(console.error(c.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=void 0===n.e2e&&void 0===n.start&&void 0===n.unit;for(const o of r.descendants){const r=o.packageJson.dependencies||{},i=o.packageJson.devDependencies||{};let a;a=r.blitz?ze:r.next?Ye:i["@remix-run/dev"]?Ue:Me.some(e=>r[e])&&!r["firebase-functions"]?Fe:Le,s&&(n={...n,e2e:e.existsSync(t.join(o.dirPath,"test","e2e"))&&!n.target?.includes("/unit/")?"headless":"none",start:!0,unit:e.existsSync(t.join(o.dirPath,"test","unit"))&&!n.target?.includes("/e2e/")}),console.info(`Running "test" for ${o.name} ...`);const c=[];if(!n.ci){switch(n.unit&&c.push(re(a.testUnit(o,n),o,n,{timeout:n.unitTimeout})),n.start&&c.push(re(a.testStart(o,n),o,n)),await Promise.all(c),n.e2e){case void 0:case"none":continue;case"":case"headless":await re(a.testE2E(o,n,{}),o,n);continue;case"headless-dev":await re(a.testE2EDev(o,n,{}),o,n);continue;case"docker":await Ke(o,n,a);continue;case"docker-debug":await Ke(o,n,a,`test ${n.target||"test/e2e/"} --debug`);continue}if(r.blitz||r.next||i["@remix-run/dev"])switch(n.e2e){case"headed":await re(a.testE2E(o,n,{playwrightArgs:`test ${n.target||"test/e2e/"} --headed`}),o,n);continue;case"headed-dev":await re(a.testE2EDev(o,n,{playwrightArgs:`test ${n.target||"test/e2e/"} --headed`}),o,n);continue;case"debug":await re(a.testE2E(o,n,{playwrightArgs:`test ${n.target||"test/e2e/"} --debug`}),o,n);continue;case"generate":await re(a.testE2E(o,n,{playwrightArgs:"codegen http://localhost:8080"}),o,n);continue;case"trace":await re("BUN playwright show-trace",o,n);continue}throw new Error(`Unknown e2e mode: ${n.e2e}`)}if(await se(Ve.stopAll(),o,n),n.unit&&await se(a.testUnit(o,n).replaceAll(" --allowOnly",""),o,n,{timeout:n.unitTimeout}),n.start&&await se(a.testStart(o,n),o,n),await te.promiseAll(),"none"!==n.e2e){o.hasDockerfile&&(process.env.WB_DOCKER||="1",await re(`${a.buildDocker(o,"test")}${We(n)}`,o,n));const e=o.hasDockerfile?{startCommand:Ve.stopAndStart(o,!0)}:{};process.exitCode=await re(a.testE2E(o,n,e).replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await re(Ve.stop(o),o,n)}}}(n)}};async function Ke(e,t,n,r){process.env.WB_DOCKER||="1",await re(`${n.buildDocker(e,"test")}${We(t)}`,e,t),process.exitCode=await re(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Ve.stopAndStart(e,!0)}${We(t)}`})}`,e,t,{exitIfFailed:!1}),await re(Ve.stop(e),e,t)}const Xe={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await z(n,!1);r||(console.error(c.red("No project found.")),process.exit(1));const s=r.descendants.map(async s=>{const o=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&o.push("YARN pyright"));o.length>0;){const i=await se(o.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),a=t.join(s.dirPath,".next");if(!i||!e.existsSync(a))return i;e.rmSync(a,{force:!0,recursive:!0}),console.info(c.yellow("Removed `.next` directory. We will re-try type checking."))}}),o=await Promise.all(s);let i=0;for(const[e,t]of o.entries())if(t){(r.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},Qe={...Xe,command:"tc"};await n(r(process.argv)).scriptName("wb").options(ve).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(G).command(me).command(he).command(ke).command(Ce).command(Ie).command(Ge).command(He).command(Xe).command(Qe).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>process.exit());
|
|
10
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpIHx8IHt9KTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcCgoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggdGhpcyBiZWhhdmlvciBpcyBub24tc3RhbmRhcmRcbiAgICAvLyBiZWNhdXNlIGBidW4gd2IgLi4uYCB3aWxsIGxvYWQgLmVudiBhbmQgLmVudi5sb2NhbCBiZWZvcmUgYHdiYCBsb2FkcyBvdGhlciB2YXJpYWJsZXMuXG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/Llsndml0ZXN0J10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/Llsndml0ZXN0J10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIGVycm9yLnN0YWNrIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKSxcbiAgICBmaXhCdW5Db21tYW5kKFxuICAgICAgbmV3U2NyaXB0XG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICAgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPVxuICAgICAgYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiBhcmd2LmZvcm1hdCA/ICdmb3JtYXQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKCFhcmd2Lm91dHNpZGUgJiYgbmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IFBPU1NJQkxFX1BBVEhTID0gW1xuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgeyBkYlBhdGgsIHNjaGVtYVBhdGggfSBvZiBQT1NTSUJMRV9QQVRIUykge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpIHtcbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBkYlBhdGgsXG4gICAgICAgICAgICBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0IHx8XG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSBgJHthcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJ31gLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uICYmIG9wdGlvbi5hbGlhcykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5rbm93bk9wdGlvbnMuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHtcbiAgICB0aGlzLmRlZmF1bHRQb3J0ID0gZGVmYXVsdFBvcnQ7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uID0gJ2RldmVsb3BtZW50Jyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGREZXZJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIGFic3RyYWN0IHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZztcblxuICBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIDgwODApfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCJybSAtUmYgJHtwcmlzbWFEaXJlY3Rvcnl9L21vdW50ICYmICR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODBcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdC9lMmUvJyAmJiBhcmd2LnRhcmdldCA/IHBsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3QvZTJlLycsIGFyZ3YudGFyZ2V0KSA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MFxuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0L2UyZS8nICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdC9lMmUvJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3QvdW5pdC8nfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBidW4gdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0L3VuaXQvJ31gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gYGJsaXR6IGRldiAtcCA4MDgwJHt0b0Rldk51bGwoYXJndil9YCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IDgwODApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICB9JHt0b0Rldk51bGwoYXJndil9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gUE9SVD1cXCR7UE9SVDotJHtwb3J0fX0gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3QvZTJlLyd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kIHx8IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3QvZTJlLyd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gYG5leHQgZGV2IC0tdHVyYm9wYWNrIC1wIDgwODAke3RvRGV2TnVsbChhcmd2KX1gIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib3BhY2ske3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSBgcmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9YCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjaToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdGVzdHMgb24gQ0knLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBydW4gZTJlIHRlc3RzLiBZb3UgbWF5IHBhc3MgbW9kZSBhcyBhcmd1bWVudDogbm9uZSB8IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdGFydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gc3RhcnQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdW5pdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG4gIHRhcmdldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0JyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gYXJndi5lMmUgPT09IHVuZGVmaW5lZCAmJiBhcmd2LnN0YXJ0ID09PSB1bmRlZmluZWQgJiYgYXJndi51bml0ID09PSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkFsbFRlc3RzKSB7XG4gICAgICBhcmd2ID0ge1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBlMmU6XG4gICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL3VuaXQvJylcbiAgICAgICAgICAgID8gJ2hlYWRsZXNzJ1xuICAgICAgICAgICAgOiAnbm9uZScsXG4gICAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgICB1bml0OiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL2UyZS8nKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3QvZTJlLyd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdC9lMmUvJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3QvZTJlLyd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdC9lMmUvJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYCR7c2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKX0ke3RvRGV2TnVsbChhcmd2KX1gLFxuICAgIH0pfWAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXS5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsInByb2Nlc3MiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0IiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJzb3J0Iiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwic3BsaXQiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJwcmludGFibGVTY3JpcHQiLCJydW5uYWJsZVNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwibWF0Y2giLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiY29uZmlndXJlRW52IiwidGltZW91dCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwibm9ybWFsaXplZFNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJiaW9tZUFyZ3NUZXh0IiwicHJldHRpZXJBcmdzVGV4dCIsInNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0IiwiZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lIiwiZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsImZpbGUiLCJTdHJpbmciLCJleHRlbnNpb24iLCJleHRuYW1lIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJiYWNrdXBQYXRoIiwiZGlyTmFtZSIsImxpdGVzdHJlYW0iLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInNjcmlwdFBhdGgiLCJwcmlzbWEiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsIkZJTEVfU0NIRU1BIiwiREFUQUJBU0VfVVJMIiwiUE9TU0lCTEVfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZGJQYXRoIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJkZWZhdWx0IiwiYnVpbGRlciIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsIkJvb2xlYW4iLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwidG9Mb3dlckNhc2UiLCJpdGVtIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwic2lsZW50IiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImRlZmF1bHRQb3J0IiwiUE9SVCIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsInRhcmdldCIsInRlc3RFMkVEZXYiLCJ0ZXN0VW5pdCIsIndhaXRBcHAiLCJibGl0elNjcmlwdHMiLCJzdXBlciIsInN0YXJ0UHJvZHVjdGlvbiIsInRlc3RTdGFydCIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsInJlbWl4U2NyaXB0cyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsIm1vZGUiLCJhcmciLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsInVuaXQiLCJDSSIsIkZPUkNFX0NPTE9SIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJ1bml0VGltZW91dCIsImFsbCIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsInR5cGVDaGVja0NvbW1hbmQiLCJjb21tYW5kcyIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6Im9jQXlIQSxNQUFNQSxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBQSxFQUVsRixPQURBTixFQUFjVyxJQUFJUixFQUFVRyxHQUNyQkEsQ0FDVCxDQzlET00sZUFBZUMsRUFDcEJDLEVBQ0FDLEVBQ0FDLEdBRUEsT0FBTyxJQUFJQyxRQUFRLENBQUNSLEVBQVNTLEtBQzNCLElBQ0UsTUFBTUMsRUFBT0MsRUFBTU4sRUFBU0MsR0FBUSxHQUFJQyxHQUFXLElBRW5ERyxFQUFLRSxRQUFRQyxjQUFjLFFBQzNCSCxFQUFLSSxRQUFRRCxjQUFjLFFBRTNCLElBQUlELEVBQVMsR0FDVEUsRUFBUyxHQUNiSixFQUFLRSxRQUFRRyxHQUFHLE9BQVNDLElBQ3ZCSixHQUFVSSxFQUNOVCxHQUFTVSxnQkFDWEMsUUFBUU4sT0FBT08sTUFBTUgsS0FHekJOLEVBQUtJLFFBQVFDLEdBQUcsT0FBU0MsSUFDbkJULEdBQVNhLGlCQUNYUixHQUFVSSxFQUVWRixHQUFVRSxFQUVSVCxHQUFTYyxnQkFDWEgsUUFBUUosT0FBT0ssTUFBTUgsS0FJekIsSUFBSU0sR0FBVSxFQUNkLE1BQU1DLEVBQWNBLE1BQ2RELEdBQVlaLEVBQUtjLE1BRXJCRixHQUFVLEVBQ05mLEdBQVNrQixTQUNYQyxRQUFRQyxLQUFLLFlBQVlqQixFQUFLYyxRQUVoQ0ksRUFBU2xCLEVBQUtjLE9BRVpqQixHQUFTc0IsYUFDWFgsUUFBUUgsR0FBRyxhQUFjUSxHQUN6QkwsUUFBUUgsR0FBRyxTQUFVUSxJQUd2QmIsRUFBS0ssR0FBRyxRQUFVZSxJQUNoQlosUUFBUWEsZUFBZSxhQUFjUixHQUNyQ0wsUUFBUWEsZUFBZSxTQUFVUixHQUNqQ2IsRUFBS3NCLG1CQUFtQixTQUN4QnZCLEVBQU9xQixLQUVUcEIsRUFBS0ssR0FBRyxRQUFTLENBQUNrQixFQUFxQkMsS0FDckNoQixRQUFRYSxlQUFlLGFBQWNSLEdBQ3JDTCxRQUFRYSxlQUFlLFNBQVVSLFFBQ2hCWSxJQUFiekIsRUFBS2MsSUFDUGYsRUFBTyxJQUFJMkIsTUFBTSx3QkFFakJwQyxFQUFRLENBQ053QixJQUFLZCxFQUFLYyxJQUNWWixTQUNBRSxTQUNBdUIsT0FBUUosRUFDUkMsYUFLRjNCLEdBQVMrQixRQUNYNUIsRUFBSzZCLE9BQU9wQixNQUFNWixFQUFRK0IsT0FDMUI1QixFQUFLNkIsT0FBT0MsTUFFaEIsQ0FBRSxNQUFPVixHQUVQckIsRUFBT3FCLEVBQ1QsR0FFSjs7Ozs7Ozs7R0N6SUEsTUFBTVcsRUFBRSxJQUFJLG9CQUFvQkMsRUFBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLFdBQVdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsV0FBVyxXQUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFlBQWtFLE1BQU1DLEVBQUVKLElBQUksTUFBTUMsRUFBRSxHQUFHLElBQUksTUFBTUMsRUFBRUMsS0FBS0gsRUFBRUssVUFBVUosRUFBRUMsR0FBR0MsRUFBRSxPQUFPRixHQUFHLE1BQU1LLEVBQUVDLE9BQU8sR0FBR04sRUFBRSxHQUFHTyxPQUFNLEVBQUdDLFdBQVUsRUFBR0MsTUFBTSxFQUFFQyxNQUFNLEVBQUVDLGNBQWMsRUFBRSxXQUFBQyxDQUFZYixFQUFFQyxFQUFFQyxHQUFHWSxLQUFLQyxRQUFRZCxFQUFFYSxLQUFLRSxXQUFXZCxFQUFFWSxLQUFLRyxXQUFXLE1BQU1qQixHQUFHLElBQUksRUFBRWMsS0FBS0ksVUFBVUosS0FBS0csWUFBWSxFQUFFSCxLQUFLSyxhQUFhakIsR0FBRyxFQUFFWSxLQUFLTSxZQUFZLEdBQUdsQixJQUFJLEVBQUUsSUFBSSxJQUFJRixFQUFFLEVBQUVBLEVBQUUsS0FBS0EsRUFBRWMsS0FBS2IsRUFBRUQsR0FBRyxDQUFDLENBQUMsTUFBQXFCLENBQU9yQixHQUFHLEdBQUdjLEtBQUtMLFVBQVUsTUFBTSxJQUFJZCxNQUFNLDJCQUEyQixNQUFNTSxFQUFFYSxLQUFLUCxPQUFPSixFQUFFVyxLQUFLSSxVQUFVSSxFQUFFdEIsRUFBRXVCLE9BQU9uQixFQUFFVSxLQUFLRyxXQUFXWCxFQUFFUSxLQUFLYixFQUFFLElBQUl1QixFQUFFQyxFQUFFQyxFQUFFLEVBQUUsS0FBS0EsRUFBRUosR0FBRyxDQUFDLEdBQUdSLEtBQUtOLE1BQU0sSUFBSU0sS0FBS04sT0FBTSxFQUFHUCxFQUFFLEdBQUdhLEtBQUtKLE1BQU1jLEVBQUUsRUFBRUEsRUFBRXBCLEVBQUUsSUFBSW9CLEVBQUV2QixFQUFFdUIsR0FBRyxFQUFFLElBQUlBLEVBQUVWLEtBQUtILE1BQU1lLEVBQUVKLEdBQUdFLEVBQUVyQixJQUFJdUIsRUFBRUQsRUFBRXpCLEVBQUUyQixZQUFZRCxJQUFJLEVBQUVELEVBQUUsSUFBSXhCLEVBQUV1QixHQUFHLElBQUlDLEdBQUd2QixFQUFFLEVBQUVzQixLQUFLQyxFQUFFLE1BQU14QixFQUFFdUIsR0FBRyxLQUFLLElBQUlDLEdBQUcsSUFBSXZCLEVBQUUsRUFBRXNCLEtBQUt2QixFQUFFdUIsR0FBRyxLQUFLLElBQUksR0FBR0MsSUFBSXZCLEVBQUUsRUFBRXNCLE1BQU1DLEVBQUUsT0FBT0EsR0FBRyxPQUFPeEIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEtBQUt2QixFQUFFLEVBQUVzQixLQUFLdkIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEVBQUUsS0FBS3ZCLEVBQUUsRUFBRXNCLEtBQUt2QixFQUFFdUIsR0FBRyxLQUFLLElBQUksR0FBR0MsSUFBSXZCLEVBQUUsRUFBRXNCLE9BQU9DLEVBQUUsUUFBUSxLQUFLQSxJQUFJLEdBQUcsTUFBTXpCLEVBQUUyQixjQUFjRCxJQUFJLElBQUl6QixFQUFFdUIsR0FBRyxLQUFLLElBQUlDLEdBQUcsS0FBS3ZCLEVBQUUsRUFBRXNCLEtBQUt2QixFQUFFdUIsR0FBRyxLQUFLLElBQUlDLEdBQUcsR0FBRyxLQUFLdkIsRUFBRSxFQUFFc0IsS0FBS3ZCLEVBQUV1QixHQUFHLEtBQUssSUFBSUMsR0FBRyxFQUFFLEtBQUt2QixFQUFFLEVBQUVzQixLQUFLdkIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJLEdBQUdDLElBQUl2QixFQUFFLEVBQUVzQixNQUFNLEdBQUdWLEtBQUtGLGNBQWNZLEVBQUVBLEdBQUdyQixFQUFFLENBQUMsSUFBSVcsS0FBS0gsTUFBTWEsRUFBRXJCLEVBQUVXLEtBQUtKLE1BQU1ULEVBQUVHLEdBQUdvQixFQUFFLEVBQUVBLEVBQUVwQixJQUFJb0IsRUFBRWxCLEVBQUVrQixJQUFJdkIsRUFBRXVCLEdBQUdJLEVBQUV0QixHQUFHUSxLQUFLTixPQUFNLENBQUUsTUFBTU0sS0FBS0gsTUFBTWEsQ0FBQyxDQUFDLE9BQU9WLElBQUksQ0FBQyxRQUFBZSxHQUFXLEdBQUdmLEtBQUtMLFVBQVUsT0FBT0ssS0FBS0wsV0FBVSxFQUFHLE1BQU1ULEVBQUVjLEtBQUtQLE9BQU8sSUFBSU4sRUFBRWEsS0FBS0YsY0FBYyxNQUFNVixFQUFFWSxLQUFLRyxXQUFXZCxFQUFFVyxLQUFLYixFQUFFLEdBQUdELEVBQUVDLEdBQUcsSUFBSWEsS0FBS0MsUUFBUSxFQUFFZCxHQUFHYSxLQUFLRixnQkFBZ0JFLEtBQUtJLFVBQVUsSUFBSWxCLEVBQUUsR0FBR0EsRUFBRUUsR0FBR0QsRUFBRSxFQUFFQSxFQUFFQyxFQUFFLElBQUlELEVBQUVELEVBQUVDLEdBQUcsRUFBRSxJQUFJRCxFQUFFRSxFQUFFLElBQUksV0FBV0QsRUFBRSxFQUFFQSxFQUFFQyxJQUFJRCxFQUFFRSxFQUFFRixJQUFJRCxFQUFFQyxHQUFHMkIsRUFBRXpCLEVBQUUsQ0FBQyxHQUFBMkIsR0FBTWhCLEtBQUtlLFdBQVcsTUFBTTVCLEVBQUVhLEtBQUtHLFdBQVcsSUFBSWYsRUFBRVksS0FBS2IsRUFBRSxNQUFNRSxFQUFFVyxLQUFLSyxhQUFhRyxFQUFFUixLQUFLTSxXQUFXLElBQUlkLEVBQUVrQixFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxHQUFHLEtBQUtELEVBQUV0QixHQUFHLENBQUMsSUFBSXFCLEVBQUUsRUFBRUEsRUFBRXZCLEdBQUd3QixFQUFFdEIsSUFBSXFCLElBQUlDLEVBQUVuQixFQUFFSixFQUFFc0IsR0FBR0UsR0FBRzFCLEVBQUVNLEdBQUcsRUFBRSxJQUFJTixFQUFFLEdBQUdNLEdBQUdOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEVBQUUsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUltQixFQUFFeEIsSUFBSSxJQUFJQyxFQUFFRSxFQUFFRixHQUFHMEIsRUFBRTFCLEdBQUdzQixFQUFFLEVBQUUsQ0FBQyxPQUFPRixJQUFJaEIsRUFBRUosRUFBRXNCLEdBQUdFLEdBQUcxQixFQUFFTSxHQUFHLEVBQUUsSUFBSU4sRUFBRSxHQUFHTSxHQUFHZ0IsRUFBRSxJQUFJSSxHQUFHMUIsRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsRUFBRSxLQUFLZ0IsRUFBRSxJQUFJSSxHQUFHMUIsRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxNQUFNb0IsQ0FBQyxFQUFFLE1BQU1FLEVBQUUsU0FBUzVCLEdBQUcsSUFBSUMsRUFBRUMsRUFBRW9CLEVBQUVsQixFQUFFRSxFQUFFc0IsRUFBRUosRUFBRUMsRUFBRUMsRUFBRUssRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJOUQsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWxCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXdCLEVBQUV4QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTBCLEVBQUUxQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWdDLEVBQUVoQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWlDLEVBQUVqQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWtDLEVBQUVsQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRWdDLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJdEIsRUFBRWdDLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHcUIsR0FBRyxFQUFFQyxJQUFJLElBQUl4QixFQUFFSSxHQUFHb0IsR0FBRyxFQUFFRCxJQUFJLElBQUl6QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUUyQixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTlCLEVBQUVzQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSS9CLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJaEMsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJakMsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFOEIsR0FBRzNCLEdBQUcsRUFBRUUsSUFBSSxJQUFJSixFQUFFOEIsR0FBRzFCLEdBQUcsRUFBRUYsSUFBSSxJQUFJSixFQUFFLElBQUlDLEVBQUVE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
|
|
9
|
+
*/const k=[..."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 j{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];P(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];P(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+=k[s>>4&15]+k[15&s]+k[s>>12&15]+k[s>>8&15]+k[s>>20&15]+k[s>>16&15]+k[s>>28&15]+k[s>>24&15];i%e===0&&(t=x(t),P(t),o=0)}return r&&(s=t[o],a+=k[s>>4&15]+k[15&s],r>1&&(a+=k[s>>12&15]+k[s>>8&15]),r>2&&(a+=k[s>>20&15]+k[s>>16&15])),a}}const P=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,j,P,R,S,D,_,O,B,C,T,I,W,V,J,z,F,Y,L,U,M,G,q,H,K,X,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,S=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,L=e[41]<<18|e[40]>>>14,C=e[2]<<1|e[3]>>>31,T=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,K=e[23]<<10|e[22]>>>22,D=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,I=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,X=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,J=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,$=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,U=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,j=e[18]<<20|e[19]>>>12,P=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,k=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^~j&R,e[11]=x^~P&S,e[20]=C^~I&V,e[21]=T^~W&J,e[30]=U^~G&H,e[31]=M^~q&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=j^~R&D,e[13]=P^~S&_,e[22]=I^~V&z,e[23]=W^~J&F,e[32]=G^~H&X,e[33]=q^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=R^~D&O,e[15]=S^~_&B,e[24]=V^~z&Y,e[25]=J^~F&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~k&f,e[7]=$^~E&h,e[16]=D^~O&A,e[17]=_^~B&x,e[26]=z^~Y&C,e[27]=F^~L&T,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=O^~A&j,e[19]=B^~x&P,e[28]=Y^~C&I,e[29]=L^~T&W,e[38]=Z^~U&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(D.decode(e))],create:([e])=>S.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)};return new Map([e,t,n,r,s,o,i].map(e=>[e.instance.name,e]))}(),S=new TextEncoder,D=new TextDecoder("utf8");function _(e=void 0,t=R){return JSON.stringify(C(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 C(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,s]of n.entries())t[r]=e(s)}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 T(e,t){return function(e){return new j(512,E,512).update(e).hex()}(_([e,t]))}const I=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=T}={}){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}}}({getCacheKey:T});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 k(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],$=!c,k=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),j[t].call(s,o)}}if(!$){var j={},P=[],R=E?"get":A||k?"set":"value";if(l?(u||k?j={get:w(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:j[R]=v,u||w(j[R],r,N?"":R)):u||(j=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+j[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var S=e,D=g.length-1;D>=0;D-=n?2:1){var _=y(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,B={},C={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($)i=_.call(O,S,C),B.v=1,y(i,"class decorators","return")&&(S=i);else if(C.static=d,C.private=l,i=C.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),j.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}),S=_.call(O,k?{get:j.get,set:j.set}:j[R],C),B.v=1,k){if("object"==typeof S&&S)(i=y(S.get,"accessor.get"))&&(j.get=i),(i=y(S.set,"accessor.set"))&&(j.set=i),(i=y(S.init,"accessor.init"))&&P.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(S,(u?"field":"method")+" decorators","return")&&(u?P.unshift(S):j[R]=S)}return s<2&&c.push(b(P,d,1),b(a,d,0)),u||$||(l?k?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?j[R]:y.call.bind(j[R])):m(e,r,j)),S}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;k(t?e:e.prototype,i,f,m?"#"+p:$(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=k(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[I,3,"isBunAvailable"],[I,3,"buildCommand"],[I,3,"rootDirPath"],[I,3,"dockerfile"],[I,3,"hasDockerfile"],[I,3,"hasSourceCode"],[I,3,"name"],[I,3,"dockerImageName"],[I,3,"env"],[I,3,"packageJson"],[I,3,"packageJsonPath"],[I,3,"hasPrisma"],[I,3,"hasVitest"],[I,3,"dockerPackageJson"],[I,3,"binExists"]]).e}argv=void W(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const o=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof o){if(0===s.length&&(s.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&s.push(t.join(n,".env"))}s=s.flatMap(e=>o?[`${e}.${o}.local`,`${e}.local`,`${e}.${o}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const i=[],a={};for(const e of s){let s=0;for(const[n,o]of Object.entries(b(t.join(r,e))))n in a||(a[n]=o,s++);i.push([e,s]),n.verbose&&s>0&&console.info(`Read ${s} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(b(t.join(r,n.checkEnv))||{}).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get hasVitest(){return!(!this.packageJson.dependencies?.vitest&&!this.packageJson.devDependencies?.vitest)}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function J(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new V(s,n,r)}async function z(n,r=!0,s){const o=function(n,r=!0,s){if(s??=process.cwd(),!e.existsSync(t.join(s,"package.json")))return;const o=new V(s,n,r);let i=o;if(!o.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const o=t.resolve(s,"..","..");e.existsSync(t.join(o,"package.json"))&&(i=new V(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await F(n,o.root,r):[o.self]}}async function F(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new V(r,n,s));return o}const Y=process.versions.bun||process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),L=Y?"bun --bun run":"node",U=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(n){await async function(n,r){const o=J(n,!0,r);if(!o)return console.error(c.red("No project found.")),!0;if(n={...n,command:n.command??(Y?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return q(o,n),!0;const[i,d,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const c=a("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!H.has(e)).sort(([e],[t])=>e.localeCompare(t)));c.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.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\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(K.some(t=>e.includes(t))||X.some(t=>e.endsWith(t)))&&!Q.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,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}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(c.green(`Skip to run '${n.command}' 💫`)),!1;if(!q(o,n))return;n.dryRun||await e.promises.writeFile(d,l,"utf8");return!0}(n)}};function q(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=s.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 K=["src/","public/"],X=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Q=["test/","tests/","__tests__/","test-fixtures/","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 ",Y?"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(e){Y||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await z(e,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=e.files??[];let s,o,i;if(r.length>0){const e=[],n=[],a=[];for(const s of r){const r=t.resolve(String(s));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):le.has(o)?e.push(r):ue.has(o)&&n.push(r)}s=e.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=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --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,e,{forceColor:!0})),e.format&&(o&&se(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await d,se(`bun --bun sort-package-json ${i}`,n.self,e,{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(n){const r=await z(n);r||(console.error(c.red("No project found.")),process.exit(1));for(const s of fe("optimizeForDockerBuild",r.descendants)){const r=s.packageJson,o=["dependencies","devDependencies"];for(const e of o){const t=r[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ge(n,r),be(r),ye(r),n.dryRun)continue;const i=n.outside?t.join(s.dirPath,"dist"):s.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(s.spawnSync(U,["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,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}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`${L} -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,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${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(n,r,s=""){const o="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${o}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(o)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:s,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${o}${t.resolve(n.dirPath,s,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${s?` ${s}`:""}`}},we={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"]}},$e={},ke={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ee).command(Ne).command(xe).command(je).command(Pe).command(Re).command(Se).command(De).command(_e).command(Oe).demandCommand().strict(!1),handler(){}},Ee={command:"deploy",describe:"Apply migration to DB without initializing it",builder:$e,async handler(e){const t=await Be(e),n=Ce(e);for(const r of fe("prisma deploy",t))await re(ve.deploy(r,n),r,e)}},Ae={...$e,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Ne={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ae,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)}},xe={command:"litestream",describe:"Setup DB for Litestream",builder:$e,async handler(e){const t=await Be(e);for(const n of fe("prisma litestream",t))await re(ve.litestream(n),n,e)}},je={command:"migrate",describe:"Apply migration to DB with initializing it",builder:$e,async handler(e){const t=await Be(e),n=Ce(e);for(const r of fe("prisma migrate",t))await re(ve.migrate(r,n),r,e)}},Pe={command:"migrate-dev",describe:"Create a migration file",builder:$e,async handler(e){const t=await Be(e),n=Ce(e);for(const r of fe("prisma migrate-dev",t))await re(ve.migrateDev(r,n),r,e)}},Re={command:"reset",describe:"Reset DB",builder:$e,async handler(e){const t=await Be(e),n=Ce(e);for(const r of fe("prisma reset",t))await re(ve.reset(r,n),r,e)}},Se={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ae,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:{...$e,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)}},_e={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...$e,"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),n=Ce(e,["db-url-or-path","restored"]);for(const r of fe("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await re(ve.studio(r,t,n),r,e)}}},Oe={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(),Ce(e,["args"])].filter(Boolean).join(" ");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}function Ce(e,t=[]){const n=[],r=Object.keys(we),s=Object.values(we).flatMap(e=>"alias"in e&&e.alias?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),o=new Set([...t,...r,...s,"_","$0"]);for(const[t,r]of Object.entries(e))if(!o.has(t)){const s=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(s!==t&&void 0!==e[s])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Te={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)}},Ie={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 r=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)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await re("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await se("poetry config virtualenvs.in-project true",t,e);const[,n]=s.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 r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await re(`${M} playwright install --with-deps`,r,e)}(e)}};function We(e){return e.silent?" > /dev/null":""}const Ve=new class{buildDevImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${e.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=()=>{if(Z.has(e))return;Z.add(e),ie(e,t);const{status:n}=i(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 Je{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Ve.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}${We(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test test/e2e/",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";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 test/e2e/"===n?`test ${a}`:n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test test/e2e/",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";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 test/e2e/"===n?`test ${i}`:n}${o}"`}testUnit(e,t){const n=t.targets&&t.targets.length>0?t.targets.join(" "):"test/unit/";return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${n} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${n}`:'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 ze=new class extends Je{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??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...ve.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`blitz dev -p 8080${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}};const Fe=new class extends Je{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)}${We(t)} && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${We(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${L} 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":"",s=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";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 ${s} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",s=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";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 ${s} --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 Ye=new class extends Je{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).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n=`next dev --turbopack -p 8080${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}};const Le=new class extends Je{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)}${We(t)} && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${L} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Ue=new class extends Je{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,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...ve.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${We(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${We(t)}`}){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${We(t)}" "${this.waitApp(e,t)}"`}},Me=["express","fastify","elysia","hono"],Ge={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=ze;else if(t.next)s=Ye;else if(r["@remix-run/dev"])s=Ue;else if(Me.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Fe;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Le}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=qe(t,"development");await re(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=qe(t,"staging");await re(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=qe(t,"staging");await re(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=qe(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 qe(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 He={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},targets:{description:"Test target paths",type:"array"}},async handler(n){await async function(n){const r=await z(n);r||(console.error(c.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets||[],o=0===s.length,i=s.some(e=>e.includes("/e2e")),a=s.some(e=>e.includes("/unit")),d=o||a,l=o||i;for(const o of r.descendants){const r=o.packageJson.dependencies||{},i=o.packageJson.devDependencies||{};let a;if(a=r.blitz?ze:r.next?Ye:i["@remix-run/dev"]?Ue:Me.some(e=>r[e])&&!r["firebase-functions"]?Fe:Le,console.info(`Running "test" for ${o.name} ...`),d&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await re(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const c=s.filter(e=>e.includes("/e2e")),u={...n,targets:c.length>0?c:void 0};switch(n.e2e){case"headless":await re(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await re(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await Ke(o,u,a);continue;case"docker-debug":{const e=c.length>0?c.join(" "):"test/e2e/";await Ke(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=c.length>0?c.join(" "):"test/e2e/";switch(n.e2e){case"headed":await re(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await re(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await re(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":await re(a.testE2E(o,u,{playwrightArgs:"codegen http://localhost:8080"}),o,n);break;case"trace":await re("BUN playwright show-trace",o,n)}}}}(n)}};async function Ke(e,t,n,r){process.env.WB_DOCKER||="1",await re(`${n.buildDocker(e,"test")}${We(t)}`,e,t),process.exitCode=await re(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Ve.stopAndStart(e,!0)}${We(t)}`})}`,e,t,{exitIfFailed:!1}),await re(Ve.stop(e),e,t)}const Xe={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await z(n);r||(console.error(c.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;if(i=r.blitz?ze:r.next?Ye:o["@remix-run/dev"]?Ue:Me.some(e=>r[e])&&!r["firebase-functions"]?Fe:Le,console.info(`Running "test-on-ci" for ${s.name} ...`),await se(Ve.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await se(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await se(i.testStart(s,n),s,n),await te.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER||="1",await re(`${i.buildDocker(s,"test")}${We(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Ve.stopAndStart(s,!0)}:{};process.exitCode=await re(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await re(Ve.stop(s),s,n)}}}(n)}};const Qe={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await z(n,!1);r||(console.error(c.red("No project found.")),process.exit(1));const s=r.descendants.map(async s=>{const o=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&o.push("YARN pyright"));o.length>0;){const i=await se(o.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),a=t.join(s.dirPath,".next");if(!i||!e.existsSync(a))return i;e.rmSync(a,{force:!0,recursive:!0}),console.info(c.yellow("Removed `.next` directory. We will re-try type checking."))}}),o=await Promise.all(s);let i=0;for(const[e,t]of o.entries())if(t){(r.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},Ze={...Qe,command:"tc"};await n(r(process.argv)).scriptName("wb").options(we).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(G).command(me).command(he).command(ke).command(Te).command(Ie).command(Ge).command(He).command(Xe).command(Qe).command(Ze).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>process.exit());
|
|
10
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpIHx8IHt9KTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcCgoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggdGhpcyBiZWhhdmlvciBpcyBub24tc3RhbmRhcmRcbiAgICAvLyBiZWNhdXNlIGBidW4gd2IgLi4uYCB3aWxsIGxvYWQgLmVudiBhbmQgLmVudi5sb2NhbCBiZWZvcmUgYHdiYCBsb2FkcyBvdGhlciB2YXJpYWJsZXMuXG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/Llsndml0ZXN0J10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/Llsndml0ZXN0J10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIGVycm9yLnN0YWNrIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKSxcbiAgICBmaXhCdW5Db21tYW5kKFxuICAgICAgbmV3U2NyaXB0XG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICAgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPVxuICAgICAgYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiBhcmd2LmZvcm1hdCA/ICdmb3JtYXQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKCFhcmd2Lm91dHNpZGUgJiYgbmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IFBPU1NJQkxFX1BBVEhTID0gW1xuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgeyBkYlBhdGgsIHNjaGVtYVBhdGggfSBvZiBQT1NTSUJMRV9QQVRIUykge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpIHtcbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBkYlBhdGgsXG4gICAgICAgICAgICBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0IHx8XG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSBgJHthcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJ31gLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uICYmIG9wdGlvbi5hbGlhcykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5rbm93bk9wdGlvbnMuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHtcbiAgICB0aGlzLmRlZmF1bHRQb3J0ID0gZGVmYXVsdFBvcnQ7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uID0gJ2RldmVsb3BtZW50Jyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGREZXZJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIGFic3RyYWN0IHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZztcblxuICBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIDgwODApfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MFxuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0L2UyZS8nID8gYHRlc3QgJHt0ZXN0VGFyZ2V0fWAgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MFxuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0L2UyZS8nID8gYHRlc3QgJHt0ZXN0VGFyZ2V0fWAgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC91bml0Lyc7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBidW4gdGVzdCAke3Rlc3RUYXJnZXR9YDtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fVlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9IGBibGl0eiBkZXYgLXAgODA4MCR7dG9EZXZOdWxsKGFyZ3YpfWAgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCB8fCB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gYG5leHQgZGV2IC0tdHVyYm9wYWNrIC1wIDgwODAke3RvRGV2TnVsbChhcmd2KX1gIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib3BhY2ske3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSBgcmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9YCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcjogeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyB8fCBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwO1xuXG4gIC8vIERldGVjdCB0ZXN0IG1vZGVzIGZyb20gdGFyZ2V0IHBhdGhzXG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1blVuaXQgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cztcbiAgY29uc3Qgc2hvdWxkUnVuRTJlID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cywgYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgJHtzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsXG4gICAgfSl9YCxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluYWxFeGl0Q29kZSkgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHByb2Nlc3MuZXhpdCgpKTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0IiwicHJvY2VzcyIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsImNvbnN0cnVjdG9yIiwidGhpcyIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibGVuZ3RoIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJwdXNoIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk51bWJlciIsImlzTmFOIiwiaXNGaW5pdGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJrZXlzIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNWaXRlc3QiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImRlc2NlbmRhbnRzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInNvcnQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJzcGxpdCIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJtYXRjaCIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJiaW9tZUV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImJpb21lQXJnc1RleHQiLCJwcmV0dGllckFyZ3NUZXh0Iiwic29ydFBhY2thZ2VKc29uQXJnc1RleHQiLCJmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUiLCJmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllciIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwiZmlsZSIsIlN0cmluZyIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJiaW9tZUNvbW1hbmQiLCJiaW9tZVByb21pc2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJzdGFydHNXaXRoIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJwcmlzbWFTY3JpcHRzIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJidWlsZGVyIiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpdGVzdHJlYW1Db21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsImRlcGxveUZvcmNlQnVpbGRlciIsImRlbWFuZE9wdGlvbiIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwiQm9vbGVhbiIsImZpbHRlcmVkIiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0Iiwic3RvcEFsbCIsIkJhc2VTY3JpcHRzIiwiZGVmYXVsdFBvcnQiLCJQT1JUIiwiYnVpbGREb2NrZXIiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwidGVzdFRhcmdldCIsInRhcmdldHMiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJzdGFydFByb2R1Y3Rpb24iLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyIsIndiRW52IiwiTkVYVF9QVUJMSUNfV0JfRU5WIiwidGVzdENvbW1hbmQiLCJlMmUiLCJjaG9pY2VzIiwiQ0kiLCJGT1JDRV9DT0xPUiIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJjb21tYW5kcyIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImFsbCIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6Im9jQXlIQSxNQUFNQSxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBQSxFQUVsRixPQURBTixF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RUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJOUQsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWxCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXdCLEVBQUV4QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTBCLEVBQUUxQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWdDLEVBQUVoQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWlDLEVBQUVqQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWtDLEVBQUVsQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRWdDLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJdEIsRUFBRWdDLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHcUIsR0FBRyxFQUFFQyxJQUFJLElBQUl4QixFQUFFSSxHQUFHb0IsR0FBRyxFQUFFRCxJQUFJLElBQUl6QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUUyQixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTlCLEVBQUVzQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSS9CLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJaEMsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJakMsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFOEIsR0FBRzNCLEdBQUcsRUFBRUUsSUFBSSxJQUFJSixFQUFFOEIsR0FBRzFCLEdBQUcsRUFBRUYsSUFBSSxJQUFJSixFQUFFLElB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
|