@willbooster/wb 13.2.3 → 13.2.4
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 +2 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"tree-kill";import
|
|
|
6
6
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
7
7
|
* @copyright Chen, Yi-Cyuan 2015-2023
|
|
8
8
|
* @license MIT
|
|
9
|
-
*/const $=[..."0123456789abcdef"],P=[6,1536,393216,100663296],R=[0,8,16,24],S=[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 N{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<<R[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<R[3&i++],t[i>>2]|=(128|a>>6&63)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<R[3&i++],t[i>>2]|=(128|a>>12&63)<<R[3&i++],t[i>>2]|=(128|a>>6&63)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=$[s>>4&15]+$[15&s]+$[s>>12&15]+$[s>>8&15]+$[s>>20&15]+$[s>>16&15]+$[s>>28&15]+$[s>>24&15];i%e===0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=$[s>>4&15]+$[15&s],r>1&&(a+=$[s>>12&15]+$[s>>8&15]),r>2&&(a+=$[s>>20&15]+$[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,f,m,h,g,b,v,y,w,k,E,A,$,P,R,x,N,j,D,T,_,O,I,C,B,L,F,J,W,z,U,M,Y,V,q,K,G,H,Q,X,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],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=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|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(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,m=e[0],h=e[1],q=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,N=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,U=e[40]<<18|e[41]>>>14,M=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,G=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,D=e[33]<<13|e[32]>>>19,T=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,_=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,$=e[6]<<28|e[7]>>>4,P=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,R=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,W=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=m^~g&v,e[1]=h^~b&y,e[10]=$^~R&N,e[11]=P^~x&j,e[20]=I^~B&F,e[21]=C^~L&J,e[30]=Y^~q&G,e[31]=V^~K&H,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~v&w,e[3]=b^~y&k,e[12]=R^~N&D,e[13]=x^~j&T,e[22]=B^~F&W,e[23]=L^~J&z,e[32]=q^~G&Q,e[33]=K^~H&X,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=v^~w&E,e[5]=y^~k&A,e[14]=N^~D&_,e[15]=j^~T&O,e[24]=F^~W&U,e[25]=J^~z&M,e[34]=G^~Q&Z,e[35]=H^~X&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~E&m,e[7]=k^~A&h,e[16]=D^~_&$,e[17]=T^~O&P,e[26]=W^~U&I,e[27]=z^~M&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~m&g,e[9]=A^~h&b,e[18]=_^~$&R,e[19]=O^~P&x,e[28]=U^~I&B,e[29]=M^~C&L,e[38]=Z^~Y&q,e[39]=ee^~V&K,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=S[r],e[1]^=S[r+1]},D=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(_.decode(e))],create:([e])=>T.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]))}(),T=new TextEncoder,_=new TextDecoder("utf-8");function O(e=void 0,t=D){return JSON.stringify(B(e,t))}function I(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 C=[];function B(e,t=D){const n=I(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=I(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(C.length<e){const t=C.length;C.length=e,C.fill(-2,t,e)}return C.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 L(e,t){return function(e){return new N(512,P,512).update(e).hex()}(O([e,t]))}const F=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=L}={}){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:L});function J(e){return!!e&&"0"!==e&&"false"!==e}let W;class z{static{[W]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,m=Object.create,h=[m(null),m(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 v(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function y(e,t,n,r,s,a,c,d,l,u,p){function m(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,k=1===s,A=3===s,$=4===s,P=2===s;function R(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),S[t].call(s,o)}}if(!w){var S={},x=[],N=A?"get":$||k?"set":"value";if(l?(u||k?S={get:E(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:S[N]=y,u||E(S[N],r,P?"":N)):u||(S=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+S[N].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var T=v(g[D],"A decorator","be",!0),_=n?g[D-1]:void 0,O={},I={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");v(t,"An initializer","be",!0),a.push(t)}.bind(null,O)};if(w)i=T.call(_,j,I),O.v=1,v(i,"class decorators","return")&&(j=i);else if(I.static=d,I.private=l,i=I.access={has:l?p.bind():function(e){return r in e}},$||(i.get=l?P?function(e){return m(e),S.value}:R("get",0,m):function(e){return e[r]}),P||A||(i.set=l?R("set",0,m):function(e,t){e[r]=t}),j=T.call(_,k?{get:S.get,set:S.set}:S[N],I),O.v=1,k){if("object"==typeof j&&j)(i=v(j.get,"accessor.get"))&&(S.get=i),(i=v(j.set,"accessor.set"))&&(S.set=i),(i=v(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):S[N]=j)}return s<2&&c.push(b(x,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,R("get",d),R("set",d)):c.push(P?S[N]:v.call.bind(S[N])):f(e,r,S)),j}function w(e){return f(e,p,{configurable:!0,enumerable:!0,value:o})}return o=m(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],f=!!i[3],m=16&l;y(t?e:e.prototype,i,m,f?"#"+p:A(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return k(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||w(e),{e:i,get c(){var n=[];return g&&[w(e=y(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[F,3,"isBunAvailable"],[F,3,"buildCommand"],[F,3,"rootDirPath"],[F,3,"dockerfile"],[F,3,"hasDockerfile"],[F,3,"hasSourceCode"],[F,3,"name"],[F,3,"dockerImageName"],[F,3,"env"],[F,3,"packageJson"],[F,3,"packageJsonPath"],[F,3,"hasPrisma"],[F,3,"hasVitest"],[F,3,"hasPlaywrightConfig"],[F,3,"skipLaunchingServerForPlaywright"],[F,3,"dockerPackageJson"],[F,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){const s=[];for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||n in process.env||(a[n]=o,s.push(n));i.push([e,s]),n.verbose&&s.length>0&&console.info(`Read ${s.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(J(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const 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 U(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new z(s,n,r)}async function M(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 z(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 z(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await Y(n,o.root,r):[o.self]}}async function Y(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 l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new z(r,n,s));return o}const V=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),q=V?"bun --bun run":"node",K=V?"bun":"yarn",G=V?"bun --bun run":"yarn",H={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=U(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(V?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return Q(s,n),!0;const[i,a,l]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Z.some(t=>e.includes(t))||ee.some(t=>e.endsWith(t)))&&!te.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!Q(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function Q(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Z=["src/","public/"],ee=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],te=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ne={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=U(e);t||(console.error(d.red("No project found.")),process.exit(1));if(J(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await f(r)}catch{}}(e)}};const re=new m,se={exitIfFailed:!0};async function oe(e,t,n,r=se){const s=ae(e,t);if(ce(s.printable,t),n.verbose&&ce(s.runnable,t,"Start (raw)",!0),n.dryRun)return de(s.printable,0,r),0;const o=await w(s.runnable,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(o.signal),de(s.printable,o.status,r),o.status??1}function ie(e,t,n,r=se){return re.runAndWaitForReturnValue(async()=>{const s=ae(e,t);if(ce(s.printable,t,"Start (parallel)",!0),n.dryRun)return ce(s.printable,t,"Started (log)"),n.verbose&&ce(s.runnable,t,"Started (raw)",!0),de(s.printable,0,r),0;const o=await w(s.runnable,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(o.signal),ce(s.printable,t,"Started (log)"),n.verbose&&ce(s.runnable,t,"Started (raw)",!0);const i=o.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),de(s.printable,o.status,r),o.status??1})}function ae(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",V?"bun --bun run ":"yarn run ");V&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=ue(n.replaceAll("YARN ",`${G} `)),s=ue(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!V&&t.binExists?"":`${G} `)),o=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${G} dotenv${o} -- ${r}`,runnable:s}}function ce(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function de(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function le(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ue(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const pe=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),fe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),me=new Set([...fe].filter(e=>!pe.has(e))),he={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){V||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await M(e,!1);n||(console.error(d.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):pe.has(o)?e.push(r):fe.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=`"**/{.*/,}*.{${[...me].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 c;(s||0===r.length)&&(c=ie(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&ie(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await c,ie(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*ge(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const be={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 M(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of ge("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(ve(n,r),ye(r),we(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||(o.spawnSync(K,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ve(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function ye(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.startsWith(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 we(e){delete e.private,delete e.publishConfig,delete e.prettier}const ke="file:",Ee=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Ae(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function $e(n){return Ee.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const Pe=new class{cleanUpLitestream(e){const t=Ae(e);return`rm -Rf ${t}/prod.sqlite3.*; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Ae(e);return`rm -Rf ${t}/prod.sqlite3*; PRISMA migrate reset --force --skip-seed && rm -Rf ${t}/prod.sqlite3*\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Ae(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],s=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(ke))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const s=$e(e),o=t.isAbsolute(r)?r:t.resolve(e.dirPath,s??".",r);return`rm -f "${o}" "${o}-wal" "${o}-shm"`}(e);s&&r.push(s);const o=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(o),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Ae(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);s=`DATABASE_URL=${ke}${e} `}else if(e.env.DATABASE_URL?.startsWith(ke)){const n=$e(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));s=`DATABASE_URL=${ke}${r} `}}return`${s}PRISMA studio ${r}`}},Re={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"]}},Se={},xe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ne).command(je).command(De).command(Te).command(_e).command(Oe).command(Ie).command(Ce).command(Be).command(Le).command(Fe).command(Je).demandCommand().strict(!1),handler(){}},Ne={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma cleanup-litestream",t))await oe(Pe.cleanUpLitestream(n),n,e)}},je={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Se,async handler(e){const t=await ze(e);for(const e of ge("prisma create-litestream-config",t))We(e)}},De={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma deploy",t))await oe(Pe.deploy(r,n),r,e)}},Te={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma deploy-force",t))await oe(Pe.deployForce(n),n,e)}},_e={command:"list-backups",describe:"List Litestream backups",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma list-backups",t))await oe(Pe.listBackups(n),n,e)}},Oe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma migrate",t))await oe(Pe.migrate(r,n),r,e)}},Ie={command:"migrate-dev",describe:"Create a migration file",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma migrate-dev",t))await oe(Pe.migrateDev(r,n),r,e)}},Ce={command:"reset",describe:"Reset DB",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma reset",t))await oe(Pe.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of ge("WB_ENV=test prisma reset",await ze(e)))await oe(Pe.reset(t,n),t,e)}}},Be={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Se,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ze(e);for(const n of ge("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await oe(Pe.restore(n,t),n,e)}}},Le={command:"seed",describe:"Populate DB with seed data",builder:{...Se,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ze(e);for(const n of ge("prisma seed",t))await oe(Pe.seed(n,e.file),n,e)}},Fe={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Se,"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 ze(e),n=Ue(e,["db-url-or-path","restored"]);for(const r of ge("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await oe(Pe.studio(r,t,n),r,e)}}},Je={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ze(e),n=[(e.args?.join(" ")??"").trimEnd(),Ue(e,["args"])].filter(Boolean).join(" ");for(const r of ge(`prisma ${n}`,t))await oe(`PRISMA ${n}`,r,e)}};function We(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},s=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(s.length>0)throw new Error(`Missing environment variables for Litestream: ${s.join(", ")}`);const o="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${o}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function ze(e){const t=await M(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function Ue(e,t=[]){const n=[],r=Object.keys(Re),s=Object.values(Re).flatMap(e=>"alias"in e?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 Me={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=U(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await oe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Ye={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await M(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ge("setup",n.descendants)){const r=await h.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===g.platform()){const n=["pstree"];await ie(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await oe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ie("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ie(`poetry env use ${n}`,t,e),await re.promiseAll(),await oe("poetry run pip install --upgrade pip",t,e),await oe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await oe(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await oe(`${G} playwright install --with-deps`,r,e)}(e)}};function Ve(e){return e.silent?" > /dev/null":""}const qe=new Set;async function Ke(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Qe(t,e))return!1}return!0}(e);n||await Ge(e,t);const r=async()=>{qe.has(e)||(qe.add(e),await Ge(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Ge(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await w("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await w("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await f(e)}catch{}}async function He(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ke(n,t),n}async function Qe(e,t){return new Promise(n=>{const r=b();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Xe=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(qe.has(e))return;qe.add(e),ce(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});de(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ze{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Xe.buildImage(e,t)}async startDev(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startDevProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startDevProtected(e,t)}async startProduction(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startProductionProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startProductionProtected(e,t)}async startTest(e,t){return await He(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && YARN concurrently --raw --kill-others-on-fail\n "${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e)}"`:`${this.buildDocker(e,"development")}\n && ${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?Pe.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Ve(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,Xe.stopAndStart(e),n)}async testStart(e,t){return await He(e.env.PORT,e),`NODE_ENV="" YARN concurrently --kill-others --raw --success first "${this.startDevProtected(e,t)}" "${this.waitApp(e)}"`}async testE2EProtected(e,t,n,{playwrightArgs:r="test test/e2e/"}){const s=await He(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=function(e,t,n){const r="BUN playwright",s=t?.join(" ")||"test/e2e/";if(!e.startsWith("test ")||!t?.length)return et(`${r} ${e}`,n);const o=e.slice(5).trim(),i=o.length>0?o.split(/\s+/):[];!i[0]||i[0].startsWith("-")?i.unshift(s):i[0]=s;return et(`${r} test ${i.join(" ")}`,n)}(r,t.targets,t.bail);return e.skipLaunchingServerForPlaywright?`${i}${o}`:`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${i}${o}"`}testUnit(e,t){const n=t.targets?.join(" ")||"test/unit/";if(e.hasVitest){return`YARN vitest run ${n} --color --passWithNoTests --allowOnly${t.bail?" --bail=1":""}`}if(e.isBunAvailable){return`bun test ${n}${t.bail?" --bail":""}`}return'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function et(e,t){return t&&e.includes("playwright test")?/--max-failures(?:=|\s)/.test(e)?e:`${e} --max-failures=1`:e}const tt=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const nt=new class extends Ze{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const s=await He(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && vitest run ${t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/"} --color --passWithNoTests --allowOnly${t.bail?" --bail=1":""}${o}"`}};const rt=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const st=new class extends Ze{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${q} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const ot=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const it=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},at=["express","fastify","elysia","hono"],ct={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 | test",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 M(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=tt;else if(t.next)s=rt;else if(r["@remix-run/dev"])s=ot;else if(r.vite)s=it;else if(at.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=nt;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=st}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await oe(await s.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await oe(await s.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await oe(await s.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await oe(await s.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await s.startTest(n,e);await oe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},dt={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"},bail:{description:"Stop tests after the first failure",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 M(n);r||(console.error(d.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")),c=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?tt:r.next?rt:i["@remix-run/dev"]?ot:i.vite?it:at.some(e=>r[e])&&!r["firebase-functions"]?nt:st,console.info(`Running "test" for ${o.name} ...`),c&&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 oe(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await oe(await a.testE2EProduction(o,u,{}),o,n);continue;case"headless-dev":await oe(await a.testE2EDev(o,u,{}),o,n);continue;case"docker":await lt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await lt(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]||i.vite){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await oe(await a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`codegen http://localhost:${o.env.PORT}`}),o,n);break;case"trace":await oe("BUN playwright show-trace",o,n)}}}}(n)}};async function lt(e,t,n,r){e.env.WB_DOCKER||="1",await oe(`${n.buildDocker(e,"test")}${Ve(t)}`,e,t),process.exitCode=await oe(await n.testE2EDocker(e,t,{playwrightArgs:r}),e,t,{exitIfFailed:!1}),await oe(Xe.stop(e),e,t)}const ut={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await M(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?tt:r.next?rt:o["@remix-run/dev"]?ot:o.vite?it:at.some(e=>r[e])&&!r["firebase-functions"]?nt:st,console.info(`Running "test-on-ci" for ${s.name} ...`),await ie(Xe.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await ie(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),e.existsSync(t.join(s.dirPath,"test","e2e"))){await ie(await i.testStart(s,n),s,n),await re.promiseAll(),s.hasDockerfile&&(s.env.WB_DOCKER||="1",await oe(`${i.buildDocker(s,"test")}${Ve(n)}`,s,n));const e=s.hasDockerfile?await i.testE2EDocker(s,n,{}):await i.testE2EProduction(s,n,{});process.exitCode=await oe(e.replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await oe(Xe.stop(s),s,n)}}}(n)}};const pt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await M(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let s=!1;const o=r.descendants.map(async o=>{const i=[];for(o.packageJson.workspaces?o.hasSourceCode&&(o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"):((o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"),o.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await ie(i.join(" && "),o,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(o.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),s=!0}}),i=await Promise.all(o);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(s?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},ft={...pt,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Re).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(H).command(ne).command(he).command(be).command(xe).command(Me).command(Ye).command(ct).command(dt).command(ut).command(pt).command(ft).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,()=>{n(process.pid),process.exit()});
|
|
10
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLWM9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25maWd1cmVFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBvcHRzOiBPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9XG4gICAgICBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6IGFyZ3YuZm9ybWF0ID8gJ2Zvcm1hdCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzLio7IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiBybSAtUmYgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCl9XCJgO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpfVwiYDtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYE5PREVfRU5WPVwiXCIgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cz8uam9pbignICcpIHx8ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbD0xJyA6ICcnO1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke2JhaWxPcHRpb259YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbCcgOiAnJztcbiAgICAgIHJldHVybiBgYnVuIHRlc3QgJHt0ZXN0VGFyZ2V0fSR7YmFpbE9wdGlvbn1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJnczogc3RyaW5nLCB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSAnQlVOIHBsYXl3cmlnaHQnO1xuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzPy5qb2luKCcgJykgfHwgJ3Rlc3QvZTJlLyc7XG4gIGlmICghcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKSB8fCAhdGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGAke2Jhc2V9ICR7cGxheXdyaWdodEFyZ3N9YCwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoJ3Rlc3QgJy5sZW5ndGgpLnRyaW0oKTtcbiAgY29uc3QgcGFydHMgPSByZXN0Lmxlbmd0aCA+IDAgPyByZXN0LnNwbGl0KC9cXHMrLykgOiBbXTtcbiAgaWYgKCFwYXJ0c1swXSB8fCBwYXJ0c1swXS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBwYXJ0cy51bnNoaWZ0KHRhcmdldCk7XG4gIH0gZWxzZSB7XG4gICAgcGFydHNbMF0gPSB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGAke2Jhc2V9IHRlc3QgJHtwYXJ0cy5qb2luKCcgJyl9YCwgYmFpbCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmQ6IHN0cmluZywgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWJhaWwgfHwgIWNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQgdGVzdCcpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cbiAgaWYgKC8tLW1heC1mYWlsdXJlcyg/Oj18XFxzKS8udGVzdChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG4gIHJldHVybiBgJHtjb21tYW5kfSAtLW1heC1mYWlsdXJlcz0xYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbD0xJyA6ICcnO1xuXG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtiYWlsT3B0aW9ufSR7c3VmZml4fVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXI6IHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBBdm9pZCBsYXVuY2hpbmcgZGV2IHNlcnZlcnMgZm9yIGJ1aWxkLW9ubHkgcGFja2FnZXM7IG9ubHkgc3RhcnQgYSBzZXJ2ZXIgd2hlbiBFMkUgbmVlZHMgaXQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0cmVlS2lsbCBmcm9tICd0cmVlLWtpbGwnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0IiwicHJvY2VzcyIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsImNvbnN0cnVjdG9yIiwidGhpcyIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibGVuZ3RoIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJwdXNoIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk51bWJlciIsImlzTmFOIiwiaXNGaW5pdGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiaGFzUGxheXdyaWdodENvbmZpZyIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwibGluZSIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsImJ1aWxkZXIiLCJleGl0IiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiY29uZmlndXJlRW52IiwidGltZW91dCIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwiQm9vbGVhbiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJkZWZhdWx0IiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsInJlcXVpcmVkRW52VmFycyIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVkiLCJtaXNzaW5nRW52VmFycyIsInJldGVudGlvbkNoZWNrSW50ZXJ2YWwiLCJsaXRlc3RyZWFtQ29uZmlnIiwid3JpdGVGaWxlU3luYyIsInJlYXNvbiIsImZpbHRlcmVkIiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiaXRlbSIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBsYXRmb3JtIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsInNpbGVudCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiYXZhaWxhYmxlIiwiaG9zdCIsInByb2JlUG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImtpbGxGdW5jIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJjb21tYW5kcyIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsInBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodENvbW1hbmQiLCJ0YXJnZXRzIiwiYmFpbCIsImJhc2UiLCJ0YXJnZXQiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJwYXJ0cyIsInVuc2hpZnQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJ0ZXN0VGFyZ2V0IiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsInRlc3RDb21tYW5kIiwiZTJlIiwiY2hvaWNlcyIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImFsbCIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6Im1oQkFtSUEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0N4RU9NLGVBQWVDLEVBQ3BCQyxFQUNBQyxFQUNBQyxHQUVBLE9BQU8sSUFBSUMsUUFBUSxDQUFDUixFQUFTUyxLQUMzQixJQUNFLE1BQU1DLEVBQU9DLEVBQU1OLEVBQVNDLEdBQVEsR0FBSUMsR0FBVyxJQUduREcsRUFBS0UsUUFBUUMsY0FBYyxRQUUzQkgsRUFBS0ksUUFBUUQsY0FBYyxRQUUzQixJQUFJRCxFQUFTLEdBQ1RFLEVBQVMsR0FDYkosRUFBS0UsUUFBUUcsR0FBRyxPQUFTQyxJQUN2QkosR0FBVUksRUFDTlQsR0FBU1UsZ0JBQ1hDLFFBQVFOLE9BQU9PLE1BQU1ILEtBR3pCTixFQUFLSSxR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
|
|
9
|
+
*/const $=[..."0123456789abcdef"],P=[6,1536,393216,100663296],R=[0,8,16,24],S=[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 N{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<<R[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<R[3&i++],t[i>>2]|=(128|a>>6&63)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<R[3&i++],t[i>>2]|=(128|a>>12&63)<<R[3&i++],t[i>>2]|=(128|a>>6&63)<<R[3&i++],t[i>>2]|=(128|63&a)<<R[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=$[s>>4&15]+$[15&s]+$[s>>12&15]+$[s>>8&15]+$[s>>20&15]+$[s>>16&15]+$[s>>28&15]+$[s>>24&15];i%e===0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=$[s>>4&15]+$[15&s],r>1&&(a+=$[s>>12&15]+$[s>>8&15]),r>2&&(a+=$[s>>20&15]+$[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,f,m,h,g,b,v,y,w,k,E,A,$,P,R,x,N,j,D,T,_,O,I,C,B,L,F,J,W,z,U,M,Y,V,q,K,G,H,Q,X,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],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=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|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(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,m=e[0],h=e[1],q=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,N=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,U=e[40]<<18|e[41]>>>14,M=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,G=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,D=e[33]<<13|e[32]>>>19,T=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,_=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,$=e[6]<<28|e[7]>>>4,P=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,R=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,W=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=m^~g&v,e[1]=h^~b&y,e[10]=$^~R&N,e[11]=P^~x&j,e[20]=I^~B&F,e[21]=C^~L&J,e[30]=Y^~q&G,e[31]=V^~K&H,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~v&w,e[3]=b^~y&k,e[12]=R^~N&D,e[13]=x^~j&T,e[22]=B^~F&W,e[23]=L^~J&z,e[32]=q^~G&Q,e[33]=K^~H&X,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=v^~w&E,e[5]=y^~k&A,e[14]=N^~D&_,e[15]=j^~T&O,e[24]=F^~W&U,e[25]=J^~z&M,e[34]=G^~Q&Z,e[35]=H^~X&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~E&m,e[7]=k^~A&h,e[16]=D^~_&$,e[17]=T^~O&P,e[26]=W^~U&I,e[27]=z^~M&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~m&g,e[9]=A^~h&b,e[18]=_^~$&R,e[19]=O^~P&x,e[28]=U^~I&B,e[29]=M^~C&L,e[38]=Z^~Y&q,e[39]=ee^~V&K,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=S[r],e[1]^=S[r+1]},D=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(_.decode(e))],create:([e])=>T.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]))}(),T=new TextEncoder,_=new TextDecoder("utf-8");function O(e=void 0,t=D){return JSON.stringify(B(e,t))}function I(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 C=[];function B(e,t=D){const n=I(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=I(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(C.length<e){const t=C.length;C.length=e,C.fill(-2,t,e)}return C.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 L(e,t){return function(e){return new N(512,P,512).update(e).hex()}(O([e,t]))}const F=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=L}={}){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:L});function J(e){return!!e&&"0"!==e&&"false"!==e}let W;class z{static{[W]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,m=Object.create,h=[m(null),m(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 v(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function y(e,t,n,r,s,a,c,d,l,u,p){function m(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,k=1===s,A=3===s,$=4===s,P=2===s;function R(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),S[t].call(s,o)}}if(!w){var S={},x=[],N=A?"get":$||k?"set":"value";if(l?(u||k?S={get:E(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:S[N]=y,u||E(S[N],r,P?"":N)):u||(S=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+S[N].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var T=v(g[D],"A decorator","be",!0),_=n?g[D-1]:void 0,O={},I={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");v(t,"An initializer","be",!0),a.push(t)}.bind(null,O)};if(w)i=T.call(_,j,I),O.v=1,v(i,"class decorators","return")&&(j=i);else if(I.static=d,I.private=l,i=I.access={has:l?p.bind():function(e){return r in e}},$||(i.get=l?P?function(e){return m(e),S.value}:R("get",0,m):function(e){return e[r]}),P||A||(i.set=l?R("set",0,m):function(e,t){e[r]=t}),j=T.call(_,k?{get:S.get,set:S.set}:S[N],I),O.v=1,k){if("object"==typeof j&&j)(i=v(j.get,"accessor.get"))&&(S.get=i),(i=v(j.set,"accessor.set"))&&(S.set=i),(i=v(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):S[N]=j)}return s<2&&c.push(b(x,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,R("get",d),R("set",d)):c.push(P?S[N]:v.call.bind(S[N])):f(e,r,S)),j}function w(e){return f(e,p,{configurable:!0,enumerable:!0,value:o})}return o=m(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],f=!!i[3],m=16&l;y(t?e:e.prototype,i,m,f?"#"+p:A(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return k(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||w(e),{e:i,get c(){var n=[];return g&&[w(e=y(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[F,3,"isBunAvailable"],[F,3,"buildCommand"],[F,3,"rootDirPath"],[F,3,"dockerfile"],[F,3,"hasDockerfile"],[F,3,"hasSourceCode"],[F,3,"name"],[F,3,"dockerImageName"],[F,3,"env"],[F,3,"packageJson"],[F,3,"packageJsonPath"],[F,3,"hasPrisma"],[F,3,"hasVitest"],[F,3,"hasPlaywrightConfig"],[F,3,"skipLaunchingServerForPlaywright"],[F,3,"dockerPackageJson"],[F,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){const s=[];for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||n in process.env||(a[n]=o,s.push(n));i.push([e,s]),n.verbose&&s.length>0&&console.info(`Read ${s.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(J(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const 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 U(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new z(s,n,r)}async function M(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 z(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 z(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await Y(n,o.root,r):[o.self]}}async function Y(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 l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new z(r,n,s));return o}const V=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),q=V?"bun --bun run":"node",K=V?"bun":"yarn",G=V?"bun --bun run":"yarn",H={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=U(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(V?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return Q(s,n),!0;const[i,a,l]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Z.some(t=>e.includes(t))||ee.some(t=>e.endsWith(t)))&&!te.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!Q(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function Q(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Z=["src/","public/"],ee=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],te=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ne={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=U(e);t||(console.error(d.red("No project found.")),process.exit(1));if(J(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await f(r)}catch{}}(e)}};const re=new m,se={exitIfFailed:!0};async function oe(e,t,n,r=se){const s=ae(e,t);if(ce(s.printable,t),n.verbose&&ce(s.runnable,t,"Start (raw)",!0),n.dryRun)return de(s.printable,0,r),0;const o=await w(s.runnable,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(o.signal),de(s.printable,o.status,r),o.status??1}function ie(e,t,n,r=se){return re.runAndWaitForReturnValue(async()=>{const s=ae(e,t);if(ce(s.printable,t,"Start (parallel)",!0),n.dryRun)return ce(s.printable,t,"Started (log)"),n.verbose&&ce(s.runnable,t,"Started (raw)",!0),de(s.printable,0,r),0;const o=await w(s.runnable,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(o.signal),ce(s.printable,t,"Started (log)"),n.verbose&&ce(s.runnable,t,"Started (raw)",!0);const i=o.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),de(s.printable,o.status,r),o.status??1})}function ae(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",V?"bun --bun run ":"yarn run ");V&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=ue(n.replaceAll("YARN ",`${G} `)),s=ue(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!V&&t.binExists?"":`${G} `)),o=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${G} dotenv${o} -- ${r}`,runnable:s}}function ce(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function de(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function le(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ue(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const pe=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),fe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),me=new Set([...fe].filter(e=>!pe.has(e))),he={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){V||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await M(e,!1);n||(console.error(d.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):pe.has(o)?e.push(r):fe.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=`"**/{.*/,}*.{${[...me].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 c;(s||0===r.length)&&(c=ie(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&ie(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await c,ie(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*ge(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const be={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 M(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of ge("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(ve(n,r),ye(r),we(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||(o.spawnSync(K,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ve(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function ye(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.startsWith(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 we(e){delete e.private,delete e.publishConfig,delete e.prettier}const ke="file:",Ee=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Ae(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function $e(n){return Ee.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const Pe=new class{cleanUpLitestream(e){const t=Ae(e);return`rm -Rf ${t}/prod.sqlite3.*; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Ae(e);return`rm -Rf ${t}/prod.sqlite3*; PRISMA migrate reset --force --skip-seed && rm -Rf ${t}/prod.sqlite3*\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Ae(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],s=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(ke))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const s=$e(e),o=t.isAbsolute(r)?r:t.resolve(e.dirPath,s??".",r);return`rm -f "${o}" "${o}-wal" "${o}-shm"`}(e);s&&r.push(s);const o=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(o),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Ae(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);s=`DATABASE_URL=${ke}${e} `}else if(e.env.DATABASE_URL?.startsWith(ke)){const n=$e(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));s=`DATABASE_URL=${ke}${r} `}}return`${s}PRISMA studio ${r}`}},Re={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"]}},Se={},xe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ne).command(je).command(De).command(Te).command(_e).command(Oe).command(Ie).command(Ce).command(Be).command(Le).command(Fe).command(Je).demandCommand().strict(!1),handler(){}},Ne={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma cleanup-litestream",t))await oe(Pe.cleanUpLitestream(n),n,e)}},je={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Se,async handler(e){const t=await ze(e);for(const e of ge("prisma create-litestream-config",t))We(e)}},De={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma deploy",t))await oe(Pe.deploy(r,n),r,e)}},Te={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma deploy-force",t))await oe(Pe.deployForce(n),n,e)}},_e={command:"list-backups",describe:"List Litestream backups",builder:Se,async handler(e){const t=await ze(e);for(const n of ge("prisma list-backups",t))await oe(Pe.listBackups(n),n,e)}},Oe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma migrate",t))await oe(Pe.migrate(r,n),r,e)}},Ie={command:"migrate-dev",describe:"Create a migration file",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma migrate-dev",t))await oe(Pe.migrateDev(r,n),r,e)}},Ce={command:"reset",describe:"Reset DB",builder:Se,async handler(e){const t=await ze(e),n=Ue(e);for(const r of ge("prisma reset",t))await oe(Pe.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of ge("WB_ENV=test prisma reset",await ze(e)))await oe(Pe.reset(t,n),t,e)}}},Be={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Se,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ze(e);for(const n of ge("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await oe(Pe.restore(n,t),n,e)}}},Le={command:"seed",describe:"Populate DB with seed data",builder:{...Se,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ze(e);for(const n of ge("prisma seed",t))await oe(Pe.seed(n,e.file),n,e)}},Fe={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Se,"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 ze(e),n=Ue(e,["db-url-or-path","restored"]);for(const r of ge("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await oe(Pe.studio(r,t,n),r,e)}}},Je={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ze(e),n=[(e.args?.join(" ")??"").trimEnd(),Ue(e,["args"])].filter(Boolean).join(" ");for(const r of ge(`prisma ${n}`,t))await oe(`PRISMA ${n}`,r,e)}};function We(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},s=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(s.length>0)throw new Error(`Missing environment variables for Litestream: ${s.join(", ")}`);const o="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${o}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function ze(e){const t=await M(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function Ue(e,t=[]){const n=[],r=Object.keys(Re),s=Object.values(Re).flatMap(e=>"alias"in e?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 Me={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=U(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await oe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Ye={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await M(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ge("setup",n.descendants)){const r=await h.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===g.platform()){const n=["pstree"];await ie(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await oe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ie("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ie(`poetry env use ${n}`,t,e),await re.promiseAll(),await oe("poetry run pip install --upgrade pip",t,e),await oe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await oe(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await oe(`${G} playwright install --with-deps`,r,e)}(e)}};function Ve(e){return e.silent?" > /dev/null":""}const qe=new Set;async function Ke(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Qe(t,e))return!1}return!0}(e);n||await Ge(e,t);const r=async()=>{qe.has(e)||(qe.add(e),await Ge(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Ge(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await w("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await w("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await f(e)}catch{}}async function He(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ke(n,t),n}async function Qe(e,t){return new Promise(n=>{const r=b();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Xe=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(qe.has(e))return;qe.add(e),ce(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});de(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ze{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Xe.buildImage(e,t)}async startDev(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startDevProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startDevProtected(e,t)}async startProduction(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startProductionProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startProductionProtected(e,t)}async startTest(e,t){return await He(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await He(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && YARN concurrently --raw --kill-others-on-fail\n "${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e)}"`:`${this.buildDocker(e,"development")}\n && ${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?Pe.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Ve(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,Xe.stopAndStart(e),n)}async testStart(e,t){return await He(e.env.PORT,e),`NODE_ENV="" YARN concurrently --kill-others --raw --success first "${this.startDevProtected(e,t)}" "${this.waitApp(e)}"`}async testE2EProtected(e,t,n,{playwrightArgs:r="test test/e2e/"}){const s=await He(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=function(e,t,n){const r="BUN playwright",s=t?.join(" ")||"test/e2e/";if(!e.startsWith("test ")||!t?.length)return et(`${r} ${e}`,n);const o=e.slice(5).trim(),i=o.length>0?o.split(/\s+/):[];!i[0]||i[0].startsWith("-")?i.unshift(s):i[0]=s;return et(`${r} test ${i.join(" ")}`,n)}(r,t.targets,t.bail);return e.skipLaunchingServerForPlaywright?`${i}${o}`:`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${i}${o}"`}testUnit(e,t){const n=t.targets?.join(" ")||"test/unit/";if(e.hasVitest){return`YARN vitest run ${n} --color --passWithNoTests --allowOnly${t.bail?" --bail=1":""}`}if(e.isBunAvailable){return`bun test ${n}${t.bail?" --bail":""}`}return'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function et(e,t){return t&&e.includes("playwright test")?/--max-failures(?:=|\s)/.test(e)?e:`${e} --max-failures=1`:e}const tt=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const nt=new class extends Ze{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const s=await He(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && vitest run ${t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/"} --color --passWithNoTests --allowOnly${t.bail?" --bail=1":""}${o}"`}};const rt=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const st=new class extends Ze{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${q} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${Xe.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const ot=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const it=new class extends Ze{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},at=["express","fastify","elysia","hono"],ct={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 | test",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 M(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=tt;else if(t.next)s=rt;else if(r["@remix-run/dev"])s=ot;else if(r.vite)s=it;else if(at.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=nt;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=st}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await oe(await s.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await oe(await s.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await oe(await s.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await oe(await s.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await s.startTest(n,e);await oe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},dt={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"},bail:{description:"Stop tests after the first failure",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 M(n);r||(console.error(d.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")),c=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?tt:r.next?rt:i["@remix-run/dev"]?ot:i.vite?it:at.some(e=>r[e])&&!r["firebase-functions"]?nt:st,console.info(`Running "test" for ${o.name} ...`),c&&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 oe(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await oe(await a.testE2EProduction(o,u,{}),o,n);continue;case"headless-dev":await oe(await a.testE2EDev(o,u,{}),o,n);continue;case"docker":await lt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await lt(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]||i.vite){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await oe(await a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":await oe(await a.testE2EProduction(o,u,{playwrightArgs:`codegen http://localhost:${o.env.PORT}`}),o,n);break;case"trace":await oe("BUN playwright show-trace",o,n)}}}}(n)}};async function lt(e,t,n,r){e.env.WB_DOCKER||="1",await oe(`${n.buildDocker(e,"test")}${Ve(t)}`,e,t),process.exitCode=await oe(await n.testE2EDocker(e,t,{playwrightArgs:r}),e,t,{exitIfFailed:!1}),await oe(Xe.stop(e),e,t)}const ut={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await M(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?tt:r.next?rt:o["@remix-run/dev"]?ot:o.vite?it:at.some(e=>r[e])&&!r["firebase-functions"]?nt:st,console.info(`Running "test-on-ci" for ${s.name} ...`),await ie(Xe.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await ie(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),e.existsSync(t.join(s.dirPath,"test","e2e"))){await ie(await i.testStart(s,n),s,n),await re.promiseAll(),s.hasDockerfile&&(s.env.WB_DOCKER||="1",await oe(`${i.buildDocker(s,"test")}${Ve(n)}`,s,n));const e=s.hasDockerfile?await i.testE2EDocker(s,n,{}):await i.testE2EProduction(s,n,{});process.exitCode=await oe(e.replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await oe(Xe.stop(s),s,n)}}}(n)}};const pt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await M(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let s=!1;const o=r.descendants.map(async o=>{const i=[];for(o.packageJson.workspaces?o.hasSourceCode&&(o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),o.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await ie(i.join(" && "),o,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(o.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),s=!0}}),i=await Promise.all(o);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(s?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},ft={...pt,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Re).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(H).command(ne).command(he).command(be).command(xe).command(Me).command(Ye).command(ct).command(dt).command(ut).command(pt).command(ft).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,()=>{n(process.pid),process.exit()});
|
|
10
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLWM9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25maWd1cmVFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBvcHRzOiBPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9XG4gICAgICBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6IGFyZ3YuZm9ybWF0ID8gJ2Zvcm1hdCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzLio7IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiBybSAtUmYgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCl9XCJgO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpfVwiYDtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYE5PREVfRU5WPVwiXCIgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cz8uam9pbignICcpIHx8ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbD0xJyA6ICcnO1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke2JhaWxPcHRpb259YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbCcgOiAnJztcbiAgICAgIHJldHVybiBgYnVuIHRlc3QgJHt0ZXN0VGFyZ2V0fSR7YmFpbE9wdGlvbn1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJnczogc3RyaW5nLCB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSAnQlVOIHBsYXl3cmlnaHQnO1xuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzPy5qb2luKCcgJykgfHwgJ3Rlc3QvZTJlLyc7XG4gIGlmICghcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKSB8fCAhdGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGAke2Jhc2V9ICR7cGxheXdyaWdodEFyZ3N9YCwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoJ3Rlc3QgJy5sZW5ndGgpLnRyaW0oKTtcbiAgY29uc3QgcGFydHMgPSByZXN0Lmxlbmd0aCA+IDAgPyByZXN0LnNwbGl0KC9cXHMrLykgOiBbXTtcbiAgaWYgKCFwYXJ0c1swXSB8fCBwYXJ0c1swXS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBwYXJ0cy51bnNoaWZ0KHRhcmdldCk7XG4gIH0gZWxzZSB7XG4gICAgcGFydHNbMF0gPSB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGAke2Jhc2V9IHRlc3QgJHtwYXJ0cy5qb2luKCcgJyl9YCwgYmFpbCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmQ6IHN0cmluZywgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWJhaWwgfHwgIWNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQgdGVzdCcpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cbiAgaWYgKC8tLW1heC1mYWlsdXJlcyg/Oj18XFxzKS8udGVzdChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG4gIHJldHVybiBgJHtjb21tYW5kfSAtLW1heC1mYWlsdXJlcz0xYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbD0xJyA6ICcnO1xuXG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtiYWlsT3B0aW9ufSR7c3VmZml4fVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXI6IHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBBdm9pZCBsYXVuY2hpbmcgZGV2IHNlcnZlcnMgZm9yIGJ1aWxkLW9ubHkgcGFja2FnZXM7IG9ubHkgc3RhcnQgYSBzZXJ2ZXIgd2hlbiBFMkUgbmVlZHMgaXQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQnKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0cmVlS2lsbCBmcm9tICd0cmVlLWtpbGwnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0IiwicHJvY2VzcyIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsImNvbnN0cnVjdG9yIiwidGhpcyIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibGVuZ3RoIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJwdXNoIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk51bWJlciIsImlzTmFOIiwiaXNGaW5pdGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiaGFzUGxheXdyaWdodENvbmZpZyIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwibGluZSIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsImJ1aWxkZXIiLCJleGl0IiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiY29uZmlndXJlRW52IiwidGltZW91dCIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwiQm9vbGVhbiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJkZWZhdWx0IiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsInJlcXVpcmVkRW52VmFycyIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVkiLCJtaXNzaW5nRW52VmFycyIsInJldGVudGlvbkNoZWNrSW50ZXJ2YWwiLCJsaXRlc3RyZWFtQ29uZmlnIiwid3JpdGVGaWxlU3luYyIsInJlYXNvbiIsImZpbHRlcmVkIiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiaXRlbSIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBsYXRmb3JtIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsInNpbGVudCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiYXZhaWxhYmxlIiwiaG9zdCIsInByb2JlUG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImtpbGxGdW5jIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJjb21tYW5kcyIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsInBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodENvbW1hbmQiLCJ0YXJnZXRzIiwiYmFpbCIsImJhc2UiLCJ0YXJnZXQiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJwYXJ0cyIsInVuc2hpZnQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJ0ZXN0VGFyZ2V0IiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsInRlc3RDb21tYW5kIiwiZTJlIiwiY2hvaWNlcyIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImFsbCIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6Im1oQkFtSUEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0N4RU9NLGVBQWVDLEVBQ3BCQyxFQUNBQyxFQUNBQyxHQUVBLE9BQU8sSUFBSUMsUUFBUSxDQUFDUixFQUFTUyxLQUMzQixJQUNFLE1BQU1DLEVBQU9DLEVBQU1OLEVBQVNDLEdBQVEsR0FBSUMsR0FBVyxJQUduREcsRUFBS0UsUUFBUUMsY0FBYyxRQUUzQkgsRUFBS0ksUUFBUUQsY0FBYyxRQUUzQixJQUFJRCxFQUFTLEdBQ1RFLEVBQVMsR0FDYkosRUFBS0UsUUFBUUcsR0FBRyxPQUFTQyxJQUN2QkosR0FBVUksRUFDTlQsR0FBU1UsZ0JBQ1hDLFFBQVFOLE9BQU9PLE1BQU1ILEtBR3pCTixFQUFLSSxRQUFRQyxHQUFHLE9BQVNDLElB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
|