logixlysia 6.6.0 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,9 @@
1
- import{Elysia as r$}from"elysia";var k0={dev:{showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0,showContextTree:!0,pino:{prettyPrint:!0}},prod:{showStartupMessage:!1,useColors:!1,showContextTree:!1,autoRedact:!0,requestId:!0,pino:{prettyPrint:!1}},json:{showStartupMessage:!1,useColors:!1,showContextTree:!1,pino:{prettyPrint:!1}}},y0=($,W)=>{if(!W)return $;let N={...$,...W};if($.pino||W.pino)N.pino={...$.pino,...W.pino,...$.pino?.prettyPrint!==void 0||W.pino?.prettyPrint!==void 0?{prettyPrint:W.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||W.logFilter)N.logFilter={...$.logFilter,...W.logFilter};if($.logRotation||W.logRotation)N.logRotation={...$.logRotation,...W.logRotation};if($.timestamp||W.timestamp)N.timestamp={...$.timestamp,...W.timestamp};return N},e=($={})=>{let W=$.preset;if(!W)return $;let N=k0[W];return{...$,config:y0(N,$.config)}};var p=()=>{let $=new WeakMap,W=(N)=>{let Q=$.get(N);if(!Q)Q={},$.set(N,Q);return Q};return{mergeContext(N,Q){if(Object.keys(Q).length===0)return;let Z=W(N);Object.assign(Z,Q)},getContext(N){let Q=$.get(N);return Q?{...Q}:{}},clearContext(N){$.delete(N)}}},g=($,W)=>{let N=$.context,Q=Object.keys(W).length>0,Z=N!==void 0&&N!==null&&typeof N==="object"&&!Array.isArray(N)&&Object.keys(N).length>0;if(!(Q||Z))return $;let H={...W,...Z?N:{}};return{...$,context:H}};import{AsyncLocalStorage as f0}from"node:async_hooks";var $0=new f0,C0={debug:()=>{return},info:()=>{return},warn:()=>{return},error:()=>{return},mergeContext:()=>{return}},x0=()=>$0.getStore()??C0;import{createRequire as K0}from"node:module";var P0=(()=>{try{return K0(import.meta.url)("elysia/package.json")}catch{return{}}})(),m0=(()=>{try{return K0(import.meta.url)("../../package.json")}catch{return{}}})(),q0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},G0=($,W)=>{let N=P0.version,Q=N?`Elysia v${N}`:"Elysia",Z=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(W)Z.push({kind:"left",text:W});Z.push({kind:"empty"});let j=Math.max(Q.length,$.length,...W?[W.length]:[0])+4,J=`┌${"─".repeat(j)}┐`,X=`└${"─".repeat(j)}┘`,M=`│${" ".repeat(j)}│`,V=[J];for(let z of Z){if(z.kind==="empty"){V.push(M);continue}if(z.kind==="center"){V.push(`│${q0(z.text,j)}│`);continue}let K=z.text,G=Math.max(0,j-K.length-4);V.push(`│ ${K}${" ".repeat(G)} │`)}return V.push(X),V.join(`
2
- `)},Y0=()=>{let $=m0.version;if(!$)return null;return` logixlysia v${$}`};var W0=($,W)=>{if(!(W.config?.showStartupMessage??!0))return;let{port:Q,hostname:Z,protocol:H}=$;if(Q===void 0||!Z||!H)return;let j=`${H}://${Z}:${Q}`,J=`\uD83E\uDD8A Elysia is running at ${j}`,X=`\uD83E\uDD8A ${j}`;if((W.config?.startupMessageFormat??"banner")==="simple"){console.log(J);return}console.log(G0(X,Y0()))};import E0 from"pino";import s$ from"pino-pretty";var d=(...$)=>{let W=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:N,request:Q,data:Z,store:H,options:j}=W,J=j.config?.transports??[];if(J.length===0)return;let X=typeof Z.message==="string"?Z.message:"",M={request:{method:Q.method,url:Q.url},...Z,beforeTime:H.beforeTime};for(let V of J)try{let z=V.log(N,X,M);if(z&&typeof z.catch==="function")z.catch(()=>{})}catch{}};import{appendFile as $$}from"node:fs/promises";import{dirname as W$}from"node:path";import{promises as h0}from"node:fs";var B0=async($)=>{await h0.mkdir($,{recursive:!0})};import{promises as D}from"node:fs";import{promisify as u0}from"node:util";import{gzip as i0}from"node:zlib";import{promises as N0}from"node:fs";import{basename as c0,dirname as v0}from"node:path";var p0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,g0=/^(\d+)(h|d|w)$/i,d0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,V0=($)=>{if(typeof $==="number")return $;let W=$.trim(),N=Number(W);if(Number.isFinite(N))return N;let Q=W.match(p0);if(!Q)throw Error(`Invalid size format: ${$}`);let Z=Number(Q[1]),H=Q[2].toLowerCase(),j=1024;if(H.startsWith("m"))j=1048576;else if(H.startsWith("g"))j=1073741824;return Math.floor(Z*j)},n0=($)=>{let W=$.trim().match(g0);if(!W)throw Error(`Invalid interval format: ${$}`);let N=Number(W[1]),Q=W[2].toLowerCase(),Z=3600000;if(Q==="d")Z=86400000;else if(Q==="w")Z=604800000;return N*Z},R0=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:n0($)}},I0=async($,W)=>{try{return(await N0.stat($)).size>W}catch{return!1}},Q0=async($)=>{let W=v0($),N=c0($),Q;try{Q=await N0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&d0.test(Z)).map((Z)=>`${W}/${Z}`)};var l0=u0(i0),n=new Map,o0=($)=>{let W=n.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return n.set($,Q),()=>{if(N?.(),n.get($)===Q)n.delete($)}})},P=($)=>String($).padStart(2,"0"),s0=($,W)=>{let N=W.getFullYear(),Q=P(W.getMonth()+1),Z=P(W.getDate()),H=P(W.getHours()),j=P(W.getMinutes()),J=P(W.getSeconds()),X=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${H}-${j}-${J}-${X}`},a0=async($)=>{try{if((await D.stat($)).size===0)return""}catch{return""}let N=`${s0($,new Date)}-${process.hrtime.bigint()}`;return await D.rename($,N),N},r0=async($)=>{let W=await o0($);try{try{await D.access($)}catch{return}let N=await D.readFile($),Q=await l0(N);await D.writeFile(`${$}.gz`,Q),await D.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},M0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=V0(W.maxSize);return await I0($,N)},t0=async($,W)=>{let N=await Q0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(J)=>({path:J,stat:await D.stat(J)})))).filter((J)=>J.status==="fulfilled").map((J)=>J.value);if(Z.length<=W)return;Z.sort((J,X)=>X.stat.mtimeMs-J.stat.mtimeMs);let H=Z.slice(W);(await Promise.allSettled(H.map(({path:J})=>D.rm(J,{force:!0})))).forEach((J,X)=>{if(J.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${H[X].path}:`,J.reason)})},e0=async($,W)=>{let N=await Q0($);if(N.length===0)return;let Q=Date.now(),j=(await Promise.allSettled(N.map(async(X)=>({path:X,stat:await D.stat(X)})))).filter((X)=>X.status==="fulfilled").map((X)=>X.value).filter(({stat:X})=>Q-X.mtimeMs>W);(await Promise.allSettled(j.map(({path:X})=>D.rm(X,{force:!0})))).forEach((X,M)=>{if(X.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${j[M].path}:`,X.reason)})},O0=async($,W)=>{let N=await a0($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await r0(N)}if(W.maxFiles!==void 0){let Z=R0(W.maxFiles);if(Z.type==="count")await t0($,Z.value);else await e0($,Z.value)}};var u=new Map,N$=($)=>{let W=u.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return u.set($,Q),()=>{if(N?.(),u.get($)===Q)u.delete($)}})},i=async(...$)=>{let W=typeof $[0]==="string"?(()=>{let[R,b,F,T,E,L]=$;return{filePath:R,level:b,request:F,data:T,store:E,options:L}})():$[0],{filePath:N,level:Q,request:Z,data:H,store:j,options:J}=W,X=J.config,M=X?.useTransportsOnly===!0,V=X?.disableFileLogging===!0;if(M||V)return;let z=typeof H.message==="string"?H.message:"",K=j.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-j.beforeTime)/1e6,G="/";try{let{pathname:R,search:b}=new URL(Z.url);G=X?.logQueryParams?`${R}${b}`:R}catch{G=Z.url}let O=`${Q} ${K.toFixed(2)}ms ${Z.method} ${G} ${z}
3
- `,U=await N$(N);try{try{await B0(W$(N)),await $$(N,O,{encoding:"utf-8"})}catch(F){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,F),F}let R=X?.logRotation;if(!R)return;if(await M0(N,R))try{await O0(N,R)}catch(F){console.error(`[logixlysia] Failed to rotate log file ${N}:`,F)}}finally{U()}};var Q$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,Z$=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,j$=/\b(?:\d[ -]*?){13,19}\b/g,J$=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var Z0=($)=>A($).replaceAll("[REDACTED]","redacted"),H$=($)=>{try{let W=new URL($);if(W.username!=="")W.username=Z0(W.username);if(W.password!=="")W.password=Z0(W.password);return W.hostname=Z0(W.hostname),W.pathname=A(W.pathname),W.search=A(W.search),W.hash=A(W.hash),W.toString()}catch{return A($).replaceAll("[REDACTED]","redacted")}},X$=($)=>{if($.length<13||$.length>19)return!1;let W=0,N=!1;for(let Q=$.length-1;Q>=0;Q--){let Z=$.charCodeAt(Q);if(Z<48||Z>57)return!1;let H=Z-48;if(N){if(H*=2,H>9)H-=9}W+=H,N=!N}return W%10===0},z$=($)=>$.replace(j$,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&X$(N))return"[REDACTED]";return W}),A=($)=>{let W=$;return W=W.replace(Q$,"[REDACTED]"),W=W.replace(Z$,"[REDACTED]"),W=z$(W),W=W.replace(J$,"[REDACTED]"),W},K$=($,W)=>{let N=A($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=A($.stack);let H=$;for(let j of Object.keys(H))if(j!=="message"&&j!=="name"&&j!=="stack")Z[j]=l(H[j],W);return Z},G$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q++)N[Q]=l($[Q],W);return N},Y$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=l($[Q],W);return N},j0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},l=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return A($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return j0(Q,W,()=>K$($,W));if(Array.isArray($))return j0(Q,W,()=>G$($,W));return j0(Q,W,()=>Y$($,W))},o=($)=>l($,new WeakSet),s=($)=>{let W=H$($.url),N=new Headers,Q=!1;for(let[X,M]of $.headers.entries()){let V=A(M);if(V!==M)Q=!0;N.set(X,V)}let Z=A($.method),H=W!==$.url,j=Z!==$.method;if(!(H||Q||j))return $;let J={method:Z,headers:N,redirect:$.redirect,signal:$.signal};return new Request(W,J)};import{STATUS_CODES as b$}from"node:http";import Y from"chalk";import{StatusMap as B$}from"elysia";var V$=/^\d+$/,R$=/[_-]+/g,I$=/([a-z0-9])([A-Z])/g,M$=/([A-Z])([A-Z][a-z])/g,O$=/['’]/g,U$=/[^a-z0-9\s]+/g,F$=/\s+/g,U0=($)=>{let W=$.trim();if(!W)return"";return W.replace(R$," ").replace(I$,"$1 $2").replace(M$,"$1 $2").replace(O$,"").toLowerCase().replace(U$," ").replace(F$," ").trim()},_$=(()=>{let $=new Map;for(let[W,N]of Object.entries(B$))$.set(U0(W),N);return $})(),F0=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(V$.test(W))return Number(W);return _$.get(U0(W))??500}return 500};var a=($)=>{let W="An error occurred";if($ instanceof Error)W=$.message;else if($&&typeof $==="object"&&"message"in $)W=$.message;else W=String($);return W},_0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("internal"in $));var m=($)=>String($).padStart(2,"0"),T$=($)=>String($).padStart(3,"0"),D$=500,A$=1000,E$=7,S$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",w$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,b0=($)=>{let N=$.config?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},L$=($,W)=>{if(!W)return $.toISOString();let N=String($.getFullYear()),Q=m($.getMonth()+1),Z=m($.getDate()),H=m($.getHours()),j=m($.getMinutes()),J=m($.getSeconds()),X=T$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",H).replaceAll("MM",j).replaceAll("ss",J).replaceAll("SSS",X)},k$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},y$=($)=>{if($>=1000){let W=$/1000;if(W>=10)return`${Math.round(W)}s`;let N=W.toFixed(1);return N.endsWith(".0")?`${Math.round(W)}s`:`${N}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},f$=($)=>{let W=$.config;return{slow:W?.slowThreshold??D$,verySlow:W?.verySlowThreshold??A$}},C$=($,W,N)=>{let Q=y$($),{slow:Z,verySlow:H}=f$(N),j=$>=H;if(!W)return{text:Q,isVerySlow:j};let J=Q;if($<Z)J=Y.green(Q);else if($<H)J=Y.yellow(Q);else J=Y.red.bold(Q);return{text:J,isVerySlow:j}},x$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${Y.yellow(N)}`},P$=($,W)=>{if(!W)return"\uD83E\uDD8A";if($==="ERROR")return Y.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return Y.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return Y.bgBlue.black(" \uD83E\uDD8A ");return Y.bgGreen.black(" \uD83E\uDD8A ")},m$=($,W)=>{if(!W)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},q$=($,W)=>{if(!W)return $;let N=$.toUpperCase();if(N==="GET")return Y.green.bold(N);if(N==="POST")return Y.blue.bold(N);if(N==="PUT")return Y.yellow.bold(N);if(N==="PATCH")return Y.yellowBright.bold(N);if(N==="DELETE")return Y.red.bold(N);if(N==="OPTIONS")return Y.cyan.bold(N);if(N==="HEAD")return Y.greenBright.bold(N);if(N==="TRACE")return Y.magenta.bold(N);if(N==="CONNECT")return Y.cyanBright.bold(N);return Y.white.bold(N)},h$=($,W)=>{if(!W)return $;let N=Number.parseInt($,10);if(!Number.isFinite(N))return $;if(N>=500)return Y.red($);if(N>=400)return Y.yellow($);if(N>=300)return Y.cyan($);if(N>=200)return Y.green($);return Y.gray($)},c$=($,W)=>{if(!W)return $;return Y.gray($)},v$=($,W)=>{if(!W)return $;return Y.whiteBright($)},p$=($)=>{return b$[$]??""},g$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${Y.dim(Q)} `},T0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},d$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),D0=($,W,N)=>{let Q=[];for(let[Z,H]of Object.entries($)){let j=W?`${W}.${Z}`:Z;if(d$(H)&&N>1)Q.push(...D0(H,j,N-1));else Q.push([j,T0(H)])}return Q},n$=($,W)=>{if($.length===0)return[];let N=[],Q=$.length-1;for(let Z=0;Z<$.length;Z++){let H=Z===Q?"└─":"├─",j=$[Z];if(!j)continue;let[J,X]=j,M=W?Y.cyan(J):J,V=W?Y.white(X):X;N.push(` ${H} ${M} ${V}`)}return N};var u$=($)=>{let W=[],N=a($);if(N)W.push(["error",N]);if(_0($)){if($.why!==void 0)W.push(["error.why",String($.why)]);if($.fix!==void 0)W.push(["error.fix",String($.fix)]);if($.link!==void 0)W.push(["error.link",String($.link)]);if($.internal!==void 0)W.push(["error.internal",T0($.internal)])}return W},i$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=b0(N),Z=N.config?.contextDepth??1,H=[],j=W.context;if(j&&typeof j==="object"&&!Array.isArray(j)&&Object.keys(j).length>0&&Z>=1)H.push(...D0(j,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0)H.push(...u$(W.error));return n$(H,Q)},l$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},r=({level:$,request:W,data:N,store:Q,options:Z})=>{let H=Z.config,j=b0(Z),J=H?.customLogFormat??S$,X=new Date,M=String(X.getTime()),V=L$(X,H?.timestamp?.translateTime),z=c$(V,j),K=typeof N.message==="string"?N.message:"",G=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,O,U;try{let x=new URL(W.url);O=x.pathname,U=x.search}catch{O=W.url||"/",U=""}let R=U,b=H?.logQueryParams?`${O}${R}`:O,F=N.status,T=F===null||F===void 0?200:F0(F),E=String(T),L=H?.ip===!0?k$(W):"",q=H?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":l$(N.context),k=m$($,j),B=W.method.toUpperCase().padEnd(E$),I=q$(B,j),_=v$(b,j),S=h$(E,j),{text:y,isVerySlow:f}=C$(G,j,Z),C=x$(f,j),h=P$($,j),c=p$(T),w=g$(Z,j),v={"{now}":z,"{epoch}":M,"{level}":k,"{icon}":h,"{duration}":y,"{method}":I,"{pathname}":_,"{path}":_,"{query}":R,"{status}":S,"{statusText}":c,"{message}":K,"{ip}":L,"{context}":q,"{service}":w,"{speed}":C,"{requestId}":typeof N.context==="object"&&N.context!==null&&"requestId"in N.context?String(N.context.requestId):""},w0=J.replace(w$,(x)=>v[x]??x),L0=i$($,N,Z);return{main:w0,contextLines:L0}};var o$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",A0=($,W,N,Q,Z)=>{let H=Q.config,j=H?.logFilter;if(j?.level&&j.level.length>0&&!j.level.includes("ERROR"))return;let J=H?.useTransportsOnly===!0,X=H?.disableInternalLogger===!0,M=H?.disableFileLogging===!0,V=o$(W)?W.status:500,z=a(W),K="ERROR",G={status:V,message:z,error:W},O=Z?g(G,Z.getContext($)):G,U=H?.autoRedact===!0?o(O):O,R=H?.autoRedact===!0?s($):$;if(d({level:K,request:R,data:U,store:N,options:Q}),!(J||M)){let E=H?.logFilePath;if(E)i({filePath:E,level:K,request:R,data:U,store:N,options:Q}).catch(()=>{})}if(J||X)return;let{main:b,contextLines:F}=r({level:K,request:R,data:U,store:N,options:Q}),T=F.length>0?`${b}
4
- ${F.join(`
5
- `)}`:b;console.error(T)};var S0=($={},W=E0,N)=>{let Q=N??p(),Z=$.config,H=Z?.pino,{prettyPrint:j,...J}=H??{},X=typeof j==="object"&&j!==null?j:void 0,V=(j===!0||X!==void 0)&&J.transport===void 0,z=X?.messageKey??J.messageKey,K=X?.errorKey??J.errorKey,G={...J,level:J.level??"info",messageKey:z,errorKey:K},O;if(V){let B=s$({colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...X,messageKey:z,errorKey:K});O=W(G,B)}else O=W({...G,transport:J.transport});let U=(B,I)=>{if(!I?.level||I.level.length===0)return!0;return I.level.includes(B)},R=Z?.useTransportsOnly===!0,b=Z?.disableInternalLogger===!0,F=Z?.disableFileLogging===!0,T=(Z?.transports?.length??0)>0,E=!(R||F)&&!!Z?.logFilePath,L=!(R||b),t=!(T||E||L),q=(B,I,_,S)=>{if(t||!U(B,Z?.logFilter))return;let y=g(_,Q.getContext(I)),f=Z?.autoRedact===!0?o(y):y,C=Z?.autoRedact===!0?s(I):I;if(T)d({level:B,request:C,data:f,store:S,options:$});if(E){let v=Z?.logFilePath;if(v)i({filePath:v,level:B,request:C,data:f,store:S,options:$}).catch(()=>{})}if(!L)return;let{main:h,contextLines:c}=r({level:B,request:C,data:f,store:S,options:$}),w=c.length>0?`${h}
6
- ${c.join(`
7
- `)}`:h;switch(B){case"DEBUG":{console.debug(w);break}case"INFO":{console.info(w);break}case"WARNING":{console.warn(w);break}case"ERROR":{console.error(w);break}default:{console.log(w);break}}},k=(B,I,_,S)=>{if(t||!U(B,Z?.logFilter))return;let y={beforeTime:process.hrtime.bigint()};q(B,I,{message:_,context:S},y)};return{pino:O,mergeContext:(B,I)=>{Q.mergeContext(B,I)},getContext:(B)=>Q.getContext(B),log:q,handleHttpError:(B,I,_)=>{A0(B,I,_,$,Q)},debug:(B,I,_)=>{k("DEBUG",B,I,_)},info:(B,I,_)=>{k("INFO",B,I,_)},warn:(B,I,_)=>{k("WARNING",B,I,_)},error:(B,I,_)=>{k("ERROR",B,I,_)}}},J0=($,W)=>S0($,E0,W);var H0=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,header:"X-Request-Id",generator:()=>crypto.randomUUID()};if($.enabled===!1)return null;return{enabled:!0,header:$.header?.trim()||"X-Request-Id",generator:$.generator??(()=>crypto.randomUUID())}},X0=($,W)=>{let N=$.headers.get(W.header);if(N)return N;return W.generator()};var a$=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),z0=($,W,N)=>{let Q=new WeakMap,Z=(H,j,J,X,M)=>{let V=j,K={beforeTime:Q.get(V)??process.hrtime.bigint()},G=N.getContext(V),O=Object.keys(G).length>0||M?{...G,...M,wsId:j.id}:{wsId:j.id};W.log(H,a$(J),{message:X,context:O,status:200},K)};return(H,j)=>({...j,open(J){if(Q.set(J,process.hrtime.bigint()),j.open?.(J),$.config?.disableWebSocketLogging!==!0)Z("INFO",J,H,"WebSocket opened")},message(J,X){if(j.message?.(J,X),$.config?.disableWebSocketLogging!==!0)Z("INFO",J,H,"WebSocket message",{payloadType:typeof X})},close(J){if(j.close?.(J),$.config?.disableWebSocketLogging!==!0)Z("INFO",J,H,"WebSocket closed");N.clearContext(J),Q.delete(J)}})};var t$=($={})=>{let W=e($),N=new WeakSet,Q=p(),Z=J0(W,Q),H=z0(W,Z,Q),j=H0(W.config?.requestId),J={...Z,debug:(z,K,G)=>{N.add(z),Z.debug(z,K,G)},info:(z,K,G)=>{N.add(z),Z.info(z,K,G)},warn:(z,K,G)=>{N.add(z),Z.warn(z,K,G)},error:(z,K,G)=>{N.add(z),Z.error(z,K,G)}},X=(z)=>({debug:(K,G)=>J.debug(z,K,G),info:(K,G)=>J.info(z,K,G),warn:(K,G)=>J.warn(z,K,G),error:(K,G)=>J.error(z,K,G),mergeContext:(K)=>Q.mergeContext(z,K)}),V=new r$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",J).state("pino",J.pino).state("beforeTime",BigInt(0)).derive(({request:z})=>({log:X(z)})).onStart(({server:z})=>{if(z)W0(z,W);else{let K=Number(process.env.PORT)||3000,G=process.env.HOST||"localhost";W0({port:K,hostname:G,protocol:"http"},W)}}).onRequest(({request:z,store:K})=>{if(K.beforeTime=process.hrtime.bigint(),j){let G=X0(z,j);Q.mergeContext(z,{requestId:G})}if(W.config?.useAsyncLocalStorage)$0.enterWith(X(z))}).onAfterHandle(({request:z,set:K,store:G})=>{try{if(j){let T=Q.getContext(z).requestId;if(T)K.headers[j.header]=T}if(N.has(z))return;let O=typeof K.status==="number"?K.status:200,U="INFO";if(O>=500)U="ERROR";else if(O>=400)U="WARNING";let R=Q.getContext(z),b={status:O};if(Object.keys(R).length>0)b.context={...R};J.log(U,z,b,G)}finally{Q.clearContext(z)}}).onError(({request:z,error:K,set:G,store:O})=>{try{if(j){let R=Q.getContext(z).requestId;if(R)G.headers[j.header]=R}J.handleHttpError(z,K,O)}finally{Q.clearContext(z)}}).as("scoped");return Object.assign(V,{wrapWs:H})},KW=t$;export{x0 as useLogger,H0 as resolveRequestIdConfig,e as resolveOptions,t$ as logixlysia,X0 as getOrCreateRequestId,KW as default,z0 as createWsHandlerWrapper,J0 as createPluginLogger,S0 as createLogger};
1
+ import{Elysia as P2}from"elysia";import{promises as p0}from"node:fs";import{basename as g0,dirname as c0}from"node:path";var d0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,u0=/^(\d+)(h|d|w)$/i,l0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,E=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let Z=$.trim();if(Z!==""){let G=Number(Z);if(Number.isFinite(G)){if(G<=0)throw Error(`Invalid size: ${$}`);return G}}let J=Z.match(d0);if(!J)throw Error(`Invalid size format: ${$}`);let X=Number(J[1]),B=J[2].toLowerCase(),Q=1024;if(B.startsWith("m"))Q=1048576;else if(B.startsWith("g"))Q=1073741824;return Math.floor(X*Q)},P=($)=>{let Z=$.trim().match(u0);if(!Z)throw Error(`Invalid interval format: ${$}`);let J=Number(Z[1]),X=Z[2].toLowerCase(),B=3600000;if(X==="d")B=86400000;else if(X==="w")B=604800000;return J*B},x=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:P($)}};var Z0=async($)=>{let Z=c0($),J=g0($),X;try{X=await p0.readdir(Z)}catch{return[]}return X.filter((B)=>B.startsWith(`${J}.`)&&l0.test(B)).map((B)=>`${Z}/${B}`)};var n0=["dev","prod","json"],i0=($)=>{let Z=$?.logRotation;if(!Z)return;try{if(Z.maxSize!==void 0)E(Z.maxSize);if(Z.maxFiles!==void 0)x(Z.maxFiles);if(Z.interval!==void 0)P(Z.interval);if(Z.compression!==void 0&&Z.compression!=="gzip")throw Error(`Invalid compression algorithm: ${Z.compression}`)}catch(J){let X=J instanceof Error?J.message:String(J);throw Error(`logixlysia: invalid logRotation config — ${X}`,{cause:J})}},a0={dev:{pino:{prettyPrint:!0},showContextTree:!0,showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0},json:{pino:{prettyPrint:!1},showContextTree:!1,showStartupMessage:!1,useColors:!1},prod:{autoRedact:!0,pino:{prettyPrint:!1},requestId:!0,showContextTree:!1,showStartupMessage:!1,useColors:!1}},s0=($,Z)=>{if(!Z)return $;let J={...$,...Z};if($.pino||Z.pino)J.pino={...$.pino,...Z.pino,...$.pino?.prettyPrint!==void 0||Z.pino?.prettyPrint!==void 0?{prettyPrint:Z.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||Z.logFilter)J.logFilter={...$.logFilter,...Z.logFilter};if($.logRotation||Z.logRotation)J.logRotation={...$.logRotation,...Z.logRotation};if($.timestamp||Z.timestamp)J.timestamp={...$.timestamp,...Z.timestamp};return J},c=($={})=>{let{preset:Z}=$;if(Z&&!n0.includes(Z))throw Error(`logixlysia: invalid preset — ${Z}`);let J=Z?{...$,config:s0(a0[Z],$.config)}:$;return i0(J.config),J};var o0=Object.freeze({}),m=()=>{let $=new WeakMap,Z=(J)=>{let X=$.get(J);if(!X)X={},$.set(J,X);return X};return{clearContext(J){$.delete(J)},getContext(J){let X=$.get(J);return X?{...X}:{}},mergeContext(J,X){if(Object.keys(X).length===0)return;let B=Z(J);Object.assign(B,X)},peekContext(J){return $.get(J)??o0}}},J0=($,Z)=>{let J=$.context,X=Object.keys(Z).length>0,B=J!==void 0&&J!==null&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0;if(!(X||B))return $;let Q={...Z,...B?J:{}};return{...$,context:Q}};import{AsyncLocalStorage as t0}from"node:async_hooks";var d=new t0,r0={debug:()=>{return},error:()=>{return},info:()=>{return},mergeContext:()=>{return},warn:()=>{return}},e0=()=>d.getStore()??r0;import{createRequire as X0}from"node:module";var $$=(()=>{try{return X0(import.meta.url)("elysia/package.json")}catch{return{}}})(),Z$=(()=>{try{return X0(import.meta.url)("../../package.json")}catch{return{}}})(),J$=($,Z)=>{if($.length>=Z)return $.slice(0,Z);let J=Math.floor((Z-$.length)/2),X=Z-$.length-J;return`${" ".repeat(J)}${$}${" ".repeat(X)}`},B0=($,Z)=>{let{version:J}=$$,X=J?`Elysia v${J}`:"Elysia",B=[{kind:"empty"},{kind:"center",text:X},{kind:"empty"},{kind:"left",text:$}];if(Z)B.push({kind:"left",text:Z});B.push({kind:"empty"});let G=Math.max(X.length,$.length,...Z?[Z.length]:[0])+4,N=`┌${"─".repeat(G)}┐`,Y=`└${"─".repeat(G)}┘`,z=`│${" ".repeat(G)}│`,U=[N];for(let W of B){if(W.kind==="empty"){U.push(z);continue}if(W.kind==="center"){U.push(`│${J$(W.text,G)}│`);continue}let{text:H}=W,j=Math.max(0,G-H.length-4);U.push(`│ ${H}${" ".repeat(j)} │`)}return U.push(Y),U.join(`
2
+ `)},Q0=()=>{let $=Z$.version;if(!$)return null;return` logixlysia v${$}`};var u=($,Z)=>{if(!(Z.config?.showStartupMessage??!0))return;let{port:X,hostname:B,protocol:Q}=$;if(X===void 0||!B||!Q)return;let G=`${Q}://${B}:${X}`,N=`\uD83E\uDD8A Elysia is running at ${G}`,Y=`\uD83E\uDD8A ${G}`;if((Z.config?.startupMessageFormat??"banner")==="simple"){console.log(N);return}console.log(B0(Y,Q0()))};import{StatusMap as X$}from"elysia";var B$=/^\d+$/,Q$=/[_-]+/g,G$=/([a-z0-9])([A-Z])/g,Y$=/([A-Z])([A-Z][a-z])/g,N$=/['’]/g,H$=/[^a-z0-9\s]+/g,j$=/\s+/g,G0=($)=>{let Z=$.trim();if(!Z)return"";return Z.replace(Q$," ").replace(G$,"$1 $2").replace(Y$,"$1 $2").replace(N$,"").toLowerCase().replace(H$," ").replace(j$," ").trim()},z$=(()=>{let $=new Map;for(let[Z,J]of Object.entries(X$))$.set(G0(Z),J);return $})(),v=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Z=$.trim();if(B$.test(Z))return Number(Z);return z$.get(G0(Z))??500}return 500};import q0 from"pino";import T2 from"pino-pretty";var W$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,V$=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,U$=/\b(?:\d[ -]*?){13,19}\b/g,F$=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var N0=["authorization","proxy-authorization","cookie","set-cookie","x-api-key","api-key","apikey","x-auth-token","password","passwd","secret","client-secret","token","access-token","refresh-token","id-token","session","session-id","private-key","credit-card","card-number","cvv","ssn"],M$=/([a-z0-9])([A-Z])/g,Y0=($)=>$.replace(M$,"$1-$2").replaceAll("_","-").toLowerCase(),i=($,Z)=>{let J=Y0($);if(N0.includes(J))return!0;return Z?.some((X)=>Y0(X)===J)??!1},H0=($)=>{return[...N0,...$??[]].flatMap((J)=>{if(J.includes("-"))return[`["${J}"]`,`*["${J}"]`];return[J,`*.${J}`]})};var l=($)=>_($).replaceAll("[REDACTED]","redacted"),K$=($)=>{try{let Z=new URL($);if(Z.username!=="")Z.username=l(Z.username);if(Z.password!=="")Z.password=l(Z.password);return Z.hostname=l(Z.hostname),Z.pathname=_(Z.pathname),Z.search=_(Z.search),Z.hash=_(Z.hash),Z.toString()}catch{return _($).replaceAll("[REDACTED]","redacted")}},O$=($)=>{if($.length<13||$.length>19)return!1;let Z=0,J=!1;for(let X=$.length-1;X>=0;X-=1){let B=$.charCodeAt(X);if(B<48||B>57)return!1;let Q=B-48;if(J){if(Q*=2,Q>9)Q-=9}Z+=Q,J=!J}return Z%10===0},I$=($)=>$.replace(U$,(Z)=>{let J=Z.replace(/\D/g,"");if(J.length>=13&&J.length<=19&&O$(J))return"[REDACTED]";return Z}),_=($)=>{let Z=$;return Z=Z.replace(W$,"[REDACTED]"),Z=Z.replace(V$,"[REDACTED]"),Z=I$(Z),Z=Z.replace(F$,"[REDACTED]"),Z},A$=($,Z,J)=>{let X=_($.message),B=Object.getPrototypeOf($),Q=Object.create(B);if(Q.message=X,Q.name=$.name,$.stack!==void 0)Q.stack=_($.stack);let G=$;for(let N of Object.keys(G))if(N!=="message"&&N!=="name"&&N!=="stack")Q[N]=i(N,J)?"[REDACTED]":h(G[N],Z,J);return Q},_$=($,Z,J)=>{let X;for(let[B,Q]of $.entries()){let G=h(Q,Z,J);if(X===void 0&&G!==Q)X=$.slice(0,B);X?.push(G)}return X??$},D$=($,Z,J)=>{let X=Object.keys($),B;for(let[Q,G]of X.entries()){let N=$[G],Y=i(G,J),z=Y?"[REDACTED]":h(N,Z,J);if(B===void 0&&(Y||z!==N)){B={};for(let U of X.slice(0,Q))B[U]=$[U]}if(B!==void 0)B[G]=z}return B??$},n=($,Z,J)=>{Z.add($);try{return J()}finally{Z.delete($)}},h=($,Z,J)=>{if($===null||$===void 0)return $;if(typeof $==="string")return _($);if(typeof $!=="object")return $;if($ instanceof Date)return $;let B=$;if(Z.has(B))return"[Circular]";if($ instanceof Error)return n(B,Z,()=>A$($,Z,J));if(Array.isArray($))return n(B,Z,()=>_$($,Z,J));return n(B,Z,()=>D$($,Z,J))},j0=($,Z)=>h($,new WeakSet,Z),z0=($,Z)=>{let J=K$($.url),X=new Headers,B=!1;for(let[z,U]of $.headers.entries()){let W=i(z,Z)?"[REDACTED]":_(U);if(W!==U)B=!0;X.set(z,W)}let Q=_($.method),G=J!==$.url,N=Q!==$.method;if(!(G||B||N))return $;let Y={headers:X,method:Q,redirect:$.redirect,signal:$.signal};return new Request(J,Y)};import{STATUS_CODES as T$}from"node:http";import F from"chalk";var S=($)=>{if($ instanceof Error)return $.message;if($&&typeof $==="object"&&"message"in $)return $.message;return String($)},a=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("internal"in $)),L$=($)=>$ instanceof Error&&($.code==="VALIDATION"||$.name==="ValidationError"||$.constructor?.name==="ValidationError"),R$=["fix","internal","link","message","name","status","why"],W0=($)=>{let Z={};for(let J of R$)if($[J]!==void 0)Z[J]=$[J];return Z},V0=($,Z)=>{if(L$($)&&!Z){let X=(Array.isArray($.all)?$.all:[]).map((G)=>typeof G==="object"&&G!==null&&("path"in G)?String(G.path):"").filter(Boolean),B=typeof $.type==="string"?$.type:"request",Q=X.length>0?`Validation failed (${B}): ${X.join(", ")}`:`Validation failed (${B})`;return{error:{failedPaths:X,name:"ValidationError",type:B},message:Q}}if($ instanceof Error){let J=W0($);return J.message=$.message,J.name=$.name==="Error"?$.constructor?.name??$.name:$.name,{error:J,message:S($)}}if(a($))return{error:W0($),message:S($)};return{error:{value:String($)},message:S($)}};var b$=($)=>$<=8||$>=11&&$<=31||$>=127&&$<=159,R=($,Z=2048)=>{let J=$.replaceAll("\r",String.raw`\r`).replaceAll(`
3
+ `,String.raw`\n`).replaceAll("\t",String.raw`\t`),X="";for(let B of J){let Q=B.codePointAt(0)??0;if(!b$(Q))X+=B}if(X.length>Z)X=`${X.slice(0,Z)}…`;return X};var C=($)=>String($).padStart(2,"0"),w$=($)=>String($).padStart(3,"0"),E$=500,P$=1000,S$=7,C$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",U0=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,F0=($)=>{let{config:Z}=$,J=Z?.useColors??!0,X=typeof process<"u"&&process.stdout?.isTTY===!0;return J&&X},f$=($,Z)=>{if(!Z)return $.toISOString();let J=String($.getFullYear()),X=C($.getMonth()+1),B=C($.getDate()),Q=C($.getHours()),G=C($.getMinutes()),N=C($.getSeconds()),Y=w$($.getMilliseconds());return Z.replaceAll("yyyy",J).replaceAll("mm",X).replaceAll("dd",B).replaceAll("HH",Q).replaceAll("MM",G).replaceAll("ss",N).replaceAll("SSS",Y)},q$=($)=>{let Z=$.headers.get("x-forwarded-for"),J=Z?Z.split(",")[0]?.trim()??"":$.headers.get("x-real-ip")??"";return R(J,64)},y$=($)=>{if($>=1000){let Z=$/1000;if(Z>=10)return`${Math.round(Z)}s`;let J=Z.toFixed(1);return J.endsWith(".0")?`${Math.round(Z)}s`:`${J}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},k$=($)=>{let{config:Z}=$;return{slow:Z?.slowThreshold??E$,verySlow:Z?.verySlowThreshold??P$}},x$=($,Z,J,X)=>{let B=y$($),Q=$>=X;if(!Z)return{isVerySlow:Q,text:B};let G=B;if($<J)G=F.green(B);else if($<X)G=F.yellow(B);else G=F.red.bold(B);return{isVerySlow:Q,text:G}},m$=($,Z)=>{if(!$)return"";let J="⚡ slow";if(!Z)return` ${J}`;return` ${F.yellow(J)}`},v$=($,Z)=>{if(!Z)return"\uD83E\uDD8A";if($==="ERROR")return F.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return F.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return F.bgBlue.black(" \uD83E\uDD8A ");return F.bgGreen.black(" \uD83E\uDD8A ")},h$=($,Z)=>{if(!Z)return $;if($==="ERROR")return F.bgRed.black($);if($==="WARNING")return F.bgYellow.black($);if($==="DEBUG")return F.bgBlue.black($);return F.bgGreen.black($)},p$=($,Z)=>{if(!Z)return $;let J=$.toUpperCase();if(J==="GET")return F.green.bold(J);if(J==="POST")return F.blue.bold(J);if(J==="PUT")return F.yellow.bold(J);if(J==="PATCH")return F.yellowBright.bold(J);if(J==="DELETE")return F.red.bold(J);if(J==="OPTIONS")return F.cyan.bold(J);if(J==="HEAD")return F.greenBright.bold(J);if(J==="TRACE")return F.magenta.bold(J);if(J==="CONNECT")return F.cyanBright.bold(J);return F.white.bold(J)},g$=($,Z)=>{if(!Z)return $;let J=Number.parseInt($,10);if(!Number.isFinite(J))return $;if(J>=500)return F.red($);if(J>=400)return F.yellow($);if(J>=300)return F.cyan($);if(J>=200)return F.green($);return F.gray($)},c$=($,Z)=>{if(!Z)return $;return F.gray($)},d$=($,Z)=>{if(!Z)return $;return F.whiteBright($)},u$=($)=>{return T$[$]??""},l$=($,Z)=>{let J=$.config?.service?.trim();if(!J)return"";let X=`[${J}]`;if(!Z)return`${X} `;return`${F.dim(X)} `},s=($)=>{let{config:Z}=$,J=F0($),X=Z?.customLogFormat??C$,B=new Set(X.match(U0)??[]),{slow:Q,verySlow:G}=k$($),N=l$($,J);return{format:X,serviceToken:N,slowThreshold:Q,tokens:B,useColors:J,verySlowThreshold:G}},M0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return R($);if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return R($.message);try{return R(JSON.stringify($))}catch{return R(String($))}},n$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),K0=($,Z,J)=>{let X=[];for(let[B,Q]of Object.entries($)){let G=Z?`${Z}.${B}`:B;if(n$(Q)&&J>1)X.push(...K0(Q,G,J-1));else X.push([G,M0(Q)])}return X},i$=($,Z)=>{if($.length===0)return[];let J=[],X=$.length-1;for(let B=0;B<$.length;B+=1){let Q=B===X?"└─":"├─",G=$[B];if(!G)continue;let[N,Y]=G,z=Z?F.cyan(N):N,U=Z?F.white(Y):Y;J.push(` ${Q} ${z} ${U}`)}return J},a$=($)=>{let Z=[],J=S($);if(J)Z.push(["error",J]);if(a($)){if($.why!==void 0)Z.push(["error.why",String($.why)]);if($.fix!==void 0)Z.push(["error.fix",String($.fix)]);if($.link!==void 0)Z.push(["error.link",String($.link)]);if($.internal!==void 0)Z.push(["error.internal",M0($.internal)])}return Z},s$=($,Z,J,X=F0(J))=>{if(J.config?.showContextTree===!1)return[];let B=J.config?.contextDepth??1,Q=[],G=Z.context;if(G&&typeof G==="object"&&!Array.isArray(G)&&Object.keys(G).length>0&&B>=1)Q.push(...K0(G,"",B));if($==="ERROR"&&"error"in Z&&Z.error!==void 0)Q.push(...a$(Z.error));return i$(Q,X)},o$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},t$=($,Z,J)=>{if(!($.has("{now}")||$.has("{epoch}")))return{epoch:"",timestamp:""};let X=new Date,B=$.has("{epoch}")?String(X.getTime()):"";if(!$.has("{now}"))return{epoch:B,timestamp:""};let Q=f$(X,Z);return{epoch:B,timestamp:c$(Q,J)}},r$=($,Z)=>{if(!$.has("{message}"))return"";return typeof Z.message==="string"?Z.message:""},e$=($,Z,J,X,B)=>{let Q=$.has("{pathname}")||$.has("{path}"),G=$.has("{query}");if(!(Q||G))return{coloredPathname:"",query:""};let N,Y;if(B)({pathname:N,search:Y}=B);else try{({pathname:N,search:Y}=new URL(Z.url))}catch{N=Z.url||"/",Y=""}let z=G?Y:"";if(!Q)return{coloredPathname:"",query:z};let U=J?.logQueryParams?`${N}${Y}`:N;return{coloredPathname:d$(U,X),query:z}},$2=($,Z,J)=>{let X=$.has("{status}"),B=$.has("{statusText}");if(!(X||B))return{coloredStatus:"",statusText:""};let Q=Z.status,G=Q===null||Q===void 0?200:v(Q);return{coloredStatus:X?g$(String(G),J):"",statusText:B?u$(G):""}},Z2=($,Z,J)=>J?.ip===!0&&$.has("{ip}")?q$(Z):"",J2=($)=>$!==null&&$!==void 0&&typeof $==="object"&&!Array.isArray($)&&Object.keys($).length>0,X2=($,Z,J)=>{if(!$.has("{context}"))return"";if(J?.showContextTree!==!1&&J2(Z.context))return"";return o$(Z.context)},B2=($,Z,J,X,B,Q)=>{let G=$.has("{duration}"),N=$.has("{speed}");if(!(G||N))return{coloredDuration:"",speedToken:""};let Y=Q?.durationMs??(Z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Z.beforeTime)/1e6),{text:z,isVerySlow:U}=x$(Y,J,X,B);return{coloredDuration:G?z:"",speedToken:N?m$(U,J):""}},Q2=($,Z)=>{if(!$.has("{requestId}"))return"";let J=Z.context;if(typeof J!=="object"||J===null||!("requestId"in J))return"";return String(J.requestId)},O0=({level:$,request:Z,data:J,store:X,options:B,formatContext:Q,precomputed:G})=>{let{config:N}=B,{format:Y,serviceToken:z,slowThreshold:U,tokens:W,useColors:H,verySlowThreshold:j}=Q??s(B),{timestamp:V,epoch:A}=t$(W,N?.timestamp?.translateTime,H),O=r$(W,J),{coloredPathname:D,query:y}=e$(W,Z,N,H,G),{coloredStatus:T,statusText:k}=$2(W,J,H),w=Z2(W,Z,N),M=X2(W,J,N),K=W.has("{level}")?h$($,H):"",I=W.has("{method}")?p$(Z.method.toUpperCase().padEnd(S$),H):"",{coloredDuration:L,speedToken:g}=B2(W,X,H,U,j,G),x0=W.has("{icon}")?v$($,H):"",m0=Q2(W,J),v0={"{context}":M,"{duration}":L,"{epoch}":A,"{icon}":x0,"{ip}":w,"{level}":K,"{message}":O,"{method}":I,"{now}":V,"{path}":D,"{pathname}":D,"{query}":y,"{requestId}":m0,"{service}":z,"{speed}":g,"{status}":T,"{statusText}":k},h0=Y.replace(U0,($0)=>v0[$0]??$0);return{contextLines:s$($,J,B,H),main:h0}};var I0=0,G2=5000,A0=($,Z)=>{if(Z){try{Z({error:$,sink:"transport"})}catch{}return}let J=Date.now();if(J-I0<G2)return;I0=J,console.error("[logixlysia] transport failed:",$)},_0=($)=>{let{level:Z,request:J,data:X,store:B,options:Q,precomputed:G}=$,N=Q.config?.transports??[];if(N.length===0)return;let Y=Q.config?.onError,z=typeof X.message==="string"?X.message:"",U={request:{method:J.method,url:J.url},...X,durationMs:G?.durationMs??(B.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-B.beforeTime)/1e6)};for(let W of N)try{let H=W.log(Z,z,U);if(H&&typeof H.catch==="function")H.catch((j)=>A0(j,Y))}catch(H){A0(H,Y)}};import{open as K2}from"node:fs/promises";import{dirname as O2}from"node:path";import{promises as Y2}from"node:fs";var D0=async($,Z=448)=>{await Y2.mkdir($,{mode:Z,recursive:!0})};import{promises as b}from"node:fs";import{promisify as N2}from"node:util";import{gzip as H2}from"node:zlib";var L0=()=>{let $=new Map;return{acquire:async(J)=>{let X=$.get(J)??Promise.resolve(),B,Q=new Promise((G)=>{B=G});return $.set(J,Q),await X,()=>{if(B?.(),$.get(J)===Q)$.delete(J)}}}};var j2=N2(H2),z2=L0(),R0=($,Z,J)=>{if(J){J(Z);return}console.error($,Z)},f=($)=>String($).padStart(2,"0"),W2=($,Z)=>{let J=Z.getFullYear(),X=f(Z.getMonth()+1),B=f(Z.getDate()),Q=f(Z.getHours()),G=f(Z.getMinutes()),N=f(Z.getSeconds()),Y=String(Z.getMilliseconds()).padStart(3,"0");return`${$}.${J}-${X}-${B}-${Q}-${G}-${N}-${Y}`},V2=async($)=>{try{if((await b.stat($)).size===0)return""}catch{return""}let J=`${W2($,new Date)}-${process.hrtime.bigint()}`;return await b.rename($,J),J},U2=async($,Z)=>{let J=await z2.acquire($);try{try{await b.access($)}catch{return}let X=await b.readFile($),B=await j2(X);await b.writeFile(`${$}.gz`,B),await b.rm($,{force:!0})}catch(X){throw R0(`[logixlysia] Failed to compress file ${$}:`,X,Z),X}finally{J()}};var F2=($)=>$.status==="fulfilled",M2=async($,Z,J)=>{let X=await Z0($);if(X.length===0)return;if(Z.type==="count"&&X.length<=Z.value)return;let Q=(await Promise.allSettled(X.map(async(Y)=>({path:Y,stat:await b.stat(Y)})))).filter(F2).map((Y)=>Y.value),G;if(Z.type==="count"){if(Q.length<=Z.value)return;Q.sort((Y,z)=>z.stat.mtimeMs-Y.stat.mtimeMs),G=Q.slice(Z.value)}else{let Y=Date.now();G=Q.filter(({stat:z})=>Y-z.mtimeMs>Z.value)}(await Promise.allSettled(G.map(({path:Y})=>b.rm(Y,{force:!0})))).forEach((Y,z)=>{if(Y.status==="rejected")R0(`[logixlysia] Failed to delete rotated log ${G[z].path}:`,Y.reason,J)})},b0=async($,Z,J)=>{let X=await V2($);if(!X)return;if(Z.compress===!0){if((Z.compression??"gzip")==="gzip")await U2(X,J)}if(Z.maxFiles!==void 0){let Q=x(Z.maxFiles);await M2($,Q,J)}};var I2=($,Z)=>$&&$>0?$:Z;class w0{filePath;handle=null;bytesWritten=0;openedAt=0;latestOptions={};pendingBatch=null;flushChain=Promise.resolve();constructor($){this.filePath=$}write($,Z){return this.latestOptions=Z,new Promise((J,X)=>{if(this.pendingBatch){this.pendingBatch.lines.push($),this.pendingBatch.resolvers.push({reject:X,resolve:J});return}let B={lines:[$],resolvers:[{reject:X,resolve:J}]};this.pendingBatch=B,queueMicrotask(()=>{this.pendingBatch=null,this.flushChain=this.flushChain.then(()=>this.flushBatch(B),()=>this.flushBatch(B))})})}async flushBatch($){let Z=this.latestOptions,J=$.lines.join("");try{await this.ensureOpen(Z),await this.handle.write(J),this.bytesWritten+=Buffer.byteLength(J)}catch(X){for(let B of $.resolvers)B.reject(X);return}await this.maybeRotate(Z);for(let X of $.resolvers)X.resolve()}async ensureOpen($){if(this.handle)return;await D0(O2(this.filePath),$.logDirMode);let Z=await K2(this.filePath,"a",$.logFileMode??384),J=await Z.stat();this.handle=Z,this.bytesWritten=J.size,this.openedAt=I2(J.birthtimeMs,Date.now())}shouldRotateNow($){if($.maxSize!==void 0&&this.bytesWritten>E($.maxSize))return!0;return $.interval!==void 0&&Date.now()-this.openedAt>=P($.interval)}async maybeRotate($){let Z=$.logRotation;if(!Z||Z.maxSize===void 0&&Z.interval===void 0)return;try{if(!this.shouldRotateNow(Z))return;let{handle:J}=this;this.handle=null,this.bytesWritten=0,this.openedAt=Date.now(),await J?.close(),await b0(this.filePath,Z,$.onRotationError)}catch(J){if($.onRotationError)$.onRotationError(J);else console.error(`[logixlysia] Failed to rotate log file ${this.filePath}:`,J)}}}var T0=new Map,E0=($)=>{let Z=T0.get($);if(!Z)Z=new w0($),T0.set($,Z);return Z};var A2=($,Z,J)=>{if(J){let{pathname:X,search:B}=J;return Z?`${X}${B}`:X}try{let{pathname:X,search:B}=new URL($.url);return Z?`${X}${B}`:X}catch{return $.url}},P0=($,Z,J,X)=>{let B=$?.onError;if(!B){console.error(J,X);return}try{B({error:X,sink:Z})}catch{}},S0=async($)=>{let{filePath:Z,level:J,request:X,data:B,store:Q,options:G,precomputed:N}=$,{config:Y}=G,z=Y?.useTransportsOnly===!0,U=Y?.disableFileLogging===!0;if(z||U)return;let W=typeof B.message==="string"?B.message:"",H=N?.durationMs??(Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6),j=A2(X,Y?.logQueryParams,N),V=`${J} ${H.toFixed(2)}ms ${X.method} ${R(j,1024)} ${R(W)}
4
+ `,A=Y?.onError?(O)=>P0(Y,"rotation","",O):void 0;try{await E0(Z).write(V,{logDirMode:Y?.logDirMode,logFileMode:Y?.logFileMode,logRotation:Y?.logRotation,onRotationError:A})}catch(O){throw P0(Y,"file",`[logixlysia] Failed to write to log file ${Z}:`,O),O}};var C0=($)=>{let Z=$?.useTransportsOnly===!0,J=$?.disableInternalLogger===!0,X=$?.disableFileLogging===!0,B=($?.transports?.length??0)>0,Q=!(Z||X)&&!!$?.logFilePath,G=!(Z||J);return{hasFileLogging:Q,hasInternalLogger:G,hasTransports:B,isEffectivelyDisabled:!(B||Q||G),needsUrlParts:Q||G}},q=($,Z)=>{if(!Z?.level||Z.level.length===0)return!0;return Z.level.includes($)},_2=($)=>$.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-$.beforeTime)/1e6,D2=($)=>{try{let{pathname:Z,search:J}=new URL($.url);return{pathname:Z,search:J}}catch{return{pathname:$.url||"/",search:""}}},L2=($,Z,J)=>{let X=_2($),{pathname:B,search:Q}=J?D2(Z):{pathname:"",search:""};return{durationMs:X,pathname:B,search:Q}},R2=($)=>{switch($){case"DEBUG":return console.debug;case"INFO":return console.info;case"WARNING":return console.warn;case"ERROR":return console.error;default:return console.log}},p=({contextStore:$,data:Z,formatContext:J,level:X,options:B,request:Q,sinks:G,store:N})=>{let{config:Y}=B;if(G.isEffectivelyDisabled||!q(X,Y?.logFilter))return;let z=J0(Z,$.peekContext(Q)),U=Y?.autoRedact===!0?j0(z,Y?.redactKeys):z,W=Y?.autoRedact===!0?z0(Q,Y?.redactKeys):Q,H=L2(N,W,G.needsUrlParts);if(G.hasTransports)_0({data:U,level:X,options:B,precomputed:H,request:W,store:N});if(G.hasFileLogging){let O=Y?.logFilePath;if(O)S0({data:U,filePath:O,level:X,options:B,precomputed:H,request:W,store:N}).catch(()=>{})}if(!G.hasInternalLogger)return;let{main:j,contextLines:V}=O0({data:U,formatContext:J,level:X,options:B,precomputed:H,request:W,store:N}),A=V.length>0?`${j}
5
+ ${V.join(`
6
+ `)}`:j;R2(X)(A)};var b2=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",f0=($,Z,J,X,B,Q,G)=>{let{config:N}=X,Y=b2(Z)?Z.status:500,z=Y>=400&&Y<500?"WARNING":"ERROR";if(Q.isEffectivelyDisabled||!q(z,N?.logFilter))return;let{error:U,message:W}=V0(Z,N?.logErrorPayload===!0);p({contextStore:B,data:{error:U,message:W,status:Y},formatContext:G,level:z,options:X,request:$,sinks:Q,store:J})};var y0=($={},Z=q0,J)=>{let X=J??m(),{config:B}=$,Q=s($),G=B?.pino,{prettyPrint:N,...Y}=G??{},z=typeof N==="object"&&N!==null?N:void 0,W=(N===!0||z!==void 0)&&Y.transport===void 0,H=z?.messageKey??Y.messageKey,j=z?.errorKey??Y.errorKey,V={...Y,errorKey:j,level:Y.level??"info",messageKey:H,...B?.autoRedact===!0&&Y.redact===void 0?{redact:{censor:"[REDACTED]",paths:H0(B?.redactKeys)}}:{}},A=()=>T2({colorize:process.stdout?.isTTY===!0,translateTime:B?.timestamp?.translateTime,...z,errorKey:j,messageKey:H}),O,D=()=>{if(!O)O=W?Z(V,A()):Z({...V,transport:Y.transport});return O},y=new Proxy({},{get(M,K){let I=D(),L=I[K];return typeof L==="function"?L.bind(I):L},has:(M,K)=>(K in D())});if(B?.pino!==void 0)D();let T=C0(B),k=(M,K,I,L)=>{p({contextStore:X,data:I,formatContext:Q,level:M,options:$,request:K,sinks:T,store:L})},w=(M,K,I,L)=>{if(T.isEffectivelyDisabled||!q(M,B?.logFilter))return;let g={beforeTime:process.hrtime.bigint()};k(M,K,{context:L,message:I},g)};return{debug:(M,K,I)=>{w("DEBUG",M,K,I)},error:(M,K,I)=>{w("ERROR",M,K,I)},getContext:(M)=>X.getContext(M),handleHttpError:(M,K,I)=>{f0(M,K,I,$,X,T,Q)},info:(M,K,I)=>{w("INFO",M,K,I)},log:k,mergeContext:(M,K)=>{X.mergeContext(M,K)},pino:y,warn:(M,K,I)=>{w("WARNING",M,K,I)}}},o=($,Z)=>y0($,q0,Z);var w2=/^[A-Za-z0-9._-]{1,128}$/,t=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,generator:()=>crypto.randomUUID(),header:"X-Request-Id"};if($.enabled===!1)return null;return{enabled:!0,generator:$.generator??(()=>crypto.randomUUID()),header:$.header?.trim()||"X-Request-Id"}},r=($,Z)=>{let J=$.headers.get(Z.header);if(J&&w2.test(J))return J;return Z.generator()};var k0=new Map,E2=($)=>{let Z=k0.get($);if(!Z)Z=new Request(`http://logixlysia.local${$}`,{method:"WS"}),k0.set($,Z);return Z},e=($,Z,J)=>{let X=new WeakMap,B=(Q,G,N,Y,z)=>{let U=G,H={beforeTime:X.get(U)??process.hrtime.bigint()},j=J.peekContext(U),V=Object.keys(j).length>0||z?{...j,...z,wsId:G.id}:{wsId:G.id};Z.log(Q,E2(N),{context:V,message:Y,status:200},H)};return(Q,G)=>({...G,close(N){if(G.close?.(N),$.config?.disableWebSocketLogging!==!0)B("INFO",N,Q,"WebSocket closed");J.clearContext(N),X.delete(N)},message(N,Y){if(G.message?.(N,Y),$.config?.disableWebSocketLogging!==!0)B("INFO",N,Q,"WebSocket message",{payloadType:typeof Y})},open(N){if(X.set(N,process.hrtime.bigint()),G.open?.(N),$.config?.disableWebSocketLogging!==!0)B("INFO",N,Q,"WebSocket opened")}})};var S2=($={})=>{let Z=c($),J=new WeakSet,X=new WeakMap,B=m(),Q=o(Z,B),G=e(Z,Q,B),N=t(Z.config?.requestId),Y={...Q,debug:(H,j,V)=>{J.add(H),Q.debug(H,j,V)},error:(H,j,V)=>{J.add(H),Q.error(H,j,V)},info:(H,j,V)=>{J.add(H),Q.info(H,j,V)},warn:(H,j,V)=>{J.add(H),Q.warn(H,j,V)}},z=(H)=>({debug:(j,V)=>Y.debug(H,j,V),error:(j,V)=>Y.error(H,j,V),info:(j,V)=>Y.info(H,j,V),mergeContext:(j)=>B.mergeContext(H,j),warn:(j,V)=>Y.warn(H,j,V)}),W=new P2({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).state("logger",Y).state("pino",Y.pino).state("beforeTime",BigInt(0)).derive(({request:H})=>({log:z(H)})).onStart(({server:H})=>{if(H)u(H,Z);else{let j=Number(process.env.PORT)||3000,V=process.env.HOST||"localhost";u({hostname:V,port:j,protocol:"http"},Z)}}).onRequest(({request:H})=>{if(X.set(H,process.hrtime.bigint()),N){let j=r(H,N);B.mergeContext(H,{requestId:j})}if(Z.config?.useAsyncLocalStorage)d.enterWith(z(H))}).onAfterHandle(({request:H,set:j})=>{try{if(N){let T=B.getContext(H).requestId;if(T)j.headers[N.header]=T}if(J.has(H))return;let V=j.status===void 0||j.status===null?200:v(j.status),A="INFO";if(V>=500)A="ERROR";else if(V>=400)A="WARNING";let O=B.getContext(H),D={status:V};if(Object.keys(O).length>0)D.context={...O};Y.log(A,H,D,{beforeTime:X.get(H)??BigInt(0)})}finally{X.delete(H),B.clearContext(H)}}).onError(({request:H,error:j,set:V})=>{try{if(N){let O=B.getContext(H).requestId;if(O)V.headers[N.header]=O}Y.handleHttpError(H,j,{beforeTime:X.get(H)??BigInt(0)})}finally{X.delete(H),B.clearContext(H)}}).as("scoped");return Object.assign(W,{wrapWs:G})},Z4=S2;export{e0 as useLogger,t as resolveRequestIdConfig,c as resolveOptions,r as getOrCreateRequestId,Z4 as default,e as createWsHandlerWrapper,o as createPluginLogger,y0 as createLogger};
8
7
 
9
- //# debugId=670B6FB1AC9D6E3864756E2164756E21
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvY29udGV4dC9zdG9yYWdlLnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiLCAic3JjL21pZGRsZXdhcmUvcmVxdWVzdC1pZC50cyIsICJzcmMvd2Vic29ja2V0L3dyYXAtd3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB7IGxvZ2dlclN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dpeGx5c2lhU3RvcmUsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXJcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmltcG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyXG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhUGx1Z2luID0gTG9naXhseXNpYSAmIHtcbiAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxufVxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChyYXdPcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhUGx1Z2luID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKHJhd09wdGlvbnMpXG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgY29udGV4dFN0b3JlID0gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVQbHVnaW5Mb2dnZXIob3B0aW9ucywgY29udGV4dFN0b3JlKVxuICBjb25zdCB3cmFwV3MgPSBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyKG9wdGlvbnMsIGJhc2VMb2dnZXIsIGNvbnRleHRTdG9yZSlcbiAgY29uc3QgcmVxdWVzdElkQ29uZmlnID0gcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyhvcHRpb25zLmNvbmZpZz8ucmVxdWVzdElkKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlciA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT4gKHtcbiAgICBkZWJ1ZzogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBpbmZvOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgd2FybjogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci53YXJuKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGVycm9yOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIG1lcmdlQ29udGV4dDogcGFydGlhbCA9PiBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gIH0pXG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciDigJQgZGVyaXZlZCBsb2cgdHlwaW5nIG1hdGNoZXMgTG9naXhseXNpYVNpbmdsZXRvbi5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5kZXJpdmUoKHsgcmVxdWVzdCB9KSA9PiAoeyBsb2c6IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkgfSkpXG4gICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgc3RhcnRTZXJ2ZXIoc2VydmVyLCBvcHRpb25zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwXG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcHJvY2Vzcy5lbnYuSE9TVCB8fCAnbG9jYWxob3N0J1xuICAgICAgICBzdGFydFNlcnZlcih7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbDogJ2h0dHAnIH0sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25SZXF1ZXN0KCh7IHJlcXVlc3QsIHN0b3JlIH0pID0+IHtcbiAgICAgIHN0b3JlLmJlZm9yZVRpbWUgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBnZXRPckNyZWF0ZVJlcXVlc3RJZChyZXF1ZXN0LCByZXF1ZXN0SWRDb25maWcpXG4gICAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgeyByZXF1ZXN0SWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy51c2VBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgICBsb2dnZXJTdG9yYWdlLmVudGVyV2l0aChjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgICAgY29uc3QgaWQgPSBjdHgucmVxdWVzdElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgc2V0LmhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5hcygnc2NvcGVkJykgYXMgTG9naXhseXNpYVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHBsdWdpbiwgeyB3cmFwV3MgfSkgYXMgTG9naXhseXNpYVBsdWdpblxufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9wZXJmb3JtYW5jZS9ub0JhcnJlbEZpbGU6IHB1YmxpYyBwYWNrYWdlIGVudHJ5IHJlLWV4cG9ydHNcbmV4cG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuZXhwb3J0IHsgdXNlTG9nZ2VyIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdElkQ29uZmlnLFxuICBSZXF1ZXN0U2NvcGVkTG9nZ2VyLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHtcbiAgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQsXG4gIHJlc29sdmVSZXF1ZXN0SWRDb25maWdcbn0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQgdHlwZSB7IFdzSGFuZGxlckhvb2tzIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcbmV4cG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCB0eXBlIExvZ1ByZXNldCA9ICdkZXYnIHwgJ3Byb2QnIHwgJ2pzb24nXG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfVxuICB9LFxuICBwcm9kOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBqc29uOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHByZXNldCA9IG9wdGlvbnMucHJlc2V0XG4gIGlmICghcHJlc2V0KSB7XG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIGNvbnN0IHByZXNldENvbmZpZyA9IFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjb25maWc6IG1lcmdlQ29uZmlnKHByZXNldENvbmZpZywgb3B0aW9ucy5jb25maWcpXG4gIH1cbn1cbiIsCiAgICAiLyoqIEhUVFAgYFJlcXVlc3RgIG9yIFdlYlNvY2tldCBpbnN0YW5jZSBmb3IgYWNjdW11bGF0ZWQgY29udGV4dC4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRLZXkgPSBSZXF1ZXN0IHwgb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHRTdG9yZSB7XG4gIGNsZWFyQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gdm9pZFxuICBnZXRDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5KSA9PiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgbWVyZ2VDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5LCBwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSA9ICgpOiBSZXF1ZXN0Q29udGV4dFN0b3JlID0+IHtcbiAgY29uc3QgYmFncyA9IG5ldyBXZWFrTWFwPENvbnRleHRLZXksIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpXG5cbiAgY29uc3QgZ2V0T3JDcmVhdGUgPSAoa2V5OiBDb250ZXh0S2V5KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGxldCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgaWYgKCFiYWcpIHtcbiAgICAgIGJhZyA9IHt9XG4gICAgICBiYWdzLnNldChrZXksIGJhZylcbiAgICB9XG4gICAgcmV0dXJuIGJhZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0KGtleSkge1xuICAgICAgY29uc3QgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgICAgcmV0dXJuIGJhZyA/IHsgLi4uYmFnIH0gOiB7fVxuICAgIH0sXG4gICAgY2xlYXJDb250ZXh0KGtleSkge1xuICAgICAgYmFncy5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuXG4vKiogQWNjdW11bGF0ZWQgcmVxdWVzdCBjb250ZXh0IGZpcnN0OyBleHBsaWNpdCBgZGF0YS5jb250ZXh0YCB3aW5zIG9uIGtleSBjb2xsaXNpb24uICovXG5leHBvcnQgY29uc3QgbWVyZ2VMb2dEYXRhQ29udGV4dCA9IChcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGFjY3VtdWxhdGVkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkYXRhLmNvbnRleHRcbiAgY29uc3QgaGFzQWNjdW11bGF0ZWQgPSBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMFxuICBjb25zdCBoYXNFeHBsaWNpdCA9XG4gICAgZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGV4cGxpY2l0ICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGV4cGxpY2l0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGV4cGxpY2l0KSAmJlxuICAgIE9iamVjdC5rZXlzKGV4cGxpY2l0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuXG4gIGlmICghKGhhc0FjY3VtdWxhdGVkIHx8IGhhc0V4cGxpY2l0KSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBjb25zdCBtZXJnZWRDb250ZXh0ID0ge1xuICAgIC4uLmFjY3VtdWxhdGVkLFxuICAgIC4uLihoYXNFeHBsaWNpdCA/IChleHBsaWNpdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB7fSlcbiAgfVxuXG4gIHJldHVybiB7IC4uLmRhdGEsIGNvbnRleHQ6IG1lcmdlZENvbnRleHQgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RTY29wZWRMb2dnZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4gPVxuICBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4oKVxuXG5jb25zdCBOT09QX0xPR0dFUjogUmVxdWVzdFNjb3BlZExvZ2dlciA9IHtcbiAgZGVidWc6ICgpID0+IHVuZGVmaW5lZCxcbiAgaW5mbzogKCkgPT4gdW5kZWZpbmVkLFxuICB3YXJuOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVycm9yOiAoKSA9PiB1bmRlZmluZWQsXG4gIG1lcmdlQ29udGV4dDogKCkgPT4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCB1c2VMb2dnZXIgPSAoKTogUmVxdWVzdFNjb3BlZExvZ2dlciA9PlxuICBsb2dnZXJTdG9yYWdlLmdldFN0b3JlKCkgPz8gTk9PUF9MT0dHRVJcbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBlbHlzaWFQa2cudmVyc2lvblxuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcm93LnRleHRcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIHRleHQubGVuZ3RoIC0gNClcbiAgICBvdXQucHVzaChg4pSCICAke3RleHR9JHsnICcucmVwZWF0KHBhZGRpbmcpfSAg4pSCYClcbiAgfVxuICBvdXQucHVzaChib3QpXG4gIHJldHVybiBvdXQuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgdiA9IGxvZ2l4bHlzaWFQa2cudmVyc2lvblxuICBpZiAoIXYpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBgICAgICBsb2dpeGx5c2lhIHYke3Z9YFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lLCByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcbiAgY29uc3QgdXJsRGlzcGxheUxpbmUgPSBg8J+miiAgJHt1cmx9YFxuXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xuICBpZiAoZm9ybWF0ID09PSAnc2ltcGxlJykge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIodXJsRGlzcGxheUxpbmUsIGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSgpKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBwcmV0dHkgZnJvbSAncGluby1wcmV0dHknXG5pbXBvcnQge1xuICBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zID0ge30sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlubyA9IHBpbm8sXG4gIGV4dGVybmFsQ29udGV4dFN0b3JlPzogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IHtcbiAgY29uc3QgY29udGV4dFN0b3JlID0gZXh0ZXJuYWxDb250ZXh0U3RvcmUgPz8gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCBiYXNlUGlub09wdGlvbnMgPSB7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5XG4gIH1cblxuICBsZXQgcGlub0xvZ2dlcjogUGlub1xuXG4gIGlmIChzaG91bGRQcmV0dHlQcmludCkge1xuICAgIGNvbnN0IHByZXR0eVN0cmVhbSA9IHByZXR0eSh7XG4gICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICBtZXNzYWdlS2V5LFxuICAgICAgZXJyb3JLZXlcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXG4gICAgcGlub0xvZ2dlciA9IHBpbm9GYWN0b3J5KGJhc2VQaW5vT3B0aW9ucywgcHJldHR5U3RyZWFtKVxuICB9IGVsc2Uge1xuICAgIHBpbm9Mb2dnZXIgPSBwaW5vRmFjdG9yeSh7XG4gICAgICAuLi5iYXNlUGlub09wdGlvbnMsXG4gICAgICB0cmFuc3BvcnQ6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IGhhc1RyYW5zcG9ydHMgPSAoY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc0ZpbGVMb2dnaW5nID1cbiAgICAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykgJiYgISFjb25maWc/LmxvZ0ZpbGVQYXRoXG4gIGNvbnN0IGhhc0ludGVybmFsTG9nZ2VyID0gISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpXG4gIGNvbnN0IGlzRWZmZWN0aXZlbHlEaXNhYmxlZCA9ICEoXG4gICAgaGFzVHJhbnNwb3J0cyB8fFxuICAgIGhhc0ZpbGVMb2dnaW5nIHx8XG4gICAgaGFzSW50ZXJuYWxMb2dnZXJcbiAgKVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gbWVyZ2VMb2dEYXRhQ29udGV4dChcbiAgICAgIGRhdGEsXG4gICAgICBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgIClcbiAgICBjb25zdCBsb2dEYXRhID1cbiAgICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQpIDogZGF0YVdpdGhDb250ZXh0XG4gICAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gICAgaWYgKGhhc1RyYW5zcG9ydHMpIHtcbiAgICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoaGFzRmlsZUxvZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8qIElnbm9yZSBlcnJvcnMgKi9cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0ludGVybmFsTG9nZ2VyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICBzdG9yZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdERUJVRyc6IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnSU5GTyc6IHtcbiAgICAgICAgY29uc29sZS5pbmZvKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdXQVJOSU5HJzoge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9nV2l0aENvbnRleHQgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbWVyZ2VDb250ZXh0OiAocmVxdWVzdCwgcGFydGlhbCkgPT4ge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dDogcmVxdWVzdCA9PiBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSxcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cbn1cblxuLyoqIFBsdWdpbiBlbnRyeTogc2hhcmVzIG9uZSByZXF1ZXN0LWNvbnRleHQgc3RvcmUgYWNyb3NzIHRoZSBFbHlzaWEgbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBsdWdpbkxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4gY3JlYXRlTG9nZ2VyKG9wdGlvbnMsIHBpbm8sIGNvbnRleHRTdG9yZSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb1RyYW5zcG9ydHNJbnB1dF1cbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdEluZm8sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8ge1xuICAgICAgICAgIGxldmVsOiBhcmdzWzBdLFxuICAgICAgICAgIHJlcXVlc3Q6IGFyZ3NbMV0sXG4gICAgICAgICAgZGF0YTogYXJnc1syXSxcbiAgICAgICAgICBzdG9yZTogYXJnc1szXSxcbiAgICAgICAgICBvcHRpb25zOiBhcmdzWzRdXG4gICAgICAgIH1cbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBiZWZvcmVUaW1lOiBzdG9yZS5iZWZvcmVUaW1lXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdCAmJlxuICAgICAgICB0eXBlb2YgKHJlc3VsdCBhcyB7IGNhdGNoPzogdW5rbm93biB9KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUcmFuc3BvcnQgZmFpbHVyZXMgbXVzdCBuZXZlciBjcmFzaCBhcHBsaWNhdGlvbiBsb2dnaW5nLlxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBhcHBlbmRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXG5pbXBvcnQgeyBwZXJmb3JtUm90YXRpb24sIHNob3VsZFJvdGF0ZSB9IGZyb20gJy4vcm90YXRpb24tbWFuYWdlcidcblxuLy8gUGVyLWZpbGUgbXV0ZXggdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJvdGF0aW9uXG5jb25zdCBmaWxlTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlTG9jayA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gIGNvbnN0IHByaW9yID0gZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBmaWxlTG9ja3Muc2V0KGZpbGVQYXRoLCBuZXdMb2NrKVxuXG4gICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBjYW4gbm93IHByb2NlZWRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVzb2x2ZUxvY2s/LigpXG4gICAgICBpZiAoZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPT09IG5ld0xvY2spIHtcbiAgICAgICAgZmlsZUxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIC8vIFNhZmVseSBwYXJzZSBVUkwgdG8gYXZvaWQgY3Jhc2hlcyBvbiBtYWxmb3JtZWQgVVJMc1xuICBsZXQgcGF0aG5hbWUgPSAnLydcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHBhdGhuYW1lOiByYXdQYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHBhdGhuYW1lID0gY29uZmlnPy5sb2dRdWVyeVBhcmFtcyA/IGAke3Jhd1BhdGhuYW1lfSR7c2VhcmNofWAgOiByYXdQYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICBwYXRobmFtZSA9IHJlcXVlc3QudXJsXG4gIH1cblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7cGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBhbnkgZmlsZSBvcGVyYXRpb25zIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHJlbGVhc2VMb2NrID0gYXdhaXQgYWNxdWlyZUxvY2soZmlsZVBhdGgpXG5cbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZmlsZSB3cml0ZSBlcnJvcnMgdG8gc3RkZXJyIHNvIHRoZXkncmUgbm90IGNvbXBsZXRlbHkgc2lsZW50XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICBlcnJvclxuICAgICAgKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgIGlmIChzaG91bGQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgcm90YXRpb24gZXJyb3JzIGJ1dCBkb24ndCBjcmFzaCAtIGxvZyBlbnRyeSB3YXMgYWxyZWFkeSB3cml0dGVuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIGxvY2tcbiAgICByZWxlYXNlTG9jaygpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIENvbXByZXNzaW9uIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGNvbXByZXNzaW9uIG9mIHRoZSBzYW1lIGZpbGVcbmNvbnN0IGNvbXByZXNzaW9uTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgICBjb21wcmVzc2lvbkxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgYWNxdWlyZUNvbXByZXNzaW9uTG9jayhmaWxlUGF0aClcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBmaWxlIHN0aWxsIGV4aXN0cyAobWlnaHQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGFscmVhZHkgY29tcHJlc3NlZCBvciBkZWxldGVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICAgIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBpZiAoc3RhdHMubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0c1xuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSBvbGQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9XG4gIC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0oPzotXFxkezN9KT8oPzotXFxkKyk/KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgIHJldHVybiBhc051bWJlclxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9IC9cXGIoPzpcXGR7MSwzfVxcLil7M31cXGR7MSwzfVxcYi9nXG4vKiogRGlnaXQgcnVucyB0aGF0IG1heSBiZSBmb3JtYXR0ZWQgUEFOcyAoc3BhY2VzL2Rhc2hlcyk7IHZhbGlkYXRlZCB3aXRoIEx1aG4gYmVmb3JlIHJlZGFjdGluZy4gKi9cbmNvbnN0IENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCA9IC9cXGIoPzpcXGRbIC1dKj8pezEzLDE5fVxcYi9nXG5jb25zdCBKV1RfUkVHRVggPSAvZXlKW2EtekEtWjAtOV8tXStcXC5leUpbYS16QS1aMC05Xy1dK1xcLlthLXpBLVowLTlfLV0rL2dcblxuY29uc3QgUEFOX01JTl9MRU4gPSAxM1xuY29uc3QgUEFOX01BWF9MRU4gPSAxOVxuXG5jb25zdCBSRURBQ1RFRF9URVhUID0gJ1tSRURBQ1RFRF0nXG5jb25zdCBDSVJDVUxBUl9SRUYgPSAnW0NpcmN1bGFyXSdcblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQXBwbHkgUElJIHJlZGFjdGlvbiB0byBhIHJlcXVlc3QgVVJMIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3VsdCBwYXJzZWFibGUgYnkgdGhlIFVSTC9SZXF1ZXN0IGNvbnN0cnVjdG9ycy4gKi9cbmNvbnN0IHJlZGFjdFJlcXVlc3RVcmwgPSAodXJsU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybFN0cmluZylcbiAgICBpZiAodS51c2VybmFtZSAhPT0gJycpIHtcbiAgICAgIHUudXNlcm5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUudXNlcm5hbWUpXG4gICAgfVxuICAgIGlmICh1LnBhc3N3b3JkICE9PSAnJykge1xuICAgICAgdS5wYXNzd29yZCA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5wYXNzd29yZClcbiAgICB9XG4gICAgdS5ob3N0bmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5ob3N0bmFtZSlcbiAgICB1LnBhdGhuYW1lID0gcmVkYWN0U3RyaW5nKHUucGF0aG5hbWUpXG4gICAgdS5zZWFyY2ggPSByZWRhY3RTdHJpbmcodS5zZWFyY2gpXG4gICAgdS5oYXNoID0gcmVkYWN0U3RyaW5nKHUuaGFzaClcbiAgICByZXR1cm4gdS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodXJsU3RyaW5nKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcbiAgfVxufVxuXG4vKiogTHVobiBjaGVja3N1bTsgYGRpZ2l0c2AgbXVzdCBjb250YWluIG9ubHkgYDAtOWAgYW5kIGxlbmd0aCBpbiBQQU4gcmFuZ2UuICovXG5jb25zdCBwYXNzZXNMdWhuID0gKGRpZ2l0czogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmIChkaWdpdHMubGVuZ3RoIDwgUEFOX01JTl9MRU4gfHwgZGlnaXRzLmxlbmd0aCA+IFBBTl9NQVhfTEVOKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBsZXQgYWx0ZXJuYXRlID0gZmFsc2VcblxuICBmb3IgKGxldCBpID0gZGlnaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBsZXQgbiA9IGNvZGUgLSA0OFxuICAgIGlmIChhbHRlcm5hdGUpIHtcbiAgICAgIG4gKj0gMlxuICAgICAgaWYgKG4gPiA5KSB7XG4gICAgICAgIG4gLT0gOVxuICAgICAgfVxuICAgIH1cbiAgICBzdW0gKz0gblxuICAgIGFsdGVybmF0ZSA9ICFhbHRlcm5hdGVcbiAgfVxuXG4gIHJldHVybiBzdW0gJSAxMCA9PT0gMFxufVxuXG5jb25zdCByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdGV4dC5yZXBsYWNlKENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCwgbWF0Y2ggPT4ge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG1hdGNoLnJlcGxhY2UoL1xcRC9nLCAnJylcbiAgICBpZiAoXG4gICAgICBkaWdpdHMubGVuZ3RoID49IFBBTl9NSU5fTEVOICYmXG4gICAgICBkaWdpdHMubGVuZ3RoIDw9IFBBTl9NQVhfTEVOICYmXG4gICAgICBwYXNzZXNMdWhuKGRpZ2l0cylcbiAgICApIHtcbiAgICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gICAgfVxuICAgIHJldHVybiBtYXRjaFxuICB9KVxuXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuY29uc3QgcmVkYWN0RXJyb3JDbG9uZSA9IChcbiAgb3JpZ2luYWxFcnJvcjogRXJyb3IsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLm1lc3NhZ2UpXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXJyb3IpIGFzIG9iamVjdFxuICBjb25zdCBuZXdFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG8pIGFzIEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBuZXdFcnJvci5tZXNzYWdlID0gcmVkYWN0ZWRNZXNzYWdlXG4gIG5ld0Vycm9yLm5hbWUgPSBvcmlnaW5hbEVycm9yLm5hbWVcblxuICBpZiAob3JpZ2luYWxFcnJvci5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmV3RXJyb3Iuc3RhY2sgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5zdGFjaylcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXJyb3JSZWNvcmQpKSB7XG4gICAgaWYgKGtleSAhPT0gJ21lc3NhZ2UnICYmIGtleSAhPT0gJ25hbWUnICYmIGtleSAhPT0gJ3N0YWNrJykge1xuICAgICAgbmV3RXJyb3Jba2V5XSA9IHJlZGFjdElubmVyKGVycm9yUmVjb3JkW2tleV0sIGluUHJvZ3Jlc3MpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbmNvbnN0IHJlZGFjdEFycmF5SXRlbXMgPSAoXG4gIHZhbHVlOiB1bmtub3duW10sXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93bltdID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRBcnJheTogdW5rbm93bltdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdmFsdWUubGVuZ3RoIH0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICByZWRhY3RlZEFycmF5W2ldID0gcmVkYWN0SW5uZXIodmFsdWVbaV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkQXJyYXlcbn1cblxuY29uc3QgcmVkYWN0UmVjb3JkRW50cmllcyA9IChcbiAgcmVjb3JkVmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpKSB7XG4gICAgcmVkYWN0ZWRSZWNvcmRba2V5XSA9IHJlZGFjdElubmVyKHJlY29yZFZhbHVlW2tleV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkUmVjb3JkXG59XG5cbmNvbnN0IHdpdGhSZWVudHJhbmN5R3VhcmQgPSA8VD4oXG4gIG9iajogb2JqZWN0LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gIHJ1bjogKCkgPT4gVFxuKTogVCA9PiB7XG4gIGluUHJvZ3Jlc3MuYWRkKG9iailcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBpblByb2dyZXNzLmRlbGV0ZShvYmopXG4gIH1cbn1cblxuY29uc3QgcmVkYWN0SW5uZXIgPSA8VD4odmFsdWU6IFQsIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0Pik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBvYmplY3RcbiAgaWYgKGluUHJvZ3Jlc3MuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gQ0lSQ1VMQVJfUkVGIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RFcnJvckNsb25lKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgcmVkYWN0UmVjb3JkRW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaW5Qcm9ncmVzcylcbiAgKSBhcyB1bmtub3duIGFzIFRcbn1cblxuZXhwb3J0IGNvbnN0IHJlZGFjdCA9IDxUPih2YWx1ZTogVCk6IFQgPT4gcmVkYWN0SW5uZXIodmFsdWUsIG5ldyBXZWFrU2V0KCkpXG5cbi8qKlxuICogQ2xvbmUgcmVxdWVzdCBVUkwsIG1ldGhvZCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBUaGUgcmV0dXJuZWQgcmVxdWVzdCBpcyBhIGxvZ2dpbmctb25seSBhcnRpZmFjdCBjYXJyeWluZyB1cmwvbWV0aG9kL2hlYWRlcnMvc2lnbmFsOyBpdCBpbnRlbnRpb25hbGx5XG4gKiBvbWl0cyB0aGUgYm9keSBzbyBpdCBuZXZlciByZS11c2VzIHRoZSBvcmlnaW5hbCAocG9zc2libHkgYWxyZWFkeS1jb25zdW1lZCkgcmVxdWVzdCBzdHJlYW0uIFRoZVxuICogb3JpZ2luYWwgcmVxdWVzdCBpcyBsZWZ0IHVudG91Y2hlZCBhbmQgcmVtYWlucyB1c2FibGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWRhY3RSZXF1ZXN0ID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBSZXF1ZXN0ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRVcmwgPSByZWRhY3RSZXF1ZXN0VXJsKHJlcXVlc3QudXJsKVxuICBjb25zdCBuZXh0SGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgbGV0IGhlYWRlcnNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcmVxdWVzdC5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJlZGFjdGVkID0gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIGlmIChyZWRhY3RlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGhlYWRlcnNDaGFuZ2VkID0gdHJ1ZVxuICAgIH1cbiAgICBuZXh0SGVhZGVycy5zZXQobmFtZSwgcmVkYWN0ZWQpXG4gIH1cblxuICBjb25zdCByZWRhY3RlZE1ldGhvZCA9IHJlZGFjdFN0cmluZyhyZXF1ZXN0Lm1ldGhvZClcbiAgY29uc3QgdXJsQ2hhbmdlZCA9IHJlZGFjdGVkVXJsICE9PSByZXF1ZXN0LnVybFxuICBjb25zdCBtZXRob2RDaGFuZ2VkID0gcmVkYWN0ZWRNZXRob2QgIT09IHJlcXVlc3QubWV0aG9kXG5cbiAgaWYgKCEodXJsQ2hhbmdlZCB8fCBoZWFkZXJzQ2hhbmdlZCB8fCBtZXRob2RDaGFuZ2VkKSkge1xuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVxdWVzdChyZWRhY3RlZFVybCwgaW5pdClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgaXNTdHJ1Y3R1cmVkRXJyb3IsIHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxuXG5jb25zdCBERUZBVUxUX1NMT1dfTVMgPSA1MDBcbmNvbnN0IERFRkFVTFRfVkVSWV9TTE9XX01TID0gMTAwMFxuY29uc3QgTUVUSE9EX1BBRCA9IDdcblxuY29uc3QgREVGQVVMVF9MT0dfRk9STUFUID1cbiAgJ3tub3d9IHtzZXJ2aWNlfXtpY29ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHtkdXJhdGlvbn0ge21lc3NhZ2V9e3NwZWVkfSdcblxuY29uc3QgTE9HX0ZPUk1BVF9SRUdFWCA9XG4gIC9cXHsobm93fGVwb2NofGxldmVsfGljb258ZHVyYXRpb258bWV0aG9kfHBhdGhuYW1lfHBhdGh8cXVlcnl8c3RhdHVzfHN0YXR1c1RleHR8bWVzc2FnZXxpcHxjb250ZXh0fHNlcnZpY2V8c3BlZWR8cmVxdWVzdElkKVxcfS9nXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkTG9nT3V0cHV0IHtcbiAgY29udGV4dExpbmVzOiBzdHJpbmdbXVxuICBtYWluOiBzdHJpbmdcbn1cblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuLyoqIFJlc29sdmVzIGNsaWVudCBJUCBmcm9tIHgtZm9yd2FyZGVkLWZvciAoZmlyc3QgSVApIG9yIHgtcmVhbC1pcC4gRW1wdHkgd2hlbiBuZWl0aGVyIGhlYWRlciBpcyBzZXQgKGUuZy4gbG9jYWxob3N0KS4gKi9cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgaWYgKGZvcndhcmRlZCkge1xuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbiA9IChtczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKG1zID49IDEwMDApIHtcbiAgICBjb25zdCBzZWMgPSBtcyAvIDEwMDBcbiAgICBpZiAoc2VjID49IDEwKSB7XG4gICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChzZWMpfXNgXG4gICAgfVxuICAgIGNvbnN0IG9uZURlY2ltYWwgPSBzZWMudG9GaXhlZCgxKVxuICAgIHJldHVybiBvbmVEZWNpbWFsLmVuZHNXaXRoKCcuMCcpID8gYCR7TWF0aC5yb3VuZChzZWMpfXNgIDogYCR7b25lRGVjaW1hbH1zYFxuICB9XG4gIGlmIChtcyA+IDAgJiYgbXMgPCAxKSB7XG4gICAgcmV0dXJuIGAke21zLnRvRml4ZWQoMil9bXNgXG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMpfW1zYFxufVxuXG5jb25zdCBnZXRTbG93VGhyZXNob2xkcyA9IChcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyBzbG93OiBudW1iZXI7IHZlcnlTbG93OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIHJldHVybiB7XG4gICAgc2xvdzogY29uZmlnPy5zbG93VGhyZXNob2xkID8/IERFRkFVTFRfU0xPV19NUyxcbiAgICB2ZXJ5U2xvdzogY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1ZFUllfU0xPV19NU1xuICB9XG59XG5cbmNvbnN0IGNvbG9yRHVyYXRpb25UZXh0ID0gKFxuICBtczogbnVtYmVyLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgdGV4dDogc3RyaW5nOyBpc1ZlcnlTbG93OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCByYXcgPSBmb3JtYXREdXJhdGlvbihtcylcbiAgY29uc3QgeyBzbG93LCB2ZXJ5U2xvdyB9ID0gZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3QgaXNWZXJ5U2xvdyA9IG1zID49IHZlcnlTbG93XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4geyB0ZXh0OiByYXcsIGlzVmVyeVNsb3cgfVxuICB9XG5cbiAgbGV0IGNvbG9yZWQgPSByYXdcbiAgaWYgKG1zIDwgc2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay5ncmVlbihyYXcpXG4gIH0gZWxzZSBpZiAobXMgPCB2ZXJ5U2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay55ZWxsb3cocmF3KVxuICB9IGVsc2Uge1xuICAgIGNvbG9yZWQgPSBjaGFsay5yZWQuYm9sZChyYXcpXG4gIH1cblxuICByZXR1cm4geyB0ZXh0OiBjb2xvcmVkLCBpc1ZlcnlTbG93IH1cbn1cblxuY29uc3QgZ2V0U3BlZWRUb2tlbiA9IChpc1ZlcnlTbG93OiBib29sZWFuLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmVyeVNsb3cpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBiYWRnZSA9ICfimqEgc2xvdydcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCAke2JhZGdlfWBcbiAgfVxuICByZXR1cm4gYCAke2NoYWxrLnllbGxvdyhiYWRnZSl9YFxufVxuXG4vKiogTG9naXhseXNpYSBicmFuZDogZm94IGVtb2ppIHdpdGggbGV2ZWwtY29sb3JlZCBiYWNrZ3JvdW5kIHdoZW4gY29sb3JzIGFyZSBlbmFibGVkLiAqL1xuY29uc3QgZ2V0TGV2ZWxJY29uID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gJ/CfpoonXG4gIH1cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2soJyDwn6aKICcpXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB2YWx1ZS5tZXNzYWdlXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJDb250ZXh0VHJlZUxpbmVzID0gKFxuICBjdHg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcbiAgaWYgKGRlcHRoIDwgMSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGNvbGxlY3RDb250ZXh0RW50cmllcyhjdHgsICcnLCBkZXB0aClcbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzID0gKGVycm9yOiB1bmtub3duKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihlcnJvcilcbiAgaWYgKG1zZykge1xuICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgbXNnXSlcbiAgfVxuICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLndoeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci53aHknLCBTdHJpbmcoZXJyb3Iud2h5KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5maXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuZml4JywgU3RyaW5nKGVycm9yLmZpeCldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5saW5rJywgU3RyaW5nKGVycm9yLmxpbmspXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmludGVybmFsJywgc3RyaW5naWZ5VHJlZVZhbHVlKGVycm9yLmludGVybmFsKV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKG9wdGlvbnMuY29uZmlnPy5zaG93Q29udGV4dFRyZWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcblxuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuXG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAoXG4gICAgY3R4ICYmXG4gICAgdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShjdHgpICYmXG4gICAgT2JqZWN0LmtleXMoY3R4IGFzIG9iamVjdCkubGVuZ3RoID4gMCAmJlxuICAgIGRlcHRoID49IDFcbiAgKSB7XG4gICAgZW50cmllcy5wdXNoKFxuICAgICAgLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJycsIGRlcHRoKVxuICAgIClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAnZXJyb3InIGluIGRhdGEgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzKGRhdGEuZXJyb3IpKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9nT3V0cHV0ID0gKHtcbiAgbGV2ZWwsXG4gIHJlcXVlc3QsXG4gIGRhdGEsXG4gIHN0b3JlLFxuICBvcHRpb25zXG59OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBGb3JtYXR0ZWRMb2dPdXRwdXQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID0gY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz8gREVGQVVMVF9MT0dfRk9STUFUXG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcbiAgY29uc3QgdGltZXN0YW1wID0gZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycylcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGxldCByYXdQYXRobmFtZTogc3RyaW5nXG4gIGxldCBzZWFyY2g6IHN0cmluZ1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcmF3UGF0aG5hbWUgPSB1cmwucGF0aG5hbWVcbiAgICBzZWFyY2ggPSB1cmwuc2VhcmNoXG4gIH0gY2F0Y2gge1xuICAgIHJhd1BhdGhuYW1lID0gcmVxdWVzdC51cmwgfHwgJy8nXG4gICAgc2VhcmNoID0gJydcbiAgfVxuICBjb25zdCBxdWVyeSA9IHNlYXJjaFxuICBjb25zdCBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXNcbiAgICA/IGAke3Jhd1BhdGhuYW1lfSR7cXVlcnl9YFxuICAgIDogcmF3UGF0aG5hbWVcbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcbiAgY29uc3QgaXAgPSBjb25maWc/LmlwID09PSB0cnVlID8gZ2V0SXAocmVxdWVzdCkgOiAnJ1xuXG4gIGNvbnN0IHNob3dUcmVlID0gY29uZmlnPy5zaG93Q29udGV4dFRyZWUgIT09IGZhbHNlXG4gIGNvbnN0IGN0eFN0cmluZyA9XG4gICAgc2hvd1RyZWUgJiZcbiAgICBkYXRhLmNvbnRleHQgJiZcbiAgICB0eXBlb2YgZGF0YS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dCkgJiZcbiAgICBPYmplY3Qua2V5cyhkYXRhLmNvbnRleHQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG4gICAgICA/ICcnXG4gICAgICA6IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBtZXRob2RQYWRkZWQgPSByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLnBhZEVuZChNRVRIT0RfUEFEKVxuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gZ2V0Q29sb3JlZE1ldGhvZChtZXRob2RQYWRkZWQsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCB7IHRleHQ6IGNvbG9yZWREdXJhdGlvbiwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgb3B0aW9uc1xuICApXG4gIGNvbnN0IHNwZWVkVG9rZW4gPSBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycylcbiAgY29uc3QgaWNvbiA9IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBzdGF0dXNUZXh0ID0gZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKVxuICBjb25zdCBzZXJ2aWNlVG9rZW4gPSBnZXRTZXJ2aWNlVG9rZW4ob3B0aW9ucywgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IHRva2VuTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne2Vwb2NofSc6IGVwb2NoLFxuICAgICd7bGV2ZWx9JzogY29sb3JlZExldmVsLFxuICAgICd7aWNvbn0nOiBpY29uLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7bWV0aG9kfSc6IGNvbG9yZWRNZXRob2QsXG4gICAgJ3twYXRobmFtZX0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3twYXRofSc6IGNvbG9yZWRQYXRobmFtZSxcbiAgICAne3F1ZXJ5fSc6IHF1ZXJ5LFxuICAgICd7c3RhdHVzfSc6IGNvbG9yZWRTdGF0dXMsXG4gICAgJ3tzdGF0dXNUZXh0fSc6IHN0YXR1c1RleHQsXG4gICAgJ3ttZXNzYWdlfSc6IG1lc3NhZ2UsXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7c2VydmljZX0nOiBzZXJ2aWNlVG9rZW4sXG4gICAgJ3tzcGVlZH0nOiBzcGVlZFRva2VuLFxuICAgICd7cmVxdWVzdElkfSc6XG4gICAgICB0eXBlb2YgZGF0YS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgZGF0YS5jb250ZXh0ICE9PSBudWxsICYmXG4gICAgICAncmVxdWVzdElkJyBpbiBkYXRhLmNvbnRleHRcbiAgICAgICAgPyBTdHJpbmcoKGRhdGEuY29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucmVxdWVzdElkKVxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBtYWluID0gZm9ybWF0LnJlcGxhY2UoXG4gICAgTE9HX0ZPUk1BVF9SRUdFWCxcbiAgICBtYXRjaCA9PiB0b2tlbk1hcFttYXRjaF0gPz8gbWF0Y2hcbiAgKVxuXG4gIGNvbnN0IGNvbnRleHRMaW5lcyA9IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyhsZXZlbCwgZGF0YSwgb3B0aW9ucylcblxuICByZXR1cm4geyBtYWluLCBjb250ZXh0TGluZXMgfVxufVxuXG4vKiogQGRlcHJlY2F0ZWQgUHJlZmVyIHtAbGluayBmb3JtYXRMb2dPdXRwdXR9IGZvciBtdWx0aS1saW5lIGNvbnRleHQgdHJlZXMuIFJldHVybnMgdGhlIG1haW4gbGluZSBvbmx5LiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdExpbmUgPSAoaW5wdXQ6IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufSk6IHN0cmluZyA9PlxuICBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIC4uLmlucHV0LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIC4uLmlucHV0Lm9wdGlvbnMsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLi4uaW5wdXQub3B0aW9ucy5jb25maWcsXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdHVyZWRFcnJvciB7XG4gIGZpeD86IHN0cmluZ1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgbGluaz86IHN0cmluZ1xuICB3aHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RydWN0dXJlZEVycm9yID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgU3RydWN0dXJlZEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAoJ3doeScgaW4gdmFsdWUgfHwgJ2ZpeCcgaW4gdmFsdWUgfHwgJ2xpbmsnIGluIHZhbHVlIHx8ICdpbnRlcm5hbCcgaW4gdmFsdWUpXG4iLAogICAgImltcG9ydCB7XG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG5leHBvcnQgY29uc3QgaGFuZGxlSHR0cEVycm9yID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZXJyb3I6IHVua25vd24sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IGxvZ0ZpbHRlciA9IGNvbmZpZz8ubG9nRmlsdGVyXG4gIGlmIChcbiAgICBsb2dGaWx0ZXI/LmxldmVsICYmXG4gICAgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA+IDAgJiZcbiAgICAhbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKCdFUlJPUicpXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG4gIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZUVycm9yKGVycm9yKVxuXG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUidcbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHN0YXR1cywgbWVzc2FnZSwgZXJyb3IgfVxuICBjb25zdCBkYXRhV2l0aENvbnRleHQgPSBjb250ZXh0U3RvcmVcbiAgICA/IG1lcmdlTG9nRGF0YUNvbnRleHQoZGF0YSwgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCkpXG4gICAgOiBkYXRhXG4gIGNvbnN0IGxvZ0RhdGEgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQpIDogZGF0YVdpdGhDb250ZXh0XG4gIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdFJlcXVlc3QocmVxdWVzdCkgOiByZXF1ZXN0XG5cbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsIGRhdGE6IGxvZ0RhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGxldmVsLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgZGF0YTogbG9nRGF0YSxcbiAgICBzdG9yZSxcbiAgICBvcHRpb25zXG4gIH0pXG5cbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9XG4gICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG4gIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkTWVzc2FnZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuXG4gIGdlbmVyYXRvcjogKCkgPT4gc3RyaW5nXG4gIGhlYWRlcjogc3RyaW5nXG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyB0aGUgYHJlcXVlc3RJZGAgb3B0aW9uIGludG8gYSBjb25jcmV0ZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIC0gYHVuZGVmaW5lZGAgLyBgZmFsc2VgIOKGkiBgbnVsbGAgKGRpc2FibGVkKVxuICogLSBgdHJ1ZWAg4oaSIGRlZmF1bHQgY29uZmlnXG4gKiAtIGBSZXF1ZXN0SWRDb25maWdgIOKGkiBtZXJnZWQgd2l0aCBkZWZhdWx0czsgYGVuYWJsZWQ6IGZhbHNlYCBpbnNpZGUgdGhlIG9iamVjdCBkaXNhYmxlcyB0aGUgZmVhdHVyZVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyA9IChcbiAgcmF3PzogYm9vbGVhbiB8IFJlcXVlc3RJZENvbmZpZ1xuKTogUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcgfCBudWxsID0+IHtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHJhdyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgaGVhZGVyOiBERUZBVUxUX0hFQURFUixcbiAgICAgIGdlbmVyYXRvcjogKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9iamVjdCBmb3JtIOKAlCBgZW5hYmxlZGAgZGVmYXVsdHMgdG8gYHRydWVgIHdoZW4gdGhlIG9iamVjdCBpcyBwcm92aWRlZFxuICBpZiAocmF3LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBoZWFkZXI6IHJhdy5oZWFkZXI/LnRyaW0oKSB8fCBERUZBVUxUX0hFQURFUixcbiAgICBnZW5lcmF0b3I6IHJhdy5nZW5lcmF0b3IgPz8gKCgpID0+IGNyeXB0by5yYW5kb21VVUlEKCkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBleGlzdGluZyByZXF1ZXN0IElEIGZyb20gdGhlIGluY29taW5nIHJlcXVlc3QgaGVhZGVyLCBvciBnZW5lcmF0ZXMgYVxuICogbmV3IG9uZSB1c2luZyB0aGUgY29uZmlndXJlZCBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVJlcXVlc3RJZCA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgY29uZmlnOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZ1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGNvbmZpZy5oZWFkZXIpXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZ1xuICB9XG4gIHJldHVybiBjb25maWcuZ2VuZXJhdG9yKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ2dlciwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRMaWtlIHtcbiAgcmVhZG9ubHkgZGF0YT86IHsgc3RvcmU/OiB7IGxvZ2dlcj86IExvZ2dlciB9IH1cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc0hhbmRsZXJIb29rczxcbiAgVE1lc3NhZ2UgPSB1bmtub3duLFxuICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlID0gV2ViU29ja2V0TGlrZVxuPiB7XG4gIGNsb3NlPzogKHdzOiBUV3MpID0+IHZvaWRcbiAgbWVzc2FnZT86ICh3czogVFdzLCBtZXNzYWdlOiBUTWVzc2FnZSkgPT4gdm9pZFxuICBvcGVuPzogKHdzOiBUV3MpID0+IHZvaWRcbn1cblxuY29uc3Qgd3NTeW50aGV0aWNSZXF1ZXN0ID0gKHBhdGg6IHN0cmluZyk6IFJlcXVlc3QgPT5cbiAgbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2dpeGx5c2lhLmxvY2FsJHtwYXRofWAsIHsgbWV0aG9kOiAnV1MnIH0pXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBsb2dnZXI6IExvZ2dlcixcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pID0+IHtcbiAgY29uc3Qgd3NUaW1pbmdzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBiaWdpbnQ+KClcblxuICBjb25zdCBsb2dXcyA9IChcbiAgICBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyxcbiAgICB3czogV2ViU29ja2V0TGlrZSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGV4dHJhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5ID0gd3MgYXMgb2JqZWN0XG4gICAgY29uc3QgYmVmb3JlVGltZSA9IHdzVGltaW5ncy5nZXQoa2V5KSA/PyBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWUgfVxuICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gY29udGV4dFN0b3JlLmdldENvbnRleHQoa2V5KVxuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDAgfHwgZXh0cmFcbiAgICAgICAgPyB7IC4uLmFjY3VtdWxhdGVkLCAuLi5leHRyYSwgd3NJZDogd3MuaWQgfVxuICAgICAgICA6IHsgd3NJZDogd3MuaWQgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgd3NTeW50aGV0aWNSZXF1ZXN0KHBhdGgpLFxuICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgc3RvcmVcbiAgICApXG4gIH1cblxuICByZXR1cm4gPFxuICAgIFRNZXNzYWdlLFxuICAgIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UsXG4gICAgY29uc3QgVEhvb2tzIGV4dGVuZHMgV3NIYW5kbGVySG9va3M8VE1lc3NhZ2UsIFRXcz5cbiAgPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaG9va3M6IFRIb29rc1xuICApOiBUSG9va3MgPT5cbiAgICAoe1xuICAgICAgLi4uaG9va3MsXG4gICAgICBvcGVuKHdzKSB7XG4gICAgICAgIHdzVGltaW5ncy5zZXQod3MgYXMgb2JqZWN0LCBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSlcbiAgICAgICAgaG9va3Mub3Blbj8uKHdzKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBvcGVuZWQnKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWVzc2FnZSh3cywgbWVzc2FnZSkge1xuICAgICAgICBob29rcy5tZXNzYWdlPy4od3MsIG1lc3NhZ2UpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG1lc3NhZ2UnLCB7XG4gICAgICAgICAgICBwYXlsb2FkVHlwZTogdHlwZW9mIG1lc3NhZ2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2xvc2Uod3MpIHtcbiAgICAgICAgaG9va3MuY2xvc2U/Lih3cylcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgY2xvc2VkJylcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHdzIGFzIG9iamVjdClcbiAgICAgICAgd3NUaW1pbmdzLmRlbGV0ZSh3cyBhcyBvYmplY3QpXG4gICAgICB9XG4gICAgfSkgYXMgVEhvb2tzXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNJVCxJQUFNLEdBQXFFLENBQ3pFLElBQUssQ0FDSCxtQkFBb0IsR0FDcEIscUJBQXNCLFNBQ3RCLFVBQVcsR0FDWCxnQkFBaUIsR0FDakIsS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLFdBQVksR0FDWixVQUFXLEdBQ1gsS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixDQUNGLEVBRU0sR0FBYyxDQUNsQixFQUNBLElBQ21DLENBQ25DLEdBQUksQ0FBQyxFQUNILE9BQU8sRUFHVCxJQUFNLEVBQXlDLElBQUssS0FBUyxDQUFTLEVBRXRFLEdBQUksRUFBSyxNQUFRLEVBQVMsS0FDeEIsRUFBTyxLQUFPLElBQ1Qs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VUFBUyxNQUFLLFdBQVksQ0FDMUMsR0FBSSxDQUNGLEdBQUksRUFBaUIsQ0FFbkIsSUFBTSxFQURNLEVBQWEsV0FBVyxDQUFPLEVBQzVCLFVBQ2YsR0FBSSxFQUNGLEVBQUksUUFBUSxFQUFnQixRQUFVLEVBSTFDLEdBQUksRUFBYSxJQUFJLENBQU8sRUFDMUIsT0FHRixJQUFNLEVBQVMsT0FBTyxFQUFJLFNBQVcsU0FBVyxFQUFJLE9BQVMsSUFDekQsRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsSUFBTSxFQUFjLEVBQWEsV0FBVyxDQUFPLEVBQzdDLEVBQWdDLENBQUUsUUFBTyxFQUMvQyxHQUFJLE9BQU8sS0FBSyxDQUFXLEVBQUUsT0FBUyxFQUNwQyxFQUFLLFFBQVUsSUFBSyxDQUFZLEVBR2xDLEVBQU8sSUFBSSxFQUFPLEVBQVMsRUFBTSxDQUFLLFNBQ3RDLENBQ0EsRUFBYSxhQUFhLENBQU8sR0FFcEMsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLE1BQUssV0FBWSxDQUMzQyxHQUFJLENBQ0YsR0FBSSxFQUFpQixDQUVuQixJQUFNLEVBRE0sRUFBYSxXQUFXLENBQU8sRUFDNUIsVUFDZixHQUFJLEVBQ0YsRUFBSSxRQUFRLEVBQWdCLFFBQVUsRUFHMUMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQUssU0FDNUMsQ0FDQSxFQUFhLGFBQWEsQ0FBTyxHQUVwQyxFQUNBLEdBQUcsUUFBUSxFQUVkLE9BQU8sT0FBTyxPQUFPLEVBQVEsQ0FBRSxRQUFPLENBQUMsR0E0QjFCIiwKICAiZGVidWdJZCI6ICI2NzBCNkZCMUFDOUQ2RTM4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
8
+ //# debugId=8C348AF0409A462864756E2164756E21
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy91dGlscy9zYW5pdGl6ZS50cyIsICJzcmMvb3V0cHV0L2luZGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS1zaW5rLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy9vdXRwdXQva2V5ZWQtbXV0ZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9sb2dnZXIvZW1pdC50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgInNyYy9taWRkbGV3YXJlL3JlcXVlc3QtaWQudHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcbmltcG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgeyBsb2dnZXJTdG9yYWdlIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5pbXBvcnQgeyBzdGFydFNlcnZlciB9IGZyb20gJy4vZXh0ZW5zaW9ucydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dpeGx5c2lhU3RvcmUsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXJcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmltcG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyXG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhUGx1Z2luID0gTG9naXhseXNpYSAmIHtcbiAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxufVxuXG5jb25zdCBsb2dpeGx5c2lhID0gKHJhd09wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWFQbHVnaW4gPT4ge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMocmF3T3B0aW9ucylcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lcyA9IG5ldyBXZWFrTWFwPFJlcXVlc3QsIGJpZ2ludD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCByZXF1ZXN0SWRDb25maWcgPSByZXNvbHZlUmVxdWVzdElkQ29uZmlnKG9wdGlvbnMuY29uZmlnPy5yZXF1ZXN0SWQpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5lcnJvcihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgKTogUmVxdWVzdFNjb3BlZExvZ2dlciA9PiAoe1xuICAgIGRlYnVnOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGVycm9yOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGluZm86IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIuaW5mbyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBtZXJnZUNvbnRleHQ6IHBhcnRpYWwgPT4gY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKSxcbiAgICB3YXJuOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgfSlcblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTG9naXhseXNpYSBpcyBhIHBsdWdpbiBmb3IgRWx5c2lhIHRoYXQgcHJvdmlkZXMgYSBsb2dnZXIgYW5kIHBpbm8gbG9nZ2VyLicsXG4gICAgICB0YWdzOiBbJ2xvZ2dpbmcnLCAncGlubyddXG4gICAgfSxcbiAgICBuYW1lOiAnTG9naXhseXNpYSdcbiAgfSlcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBkZXJpdmVkIGxvZyB0eXBpbmcgbWF0Y2hlcyBMb2dpeGx5c2lhU2luZ2xldG9uLlxuICBjb25zdCBwbHVnaW4gPSBhcHBcbiAgICAuc3RhdGUoJ2xvZ2dlcicsIGxvZ2dlcilcbiAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAuc3RhdGUoJ2JlZm9yZVRpbWUnLCBCaWdJbnQoMCkpXG4gICAgLmRlcml2ZSgoeyByZXF1ZXN0IH0pID0+ICh7IGxvZzogY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSB9KSlcbiAgICAub25TdGFydCgoeyBzZXJ2ZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDBcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwcm9jZXNzLmVudi5IT1NUIHx8ICdsb2NhbGhvc3QnXG4gICAgICAgIHN0YXJ0U2VydmVyKHsgaG9zdG5hbWUsIHBvcnQsIHByb3RvY29sOiAnaHR0cCcgfSwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoKHsgcmVxdWVzdCB9KSA9PiB7XG4gICAgICByZXF1ZXN0U3RhcnRUaW1lcy5zZXQocmVxdWVzdCwgcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkpXG4gICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGdldE9yQ3JlYXRlUmVxdWVzdElkKHJlcXVlc3QsIHJlcXVlc3RJZENvbmZpZylcbiAgICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCB7IHJlcXVlc3RJZCB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb25maWc/LnVzZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICAgIGxvZ2dlclN0b3JhZ2UuZW50ZXJXaXRoKGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgICAgY29uc3QgaWQgPSBjdHgucmVxdWVzdElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgc2V0LmhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWRDdXN0b21Mb2cuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPVxuICAgICAgICAgIHNldC5zdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBzZXQuc3RhdHVzID09PSBudWxsXG4gICAgICAgICAgICA/IDIwMFxuICAgICAgICAgICAgOiBnZXRTdGF0dXNDb2RlKHNldC5zdGF0dXMpXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgICAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0ID0geyAuLi5hY2N1bXVsYXRlZCB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCBkYXRhLCB7XG4gICAgICAgICAgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IEJpZ0ludCgwKVxuICAgICAgICB9KVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXMuZGVsZXRlKHJlcXVlc3QpXG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKCh7IHJlcXVlc3QsIGVycm9yLCBzZXQgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgICAgY29uc3QgaWQgPSBjdHgucmVxdWVzdElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgc2V0LmhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCB7XG4gICAgICAgICAgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IEJpZ0ludCgwKVxuICAgICAgICB9KVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXMuZGVsZXRlKHJlcXVlc3QpXG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5hcygnc2NvcGVkJykgYXMgTG9naXhseXNpYVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHBsdWdpbiwgeyB3cmFwV3MgfSkgYXMgTG9naXhseXNpYVBsdWdpblxufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9wZXJmb3JtYW5jZS9ub0JhcnJlbEZpbGU6IHB1YmxpYyBwYWNrYWdlIGVudHJ5IHJlLWV4cG9ydHNcbmV4cG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuZXhwb3J0IHsgdXNlTG9nZ2VyIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdElkQ29uZmlnLFxuICBSZXF1ZXN0U2NvcGVkTG9nZ2VyLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHtcbiAgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQsXG4gIHJlc29sdmVSZXF1ZXN0SWRDb25maWdcbn0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQgdHlwZSB7IFdzSGFuZGxlckhvb2tzIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcbmV4cG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9XG4gIC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0oPzotXFxkezN9KT8oPzotXFxkKyk/KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKHRyaW1tZWQgIT09ICcnKSB7XG4gICAgY29uc3QgYXNOdW1iZXIgPSBOdW1iZXIodHJpbW1lZClcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgICAgaWYgKGFzTnVtYmVyIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemU6ICR7dmFsdWV9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc051bWJlclxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaChTSVpFX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemUgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IGJhc2UgPSAxMDI0XG4gIGlmICh1bml0LnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNFxuICB9IGVsc2UgaWYgKHVuaXQuc3RhcnRzV2l0aCgnZycpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50ICogYmFzZSlcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlSW50ZXJ2YWwgPSAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUudHJpbSgpLm1hdGNoKElOVEVSVkFMX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBtcyA9IDYwICogNjAgKiAxMDAwXG4gIGlmICh1bml0ID09PSAnZCcpIHtcbiAgICBtcyA9IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndycpIHtcbiAgICBtcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cblxuICByZXR1cm4gYW1vdW50ICogbXNcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmV0ZW50aW9uID0gKFxuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nXG4pOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvdW50JywgdmFsdWUgfVxuICB9XG4gIHJldHVybiB7IHR5cGU6ICd0aW1lJywgdmFsdWU6IHBhcnNlSW50ZXJ2YWwodmFsdWUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZUJ5U2l6ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZUJ5dGVzOiBudW1iZXJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0LnNpemUgPiBtYXhTaXplQnl0ZXNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlID0gYmFzZW5hbWUoZmlsZVBhdGgpXG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdXG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG4gICAgLmZpbHRlcihuYW1lID0+IG5hbWUuc3RhcnRzV2l0aChgJHtiYXNlfS5gKSAmJiBST1RBVEVEX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgLm1hcChuYW1lID0+IGAke2Rpcn0vJHtuYW1lfWApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nUHJlc2V0LCBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlSW50ZXJ2YWwsIHBhcnNlUmV0ZW50aW9uLCBwYXJzZVNpemUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgVkFMSURfUFJFU0VUUzogcmVhZG9ubHkgTG9nUHJlc2V0W10gPSBbJ2RldicsICdwcm9kJywgJ2pzb24nXVxuXG5jb25zdCB2YWxpZGF0ZUxvZ1JvdGF0aW9uID0gKGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10pOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nUm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghbG9nUm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VTaXplKGxvZ1JvdGF0aW9uLm1heFNpemUpXG4gICAgfVxuICAgIGlmIChsb2dSb3RhdGlvbi5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVJldGVudGlvbihsb2dSb3RhdGlvbi5tYXhGaWxlcylcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlSW50ZXJ2YWwobG9nUm90YXRpb24uaW50ZXJ2YWwpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSAnZ3ppcCdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke2xvZ1JvdGF0aW9uLmNvbXByZXNzaW9ufWBcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBsb2dSb3RhdGlvbiBjb25maWcg4oCUICR7bWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDb250ZXh0VHJlZTogdHJ1ZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZVxuICB9LFxuICBqc29uOiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9LFxuICBwcm9kOiB7XG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICBwaW5vOiB7XG4gICAgICBwcmV0dHlQcmludDogZmFsc2VcbiAgICB9LFxuICAgIHJlcXVlc3RJZDogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaW5jbHVkZXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgcmV0dXJuIHJlc29sdmVkXG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIE5vbi1jbG9uaW5nIHJlYWQgb2YgdGhlIGxpdmUgY29udGV4dCBiYWcuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHN0b3JlZCBpbnRlcm5hbGx5IChvciBhXG4gICAqIHNoYXJlZCBmcm96ZW4gZW1wdHkgb2JqZWN0KSDigJQgbmV2ZXIgaGFuZCB0aGlzIHRvIHVzZXItZmFjaW5nIGNvZGUsIHdoaWNoIG1heSByZXRhaW4gb3JcbiAgICogbXV0YXRlIGl0LiBPbmx5IGludGVybmFsLCByZWFkLW9ubHkgY2FsbCBzaXRlcyAodGhhdCBpbW1lZGlhdGVseSBzcHJlYWQgdGhlIHJlc3VsdCBpbnRvIGFcbiAgICogbmV3IG9iamVjdCkgbWF5IHVzZSB0aGlzOyBldmVyeXRoaW5nIGVsc2UgbXVzdCB1c2Uge0BsaW5rIFJlcXVlc3RDb250ZXh0U3RvcmUuZ2V0Q29udGV4dH0uXG4gICAqL1xuICBwZWVrQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG59XG5cbmNvbnN0IEVNUFRZX0NPTlRFWFQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IE9iamVjdC5mcmVlemUoe30pXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlID0gKCk6IFJlcXVlc3RDb250ZXh0U3RvcmUgPT4ge1xuICBjb25zdCBiYWdzID0gbmV3IFdlYWtNYXA8Q29udGV4dEtleSwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KClcblxuICBjb25zdCBnZXRPckNyZWF0ZSA9IChrZXk6IENvbnRleHRLZXkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgbGV0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICBpZiAoIWJhZykge1xuICAgICAgYmFnID0ge31cbiAgICAgIGJhZ3Muc2V0KGtleSwgYmFnKVxuICAgIH1cbiAgICByZXR1cm4gYmFnXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9LFxuICAgIGdldENvbnRleHQoa2V5KSB7XG4gICAgICBjb25zdCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgICByZXR1cm4gYmFnID8geyAuLi5iYWcgfSA6IHt9XG4gICAgfSxcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwZWVrQ29udGV4dChrZXkpIHtcbiAgICAgIHJldHVybiBiYWdzLmdldChrZXkpID8/IEVNUFRZX0NPTlRFWFRcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0U2NvcGVkTG9nZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IGxvZ2dlclN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+ID1cbiAgbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+KClcblxuY29uc3QgTk9PUF9MT0dHRVI6IFJlcXVlc3RTY29wZWRMb2dnZXIgPSB7XG4gIGRlYnVnOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVycm9yOiAoKSA9PiB1bmRlZmluZWQsXG4gIGluZm86ICgpID0+IHVuZGVmaW5lZCxcbiAgbWVyZ2VDb250ZXh0OiAoKSA9PiB1bmRlZmluZWQsXG4gIHdhcm46ICgpID0+IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgdXNlTG9nZ2VyID0gKCk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT5cbiAgbG9nZ2VyU3RvcmFnZS5nZXRTdG9yZSgpID8/IE5PT1BfTE9HR0VSXG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHZlcnNpb24gfSA9IGVseXNpYVBrZ1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IHJvd1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMSA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9nXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xuXG5jb25zdCBub3JtYWxpemVTdGF0dXNOYW1lID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcbiAgLy8gLSBzcGFjaW5nL3B1bmN0dWF0aW9uOiBcIk5vdC1Gb3VuZFwiLCBcIm5vdF9mb3VuZFwiXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8xLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcbiAgICAudHJpbSgpXG59XG5cbmNvbnN0IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUgPSAoKCkgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMoU3RhdHVzTWFwKSkge1xuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcbiAgfVxuXG4gIHJldHVybiBtYXBcbn0pKClcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgcHJldHR5IGZyb20gJ3Bpbm8tcHJldHR5J1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUge1xuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZFBpbm9SZWRhY3RQYXRocyB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGNyZWF0ZUZvcm1hdENvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBlbWl0LCByZXNvbHZlU2lua3MsIHNob3VsZExvZyB9IGZyb20gJy4vZW1pdCdcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vID0gcGlubyxcbiAgZXh0ZXJuYWxDb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb250ZXh0U3RvcmUgPSBleHRlcm5hbENvbnRleHRTdG9yZSA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgLy8gSG9pc3RlZCBvbmNlIHBlciBsb2dnZXIgaW5zdGFuY2U6IGNvbG9ycy9mb3JtYXQvdGhyZXNob2xkcy9zZXJ2aWNlIGRvbid0IGNoYW5nZSBhY3Jvc3NcbiAgLy8gcmVxdWVzdHMgd2l0aGluIGEgcHJvY2VzcyBsaWZldGltZSAoc2VlIGNyZWF0ZUZvcm1hdENvbnRleHQncyBkb2MgY29tbWVudCkuXG4gIGNvbnN0IGZvcm1hdENvbnRleHQgPSBjcmVhdGVGb3JtYXRDb250ZXh0KG9wdGlvbnMpXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCBiYXNlUGlub09wdGlvbnMgPSB7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgZXJyb3JLZXksXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIC4uLihjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgJiYgcGlub09wdGlvbnMucmVkYWN0ID09PSB1bmRlZmluZWRcbiAgICAgID8ge1xuICAgICAgICAgIHJlZGFjdDoge1xuICAgICAgICAgICAgY2Vuc29yOiAnW1JFREFDVEVEXScsXG4gICAgICAgICAgICBwYXRoczogYnVpbGRQaW5vUmVkYWN0UGF0aHMoY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgOiB7fSlcbiAgfVxuXG4gIC8vIFBpbm8gKGFuZCwgd2hlbiBjb25maWd1cmVkLCBpdHMgcGluby1wcmV0dHkgdHJhbnNmb3JtIHN0cmVhbSkgaXMgZXhwZW5zaXZlIHRvIGNvbnN0cnVjdFxuICAvLyBhbmQgaXMgb25seSBldmVyIG5lZWRlZCB3aGVuIGEgY2FsbGVyIGV4cGxpY2l0bHkgcmVhZHMgc3RvcmUucGluby9sb2dnZXIucGlubyBvciBjb25maWd1cmVzXG4gIC8vIGNvbmZpZy5waW5vIOKAlCB0aGUgcGx1Z2luJ3Mgb3duIGxvZyBwYXRoIHdyaXRlcyB2aWEgY29uc29sZS4qIGFuZCBuZXZlciB0b3VjaGVzIGl0LiBCdWlsZGluZ1xuICAvLyBpdCBsYXppbHkgYmVoaW5kIGEgc3RhYmxlIFByb3h5IGtlZXBzIGBzdG9yZS5waW5vID09PSBsb2dnZXIucGlub2AgaWRlbnRpdHkgd2hpbGUgZGVmZXJyaW5nXG4gIC8vIHRoZSBjb3N0IHVudGlsIGZpcnN0IGFjY2Vzcy5cbiAgY29uc3QgcHJldHR5U3RyZWFtID0gKCk6IFJldHVyblR5cGU8dHlwZW9mIHByZXR0eT4gPT5cbiAgICBwcmV0dHkoe1xuICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgZXJyb3JLZXksXG4gICAgICBtZXNzYWdlS2V5XG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcblxuICBsZXQgcmVhbFBpbm86IFBpbm8gfCB1bmRlZmluZWRcblxuICBjb25zdCBnZXRQaW5vID0gKCk6IFBpbm8gPT4ge1xuICAgIGlmICghcmVhbFBpbm8pIHtcbiAgICAgIHJlYWxQaW5vID0gc2hvdWxkUHJldHR5UHJpbnRcbiAgICAgICAgPyBwaW5vRmFjdG9yeShiYXNlUGlub09wdGlvbnMsIHByZXR0eVN0cmVhbSgpKVxuICAgICAgICA6IHBpbm9GYWN0b3J5KHtcbiAgICAgICAgICAgIC4uLmJhc2VQaW5vT3B0aW9ucyxcbiAgICAgICAgICAgIHRyYW5zcG9ydDogcGlub09wdGlvbnMudHJhbnNwb3J0XG4gICAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWxQaW5vXG4gIH1cblxuICBjb25zdCBsYXp5UGlubyA9IG5ldyBQcm94eSh7fSBhcyBQaW5vLCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFBpbm8oKVxuICAgICAgY29uc3QgdmFsdWUgPSAodGFyZ2V0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICBwcm9wXG4gICAgICBdXG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHZhbHVlIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pLmJpbmQodGFyZ2V0KVxuICAgICAgICA6IHZhbHVlXG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiBwcm9wIGluIChnZXRQaW5vKCkgYXMgb2JqZWN0KVxuICB9KVxuXG4gIC8vIEV4cGxpY2l0IGNvbmZpZy5waW5vIG1lYW5zIHRoZSB1c2VyIG9wdGVkIGluIHRvIHBpbm8gZGlyZWN0bHk6IGNvbnN0cnVjdCBlYWdlcmx5IHNvXG4gIC8vIGludmFsaWQgb3B0aW9ucyBmYWlsIGZhc3QgYXQgcGx1Z2luIHNldHVwIHRpbWUsIG1hdGNoaW5nIHByZS1sYXp5IGJlaGF2aW9yLlxuICBpZiAoY29uZmlnPy5waW5vICE9PSB1bmRlZmluZWQpIHtcbiAgICBnZXRQaW5vKClcbiAgfVxuXG4gIC8vIFJlc29sdmVkIG9uY2UgcGVyIGxvZ2dlciBpbnN0YW5jZTogbm9uZSBvZiB0aGVzZSBkZXBlbmQgb24gcGVyLXJlcXVlc3Qgc3RhdGUuXG4gIGNvbnN0IHNpbmtzID0gcmVzb2x2ZVNpbmtzKGNvbmZpZylcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgZW1pdCh7XG4gICAgICBjb250ZXh0U3RvcmUsXG4gICAgICBkYXRhLFxuICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgIGxldmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBzaW5rcyxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBjb250ZXh0LCBtZXNzYWdlIH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0OiByZXF1ZXN0ID0+IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgICAgc2lua3MsXG4gICAgICAgIGZvcm1hdENvbnRleHRcbiAgICAgIClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBsb2csXG4gICAgbWVyZ2VDb250ZXh0OiAocmVxdWVzdCwgcGFydGlhbCkgPT4ge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgcGlubzogbGF6eVBpbm8sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cbn1cblxuLyoqIFBsdWdpbiBlbnRyeTogc2hhcmVzIG9uZSByZXF1ZXN0LWNvbnRleHQgc3RvcmUgYWNyb3NzIHRoZSBFbHlzaWEgbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBsdWdpbkxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4gY3JlYXRlTG9nZ2VyKG9wdGlvbnMsIHBpbm8sIGNvbnRleHRTdG9yZSlcbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9IC9cXGIoPzpcXGR7MSwzfVxcLil7M31cXGR7MSwzfVxcYi9nXG4vKiogRGlnaXQgcnVucyB0aGF0IG1heSBiZSBmb3JtYXR0ZWQgUEFOcyAoc3BhY2VzL2Rhc2hlcyk7IHZhbGlkYXRlZCB3aXRoIEx1aG4gYmVmb3JlIHJlZGFjdGluZy4gKi9cbmNvbnN0IENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCA9IC9cXGIoPzpcXGRbIC1dKj8pezEzLDE5fVxcYi9nXG5jb25zdCBKV1RfUkVHRVggPSAvZXlKW2EtekEtWjAtOV8tXStcXC5leUpbYS16QS1aMC05Xy1dK1xcLlthLXpBLVowLTlfLV0rL2dcblxuY29uc3QgUEFOX01JTl9MRU4gPSAxM1xuY29uc3QgUEFOX01BWF9MRU4gPSAxOVxuXG5jb25zdCBSRURBQ1RFRF9URVhUID0gJ1tSRURBQ1RFRF0nXG5jb25zdCBDSVJDVUxBUl9SRUYgPSAnW0NpcmN1bGFyXSdcblxuLyoqIENhc2UtaW5zZW5zaXRpdmUga2V5L2hlYWRlciBuYW1lcyB3aG9zZSBWQUxVRVMgYXJlIGFsd2F5cyByZWRhY3RlZC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFREFDVF9LRVlTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ2F1dGhvcml6YXRpb24nLFxuICAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdjb29raWUnLFxuICAnc2V0LWNvb2tpZScsXG4gICd4LWFwaS1rZXknLFxuICAnYXBpLWtleScsXG4gICdhcGlrZXknLFxuICAneC1hdXRoLXRva2VuJyxcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3Bhc3N3ZCcsXG4gICdzZWNyZXQnLFxuICAnY2xpZW50LXNlY3JldCcsXG4gICd0b2tlbicsXG4gICdhY2Nlc3MtdG9rZW4nLFxuICAncmVmcmVzaC10b2tlbicsXG4gICdpZC10b2tlbicsXG4gICdzZXNzaW9uJyxcbiAgJ3Nlc3Npb24taWQnLFxuICAncHJpdmF0ZS1rZXknLFxuICAnY3JlZGl0LWNhcmQnLFxuICAnY2FyZC1udW1iZXInLFxuICAnY3Z2JyxcbiAgJ3Nzbidcbl1cblxuY29uc3QgQ0FNRUxfQ0FTRV9CT1VOREFSWV9SRUdFWCA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5cbi8qKiBOb3JtYWxpemUgYFhfQXBpLUtleWAgLyBgYXBpS2V5YCBzdHlsZSB2YXJpYW50cyB0byBgeC1hcGkta2V5YCBmb3JtLiAqL1xuY29uc3Qgbm9ybWFsaXplS2V5TmFtZSA9IChrZXk6IHN0cmluZyk6IHN0cmluZyA9PlxuICBrZXlcbiAgICAucmVwbGFjZShDQU1FTF9DQVNFX0JPVU5EQVJZX1JFR0VYLCAnJDEtJDInKVxuICAgIC5yZXBsYWNlQWxsKCdfJywgJy0nKVxuICAgIC50b0xvd2VyQ2FzZSgpXG5cbmV4cG9ydCBjb25zdCBpc1NlbnNpdGl2ZUtleSA9IChcbiAga2V5OiBzdHJpbmcsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUtleU5hbWUoa2V5KVxuICBpZiAoREVGQVVMVF9SRURBQ1RfS0VZUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIChcbiAgICBleHRyYUtleXM/LnNvbWUoZXh0cmFLZXkgPT4gbm9ybWFsaXplS2V5TmFtZShleHRyYUtleSkgPT09IG5vcm1hbGl6ZWQpID8/XG4gICAgZmFsc2VcbiAgKVxufVxuXG4vKiogcGlubyByZWRhY3QgcGF0aHMgZm9yIG9uZSBrZXk6IHRvcC1sZXZlbCBhbmQgb25lIG5lc3RpbmcgbGV2ZWwuICovXG5leHBvcnQgY29uc3QgYnVpbGRQaW5vUmVkYWN0UGF0aHMgPSAoXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGtleXMgPSBbLi4uREVGQVVMVF9SRURBQ1RfS0VZUywgLi4uKGV4dHJhS2V5cyA/PyBbXSldXG4gIHJldHVybiBrZXlzLmZsYXRNYXAoa2V5ID0+IHtcbiAgICAvLyBwaW5vIHBhdGhzIGRvbid0IGFsbG93IGAtYCBpbiBiYXJlIGlkZW50aWZpZXJzOyBicmFja2V0LXF1b3RlIHRoZW0uXG4gICAgaWYgKGtleS5pbmNsdWRlcygnLScpKSB7XG4gICAgICByZXR1cm4gW2BbXCIke2tleX1cIl1gLCBgKltcIiR7a2V5fVwiXWBdXG4gICAgfVxuICAgIHJldHVybiBba2V5LCBgKi4ke2tleX1gXVxuICB9KVxufVxuXG4vKipcbiAqIEhvc3QgYW5kIHVzZXJpbmZvIGNhbm5vdCBjb250YWluIGBbUkVEQUNURURdYCDigJQgYFtgIGJlZ2lucyBhbiBJUHY2IGxpdGVyYWwgaW4gVVJMcyBhbmQgYnJlYWtzIHBhcnNpbmcuXG4gKi9cbmNvbnN0IFVSTF9TQUZFX1JFREFDVCA9ICdyZWRhY3RlZCdcblxuY29uc3QgcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHJlZGFjdFN0cmluZyh2YWx1ZSkucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG5cbi8qKiBBcHBseSBQSUkgcmVkYWN0aW9uIHRvIGEgcmVxdWVzdCBVUkwgd2hpbGUga2VlcGluZyB0aGUgcmVzdWx0IHBhcnNlYWJsZSBieSB0aGUgVVJML1JlcXVlc3QgY29uc3RydWN0b3JzLiAqL1xuY29uc3QgcmVkYWN0UmVxdWVzdFVybCA9ICh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsU3RyaW5nKVxuICAgIGlmICh1LnVzZXJuYW1lICE9PSAnJykge1xuICAgICAgdS51c2VybmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS51c2VybmFtZSlcbiAgICB9XG4gICAgaWYgKHUucGFzc3dvcmQgIT09ICcnKSB7XG4gICAgICB1LnBhc3N3b3JkID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnBhc3N3b3JkKVxuICAgIH1cbiAgICB1Lmhvc3RuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1Lmhvc3RuYW1lKVxuICAgIHUucGF0aG5hbWUgPSByZWRhY3RTdHJpbmcodS5wYXRobmFtZSlcbiAgICB1LnNlYXJjaCA9IHJlZGFjdFN0cmluZyh1LnNlYXJjaClcbiAgICB1Lmhhc2ggPSByZWRhY3RTdHJpbmcodS5oYXNoKVxuICAgIHJldHVybiB1LnRvU3RyaW5nKClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh1cmxTdHJpbmcpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuICB9XG59XG5cbi8qKiBMdWhuIGNoZWNrc3VtOyBgZGlnaXRzYCBtdXN0IGNvbnRhaW4gb25seSBgMC05YCBhbmQgbGVuZ3RoIGluIFBBTiByYW5nZS4gKi9cbmNvbnN0IHBhc3Nlc0x1aG4gPSAoZGlnaXRzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGRpZ2l0cy5sZW5ndGggPCBQQU5fTUlOX0xFTiB8fCBkaWdpdHMubGVuZ3RoID4gUEFOX01BWF9MRU4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGxldCBhbHRlcm5hdGUgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSBkaWdpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiA1Nykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGxldCBuID0gY29kZSAtIDQ4XG4gICAgaWYgKGFsdGVybmF0ZSkge1xuICAgICAgbiAqPSAyXG4gICAgICBpZiAobiA+IDkpIHtcbiAgICAgICAgbiAtPSA5XG4gICAgICB9XG4gICAgfVxuICAgIHN1bSArPSBuXG4gICAgYWx0ZXJuYXRlID0gIWFsdGVybmF0ZVxuICB9XG5cbiAgcmV0dXJuIHN1bSAlIDEwID09PSAwXG59XG5cbmNvbnN0IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICB0ZXh0LnJlcGxhY2UoQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYLCBtYXRjaCA9PiB7XG4gICAgY29uc3QgZGlnaXRzID0gbWF0Y2gucmVwbGFjZSgvXFxEL2csICcnKVxuICAgIGlmIChcbiAgICAgIGRpZ2l0cy5sZW5ndGggPj0gUEFOX01JTl9MRU4gJiZcbiAgICAgIGRpZ2l0cy5sZW5ndGggPD0gUEFOX01BWF9MRU4gJiZcbiAgICAgIHBhc3Nlc0x1aG4oZGlnaXRzKVxuICAgICkge1xuICAgICAgcmV0dXJuIFJFREFDVEVEX1RFWFRcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoXG4gIH0pXG5cbi8qKiBSZXR1cm5zIGB0ZXh0YCB1bmNoYW5nZWQgKHNhbWUgdmFsdWUpIHdoZW4gbm90aGluZyBtYXRjaGVkIOKAlCBjYWxsZXJzIGNhbiBjb21wYXJlIGA9PT0gaW5wdXRgLiAqL1xuZXhwb3J0IGNvbnN0IHJlZGFjdFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzdWx0ID0gdGV4dFxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIEVycm9ycyBhcmUgZXhlbXB0IGZyb20gdGhlIGlkZW50aXR5IGZhc3QgcGF0aCBiZWxvdzogYSByZWRhY3RlZCBFcnJvciBpcyBhbHdheXMgY29uc3RydWN0ZWRcbi8vIGZyZXNoIChldmVuIHdoZW4gbm90aGluZyBjaGFuZ2VkKSBzbyBjb25zdW1lcnMgbmV2ZXIgcmVjZWl2ZSB0aGUgb3JpZ2luYWwsIHBvdGVudGlhbGx5XG4vLyBzdGFjay10cmFjZS1jYXJyeWluZyBpbnN0YW5jZSBieSByZWZlcmVuY2UuXG5jb25zdCByZWRhY3RFcnJvckNsb25lID0gKFxuICBvcmlnaW5hbEVycm9yOiBFcnJvcixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLm1lc3NhZ2UpXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXJyb3IpIGFzIG9iamVjdFxuICBjb25zdCBuZXdFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG8pIGFzIEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBuZXdFcnJvci5tZXNzYWdlID0gcmVkYWN0ZWRNZXNzYWdlXG4gIG5ld0Vycm9yLm5hbWUgPSBvcmlnaW5hbEVycm9yLm5hbWVcblxuICBpZiAob3JpZ2luYWxFcnJvci5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmV3RXJyb3Iuc3RhY2sgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5zdGFjaylcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXJyb3JSZWNvcmQpKSB7XG4gICAgaWYgKGtleSAhPT0gJ21lc3NhZ2UnICYmIGtleSAhPT0gJ25hbWUnICYmIGtleSAhPT0gJ3N0YWNrJykge1xuICAgICAgbmV3RXJyb3Jba2V5XSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgICA/IFJFREFDVEVEX1RFWFRcbiAgICAgICAgOiByZWRhY3RJbm5lcihlcnJvclJlY29yZFtrZXldLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbi8qKlxuICogUmVkYWN0cyBlYWNoIGl0ZW07IHJldHVybnMgdGhlIE9SSUdJTkFMIGFycmF5IHJlZmVyZW5jZSB3aGVuIG5vIGl0ZW0gY2hhbmdlZCAoemVyb1xuICogYWxsb2NhdGlvbnMgZm9yIHRoZSBjb21tb24gbm8tUElJIGNhc2UpLiBBIG5ldyBhcnJheSBpcyBtYXRlcmlhbGl6ZWQgbGF6aWx5LCBzdGFydGluZyBmcm9tXG4gKiB0aGUgZmlyc3QgaXRlbSB0aGF0IGNoYW5nZXMg4oCUIGl0ZW1zIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBrbm93bi11bmNoYW5nZWQsIHNvIHRoZXkncmUgY29waWVkXG4gKiBmcm9tIGB2YWx1ZWAgYXMtaXMgcmF0aGVyIHRoYW4gcmVjb21wdXRlZC5cbiAqL1xuY29uc3QgcmVkYWN0QXJyYXlJdGVtcyA9IChcbiAgdmFsdWU6IHVua25vd25bXSxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogdW5rbm93bltdID0+IHtcbiAgbGV0IHJlc3VsdDogdW5rbm93bltdIHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIG9yaWdpbmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmIHJlZGFjdGVkICE9PSBvcmlnaW5hbCkge1xuICAgICAgcmVzdWx0ID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpXG4gICAgfVxuICAgIHJlc3VsdD8ucHVzaChyZWRhY3RlZClcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gdmFsdWVcbn1cblxuLyoqIFNhbWUgbGF6eS1tYXRlcmlhbGl6YXRpb24gc3RyYXRlZ3kgYXMge0BsaW5rIHJlZGFjdEFycmF5SXRlbXN9LCBmb3IgcGxhaW4gb2JqZWN0cy4gKi9cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpXG4gIGxldCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHJlY29yZFZhbHVlW2tleV1cbiAgICBjb25zdCBzZW5zaXRpdmUgPSBpc1NlbnNpdGl2ZUtleShrZXksIGV4dHJhS2V5cylcbiAgICBjb25zdCByZWRhY3RlZCA9IHNlbnNpdGl2ZVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgKHNlbnNpdGl2ZSB8fCByZWRhY3RlZCAhPT0gb3JpZ2luYWwpKSB7XG4gICAgICByZXN1bHQgPSB7fVxuICAgICAgZm9yIChjb25zdCBwcmlvcktleSBvZiBrZXlzLnNsaWNlKDAsIGluZGV4KSkge1xuICAgICAgICByZXN1bHRbcHJpb3JLZXldID0gcmVjb3JkVmFsdWVbcHJpb3JLZXldXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0W2tleV0gPSByZWRhY3RlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gcmVjb3JkVmFsdWVcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG5jb25zdCByZWRhY3RJbm5lciA9IDxUPihcbiAgdmFsdWU6IFQsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgLy8gRGF0ZXMgY2Fycnkgbm8gcmVkYWN0YWJsZSBzdHJpbmcgY29udGVudCBhbmQgYXJlIG5ldmVyIG11dGF0ZWQgYnkgdGhpcyBtb2R1bGUsIHNvIHRoZXlcbiAgICAvLyBwYXNzIHRocm91Z2ggYnkgcmVmZXJlbmNlIChwYXJ0IG9mIHRoZSBpZGVudGl0eSBmYXN0IHBhdGgpIGluc3RlYWQgb2YgYmVpbmcgZGVmZW5zaXZlbHlcbiAgICAvLyBjbG9uZWQgYXMgYmVmb3JlLlxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICByZWRhY3RSZWNvcmRFbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQsIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdKTogVCA9PlxuICByZWRhY3RJbm5lcih2YWx1ZSwgbmV3IFdlYWtTZXQoKSwgZXh0cmFLZXlzKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMLCBtZXRob2QgYW5kIGhlYWRlcnMgZm9yIGxvZ2dpbmcgd2l0aCB0aGUgc2FtZSBzdHJpbmcgcmVkYWN0aW9uIGFzIHtAbGluayByZWRhY3R9LlxuICogVGhlIHJldHVybmVkIHJlcXVlc3QgaXMgYSBsb2dnaW5nLW9ubHkgYXJ0aWZhY3QgY2FycnlpbmcgdXJsL21ldGhvZC9oZWFkZXJzL3NpZ25hbDsgaXQgaW50ZW50aW9uYWxseVxuICogb21pdHMgdGhlIGJvZHkgc28gaXQgbmV2ZXIgcmUtdXNlcyB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IGFscmVhZHktY29uc3VtZWQpIHJlcXVlc3Qgc3RyZWFtLiBUaGVcbiAqIG9yaWdpbmFsIHJlcXVlc3QgaXMgbGVmdCB1bnRvdWNoZWQgYW5kIHJlbWFpbnMgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFJlcXVlc3QgPT4ge1xuICBjb25zdCByZWRhY3RlZFVybCA9IHJlZGFjdFJlcXVlc3RVcmwocmVxdWVzdC51cmwpXG4gIGNvbnN0IG5leHRIZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICBsZXQgaGVhZGVyc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiByZXF1ZXN0LmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcmVkYWN0ZWQgPSBpc1NlbnNpdGl2ZUtleShuYW1lLCBleHRyYUtleXMpXG4gICAgICA/IFJFREFDVEVEX1RFWFRcbiAgICAgIDogcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIGlmIChyZWRhY3RlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGhlYWRlcnNDaGFuZ2VkID0gdHJ1ZVxuICAgIH1cbiAgICBuZXh0SGVhZGVycy5zZXQobmFtZSwgcmVkYWN0ZWQpXG4gIH1cblxuICBjb25zdCByZWRhY3RlZE1ldGhvZCA9IHJlZGFjdFN0cmluZyhyZXF1ZXN0Lm1ldGhvZClcbiAgY29uc3QgdXJsQ2hhbmdlZCA9IHJlZGFjdGVkVXJsICE9PSByZXF1ZXN0LnVybFxuICBjb25zdCBtZXRob2RDaGFuZ2VkID0gcmVkYWN0ZWRNZXRob2QgIT09IHJlcXVlc3QubWV0aG9kXG5cbiAgaWYgKCEodXJsQ2hhbmdlZCB8fCBoZWFkZXJzQ2hhbmdlZCB8fCBtZXRob2RDaGFuZ2VkKSkge1xuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBoZWFkZXJzOiBuZXh0SGVhZGVycyxcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVxdWVzdChyZWRhY3RlZFVybCwgaW5pdClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBpc1N0cnVjdHVyZWRFcnJvciwgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgc2FuaXRpemVMb2dUZXh0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUnXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmNvbnN0IExPR19GT1JNQVRfUkVHRVggPVxuICAvXFx7KG5vd3xlcG9jaHxsZXZlbHxpY29ufGR1cmF0aW9ufG1ldGhvZHxwYXRobmFtZXxwYXRofHF1ZXJ5fHN0YXR1c3xzdGF0dXNUZXh0fG1lc3NhZ2V8aXB8Y29udGV4dHxzZXJ2aWNlfHNwZWVkfHJlcXVlc3RJZClcXH0vZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZExvZ091dHB1dCB7XG4gIGNvbnRleHRMaW5lczogc3RyaW5nW11cbiAgbWFpbjogc3RyaW5nXG59XG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGZvcndhcmRlZFxuICAgID8gKGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJycpXG4gICAgOiAocmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJycpXG4gIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoY2FuZGlkYXRlLCA2NClcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgc2xvdzogbnVtYmVyLFxuICB2ZXJ5U2xvdzogbnVtYmVyXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogcmF3IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogY29sb3JlZCB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1czogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcbiAgfVxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXG59XG5cbmNvbnN0IGdldENvbG9yZWRUaW1lc3RhbXAgPSAodGltZXN0YW1wOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmdyYXkodGltZXN0YW1wKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcbn1cblxuY29uc3QgZ2V0U3RhdHVzVGV4dCA9IChzdGF0dXNDb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZXh0ID0gU1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdXG4gIHJldHVybiB0ZXh0ID8/ICcnXG59XG5cbmNvbnN0IGdldFNlcnZpY2VUb2tlbiA9IChvcHRpb25zOiBPcHRpb25zLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuYW1lID0gb3B0aW9ucy5jb25maWc/LnNlcnZpY2U/LnRyaW0oKVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSBgWyR7bmFtZX1dYFxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgJHticmFja2V0ZWR9IGBcbiAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZGltKGJyYWNrZXRlZCl9IGBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBzdHJpbmdcbiAgc2VydmljZVRva2VuOiBzdHJpbmdcbiAgc2xvd1RocmVzaG9sZDogbnVtYmVyXG4gIC8qKiBGb3JtYXQgdG9rZW5zIGFjdHVhbGx5IHByZXNlbnQgaW4gYGZvcm1hdGAgKHNlZSB7QGxpbmsgTE9HX0ZPUk1BVF9SRUdFWH0pLiAqL1xuICB0b2tlbnM6IFNldDxzdHJpbmc+XG4gIHVzZUNvbG9yczogYm9vbGVhblxuICB2ZXJ5U2xvd1RocmVzaG9sZDogbnVtYmVyXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgY29sb3JzL2Zvcm1hdC90aHJlc2hvbGRzL3NlcnZpY2Ugb25jZSBwZXIgbG9nZ2VyIGluc3RhbmNlIGluc3RlYWQgb2YgcGVyIGxvZyBsaW5lLlxuICogU2FmZSB0byBob2lzdDogVFRZLW5lc3MgYW5kIGNvbmZpZyBkb24ndCBjaGFuZ2UgYWNyb3NzIGEgcHJvY2VzcydzIGxpZmV0aW1lLCBzbyBmcmVlemluZyB0aGVcbiAqIGNvbG9ycyBkZWNpc2lvbiBhdCBjb25zdHJ1Y3Rpb24gdGltZSBtYXRjaGVzIHJlYWwgcHJvY2VzcyBsaWZlY3ljbGVzLlxuICpcbiAqIE5PVEU6IGFkZGluZyBhIG5ldyBmb3JtYXQgdG9rZW4gcmVxdWlyZXMgYWRkaW5nIGl0IGJvdGggdG8ge0BsaW5rIExPR19GT1JNQVRfUkVHRVh9IGFuZCB0byB0aGVcbiAqIHRva2VuLWdhdGluZyBjaGVja3MgaW4ge0BsaW5rIGZvcm1hdExvZ091dHB1dH0gYmVsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtYXRDb250ZXh0ID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBGb3JtYXRDb250ZXh0ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuICBjb25zdCB0b2tlbnMgPSBuZXcgU2V0KGZvcm1hdC5tYXRjaChMT0dfRk9STUFUX1JFR0VYKSA/PyBbXSlcbiAgY29uc3QgeyBzbG93OiBzbG93VGhyZXNob2xkLCB2ZXJ5U2xvdzogdmVyeVNsb3dUaHJlc2hvbGQgfSA9XG4gICAgZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICByZXR1cm4ge1xuICAgIGZvcm1hdCxcbiAgICBzZXJ2aWNlVG9rZW4sXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB0b2tlbnMsXG4gICAgdXNlQ29sb3JzLFxuICAgIHZlcnlTbG93VGhyZXNob2xkXG4gIH1cbn1cblxuY29uc3Qgc3RyaW5naWZ5VHJlZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJ1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KHZhbHVlKVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUubWVzc2FnZSlcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KFN0cmluZyh2YWx1ZSkpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmNvbnN0IGNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzID0gKGVycm9yOiB1bmtub3duKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihlcnJvcilcbiAgaWYgKG1zZykge1xuICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgbXNnXSlcbiAgfVxuICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLndoeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci53aHknLCBTdHJpbmcoZXJyb3Iud2h5KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5maXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuZml4JywgU3RyaW5nKGVycm9yLmZpeCldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5saW5rJywgU3RyaW5nKGVycm9yLmxpbmspXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmludGVybmFsJywgc3RyaW5naWZ5VHJlZVZhbHVlKGVycm9yLmludGVybmFsKV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhbiA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgJ2Vycm9yJyBpbiBkYXRhICYmIGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGVudHJpZXMucHVzaCguLi5jb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyhkYXRhLmVycm9yKSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuLyoqIFJhdyBkdXJhdGlvbi9VUkwgcGFydHMgY29tcHV0ZWQgb25jZSBwZXIgbG9nIGVtaXNzaW9uIGJ5IHRoZSBjYWxsZXIgKHNlZSBgbG9nZ2VyL2luZGV4LnRzYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZWNvbXB1dGVkTG9nUGFydHMge1xuICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgcGF0aG5hbWU6IHN0cmluZ1xuICBzZWFyY2g6IHN0cmluZ1xufVxuXG4vKiogYHtub3d9YC9ge2Vwb2NofWAgc2hhcmUgYSBzaW5nbGUgYERhdGVgIHNhbXBsZTsgZWFjaCBpcyBvbmx5IGZvcm1hdHRlZCB3aGVuIHJlcXVlc3RlZC4gKi9cbmNvbnN0IGdldFRpbWVzdGFtcFRva2VucyA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgdHJhbnNsYXRlVGltZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHsgdGltZXN0YW1wOiBzdHJpbmc7IGVwb2NoOiBzdHJpbmcgfSA9PiB7XG4gIGlmICghKHRva2Vucy5oYXMoJ3tub3d9JykgfHwgdG9rZW5zLmhhcygne2Vwb2NofScpKSkge1xuICAgIHJldHVybiB7IGVwb2NoOiAnJywgdGltZXN0YW1wOiAnJyB9XG4gIH1cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IHRva2Vucy5oYXMoJ3tlcG9jaH0nKSA/IFN0cmluZyhub3cuZ2V0VGltZSgpKSA6ICcnXG4gIGlmICghdG9rZW5zLmhhcygne25vd30nKSkge1xuICAgIHJldHVybiB7IGVwb2NoLCB0aW1lc3RhbXA6ICcnIH1cbiAgfVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCB0cmFuc2xhdGVUaW1lKVxuICByZXR1cm4geyBlcG9jaCwgdGltZXN0YW1wOiBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKSB9XG59XG5cbmNvbnN0IGdldE1lc3NhZ2VUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHN0cmluZyA9PiB7XG4gIGlmICghdG9rZW5zLmhhcygne21lc3NhZ2V9JykpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xufVxuXG4vKiogYHtwYXRobmFtZX1gL2B7cGF0aH1gL2B7cXVlcnl9YCBzaGFyZSBhIHNpbmdsZSBVUkwgcGFyc2UgKG9yIHRoZSBwcmVjb21wdXRlZCBvbmUpLiAqL1xuY29uc3QgZ2V0UGF0aG5hbWVUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xuKTogeyBjb2xvcmVkUGF0aG5hbWU6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgbmVlZHNQYXRobmFtZSA9IHRva2Vucy5oYXMoJ3twYXRobmFtZX0nKSB8fCB0b2tlbnMuaGFzKCd7cGF0aH0nKVxuICBjb25zdCBuZWVkc1F1ZXJ5ID0gdG9rZW5zLmhhcygne3F1ZXJ5fScpXG4gIGlmICghKG5lZWRzUGF0aG5hbWUgfHwgbmVlZHNRdWVyeSkpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeTogJycgfVxuICB9XG5cbiAgbGV0IHJhd1BhdGhuYW1lOiBzdHJpbmdcbiAgbGV0IHNlYXJjaDogc3RyaW5nXG4gIGlmIChwcmVjb21wdXRlZCkge1xuICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gcHJlY29tcHV0ZWQpXG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgICAgc2VhcmNoID0gJydcbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IG5lZWRzUXVlcnkgPyBzZWFyY2ggOiAnJ1xuICBpZiAoIW5lZWRzUGF0aG5hbWUpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeSB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3NlYXJjaH1gXG4gICAgOiByYXdQYXRobmFtZVxuICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKSwgcXVlcnkgfVxufVxuXG4vKiogYHtzdGF0dXN9YC9ge3N0YXR1c1RleHR9YCBzaGFyZSBhIHNpbmdsZSBzdGF0dXMtY29kZSByZXNvbHV0aW9uLiAqL1xuY29uc3QgZ2V0U3RhdHVzVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiB7IGNvbG9yZWRTdGF0dXM6IHN0cmluZzsgc3RhdHVzVGV4dDogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBuZWVkc1N0YXR1cyA9IHRva2Vucy5oYXMoJ3tzdGF0dXN9JylcbiAgY29uc3QgbmVlZHNTdGF0dXNUZXh0ID0gdG9rZW5zLmhhcygne3N0YXR1c1RleHR9JylcbiAgaWYgKCEobmVlZHNTdGF0dXMgfHwgbmVlZHNTdGF0dXNUZXh0KSkge1xuICAgIHJldHVybiB7IGNvbG9yZWRTdGF0dXM6ICcnLCBzdGF0dXNUZXh0OiAnJyB9XG4gIH1cbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICByZXR1cm4ge1xuICAgIGNvbG9yZWRTdGF0dXM6IG5lZWRzU3RhdHVzXG4gICAgICA/IGdldENvbG9yZWRTdGF0dXMoU3RyaW5nKHN0YXR1c0NvZGUpLCB1c2VDb2xvcnMpXG4gICAgICA6ICcnLFxuICAgIHN0YXR1c1RleHQ6IG5lZWRzU3RhdHVzVGV4dCA/IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSkgOiAnJ1xuICB9XG59XG5cbmNvbnN0IGdldElwVG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBzdHJpbmcgPT4gKGNvbmZpZz8uaXAgPT09IHRydWUgJiYgdG9rZW5zLmhhcygne2lwfScpID8gZ2V0SXAocmVxdWVzdCkgOiAnJylcblxuY29uc3QgaGFzTm9uRW1wdHlDb250ZXh0ID0gKFxuICBjb250ZXh0OiB1bmtub3duXG4pOiBjb250ZXh0IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIGNvbnRleHQgIT09IG51bGwgJiZcbiAgY29udGV4dCAhPT0gdW5kZWZpbmVkICYmXG4gIHR5cGVvZiBjb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheShjb250ZXh0KSAmJlxuICBPYmplY3Qua2V5cyhjb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuXG5jb25zdCBnZXRDb250ZXh0VG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRva2Vucy5oYXMoJ3tjb250ZXh0fScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3Qgc2hvd1RyZWUgPSBjb25maWc/LnNob3dDb250ZXh0VHJlZSAhPT0gZmFsc2VcbiAgaWYgKHNob3dUcmVlICYmIGhhc05vbkVtcHR5Q29udGV4dChkYXRhLmNvbnRleHQpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxufVxuXG4vKiogYHtkdXJhdGlvbn1gL2B7c3BlZWR9YCBzaGFyZSBhIHNpbmdsZSBkdXJhdGlvbiBzYW1wbGUgYW5kIHNsb3ctdGhyZXNob2xkIGNoZWNrLiAqL1xuY29uc3QgZ2V0RHVyYXRpb25Ub2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgc2xvd1RocmVzaG9sZDogbnVtYmVyLFxuICB2ZXJ5U2xvd1RocmVzaG9sZDogbnVtYmVyLFxuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbik6IHsgY29sb3JlZER1cmF0aW9uOiBzdHJpbmc7IHNwZWVkVG9rZW46IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgbmVlZHNEdXJhdGlvbiA9IHRva2Vucy5oYXMoJ3tkdXJhdGlvbn0nKVxuICBjb25zdCBuZWVkc1NwZWVkID0gdG9rZW5zLmhhcygne3NwZWVkfScpXG4gIGlmICghKG5lZWRzRHVyYXRpb24gfHwgbmVlZHNTcGVlZCkpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkRHVyYXRpb246ICcnLCBzcGVlZFRva2VuOiAnJyB9XG4gIH1cbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz9cbiAgICAoc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDApXG4gIGNvbnN0IHsgdGV4dCwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICApXG4gIHJldHVybiB7XG4gICAgY29sb3JlZER1cmF0aW9uOiBuZWVkc0R1cmF0aW9uID8gdGV4dCA6ICcnLFxuICAgIHNwZWVkVG9rZW46IG5lZWRzU3BlZWQgPyBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycykgOiAnJ1xuICB9XG59XG5cbmNvbnN0IGdldFJlcXVlc3RJZFRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7cmVxdWVzdElkfScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmICh0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCBjdHggPT09IG51bGwgfHwgISgncmVxdWVzdElkJyBpbiBjdHgpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIFN0cmluZygoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yZXF1ZXN0SWQpXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb2dPdXRwdXQgPSAoe1xuICBsZXZlbCxcbiAgcmVxdWVzdCxcbiAgZGF0YSxcbiAgc3RvcmUsXG4gIG9wdGlvbnMsXG4gIGZvcm1hdENvbnRleHQsXG4gIHByZWNvbXB1dGVkXG59OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBjb25zdGFudHM7IGNvbXB1dGVkIG9uIHRoZSBmbHkgd2hlbiBhIGRpcmVjdCBjYWxsZXIgb21pdHMgaXQuICovXG4gIGZvcm1hdENvbnRleHQ/OiBGb3JtYXRDb250ZXh0XG4gIC8qKiBEdXJhdGlvbi9VUkwgcGFydHMgYWxyZWFkeSBjb21wdXRlZCBieSB0aGUgY2FsbGVyOyBwYXJzZWQgb24gdGhlIGZseSB3aGVuIG9taXR0ZWQuICovXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xufSk6IEZvcm1hdHRlZExvZ091dHB1dCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IHtcbiAgICBmb3JtYXQsXG4gICAgc2VydmljZVRva2VuLFxuICAgIHNsb3dUaHJlc2hvbGQsXG4gICAgdG9rZW5zLFxuICAgIHVzZUNvbG9ycyxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICB9ID0gZm9ybWF0Q29udGV4dCA/PyBjcmVhdGVGb3JtYXRDb250ZXh0KG9wdGlvbnMpXG5cbiAgY29uc3QgeyB0aW1lc3RhbXAsIGVwb2NoIH0gPSBnZXRUaW1lc3RhbXBUb2tlbnMoXG4gICAgdG9rZW5zLFxuICAgIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgIHVzZUNvbG9yc1xuICApXG4gIGNvbnN0IG1lc3NhZ2UgPSBnZXRNZXNzYWdlVG9rZW4odG9rZW5zLCBkYXRhKVxuICBjb25zdCB7IGNvbG9yZWRQYXRobmFtZSwgcXVlcnkgfSA9IGdldFBhdGhuYW1lVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICByZXF1ZXN0LFxuICAgIGNvbmZpZyxcbiAgICB1c2VDb2xvcnMsXG4gICAgcHJlY29tcHV0ZWRcbiAgKVxuICBjb25zdCB7IGNvbG9yZWRTdGF0dXMsIHN0YXR1c1RleHQgfSA9IGdldFN0YXR1c1Rva2Vucyh0b2tlbnMsIGRhdGEsIHVzZUNvbG9ycylcbiAgY29uc3QgaXAgPSBnZXRJcFRva2VuKHRva2VucywgcmVxdWVzdCwgY29uZmlnKVxuICBjb25zdCBjdHhTdHJpbmcgPSBnZXRDb250ZXh0VG9rZW4odG9rZW5zLCBkYXRhLCBjb25maWcpXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IHRva2Vucy5oYXMoJ3tsZXZlbH0nKVxuICAgID8gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gICAgOiAnJ1xuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gdG9rZW5zLmhhcygne21ldGhvZH0nKVxuICAgID8gZ2V0Q29sb3JlZE1ldGhvZChcbiAgICAgICAgcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRCksXG4gICAgICAgIHVzZUNvbG9yc1xuICAgICAgKVxuICAgIDogJydcbiAgY29uc3QgeyBjb2xvcmVkRHVyYXRpb24sIHNwZWVkVG9rZW4gfSA9IGdldER1cmF0aW9uVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICBzdG9yZSxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZCxcbiAgICBwcmVjb21wdXRlZFxuICApXG4gIGNvbnN0IGljb24gPSB0b2tlbnMuaGFzKCd7aWNvbn0nKSA/IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKSA6ICcnXG4gIGNvbnN0IHJlcXVlc3RJZCA9IGdldFJlcXVlc3RJZFRva2VuKHRva2VucywgZGF0YSlcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7ZXBvY2h9JzogZXBvY2gsXG4gICAgJ3tpY29ufSc6IGljb24sXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne21lc3NhZ2V9JzogbWVzc2FnZSxcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne3BhdGh9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cXVlcnl9JzogcXVlcnksXG4gICAgJ3tyZXF1ZXN0SWR9JzogcmVxdWVzdElkLFxuICAgICd7c2VydmljZX0nOiBzZXJ2aWNlVG9rZW4sXG4gICAgJ3tzcGVlZH0nOiBzcGVlZFRva2VuLFxuICAgICd7c3RhdHVzfSc6IGNvbG9yZWRTdGF0dXMsXG4gICAgJ3tzdGF0dXNUZXh0fSc6IHN0YXR1c1RleHRcbiAgfVxuXG4gIGNvbnN0IG1haW4gPSBmb3JtYXQucmVwbGFjZShcbiAgICBMT0dfRk9STUFUX1JFR0VYLFxuICAgIG1hdGNoID0+IHRva2VuTWFwW21hdGNoXSA/PyBtYXRjaFxuICApXG5cbiAgY29uc3QgY29udGV4dExpbmVzID0gYnVpbGRDb250ZXh0VHJlZUxpbmVzKGxldmVsLCBkYXRhLCBvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgcmV0dXJuIHsgY29udGV4dExpbmVzLCBtYWluIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHBhcnNlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cbiAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cbiAgcmV0dXJuIFN0cmluZyhlcnJvcilcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJ1Y3R1cmVkRXJyb3Ige1xuICBmaXg/OiBzdHJpbmdcbiAgaW50ZXJuYWw/OiB1bmtub3duXG4gIGxpbms/OiBzdHJpbmdcbiAgd2h5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBpc1N0cnVjdHVyZWRFcnJvciA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIFN0cnVjdHVyZWRFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgKCd3aHknIGluIHZhbHVlIHx8ICdmaXgnIGluIHZhbHVlIHx8ICdsaW5rJyBpbiB2YWx1ZSB8fCAnaW50ZXJuYWwnIGluIHZhbHVlKVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRMb2dnZWRFcnJvciB7XG4gIC8qKiBTYWZlIHN0cnVjdHVyZWQgcmVwcmVzZW50YXRpb24gZm9yIGRhdGEvdHJhbnNwb3J0IG1ldGEuICovXG4gIGVycm9yOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAvKiogU2FmZSBvbmUtbGluZSBtZXNzYWdlIGZvciB0aGUgbG9nIGxpbmUuICovXG4gIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5jb25zdCBpc1ZhbGlkYXRpb25FcnJvckxpa2UgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBFcnJvciAmIHsgYWxsPzogdW5rbm93bltdOyBzdGF0dXM/OiBudW1iZXI7IHR5cGU/OiBzdHJpbmcgfSA9PlxuICB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gIC8vIGBjb2RlYCBpcyBFbHlzaWEncyBtaW5pZmljYXRpb24tc2FmZSBkaXNjcmltaW5hbnQg4oCUIGAubmFtZWAgYW5kXG4gIC8vIGAuY29uc3RydWN0b3IubmFtZWAgYm90aCBkZWdyYWRlIHRvIGEgbWFuZ2xlZCBzdHJpbmcgdW5kZXIgYnVuZGxlclxuICAvLyBtaW5pZmljYXRpb24gKGUuZy4gYGJ1biBidWlsZCAtLW1pbmlmeWAsIGVzYnVpbGQpLCBzbyBgY29kZWAgbXVzdCBiZVxuICAvLyBjaGVja2VkIHRvbyBvciB2YWxpZGF0aW9uIGJvZGllcyBzaWxlbnRseSByZS1sZWFrIGluIHRoYXQgYnVpbGQgbW9kZS5cbiAgKCh2YWx1ZSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09ICdWQUxJREFUSU9OJyB8fFxuICAgIHZhbHVlLm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InIHx8XG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InKVxuXG5jb25zdCBTVFJVQ1RVUkVEX0VSUk9SX0tFWVMgPSBbXG4gICdmaXgnLFxuICAnaW50ZXJuYWwnLFxuICAnbGluaycsXG4gICdtZXNzYWdlJyxcbiAgJ25hbWUnLFxuICAnc3RhdHVzJyxcbiAgJ3doeSdcbl0gYXMgY29uc3RcblxuY29uc3QgY29weVN0cnVjdHVyZWRFcnJvckZpZWxkcyA9IChcbiAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUlVDVFVSRURfRVJST1JfS0VZUykge1xuICAgIGlmIChyZWNvcmRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzYWZlW2tleV0gPSByZWNvcmRba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2FmZVxufVxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplTG9nZ2VkRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBsb2dFcnJvclBheWxvYWQ6IGJvb2xlYW5cbik6IE5vcm1hbGl6ZWRMb2dnZWRFcnJvciA9PiB7XG4gIGlmIChpc1ZhbGlkYXRpb25FcnJvckxpa2UoZXJyb3IpICYmICFsb2dFcnJvclBheWxvYWQpIHtcbiAgICBjb25zdCBmYWlsdXJlcyA9IEFycmF5LmlzQXJyYXkoZXJyb3IuYWxsKSA/IGVycm9yLmFsbCA6IFtdXG4gICAgY29uc3QgcGF0aHMgPSBmYWlsdXJlc1xuICAgICAgLm1hcChmYWlsdXJlID0+XG4gICAgICAgIHR5cGVvZiBmYWlsdXJlID09PSAnb2JqZWN0JyAmJiBmYWlsdXJlICE9PSBudWxsICYmICdwYXRoJyBpbiBmYWlsdXJlXG4gICAgICAgICAgPyBTdHJpbmcoKGZhaWx1cmUgYXMgeyBwYXRoOiB1bmtub3duIH0pLnBhdGgpXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHNjb3BlID0gdHlwZW9mIGVycm9yLnR5cGUgPT09ICdzdHJpbmcnID8gZXJyb3IudHlwZSA6ICdyZXF1ZXN0J1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgcGF0aHMubGVuZ3RoID4gMFxuICAgICAgICA/IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pOiAke3BhdGhzLmpvaW4oJywgJyl9YFxuICAgICAgICA6IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pYFxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBmYWlsZWRQYXRoczogcGF0aHMsIG5hbWU6ICdWYWxpZGF0aW9uRXJyb3InLCB0eXBlOiBzY29wZSB9LFxuICAgICAgbWVzc2FnZVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgY29uc3Qgc2FmZSA9IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMoXG4gICAgICBlcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKVxuICAgIHNhZmUubWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgICAvLyBOYXRpdmUgc3ViY2xhc3NlcyAoZS5nLiBgY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3JgKSBkb24ndCBzZXRcbiAgICAvLyBgLm5hbWVgIHVubGVzcyB0aGUgYXV0aG9yIG92ZXJyaWRlcyBpdCwgc28gaXQgcmVhZHMgYmFjayBhcyB0aGVcbiAgICAvLyBnZW5lcmljIFwiRXJyb3JcIi4gUHJlZmVyIHRoZSBjb25zdHJ1Y3RvciBuYW1lIGluIHRoYXQgY2FzZS5cbiAgICBzYWZlLm5hbWUgPVxuICAgICAgZXJyb3IubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICA/IChlcnJvci5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBlcnJvci5uYW1lKVxuICAgICAgICA6IGVycm9yLm5hbWVcbiAgICByZXR1cm4geyBlcnJvcjogc2FmZSwgbWVzc2FnZTogcGFyc2VFcnJvcihlcnJvcikgfVxuICB9XG5cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogY29weVN0cnVjdHVyZWRFcnJvckZpZWxkcyhlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICBtZXNzYWdlOiBwYXJzZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yOiB7IHZhbHVlOiBTdHJpbmcoZXJyb3IpIH0sIG1lc3NhZ2U6IHBhcnNlRXJyb3IoZXJyb3IpIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBUcnVlIGZvciBDMCBjb250cm9scyAoMHgwMC0weDA4LCAweDBCLTB4MUYpLCBERUwgKDB4N0YpLCBhbmQgQzEgY29udHJvbHNcbiAqICgweDgwLTB4OUYpLiBUYWIsIExGLCBhbmQgQ1IgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBieSB0aGUgY2FsbGVyIGJlZm9yZVxuICogdGhpcyBjaGVjayBydW5zLCBzbyB0aGV5IGFyZSBpbnRlbnRpb25hbGx5IGluY2x1ZGVkIGhlcmUgYXMgYSBzYWZldHkgbmV0XG4gKiBpbiBjYXNlIGEgY2FsbGVyIHNraXBzIHRoYXQgc3RlcC5cbiAqL1xuY29uc3QgaXNDb250cm9sQ29kZVBvaW50ID0gKGNvZGU6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgY29kZSA8PSA4IHx8IChjb2RlID49IDExICYmIGNvZGUgPD0gMzEpIHx8IChjb2RlID49IDEyNyAmJiBjb2RlIDw9IDE1OSlcblxuLyoqIFN0cmlwcyBDMC9DMSBjb250cm9sIGNoYXJzIChrZWVwcyBub25lIC0tIFxcbiBhbmQgXFxyIGJlY29tZSB2aXNpYmxlIGVzY2FwZXMpIGFuZCBib3VuZHMgbGVuZ3RoLiAqL1xuZXhwb3J0IGNvbnN0IHNhbml0aXplTG9nVGV4dCA9ICh2YWx1ZTogc3RyaW5nLCBtYXhMZW5ndGggPSAyMDQ4KTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXNjYXBlZCA9IHZhbHVlXG4gICAgLnJlcGxhY2VBbGwoJ1xccicsIFN0cmluZy5yYXdgXFxyYClcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgU3RyaW5nLnJhd2BcXG5gKVxuICAgIC5yZXBsYWNlQWxsKCdcXHQnLCBTdHJpbmcucmF3YFxcdGApXG5cbiAgbGV0IG91dCA9ICcnXG4gIGZvciAoY29uc3QgY2hhciBvZiBlc2NhcGVkKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY29kZVBvaW50QXQoMCkgPz8gMFxuICAgIGlmICghaXNDb250cm9sQ29kZVBvaW50KGNvZGUpKSB7XG4gICAgICBvdXQgKz0gY2hhclxuICAgIH1cbiAgfVxuXG4gIGlmIChvdXQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgb3V0ID0gYCR7b3V0LnNsaWNlKDAsIG1heExlbmd0aCl94oCmYFxuICB9XG4gIHJldHVybiBvdXRcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFNpbmtFcnJvckNvbnRleHQsXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5sZXQgbGFzdFRyYW5zcG9ydEVycm9yQXQgPSAwXG5jb25zdCBUUkFOU1BPUlRfRVJST1JfSU5URVJWQUxfTVMgPSA1MDAwXG5cbmNvbnN0IHJlcG9ydFRyYW5zcG9ydEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgaWYgKG9uRXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgb25FcnJvcih7IGVycm9yLCBzaW5rOiAndHJhbnNwb3J0JyB9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBpZiAobm93IC0gbGFzdFRyYW5zcG9ydEVycm9yQXQgPCBUUkFOU1BPUlRfRVJST1JfSU5URVJWQUxfTVMpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsYXN0VHJhbnNwb3J0RXJyb3JBdCA9IG5vd1xuICBjb25zb2xlLmVycm9yKCdbbG9naXhseXNpYV0gdHJhbnNwb3J0IGZhaWxlZDonLCBlcnJvcilcbn1cblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIER1cmF0aW9uIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgc2FtcGxlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiB7IGR1cmF0aW9uTXM6IG51bWJlcjsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBwcmVjb21wdXRlZCB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGR1cmF0aW9uTXM6XG4gICAgICBwcmVjb21wdXRlZD8uZHVyYXRpb25NcyA/P1xuICAgICAgKHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgICA/IDBcbiAgICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMClcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goZXJyb3IgPT5cbiAgICAgICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBGaWxlSGFuZGxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IG9wZW4gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VJbnRlcnZhbCwgcGFyc2VTaXplIH0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG4vKipcbiAqIFRoZSBsaXZlIGZpbGUncyBjcmVhdGlvbiB0aW1lIHdoZW4gdGhlIGZpbGVzeXN0ZW0gcmVwb3J0cyBvbmU7XG4gKiBzb21lIGZpbGVzeXN0ZW1zIHJlcG9ydCAwL2Fic2VudCBiaXJ0aHRpbWUg4oCUIGZhbGwgYmFjayB0byBgbm93YFxuICogKGxvc2luZyByZXN0YXJ0LXN1cnZpdmFsIGZvciB0aGUgaW50ZXJ2YWwgY2xvY2ssIGJ1dCBuZXZlciB3cm9uZ1xuICogYnkgbW9yZSB0aGFuIHRoZSBwcm9jZXNzIGxpZmV0aW1lKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcGVuZWRBdCA9IChcbiAgYmlydGh0aW1lTXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgbm93OiBudW1iZXJcbik6IG51bWJlciA9PiAoYmlydGh0aW1lTXMgJiYgYmlydGh0aW1lTXMgPiAwID8gYmlydGh0aW1lTXMgOiBub3cpXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmtPcHRpb25zIHtcbiAgbG9nRGlyTW9kZT86IG51bWJlclxuICBsb2dGaWxlTW9kZT86IG51bWJlclxuICBsb2dSb3RhdGlvbj86IExvZ1JvdGF0aW9uQ29uZmlnXG4gIC8qKiBSZXBvcnRzIGEgcm90YXRpb24tc2luayBmYWlsdXJlOyBmYWxscyBiYWNrIHRvIGEgc3RkZXJyIGxpbmUgd2hlbiBvbWl0dGVkLiAqL1xuICBvblJvdGF0aW9uRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2luayB7XG4gIC8qKiBSZXNvbHZlcyBhZnRlciBgbGluZWAgaXMgZHVyYWJseSB3cml0dGVuIHRvIGRpc2suICovXG4gIHdyaXRlOiAobGluZTogc3RyaW5nLCBvcHRpb25zOiBGaWxlU2lua09wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbn1cblxuaW50ZXJmYWNlIEJhdGNoUmVzb2x2ZXIge1xuICByZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuICByZXNvbHZlOiAoKSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBQZW5kaW5nQmF0Y2gge1xuICBsaW5lczogc3RyaW5nW11cbiAgcmVzb2x2ZXJzOiBCYXRjaFJlc29sdmVyW11cbn1cblxuY2xhc3MgRmlsZVNpbmtJbXBsIGltcGxlbWVudHMgRmlsZVNpbmsge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmdcbiAgcHJpdmF0ZSBoYW5kbGU6IEZpbGVIYW5kbGUgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGJ5dGVzV3JpdHRlbiA9IDBcbiAgcHJpdmF0ZSBvcGVuZWRBdCA9IDBcbiAgcHJpdmF0ZSBsYXRlc3RPcHRpb25zOiBGaWxlU2lua09wdGlvbnMgPSB7fVxuICBwcml2YXRlIHBlbmRpbmdCYXRjaDogUGVuZGluZ0JhdGNoIHwgbnVsbCA9IG51bGxcbiAgLy8gU2VyaWFsaXplcyBmbHVzaCBhbmQgcm90YXRpb24gd29yayBwZXIgcGF0aDogZXZlcnkgYmF0Y2ggKGFuZCB0aGVcbiAgLy8gcm90YXRpb24gaXQgbWF5IHRyaWdnZXIpIGlzIGNoYWluZWQgb250byB0aGlzIHNvIGF0IG1vc3Qgb25lIGhvbGRlciBvZlxuICAvLyB0aGUgZmlsZSBoYW5kbGUgaXMgZG9pbmcgSS9PIGF0IGEgdGltZS5cbiAgcHJpdmF0ZSBmbHVzaENoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICBjb25zdHJ1Y3RvcihmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoXG4gIH1cblxuICB3cml0ZShsaW5lOiBzdHJpbmcsIG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFsd2F5cyB1c2UgdGhlIGxhdGVzdCBjYWxsJ3Mgb3B0aW9ucywgaW4gY2FzZSBjb25maWcgZGlmZmVycyBiZXR3ZWVuXG4gICAgLy8gY2FsbHMgdG8gdGhlIHNhbWUgcGF0aCAoZS5nLiBpbiB0ZXN0cykuXG4gICAgdGhpcy5sYXRlc3RPcHRpb25zID0gb3B0aW9uc1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdCYXRjaCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdCYXRjaC5saW5lcy5wdXNoKGxpbmUpXG4gICAgICAgIHRoaXMucGVuZGluZ0JhdGNoLnJlc29sdmVycy5wdXNoKHsgcmVqZWN0LCByZXNvbHZlIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXRjaDogUGVuZGluZ0JhdGNoID0ge1xuICAgICAgICBsaW5lczogW2xpbmVdLFxuICAgICAgICByZXNvbHZlcnM6IFt7IHJlamVjdCwgcmVzb2x2ZSB9XVxuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nQmF0Y2ggPSBiYXRjaFxuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhdGNoID0gbnVsbFxuICAgICAgICB0aGlzLmZsdXNoQ2hhaW4gPSB0aGlzLmZsdXNoQ2hhaW4udGhlbihcbiAgICAgICAgICAoKSA9PiB0aGlzLmZsdXNoQmF0Y2goYmF0Y2gpLFxuICAgICAgICAgICgpID0+IHRoaXMuZmx1c2hCYXRjaChiYXRjaClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaEJhdGNoKGJhdGNoOiBQZW5kaW5nQmF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5sYXRlc3RPcHRpb25zXG4gICAgLy8gTGluZXMgYWxyZWFkeSBjYXJyeSB0aGVpciBvd24gdHJhaWxpbmcgbmV3bGluZTsgam9pbiBuZWVkcyBubyBzZXBhcmF0b3IuXG4gICAgY29uc3QgdGV4dCA9IGJhdGNoLmxpbmVzLmpvaW4oJycpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPcGVuKG9wdGlvbnMpXG4gICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmhhbmRsZSBhcyBGaWxlSGFuZGxlXG4gICAgICBhd2FpdCBoYW5kbGUud3JpdGUodGV4dClcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgYmF0Y2gucmVzb2x2ZXJzKSB7XG4gICAgICAgIHJlc29sdmVyLnJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFJvdGF0aW9uIChpZiB0cmlnZ2VyZWQpIGlzIGF3YWl0ZWQgYmVmb3JlIHJlc29sdmluZyBzbyBjYWxsZXJzIG9ic2VydmVcbiAgICAvLyBhIGNvbnNpc3RlbnQgb24tZGlzayBzdGF0ZTogdGhlIGxpbmUncyB3cml0ZSBwbHVzIGFueSByb3RhdGlvbiBpdFxuICAgIC8vIGNhdXNlZC4gbWF5YmVSb3RhdGUoKSBjYXRjaGVzIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3JzLCBzbyBpdCBuZXZlclxuICAgIC8vIHJlamVjdHMgdGhpcyBjaGFpbi5cbiAgICBhd2FpdCB0aGlzLm1heWJlUm90YXRlKG9wdGlvbnMpXG5cbiAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIGJhdGNoLnJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZXIucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPcGVuKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhhbmRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIGRpcmVjdG9yeSBvbmx5IG5lZWRzIGNyZWF0aW5nIG9uIGZpcnN0IG9wZW4gKG9yIG9uIHJlb3BlbiBhZnRlciBhXG4gICAgLy8gcm90YXRpb24gY2xlYXJlZCB0aGUgaGFuZGxlKSDigJQgbmV2ZXIgcGVyIGxpbmUuXG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUodGhpcy5maWxlUGF0aCksIG9wdGlvbnMubG9nRGlyTW9kZSlcbiAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCBvcGVuKHRoaXMuZmlsZVBhdGgsICdhJywgb3B0aW9ucy5sb2dGaWxlTW9kZSA/PyAwbzYwMClcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgaGFuZGxlLnN0YXQoKVxuICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSBzdGF0LnNpemVcbiAgICB0aGlzLm9wZW5lZEF0ID0gcmVzb2x2ZU9wZW5lZEF0KHN0YXQuYmlydGh0aW1lTXMsIERhdGUubm93KCkpXG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGVpdGhlciBjb25maWd1cmVkIHRyaWdnZXIgKHNpemUsIGludGVydmFsKSBoYXMgYmVlbiBjcm9zc2VkLiAqL1xuICBwcml2YXRlIHNob3VsZFJvdGF0ZU5vdyhyb3RhdGlvbjogTG9nUm90YXRpb25Db25maWcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICByb3RhdGlvbi5tYXhTaXplICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuID4gcGFyc2VTaXplKHJvdGF0aW9uLm1heFNpemUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgcm90YXRpb24uaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMub3BlbmVkQXQgPj0gcGFyc2VJbnRlcnZhbChyb3RhdGlvbi5pbnRlcnZhbClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlUm90YXRlKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdGF0aW9uID0gb3B0aW9ucy5sb2dSb3RhdGlvblxuICAgIGlmIChcbiAgICAgICFyb3RhdGlvbiB8fFxuICAgICAgKHJvdGF0aW9uLm1heFNpemUgPT09IHVuZGVmaW5lZCAmJiByb3RhdGlvbi5pbnRlcnZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRSb3RhdGVOb3cocm90YXRpb24pKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGhhbmRsZSB9ID0gdGhpc1xuICAgICAgdGhpcy5oYW5kbGUgPSBudWxsXG4gICAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICAgIHRoaXMub3BlbmVkQXQgPSBEYXRlLm5vdygpXG4gICAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKClcbiAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbih0aGlzLmZpbGVQYXRoLCByb3RhdGlvbiwgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlbnRyaWVzIHdlcmUgYWxyZWFkeSBkdXJhYmx5IHdyaXR0ZW4gYW5kIHJlc29sdmVkIGFib3ZlO1xuICAgICAgLy8gcm90YXRpb24gZmFpbHVyZXMgbXVzdCBub3QgZmFpbCB0aGUgY2FsbGVyJ3Mgd3JpdGUuXG4gICAgICBpZiAob3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IoZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHJvdGF0ZSBsb2cgZmlsZSAke3RoaXMuZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNlZSBwbGFucy8wMjA6IGZsdXNoKCkvY2xvc2UoKSBsaWZlY3ljbGUgd291bGQgYXdhaXQgYGZsdXNoQ2hhaW5gIGhlcmUuXG59XG5cbmNvbnN0IHNpbmtzID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVTaW5rPigpXG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU2luayA9IChmaWxlUGF0aDogc3RyaW5nKTogRmlsZVNpbmsgPT4ge1xuICBsZXQgc2luayA9IHNpbmtzLmdldChmaWxlUGF0aClcbiAgaWYgKCFzaW5rKSB7XG4gICAgc2luayA9IG5ldyBGaWxlU2lua0ltcGwoZmlsZVBhdGgpXG4gICAgc2lua3Muc2V0KGZpbGVQYXRoLCBzaW5rKVxuICB9XG4gIHJldHVybiBzaW5rXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBtb2RlID0gMG83MDBcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IG1vZGUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IGNyZWF0ZUtleWVkTXV0ZXggfSBmcm9tICcuL2tleWVkLW11dGV4J1xuXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcblxuLy8gUHJldmVudHMgY29uY3VycmVudCBjb21wcmVzc2lvbiBvZiB0aGUgc2FtZSBmaWxlIChrZXllZCBieSBmaWxlUGF0aCkuXG5jb25zdCBjb21wcmVzc2lvbkxvY2sgPSBjcmVhdGVLZXllZE11dGV4KClcblxuLyoqIFJlcG9ydHMgYSBzaW5rIGZhaWx1cmU7IHdoZW4gb21pdHRlZCwgdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHN0ZGVyci4gKi9cbmV4cG9ydCB0eXBlIFJvdGF0aW9uRXJyb3JSZXBvcnRlciA9IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXG5jb25zdCByZXBvcnRSb3RhdGlvbkVycm9yID0gKFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiB2b2lkID0+IHtcbiAgaWYgKG9uRXJyb3IpIHtcbiAgICBvbkVycm9yKGVycm9yKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9uRXJyb3I/OiBSb3RhdGlvbkVycm9yUmVwb3J0ZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgY29tcHJlc3Npb25Mb2NrLmFjcXVpcmUoZmlsZVBhdGgpXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMgKG1pZ2h0IGhhdmUgYmVlbiBjb21wcmVzc2VkIGJ5IGFub3RoZXIgcHJvY2VzcylcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBhbHJlYWR5IGNvbXByZXNzZWQgb3IgZGVsZXRlZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvcixcbiAgICAgIG9uRXJyb3JcbiAgICApXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5pbnRlcmZhY2UgRmlsZVN0YXQge1xuICBwYXRoOiBzdHJpbmdcbiAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbn1cblxuY29uc3QgaXNGdWxmaWxsZWQgPSA8VD4oXG4gIHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD5cbik6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG5cbi8qKlxuICogRGVsZXRlcyByb3RhdGVkIGZpbGVzIGJleW9uZCBgcmV0ZW50aW9uYDogZm9yIGAnY291bnQnYCwga2VlcHMgdGhlIG5ld2VzdFxuICogYHJldGVudGlvbi52YWx1ZWAgZmlsZXMgKGJ5IG10aW1lKTsgZm9yIGAndGltZSdgLCBkZWxldGVzIGZpbGVzIG9sZGVyIHRoYW5cbiAqIGByZXRlbnRpb24udmFsdWVgIG1zLiBJbmRpdmlkdWFsIHN0YXQvZGVsZXRlIGZhaWx1cmVzIGFyZSB0b2xlcmF0ZWQgKHZpYVxuICogYGFsbFNldHRsZWRgKSBzbyBvbmUgYmFkIGZpbGUgbmV2ZXIgYmxvY2tzIGNsZWFudXAgb2YgdGhlIHJlc3QuXG4gKi9cbmNvbnN0IGNsZWFudXBSb3RhdGVkID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICByZXRlbnRpb246IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9LFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnICYmIHJvdGF0ZWQubGVuZ3RoIDw9IHJldGVudGlvbi52YWx1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzLmZpbHRlcihpc0Z1bGZpbGxlZDxGaWxlU3RhdD4pLm1hcChyID0+IHIudmFsdWUpXG5cbiAgbGV0IHRvRGVsZXRlOiBGaWxlU3RhdFtdXG4gIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgIGlmIChzdGF0cy5sZW5ndGggPD0gcmV0ZW50aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgICB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiByZXRlbnRpb24udmFsdWUpXG4gIH1cblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICByZXBvcnRSb3RhdGlvbkVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgcm90YXRlZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb24sXG4gICAgICAgIG9uRXJyb3JcbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwZXJmb3JtUm90YXRpb24gPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWcsXG4gIG9uRXJyb3I/OiBSb3RhdGlvbkVycm9yUmVwb3J0ZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgcm90YXRlRmlsZShmaWxlUGF0aClcbiAgaWYgKCFyb3RhdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzaG91bGRDb21wcmVzcyA9IGNvbmZpZy5jb21wcmVzcyA9PT0gdHJ1ZVxuICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICBjb25zdCBhbGdvID0gY29uZmlnLmNvbXByZXNzaW9uID8/ICdnemlwJ1xuICAgIGlmIChhbGdvID09PSAnZ3ppcCcpIHtcbiAgICAgIGF3YWl0IGNvbXByZXNzRmlsZShyb3RhdGVkLCBvbkVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcbiAgICBhd2FpdCBjbGVhbnVwUm90YXRlZChmaWxlUGF0aCwgcmV0ZW50aW9uLCBvbkVycm9yKVxuICB9XG5cbiAgLy8gSW50ZXJ2YWwtYmFzZWQgdHJpZ2dlcmluZyBsaXZlcyBpbiBgRmlsZVNpbmtJbXBsLm1heWJlUm90YXRlYFxuICAvLyAoZmlsZS1zaW5rLnRzKTsgcGVyZm9ybVJvdGF0aW9uIGlzIHRyaWdnZXItYWdub3N0aWMg4oCUIGl0IHJlbmFtZXMsXG4gIC8vIGNvbXByZXNzZXMsIGFuZCBjbGVhbnMgdXAgcmVnYXJkbGVzcyBvZiB3aHkgcm90YXRpb24gZmlyZWQuXG59XG4iLAogICAgImV4cG9ydCBpbnRlcmZhY2UgS2V5ZWRNdXRleCB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHdvcmsgZm9yIGBrZXlgOiByZXNvbHZlcyBvbmNlIGFueSBwcmlvciBob2xkZXIgZm9yIHRoZSBzYW1lXG4gICAqIGtleSBoYXMgcmVsZWFzZWQsIGFuZCByZXR1cm5zIGEgcmVsZWFzZSBmdW5jdGlvbiB0aGUgY2FsbGVyIE1VU1QgY2FsbFxuICAgKiBleGFjdGx5IG9uY2UgdG8gaGFuZCB0aGUgbG9jayB0byB0aGUgbmV4dCB3YWl0ZXIgKGlmIGFueSkuXG4gICAqL1xuICBhY3F1aXJlOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8KCkgPT4gdm9pZD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGluZGVwZW5kZW50IGtleWVkIG11dGV4OiBhY3F1aXNpdGlvbnMgZm9yIGRpZmZlcmVudCBrZXlzIG5ldmVyXG4gKiBibG9jayBlYWNoIG90aGVyLCB3aGlsZSBhY3F1aXNpdGlvbnMgZm9yIHRoZSBzYW1lIGtleSBhcmUgc2VyaWFsaXplZCBpblxuICogRklGTyBvcmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUtleWVkTXV0ZXggPSAoKTogS2V5ZWRNdXRleCA9PiB7XG4gIGNvbnN0IGxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuICBjb25zdCBhY3F1aXJlID0gYXN5bmMgKGtleTogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gICAgY29uc3QgcHJpb3IgPSBsb2Nrcy5nZXQoa2V5KSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgbGV0IHJlbGVhc2U6ICgpID0+IHZvaWRcbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICByZWxlYXNlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICAvLyBSZWdpc3RlciBiZWZvcmUgYXdhaXRpbmc6IHNhbWUtdGljayBjYWxsZXJzIG11c3QgY2hhaW4gb250byBUSElTIGxvY2ssXG4gICAgLy8gbm90IHRoZSBvbmUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHRoZXkgY2FsbGVkIGFjcXVpcmUoKS5cbiAgICBsb2Nrcy5zZXQoa2V5LCBjdXJyZW50KVxuXG4gICAgYXdhaXQgcHJpb3JcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZWxlYXNlPy4oKVxuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSBjdXJyZW50KSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWNxdWlyZSB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTaW5rRXJyb3JDb250ZXh0LFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHNhbml0aXplTG9nVGV4dCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplJ1xuaW1wb3J0IHsgZ2V0RmlsZVNpbmsgfSBmcm9tICcuL2ZpbGUtc2luaydcblxuaW50ZXJmYWNlIExvZ1RvRmlsZUlucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgZmlsZVBhdGg6IHN0cmluZ1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICAvKiogRHVyYXRpb24vVVJMIHBhcnRzIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgcGFyc2VkIG9uIHRoZSBmbHkgd2hlbiBvbWl0dGVkLiAqL1xuICBwcmVjb21wdXRlZD86IHsgZHVyYXRpb25NczogbnVtYmVyOyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9XG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuLyoqIFJlc29sdmVzIHRoZSBsb2dnZWQgcGF0aG5hbWUgKHdpdGggcXVlcnkgc3RyaW5nIHdoZW4gY29uZmlndXJlZCkgZnJvbSBwcmVjb21wdXRlZCBwYXJ0cyBvciBhIGZyZXNoIHBhcnNlLiAqL1xuY29uc3QgcmVzb2x2ZVBhdGhuYW1lID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgbG9nUXVlcnlQYXJhbXM6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHByZWNvbXB1dGVkPzogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9XG4pOiBzdHJpbmcgPT4ge1xuICBpZiAocHJlY29tcHV0ZWQpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IHByZWNvbXB1dGVkXG4gICAgcmV0dXJuIGxvZ1F1ZXJ5UGFyYW1zID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcmV0dXJuIGxvZ1F1ZXJ5UGFyYW1zID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIHRvIHJhdyBVUkwgaWYgcGFyc2luZyBmYWlsc1xuICAgIHJldHVybiByZXF1ZXN0LnVybFxuICB9XG59XG5cbi8qKiBSZXBvcnRzIGEgc2luayBmYWlsdXJlIHZpYSBgY29uZmlnLm9uRXJyb3JgIHdoZW4gc2V0IChzd2FsbG93aW5nIGhvb2sgZXJyb3JzKSwgZWxzZSBzdGRlcnIuICovXG5jb25zdCByZXBvcnRTaW5rRXJyb3IgPSAoXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10sXG4gIHNpbms6IFNpbmtFcnJvckNvbnRleHRbJ3NpbmsnXSxcbiAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgb25FcnJvciA9IGNvbmZpZz8ub25FcnJvclxuICBpZiAoIW9uRXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGZhbGxiYWNrTWVzc2FnZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cbiAgdHJ5IHtcbiAgICBvbkVycm9yKHsgZXJyb3IsIHNpbmsgfSlcbiAgfSBjYXRjaCB7XG4gICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKGlucHV0OiBMb2dUb0ZpbGVJbnB1dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHByZWNvbXB1dGVkIH0gPSBpbnB1dFxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz9cbiAgICAoc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDApXG5cbiAgY29uc3QgcGF0aG5hbWUgPSByZXNvbHZlUGF0aG5hbWUocmVxdWVzdCwgY29uZmlnPy5sb2dRdWVyeVBhcmFtcywgcHJlY29tcHV0ZWQpXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtzYW5pdGl6ZUxvZ1RleHQocGF0aG5hbWUsIDEwMjQpfSAke3Nhbml0aXplTG9nVGV4dChtZXNzYWdlKX1cXG5gXG5cbiAgY29uc3Qgb25Sb3RhdGlvbkVycm9yID0gY29uZmlnPy5vbkVycm9yXG4gICAgPyAoZXJyb3I6IHVua25vd24pID0+IHJlcG9ydFNpbmtFcnJvcihjb25maWcsICdyb3RhdGlvbicsICcnLCBlcnJvcilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZ2V0RmlsZVNpbmsoZmlsZVBhdGgpLndyaXRlKGxpbmUsIHtcbiAgICAgIGxvZ0Rpck1vZGU6IGNvbmZpZz8ubG9nRGlyTW9kZSxcbiAgICAgIGxvZ0ZpbGVNb2RlOiBjb25maWc/LmxvZ0ZpbGVNb2RlLFxuICAgICAgbG9nUm90YXRpb246IGNvbmZpZz8ubG9nUm90YXRpb24sXG4gICAgICBvblJvdGF0aW9uRXJyb3JcbiAgICB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFNpbmtFcnJvcihcbiAgICAgIGNvbmZpZyxcbiAgICAgICdmaWxlJyxcbiAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHdyaXRlIHRvIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvclxuICAgIClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG4iLAogICAgImltcG9ydCB7XG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQge1xuICB0eXBlIEZvcm1hdENvbnRleHQsXG4gIGZvcm1hdExvZ091dHB1dCxcbiAgdHlwZSBQcmVjb21wdXRlZExvZ1BhcnRzXG59IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuLyoqXG4gKiBXaGljaCBzaW5rcyBhcmUgYWN0aXZlIGZvciBhIGdpdmVuIGNvbmZpZywgcmVzb2x2ZWQgb25jZSBwZXIgbG9nZ2VyXG4gKiBpbnN0YW5jZSAoc2VlIGBjcmVhdGVMb2dnZXJgKSBzaW5jZSBub25lIG9mIHRoZXNlIGRlcGVuZCBvbiBwZXItcmVxdWVzdFxuICogc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua3Mge1xuICBoYXNGaWxlTG9nZ2luZzogYm9vbGVhblxuICBoYXNJbnRlcm5hbExvZ2dlcjogYm9vbGVhblxuICBoYXNUcmFuc3BvcnRzOiBib29sZWFuXG4gIC8qKiBUcnVlIHdoZW4gbm8gc2luayBpcyBhY3RpdmUgYXQgYWxsOiBgbG9nKClgL2BoYW5kbGVIdHRwRXJyb3IoKWAgY2FuIHNraXAgYWxsIHdvcmsuICovXG4gIGlzRWZmZWN0aXZlbHlEaXNhYmxlZDogYm9vbGVhblxuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBhY3RpdmUgc2luayByZWFkcyBwYXRobmFtZS9zZWFyY2ggKGZpbGUgbG9nZ2luZyBvciB0aGUgY29uc29sZSBmb3JtYXR0ZXIpLiAqL1xuICBuZWVkc1VybFBhcnRzOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2lua3MgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IFNpbmtzID0+IHtcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgY29uc3QgaGFzVHJhbnNwb3J0cyA9IChjb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgY29uc3QgaGFzRmlsZUxvZ2dpbmcgPVxuICAgICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSAmJiAhIWNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgY29uc3QgaGFzSW50ZXJuYWxMb2dnZXIgPSAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcilcbiAgY29uc3QgaXNFZmZlY3RpdmVseURpc2FibGVkID0gIShcbiAgICBoYXNUcmFuc3BvcnRzIHx8XG4gICAgaGFzRmlsZUxvZ2dpbmcgfHxcbiAgICBoYXNJbnRlcm5hbExvZ2dlclxuICApXG4gIGNvbnN0IG5lZWRzVXJsUGFydHMgPSBoYXNGaWxlTG9nZ2luZyB8fCBoYXNJbnRlcm5hbExvZ2dlclxuXG4gIHJldHVybiB7XG4gICAgaGFzRmlsZUxvZ2dpbmcsXG4gICAgaGFzSW50ZXJuYWxMb2dnZXIsXG4gICAgaGFzVHJhbnNwb3J0cyxcbiAgICBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQsXG4gICAgbmVlZHNVcmxQYXJ0c1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG59XG5cbmNvbnN0IGNvbXB1dGVEdXJhdGlvbk1zID0gKHN0b3JlOiBTdG9yZURhdGEpOiBudW1iZXIgPT5cbiAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgPyAwXG4gICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4vKiogUGFyc2VzIHRoZSBVUkwgb25jZTsgb25seSBjYWxsZWQgd2hlbiBhdCBsZWFzdCBvbmUgYWN0aXZlIHNpbmsgcmVhZHMgcGF0aG5hbWUvc2VhcmNoLiAqL1xuY29uc3QgcGFyc2VSZXF1ZXN0VXJsT25jZSA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbik6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJldHVybiB7IHBhdGhuYW1lLCBzZWFyY2ggfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBwYXRobmFtZTogcmVxdWVzdC51cmwgfHwgJy8nLCBzZWFyY2g6ICcnIH1cbiAgfVxufVxuXG4vKipcbiAqIFNhbXBsZXMgZHVyYXRpb24gYW5kIHBhcnNlcyB0aGUgVVJMIG9uY2UgcGVyIGVtaXNzaW9uIGZvciB0aGUgc2lua3MgdGhhdCB3aWxsIGFjdHVhbGx5IHJ1bi5cbiAqIGBsb2dUb1RyYW5zcG9ydHNgJyBtZXRhIG9ubHkgcmVhZHMgYGR1cmF0aW9uTXNgIChub3QgcGF0aG5hbWUvc2VhcmNoKSwgc28gdGhlIFVSTCBpcyBwYXJzZWRcbiAqIG9ubHkgd2hlbiBmaWxlIGxvZ2dpbmcgb3IgdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZSDigJQgc2tpcHBpbmcgaXQgZW50aXJlbHkgZm9yXG4gKiB0cmFuc3BvcnRzLW9ubHkgY29uZmlncywgbWF0Y2hpbmcgdGhhdCBwYXRoJ3MgcHJlLW9wdGltaXphdGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXB1dGVQcmVjb21wdXRlZExvZ1BhcnRzID0gKFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgbmVlZHNVcmxQYXJ0czogYm9vbGVhblxuKTogUHJlY29tcHV0ZWRMb2dQYXJ0cyA9PiB7XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wdXRlRHVyYXRpb25NcyhzdG9yZSlcbiAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZWVkc1VybFBhcnRzXG4gICAgPyBwYXJzZVJlcXVlc3RVcmxPbmNlKHJlcXVlc3QpXG4gICAgOiB7IHBhdGhuYW1lOiAnJywgc2VhcmNoOiAnJyB9XG5cbiAgcmV0dXJuIHsgZHVyYXRpb25NcywgcGF0aG5hbWUsIHNlYXJjaCB9XG59XG5cbmNvbnN0IGNvbnNvbGVGb3JMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwpOiB0eXBlb2YgY29uc29sZS5sb2cgPT4ge1xuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1Z1xuICAgIH1cbiAgICBjYXNlICdJTkZPJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuaW5mb1xuICAgIH1cbiAgICBjYXNlICdXQVJOSU5HJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FyblxuICAgIH1cbiAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yXG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZ1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtaXRJbnB1dCB7XG4gIC8qKiBTaGFyZWQgcGVyLXJlcXVlc3QgY29udGV4dCBiYWcgKHBlZWtlZCwgbmV2ZXIgY2xvbmVkL3JldGFpbmVkKS4gKi9cbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgY29uc3RhbnRzIGZvciBgZm9ybWF0TG9nT3V0cHV0YDsgb25seSByZWFkIHdoZW4gdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZS4gKi9cbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dFxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIHNpbmsgZ2F0ZXMgZnJvbSB7QGxpbmsgcmVzb2x2ZVNpbmtzfS4gKi9cbiAgc2lua3M6IFNpbmtzXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuLyoqXG4gKiBUaGUgc2luZ2xlIGxvZy1lbWlzc2lvbiBwaXBlbGluZSBzaGFyZWQgYnkgdGhlIHN1Y2Nlc3MgcGF0aCAoYGxvZygpYCkgYW5kXG4gKiB0aGUgZXJyb3IgcGF0aCAoYGhhbmRsZUh0dHBFcnJvcigpYCk6IGZpbHRlciBjaGVjayAtPiBjb250ZXh0IG1lcmdlIC0+XG4gKiByZWRhY3QgLT4gdHJhbnNwb3J0cyAtPiBmaWxlIC0+IGNvbnNvbGUsIGFsbCBnYXRlZCBieSB0aGUgc2FtZSBgc2lua3NgLlxuICovXG5leHBvcnQgY29uc3QgZW1pdCA9ICh7XG4gIGNvbnRleHRTdG9yZSxcbiAgZGF0YSxcbiAgZm9ybWF0Q29udGV4dCxcbiAgbGV2ZWwsXG4gIG9wdGlvbnMsXG4gIHJlcXVlc3QsXG4gIHNpbmtzLFxuICBzdG9yZVxufTogRW1pdElucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG5cbiAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgZGF0YSxcbiAgICAvLyBtZXJnZUxvZ0RhdGFDb250ZXh0IG9ubHkgcmVhZHMvc3ByZWFkcyB0aGlzIGJhZyBpbnRvIGEgbmV3IG9iamVjdDsgaXQgbmV2ZXIgcmV0YWluc1xuICAgIC8vIHRoZSByZWZlcmVuY2UsIHNvIGEgbm9uLWNsb25pbmcgcGVlayBpcyBzYWZlIGhlcmUuXG4gICAgY29udGV4dFN0b3JlLnBlZWtDb250ZXh0KHJlcXVlc3QpXG4gIClcbiAgY29uc3QgbG9nRGF0YSA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlXG4gICAgICA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQsIGNvbmZpZz8ucmVkYWN0S2V5cylcbiAgICAgIDogZGF0YVdpdGhDb250ZXh0XG4gIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZVxuICAgICAgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZz8ucmVkYWN0S2V5cylcbiAgICAgIDogcmVxdWVzdFxuXG4gIGNvbnN0IHByZWNvbXB1dGVkID0gY29tcHV0ZVByZWNvbXB1dGVkTG9nUGFydHMoXG4gICAgc3RvcmUsXG4gICAgbG9nUmVxdWVzdCxcbiAgICBzaW5rcy5uZWVkc1VybFBhcnRzXG4gIClcblxuICBpZiAoc2lua3MuaGFzVHJhbnNwb3J0cykge1xuICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcHJlY29tcHV0ZWQsXG4gICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgc3RvcmVcbiAgICB9KVxuICB9XG5cbiAgaWYgKHNpbmtzLmhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHByZWNvbXB1dGVkLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBzdG9yZVxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvKiBJZ25vcmUgZXJyb3JzOiBmaWxlLnRzIGFscmVhZHkgcmVwb3J0ZWQgdGhlbSAoY29uc29sZS5lcnJvciBvciBjb25maWcub25FcnJvcikuICovXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghc2lua3MuaGFzSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgZm9ybWF0Q29udGV4dCxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHByZWNvbXB1dGVkLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgc3RvcmVcbiAgfSlcbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgY29uc29sZUZvckxldmVsKGxldmVsKShtZXNzYWdlKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbm9ybWFsaXplTG9nZ2VkRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB0eXBlIHsgRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGVtaXQsIHR5cGUgU2lua3MsIHNob3VsZExvZyB9IGZyb20gJy4vZW1pdCdcblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBzaW5rczogU2lua3MsXG4gIGZvcm1hdENvbnRleHQ6IEZvcm1hdENvbnRleHRcbik6IHZvaWQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSBzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCA/ICdXQVJOSU5HJyA6ICdFUlJPUidcblxuICAvLyBNaXJyb3JzIGVtaXQoKSdzIG93biBnYXRlIGNoZWNrLCBidXQgcGVyZm9ybWVkICpiZWZvcmUqIG5vcm1hbGl6aW5nIHRoZVxuICAvLyBlcnJvciBzbyBhIGZpbHRlcmVkLW91dC9kaXNhYmxlZCBsb2dnZXIgbmV2ZXIgcGF5cyBmb3IgdGhhdCB3b3JrLlxuICAvLyBlbWl0KCkgcmUtY2hlY2tzIHRoZSBzYW1lIGdhdGUsIHdoaWNoIGlzIGNoZWFwIGFuZCBrZWVwcyB0aGlzIGZ1bmN0aW9uIGFcbiAgLy8gdGhpbiwgcHJvdmFibHktY29ycmVjdCB3cmFwcGVyIGFyb3VuZCB0aGUgc2hhcmVkIHBpcGVsaW5lLlxuICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBlcnJvcjogc2FmZUVycm9yLCBtZXNzYWdlIH0gPSBub3JtYWxpemVMb2dnZWRFcnJvcihcbiAgICBlcnJvcixcbiAgICBjb25maWc/LmxvZ0Vycm9yUGF5bG9hZCA9PT0gdHJ1ZVxuICApXG5cbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGVycm9yOiBzYWZlRXJyb3IsIG1lc3NhZ2UsIHN0YXR1cyB9XG5cbiAgZW1pdCh7XG4gICAgY29udGV4dFN0b3JlLFxuICAgIGRhdGEsXG4gICAgZm9ybWF0Q29udGV4dCxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHJlcXVlc3QsXG4gICAgc2lua3MsXG4gICAgc3RvcmVcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5jb25zdCBWQUxJRF9SRVFVRVNUX0lEID0gL15bQS1aYS16MC05Ll8tXXsxLDEyOH0kL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBnZW5lcmF0b3I6ICgpID0+IHN0cmluZ1xuICBoZWFkZXI6IHN0cmluZ1xufVxuXG4vKipcbiAqIE5vcm1hbGlzZXMgdGhlIGByZXF1ZXN0SWRgIG9wdGlvbiBpbnRvIGEgY29uY3JldGUgY29uZmlnIG9iamVjdC5cbiAqXG4gKiAtIGB1bmRlZmluZWRgIC8gYGZhbHNlYCDihpIgYG51bGxgIChkaXNhYmxlZClcbiAqIC0gYHRydWVgIOKGkiBkZWZhdWx0IGNvbmZpZ1xuICogLSBgUmVxdWVzdElkQ29uZmlnYCDihpIgbWVyZ2VkIHdpdGggZGVmYXVsdHM7IGBlbmFibGVkOiBmYWxzZWAgaW5zaWRlIHRoZSBvYmplY3QgZGlzYWJsZXMgdGhlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXF1ZXN0SWRDb25maWcgPSAoXG4gIHJhdz86IGJvb2xlYW4gfCBSZXF1ZXN0SWRDb25maWdcbik6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHwgbnVsbCA9PiB7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChyYXcgPT09IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGdlbmVyYXRvcjogKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIGhlYWRlcjogREVGQVVMVF9IRUFERVJcbiAgICB9XG4gIH1cblxuICAvLyBPYmplY3QgZm9ybSDigJQgYGVuYWJsZWRgIGRlZmF1bHRzIHRvIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgcHJvdmlkZWRcbiAgaWYgKHJhdy5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZ2VuZXJhdG9yOiByYXcuZ2VuZXJhdG9yID8/ICgoKSA9PiBjcnlwdG8ucmFuZG9tVVVJRCgpKSxcbiAgICBoZWFkZXI6IHJhdy5oZWFkZXI/LnRyaW0oKSB8fCBERUZBVUxUX0hFQURFUlxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpc3RpbmcgcmVxdWVzdCBJRCBmcm9tIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhlYWRlciwgb3IgZ2VuZXJhdGVzIGFcbiAqIG5ldyBvbmUgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdG9yLlxuICpcbiAqIEluYm91bmQgdmFsdWVzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCBgVkFMSURfUkVRVUVTVF9JRGAgKGFscGhhbnVtZXJpYyBwbHVzXG4gKiBgLmAsIGBfYCwgYC1gLCAxLTEyOCBjaGFycykgYmVmb3JlIGJlaW5nIHRydXN0ZWQg4oCUIHJlcXVlc3QgSURzIGZsb3cgaW50byBsb2dcbiAqIGxpbmVzLCByZXNwb25zZSBoZWFkZXJzLCBhbmQgY29udGV4dCB0cmVlcywgc28gbWFsZm9ybWVkIG9yIG92ZXJzaXplZFxuICogdmFsdWVzIGFyZSByZXBsYWNlZCB3aXRoIGEgZnJlc2hseSBnZW5lcmF0ZWQgb25lIHJhdGhlciB0aGFuIGVjaG9lZCBiYWNrLlxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGNvbmZpZzogUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWdcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gcmVxdWVzdC5oZWFkZXJzLmdldChjb25maWcuaGVhZGVyKVxuICBpZiAoZXhpc3RpbmcgJiYgVkFMSURfUkVRVUVTVF9JRC50ZXN0KGV4aXN0aW5nKSkge1xuICAgIHJldHVybiBleGlzdGluZ1xuICB9XG4gIHJldHVybiBjb25maWcuZ2VuZXJhdG9yKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ2dlciwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRMaWtlIHtcbiAgcmVhZG9ubHkgZGF0YT86IHsgc3RvcmU/OiB7IGxvZ2dlcj86IExvZ2dlciB9IH1cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc0hhbmRsZXJIb29rczxcbiAgVE1lc3NhZ2UgPSB1bmtub3duLFxuICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlID0gV2ViU29ja2V0TGlrZVxuPiB7XG4gIGNsb3NlPzogKHdzOiBUV3MpID0+IHZvaWRcbiAgbWVzc2FnZT86ICh3czogVFdzLCBtZXNzYWdlOiBUTWVzc2FnZSkgPT4gdm9pZFxuICBvcGVuPzogKHdzOiBUV3MpID0+IHZvaWRcbn1cblxuLy8gU3ludGhldGljIHJlcXVlc3RzIGFyZSBvbmx5IHJlYWQgKG1ldGhvZC91cmwpIGJ5IHRoZSBsb2cgcGlwZWxpbmUsIG5ldmVyIG11dGF0ZWQsIHNvIGNhY2hpbmdcbi8vIG9uZSBwZXIgcGF0aCBhdm9pZHMgYWxsb2NhdGluZyBhIGZyZXNoIFJlcXVlc3Qgb24gZXZlcnkgV1Mgb3Blbi9tZXNzYWdlL2Nsb3NlIGxvZyBldmVudC5cbmNvbnN0IHdzUmVxdWVzdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlcXVlc3Q+KClcblxuY29uc3Qgd3NTeW50aGV0aWNSZXF1ZXN0ID0gKHBhdGg6IHN0cmluZyk6IFJlcXVlc3QgPT4ge1xuICBsZXQgcmVxdWVzdCA9IHdzUmVxdWVzdENhY2hlLmdldChwYXRoKVxuICBpZiAoIXJlcXVlc3QpIHtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2dpeGx5c2lhLmxvY2FsJHtwYXRofWAsIHsgbWV0aG9kOiAnV1MnIH0pXG4gICAgd3NSZXF1ZXN0Q2FjaGUuc2V0KHBhdGgsIHJlcXVlc3QpXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3Rcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGxvZ2dlcjogTG9nZ2VyLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbikgPT4ge1xuICBjb25zdCB3c1RpbWluZ3MgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJpZ2ludD4oKVxuXG4gIGNvbnN0IGxvZ1dzID0gKFxuICAgIGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InLFxuICAgIHdzOiBXZWJTb2NrZXRMaWtlLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXkgPSB3cyBhcyBvYmplY3RcbiAgICBjb25zdCBiZWZvcmVUaW1lID0gd3NUaW1pbmdzLmdldChrZXkpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZSB9XG4gICAgLy8gUmVhZC1vbmx5OiBpbW1lZGlhdGVseSBzcHJlYWQgYmVsb3cgaW50byBhIG5ldyBvYmplY3QsIG5ldmVyIHJldGFpbmVkIG9yIG11dGF0ZWQuXG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUucGVla0NvbnRleHQoa2V5KVxuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDAgfHwgZXh0cmFcbiAgICAgICAgPyB7IC4uLmFjY3VtdWxhdGVkLCAuLi5leHRyYSwgd3NJZDogd3MuaWQgfVxuICAgICAgICA6IHsgd3NJZDogd3MuaWQgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgd3NTeW50aGV0aWNSZXF1ZXN0KHBhdGgpLFxuICAgICAgeyBjb250ZXh0LCBtZXNzYWdlLCBzdGF0dXM6IDIwMCB9LFxuICAgICAgc3RvcmVcbiAgICApXG4gIH1cblxuICByZXR1cm4gPFxuICAgIFRNZXNzYWdlLFxuICAgIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UsXG4gICAgY29uc3QgVEhvb2tzIGV4dGVuZHMgV3NIYW5kbGVySG9va3M8VE1lc3NhZ2UsIFRXcz5cbiAgPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaG9va3M6IFRIb29rc1xuICApOiBUSG9va3MgPT5cbiAgICAoe1xuICAgICAgLi4uaG9va3MsXG4gICAgICBjbG9zZSh3cykge1xuICAgICAgICBob29rcy5jbG9zZT8uKHdzKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBjbG9zZWQnKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQod3MgYXMgb2JqZWN0KVxuICAgICAgICB3c1RpbWluZ3MuZGVsZXRlKHdzIGFzIG9iamVjdClcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlKHdzLCBtZXNzYWdlKSB7XG4gICAgICAgIGhvb2tzLm1lc3NhZ2U/Lih3cywgbWVzc2FnZSlcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgbWVzc2FnZScsIHtcbiAgICAgICAgICAgIHBheWxvYWRUeXBlOiB0eXBlb2YgbWVzc2FnZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvcGVuKHdzKSB7XG4gICAgICAgIHdzVGltaW5ncy5zZXQod3MgYXMgb2JqZWN0LCBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSlcbiAgICAgICAgaG9va3Mub3Blbj8uKHdzKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBvcGVuZWQnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkgYXMgVEhvb2tzXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNBVCxtQkFBUyxpQkFDVCxtQkFB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USxPQUFPLE9BQU8sQ0FBQyxFQUNsRCxFQUFpQixDQUNuQixJQUFNLEVBQVksRUFBcUIsRUFBUyxDQUFlLEVBQy9ELEVBQWEsYUFBYSxFQUFTLENBQUUsV0FBVSxDQUFDLEVBR2xELEdBQUksRUFBUSxRQUFRLHFCQUNsQixFQUFjLFVBQVUsRUFBMEIsQ0FBTyxDQUFDLEVBRTdELEVBQ0EsY0FBYyxFQUFHLFVBQVMsU0FBVSxDQUNuQyxHQUFJLENBQ0YsR0FBSSxFQUFpQixDQUVuQixJQUFNLEVBRE0sRUFBYSxXQUFXLENBQU8sRUFDNUIsVUFDZixHQUFJLEVBQ0YsRUFBSSxRQUFRLEVBQWdCLFFBQVUsRUFJMUMsR0FBSSxFQUFhLElBQUksQ0FBTyxFQUMxQixPQUdGLElBQU0sRUFDSixFQUFJLFNBQVcsUUFBYSxFQUFJLFNBQVcsS0FDdkMsSUFDQSxFQUFjLEVBQUksTUFBTSxFQUMxQixFQUFzQyxPQUMxQyxHQUFJLEdBQVUsSUFDWixFQUFRLFFBQ0gsUUFBSSxHQUFVLElBQ25CLEVBQVEsVUFHVixJQUFNLEVBQWMsRUFBYSxXQUFXLENBQU8sRUFDN0MsRUFBZ0MsQ0FBRSxRQUFPLEVBQy9DLEdBQUksT0FBTyxLQUFLLENBQVcsRUFBRSxPQUFTLEVBQ3BDLEVBQUssUUFBVSxJQUFLLENBQVksRUFHbEMsRUFBTyxJQUFJLEVBQU8sRUFBUyxFQUFNLENBQy9CLFdBQVksRUFBa0IsSUFBSSxDQUFPLEdBQUssT0FBTyxDQUFDLENBQ3hELENBQUMsU0FDRCxDQUNBLEVBQWtCLE9BQU8sQ0FBTyxFQUNoQyxFQUFhLGFBQWEsQ0FBTyxHQUVwQyxFQUNBLFFBQVEsRUFBRyxVQUFTLFFBQU8sU0FBVSxDQUNwQyxHQUFJLENBQ0YsR0FBSSxFQUFpQixDQUVuQixJQUFNLEVBRE0sRUFBYSxXQUFXLENBQU8sRUFDNUIsVUFDZixHQUFJLEVBQ0YsRUFBSSxRQUFRLEVBQWdCLFFBQVUsRUFHMUMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQ3JDLFdBQVksRUFBa0IsSUFBSSxDQUFPLEdBQUssT0FBTyxDQUFDLENBQ3hELENBQUMsU0FDRCxDQUNBLEVBQWtCLE9BQU8sQ0FBTyxFQUNoQyxFQUFhLGFBQWEsQ0FBTyxHQUVwQyxFQUNBLEdBQUcsUUFBUSxFQUVkLE9BQU8sT0FBTyxPQUFPLEVBQVEsQ0FBRSxRQUFPLENBQUMsR0E0QjFCIiwKICAiZGVidWdJZCI6ICI4QzM0OEFGMDQwOUE0NjI4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==