logixlysia 6.3.2 → 6.5.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/ai.d.ts +37 -0
- package/dist/ai.js +4 -0
- package/dist/index.d.ts +51 -2
- package/dist/index.js +9 -9
- package/dist/otel.d.ts +28 -0
- package/dist/otel.js +4 -0
- package/package.json +31 -2
package/dist/ai.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Logger as PinoLogger } from "pino";
|
|
2
|
+
type Pino = PinoLogger<never, boolean>;
|
|
3
|
+
type RequestInfo = Request;
|
|
4
|
+
type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
|
|
5
|
+
interface StoreData {
|
|
6
|
+
beforeTime: bigint;
|
|
7
|
+
}
|
|
8
|
+
interface Logger {
|
|
9
|
+
debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
10
|
+
error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
11
|
+
getContext: (key: RequestInfo | object) => Readonly<Record<string, unknown>>;
|
|
12
|
+
handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
|
|
13
|
+
info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
14
|
+
log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
|
|
15
|
+
mergeContext: (key: RequestInfo | object, partial: Record<string, unknown>) => void;
|
|
16
|
+
pino: Pino;
|
|
17
|
+
warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
18
|
+
}
|
|
19
|
+
interface AIMetrics {
|
|
20
|
+
calls?: number;
|
|
21
|
+
finishReason?: string;
|
|
22
|
+
inputTokens?: number;
|
|
23
|
+
model?: string;
|
|
24
|
+
msToFinish?: number;
|
|
25
|
+
msToFirstChunk?: number;
|
|
26
|
+
outputTokens?: number;
|
|
27
|
+
provider?: string;
|
|
28
|
+
reasoningTokens?: number;
|
|
29
|
+
tokensPerSecond?: number;
|
|
30
|
+
totalTokens?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Merges AI SDK / LLM usage metrics into the request context bag so they appear
|
|
34
|
+
* on the final access log (evlog-style `ai` object).
|
|
35
|
+
*/
|
|
36
|
+
declare const mergeAIMetrics: (logger: Pick<Logger, "mergeContext">, request: Request, metrics: AIMetrics) => void;
|
|
37
|
+
export { mergeAIMetrics, mergeAIMetrics as default, AIMetrics };
|
package/dist/ai.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var z=(k,w,d)=>{if(Object.keys(d).length===0)return;k.mergeContext(w,{ai:d})};export{z as mergeAIMetrics,z as default};
|
|
2
|
+
|
|
3
|
+
//# debugId=1C3753C5E33BE73A64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJTWV0cmljcyB7XG4gIGNhbGxzPzogbnVtYmVyXG4gIGZpbmlzaFJlYXNvbj86IHN0cmluZ1xuICBpbnB1dFRva2Vucz86IG51bWJlclxuICBtb2RlbD86IHN0cmluZ1xuICBtc1RvRmluaXNoPzogbnVtYmVyXG4gIG1zVG9GaXJzdENodW5rPzogbnVtYmVyXG4gIG91dHB1dFRva2Vucz86IG51bWJlclxuICBwcm92aWRlcj86IHN0cmluZ1xuICByZWFzb25pbmdUb2tlbnM/OiBudW1iZXJcbiAgdG9rZW5zUGVyU2Vjb25kPzogbnVtYmVyXG4gIHRvdGFsVG9rZW5zPzogbnVtYmVyXG59XG5cbi8qKlxuICogTWVyZ2VzIEFJIFNESyAvIExMTSB1c2FnZSBtZXRyaWNzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgc28gdGhleSBhcHBlYXJcbiAqIG9uIHRoZSBmaW5hbCBhY2Nlc3MgbG9nIChldmxvZy1zdHlsZSBgYWlgIG9iamVjdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFJTWV0cmljcyA9IChcbiAgbG9nZ2VyOiBQaWNrPExvZ2dlciwgJ21lcmdlQ29udGV4dCc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBtZXRyaWNzOiBBSU1ldHJpY3Ncbik6IHZvaWQgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMobWV0cmljcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCB7IGFpOiBtZXRyaWNzIH0pXG59XG5cbmV4cG9ydCB7IG1lcmdlQUlNZXRyaWNzIGFzIGRlZmF1bHQgfVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBb0JPLElBQU0sRUFBaUIsQ0FDNUIsRUFDQSxFQUNBLElBQ1MsQ0FDVCxHQUFJLE9BQU8sS0FBSyxDQUFPLEVBQUUsU0FBVyxFQUNsQyxPQUVGLEVBQU8sYUFBYSxFQUFTLENBQUUsR0FBSSxDQUFRLENBQUMiLAogICJkZWJ1Z0lkIjogIjFDMzc1M0M1RTMzQkU3M0E2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/dist/index.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ interface LogFilter {
|
|
|
47
47
|
* @see https://github.com/pinojs/pino-pretty#options
|
|
48
48
|
*/
|
|
49
49
|
type PrettyPrintConfig = boolean | Record<string, unknown>;
|
|
50
|
+
type LogPreset = "dev" | "prod" | "json";
|
|
50
51
|
interface Options {
|
|
51
52
|
config?: {
|
|
52
53
|
showStartupMessage?: boolean;
|
|
@@ -67,6 +68,10 @@ interface Options {
|
|
|
67
68
|
showContextTree?: boolean;
|
|
68
69
|
/** How many object nesting levels to expand in the context tree; default 1. */
|
|
69
70
|
contextDepth?: number;
|
|
71
|
+
/** Include query parameters in the logged URL path; default false. */
|
|
72
|
+
logQueryParams?: boolean;
|
|
73
|
+
/** Skip automatic WebSocket lifecycle logs from `wrapWs`; default false. */
|
|
74
|
+
disableWebSocketLogging?: boolean;
|
|
70
75
|
logFilter?: LogFilter;
|
|
71
76
|
transports?: Transport[];
|
|
72
77
|
useTransportsOnly?: boolean;
|
|
@@ -83,13 +88,20 @@ interface Options {
|
|
|
83
88
|
prettyPrint?: PrettyPrintConfig;
|
|
84
89
|
}) | undefined;
|
|
85
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* Opinionated defaults for common environments.
|
|
93
|
+
* Explicit `config` fields override preset values.
|
|
94
|
+
*/
|
|
95
|
+
preset?: LogPreset;
|
|
86
96
|
}
|
|
87
97
|
interface Logger {
|
|
88
98
|
debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
89
99
|
error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
100
|
+
getContext: (key: RequestInfo | object) => Readonly<Record<string, unknown>>;
|
|
90
101
|
handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
|
|
91
102
|
info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
92
103
|
log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
|
|
104
|
+
mergeContext: (key: RequestInfo | object, partial: Record<string, unknown>) => void;
|
|
93
105
|
pino: Pino;
|
|
94
106
|
warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
95
107
|
}
|
|
@@ -97,6 +109,40 @@ interface LogixlysiaContext {
|
|
|
97
109
|
request: Request;
|
|
98
110
|
store: LogixlysiaStore;
|
|
99
111
|
}
|
|
112
|
+
/** HTTP `Request` or WebSocket instance for accumulated context. */
|
|
113
|
+
type ContextKey = Request | object;
|
|
114
|
+
interface RequestContextStore {
|
|
115
|
+
clearContext: (key: ContextKey) => void;
|
|
116
|
+
getContext: (key: ContextKey) => Readonly<Record<string, unknown>>;
|
|
117
|
+
mergeContext: (key: ContextKey, partial: Record<string, unknown>) => void;
|
|
118
|
+
}
|
|
119
|
+
interface WebSocketLike {
|
|
120
|
+
readonly data?: {
|
|
121
|
+
store?: {
|
|
122
|
+
logger?: Logger;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
readonly id?: string;
|
|
126
|
+
}
|
|
127
|
+
interface WsHandlerHooks<
|
|
128
|
+
TMessage = unknown,
|
|
129
|
+
TWs extends WebSocketLike = WebSocketLike
|
|
130
|
+
> {
|
|
131
|
+
close?: (ws: TWs) => void;
|
|
132
|
+
message?: (ws: TWs, message: TMessage) => void;
|
|
133
|
+
open?: (ws: TWs) => void;
|
|
134
|
+
}
|
|
135
|
+
declare const createWsHandlerWrapper: (options: Options, logger: Logger, contextStore: RequestContextStore) => <
|
|
136
|
+
TMessage,
|
|
137
|
+
TWs extends WebSocketLike,
|
|
138
|
+
const THooks extends WsHandlerHooks<TMessage, TWs>
|
|
139
|
+
>(path: string, hooks: THooks) => THooks;
|
|
140
|
+
/** Applies preset defaults; explicit `config` keys override preset values. */
|
|
141
|
+
declare const resolveOptions: (options?: Options) => Options;
|
|
142
|
+
import pino from "pino";
|
|
143
|
+
declare const createLogger: (options?: Options, pinoFactory?: typeof pino, externalContextStore?: RequestContextStore) => Logger;
|
|
144
|
+
/** Plugin entry: shares one request-context store across the Elysia lifecycle. */
|
|
145
|
+
declare const createPluginLogger: (options: Options, contextStore: RequestContextStore) => Logger;
|
|
100
146
|
/**
|
|
101
147
|
* Empty singleton slots must not use `Record<string, never>`: intersecting that with Elysia's `Context`
|
|
102
148
|
* makes every key (including `store`) become `never` because each key is merged with `never`.
|
|
@@ -115,5 +161,8 @@ interface LogixlysiaSingleton {
|
|
|
115
161
|
store: LogixlysiaStore;
|
|
116
162
|
}
|
|
117
163
|
type Logixlysia = Elysia<"", LogixlysiaSingleton>;
|
|
118
|
-
|
|
119
|
-
|
|
164
|
+
type LogixlysiaPlugin = Logixlysia & {
|
|
165
|
+
wrapWs: ReturnType<typeof createWsHandlerWrapper>;
|
|
166
|
+
};
|
|
167
|
+
declare const logixlysia: (rawOptions?: Options) => LogixlysiaPlugin;
|
|
168
|
+
export { resolveOptions, logixlysia, logixlysia as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, StoreData, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, Logixlysia, Logger, LogPreset, LogLevel, EmptyElysiaSlot };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{Elysia as
|
|
2
|
-
`)},
|
|
3
|
-
`,
|
|
4
|
-
${
|
|
5
|
-
`)}`:
|
|
6
|
-
${
|
|
7
|
-
`)}`:
|
|
1
|
+
import{Elysia as g$}from"elysia";var A0={dev:{showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0,showContextTree:!0,pino:{prettyPrint:!0}},prod:{showStartupMessage:!1,useColors:!1,showContextTree:!1,autoRedact:!0,pino:{prettyPrint:!1}},json:{showStartupMessage:!1,useColors:!1,showContextTree:!1,pino:{prettyPrint:!1}}},w0=($,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=A0[W];return{...$,config:w0(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{createRequire as H0}from"node:module";var E0=(()=>{try{return H0(import.meta.url)("elysia/package.json")}catch{return{}}})(),S0=(()=>{try{return H0(import.meta.url)("../../package.json")}catch{return{}}})(),L0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},X0=($,W)=>{let N=E0.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)}┘`,z=`│${" ".repeat(J)}│`,K=[j];for(let Y of Z){if(Y.kind==="empty"){K.push(z);continue}if(Y.kind==="center"){K.push(`│${L0(Y.text,J)}│`);continue}let V=Y.text,M=Math.max(0,J-V.length-4);K.push(`│ ${V}${" ".repeat(M)} │`)}return K.push(X),K.join(`
|
|
2
|
+
`)},z0=()=>{let $=S0.version;if(!$)return null;return` logixlysia v${$}`};var $0=($,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(X0(X,z0()))};import T0 from"pino";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:"",z={request:{method:Q.method,url:Q.url},...Z,beforeTime:H.beforeTime};for(let K of j)try{let Y=K.log(N,X,z);if(Y&&typeof Y.catch==="function")Y.catch(()=>{})}catch{}};import{appendFile as i0}from"node:fs/promises";import{dirname as o0}from"node:path";import{promises as k0}from"node:fs";var K0=async($)=>{await k0.mkdir($,{recursive:!0})};import{promises as _}from"node:fs";import{promisify as P0}from"node:util";import{gzip as c0}from"node:zlib";import{promises as W0}from"node:fs";import{basename as y0,dirname as f0}from"node:path";var C0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,q0=/^(\d+)(h|d|w)$/i,x0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,Y0=($)=>{if(typeof $==="number")return $;let W=$.trim(),N=Number(W);if(Number.isFinite(N))return N;let Q=W.match(C0);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)},m0=($)=>{let W=$.trim().match(q0);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},I0=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:m0($)}},B0=async($,W)=>{try{return(await W0.stat($)).size>W}catch{return!1}},N0=async($)=>{let W=f0($),N=y0($),Q;try{Q=await W0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&x0.test(Z)).map((Z)=>`${W}/${Z}`)};var h0=P0(c0),n=new Map,v0=($)=>{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($)}})},x=($)=>String($).padStart(2,"0"),p0=($,W)=>{let N=W.getFullYear(),Q=x(W.getMonth()+1),Z=x(W.getDate()),H=x(W.getHours()),J=x(W.getMinutes()),j=x(W.getSeconds()),X=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${H}-${J}-${j}-${X}`},g0=async($)=>{try{if((await _.stat($)).size===0)return""}catch{return""}let N=`${p0($,new Date)}-${process.hrtime.bigint()}`;return await _.rename($,N),N},d0=async($)=>{let W=await v0($);try{try{await _.access($)}catch{return}let N=await _.readFile($),Q=await h0(N);await _.writeFile(`${$}.gz`,Q),await _.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},G0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=Y0(W.maxSize);return await B0($,N)},n0=async($,W)=>{let N=await N0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(j)=>({path:j,stat:await _.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})=>_.rm(j,{force:!0})))).forEach((j,X)=>{if(j.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${H[X].path}:`,j.reason)})},u0=async($,W)=>{let N=await N0($);if(N.length===0)return;let Q=Date.now(),J=(await Promise.allSettled(N.map(async(X)=>({path:X,stat:await _.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})=>_.rm(X,{force:!0})))).forEach((X,z)=>{if(X.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${J[z].path}:`,X.reason)})},V0=async($,W)=>{let N=await g0($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await d0(N)}if(W.maxFiles!==void 0){let Z=I0(W.maxFiles);if(Z.type==="count")await n0($,Z.value);else await u0($,Z.value)}};var u=new Map,s0=($)=>{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,T,A,w,L]=$;return{filePath:R,level:b,request:T,data:A,store:w,options:L}})():$[0],{filePath:N,level:Q,request:Z,data:H,store:J,options:j}=W,X=j.config,z=X?.useTransportsOnly===!0,K=X?.disableFileLogging===!0;if(z||K)return;let Y=typeof H.message==="string"?H.message:"",V=J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6,M="/";try{let{pathname:R,search:b}=new URL(Z.url);M=X?.logQueryParams?`${R}${b}`:R}catch{M=Z.url}let F=`${Q} ${V.toFixed(2)}ms ${Z.method} ${M} ${Y}
|
|
3
|
+
`,U=await s0(N);try{try{await K0(o0(N)),await i0(N,F,{encoding:"utf-8"})}catch(T){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,T),T}let R=X?.logRotation;if(!R)return;if(await G0(N,R))try{await V0(N,R)}catch(T){console.error(`[logixlysia] Failed to rotate log file ${N}:`,T)}}finally{U()}};var l0=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,r0=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,a0=/\b(?:\d[ -]*?){13,19}\b/g,t0=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var Q0=($)=>D($).replaceAll("[REDACTED]","redacted"),e0=($)=>{try{let W=new URL($);if(W.username!=="")W.username=Q0(W.username);if(W.password!=="")W.password=Q0(W.password);return W.hostname=Q0(W.hostname),W.pathname=D(W.pathname),W.search=D(W.search),W.hash=D(W.hash),W.toString()}catch{return D($).replaceAll("[REDACTED]","redacted")}},$$=($)=>{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},W$=($)=>$.replace(a0,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&$$(N))return"[REDACTED]";return W}),D=($)=>{let W=$;return W=W.replace(l0,"[REDACTED]"),W=W.replace(r0,"[REDACTED]"),W=W$(W),W=W.replace(t0,"[REDACTED]"),W},N$=($,W)=>{let N=D($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=D($.stack);let H=$;for(let J of Object.keys(H))if(J!=="message"&&J!=="name"&&J!=="stack")Z[J]=o(H[J],W);return Z},Q$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q++)N[Q]=o($[Q],W);return N},Z$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=o($[Q],W);return N},Z0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},o=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return D($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return Z0(Q,W,()=>N$($,W));if(Array.isArray($))return Z0(Q,W,()=>Q$($,W));return Z0(Q,W,()=>Z$($,W))},s=($)=>o($,new WeakSet),l=($)=>{let W=e0($.url),N=new Headers,Q=!1;for(let[X,z]of $.headers.entries()){let K=D(z);if(K!==z)Q=!0;N.set(X,K)}let Z=D($.method),H=W!==$.url,J=Z!==$.method;if(!(H||Q||J))return $;let j={method:Z,headers:N,redirect:$.redirect,signal:$.signal};if($.body!==null)j.body=$.body,j.duplex="half";return new Request(W,j)};import{STATUS_CODES as G$}from"node:http";import I from"chalk";import{StatusMap as J$}from"elysia";var j$=/^\d+$/,H$=/[_-]+/g,X$=/([a-z0-9])([A-Z])/g,z$=/([A-Z])([A-Z][a-z])/g,K$=/['’]/g,Y$=/[^a-z0-9\s]+/g,I$=/\s+/g,M0=($)=>{let W=$.trim();if(!W)return"";return W.replace(H$," ").replace(X$,"$1 $2").replace(z$,"$1 $2").replace(K$,"").toLowerCase().replace(Y$," ").replace(I$," ").trim()},B$=(()=>{let $=new Map;for(let[W,N]of Object.entries(J$))$.set(M0(W),N);return $})(),R0=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(j$.test(W))return Number(W);return B$.get(M0(W))??500}return 500};var r=($)=>{let W="An error occurred";if($ instanceof Error)W=$.message;else if($&&typeof $==="object"&&"message"in $)W=$.message;else W=String($);return W};var m=($)=>String($).padStart(2,"0"),V$=($)=>String($).padStart(3,"0"),M$=500,R$=1000,F$=7,O$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",U$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed)\}/g,F0=($)=>{let N=$.config?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},T$=($,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=V$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",H).replaceAll("MM",J).replaceAll("ss",j).replaceAll("SSS",X)},b$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},_$=($)=>{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`},D$=($)=>{let W=$.config;return{slow:W?.slowThreshold??M$,verySlow:W?.verySlowThreshold??R$}},A$=($,W,N)=>{let Q=_$($),{slow:Z,verySlow:H}=D$(N),J=$>=H;if(!W)return{text:Q,isVerySlow:J};let j=Q;if($<Z)j=I.green(Q);else if($<H)j=I.yellow(Q);else j=I.red.bold(Q);return{text:j,isVerySlow:J}},w$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${I.yellow(N)}`},E$=($,W)=>{if(!W)return"\uD83E\uDD8A";if($==="ERROR")return I.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return I.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return I.bgBlue.black(" \uD83E\uDD8A ");return I.bgGreen.black(" \uD83E\uDD8A ")},S$=($,W)=>{if(!W)return $;if($==="ERROR")return I.bgRed.black($);if($==="WARNING")return I.bgYellow.black($);if($==="DEBUG")return I.bgBlue.black($);return I.bgGreen.black($)},L$=($,W)=>{if(!W)return $;let N=$.toUpperCase();if(N==="GET")return I.green.bold(N);if(N==="POST")return I.blue.bold(N);if(N==="PUT")return I.yellow.bold(N);if(N==="PATCH")return I.yellowBright.bold(N);if(N==="DELETE")return I.red.bold(N);if(N==="OPTIONS")return I.cyan.bold(N);if(N==="HEAD")return I.greenBright.bold(N);if(N==="TRACE")return I.magenta.bold(N);if(N==="CONNECT")return I.cyanBright.bold(N);return I.white.bold(N)},k$=($,W)=>{if(!W)return $;let N=Number.parseInt($,10);if(!Number.isFinite(N))return $;if(N>=500)return I.red($);if(N>=400)return I.yellow($);if(N>=300)return I.cyan($);if(N>=200)return I.green($);return I.gray($)},y$=($,W)=>{if(!W)return $;return I.gray($)},f$=($,W)=>{if(!W)return $;return I.whiteBright($)},C$=($)=>{return G$[$]??""},q$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${I.dim(Q)} `},x$=($)=>{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($)}},m$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),O0=($,W,N)=>{let Q=[];for(let[Z,H]of Object.entries($)){let J=W?`${W}.${Z}`:Z;if(m$(H)&&N>1)Q.push(...O0(H,J,N-1));else Q.push([J,x$(H)])}return Q},P$=($,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,z=W?I.cyan(j):j,K=W?I.white(X):X;N.push(` ${H} ${z} ${K}`)}return N};var c$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=F0(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(...O0(J,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0){let j=r(W.error);if(j)H.push(["error",j])}return P$(H,Q)},h$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},a=({level:$,request:W,data:N,store:Q,options:Z})=>{let H=Z.config,J=F0(Z),j=H?.customLogFormat??O$,X=new Date,z=String(X.getTime()),K=T$(X,H?.timestamp?.translateTime),Y=y$(K,J),V=typeof N.message==="string"?N.message:"",M=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,F,U;try{let q=new URL(W.url);F=q.pathname,U=q.search}catch{F=W.url||"/",U=""}let R=U,b=H?.logQueryParams?`${F}${R}`:F,T=N.status,A=T===null||T===void 0?200:R0(T),w=String(A),L=H?.ip===!0?b$(W):"",P=H?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":h$(N.context),k=S$($,J),B=W.method.toUpperCase().padEnd(F$),G=L$(B,J),O=f$(b,J),E=k$(w,J),{text:y,isVerySlow:f}=A$(M,J,Z),C=w$(f,J),c=E$($,J),h=C$(A),S=q$(Z,J),v={"{now}":Y,"{epoch}":z,"{level}":k,"{icon}":c,"{duration}":y,"{method}":G,"{pathname}":O,"{path}":O,"{query}":R,"{status}":E,"{statusText}":h,"{message}":V,"{ip}":L,"{context}":P,"{service}":S,"{speed}":C},_0=j.replace(U$,(q)=>v[q]??q),D0=c$($,N,Z);return{main:_0,contextLines:D0}};var v$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",U0=($,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,z=H?.disableFileLogging===!0,K=v$(W)?W.status:500,Y=r(W),V="ERROR",M={status:K,message:Y,error:W},F=Z?g(M,Z.getContext($)):M,U=H?.autoRedact===!0?s(F):F,R=H?.autoRedact===!0?l($):$;if(d({level:V,request:R,data:U,store:N,options:Q}),!(j||z)){let w=H?.logFilePath;if(w)i({filePath:w,level:V,request:R,data:U,store:N,options:Q}).catch(()=>{})}if(j||X)return;let{main:b,contextLines:T}=a({level:V,request:R,data:U,store:N,options:Q}),A=T.length>0?`${b}
|
|
4
|
+
${T.join(`
|
|
5
|
+
`)}`:b;console.error(A)};var b0=($={},W=T0,N)=>{let Q=N??p(),Z=$.config,H=Z?.pino,{prettyPrint:J,...j}=H??{},X=typeof J==="object"&&J!==null?J:void 0,K=(J===!0||X!==void 0)&&j.transport===void 0,Y=X?.messageKey??j.messageKey,V=X?.errorKey??j.errorKey,M=K?{target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...X,messageKey:Y,errorKey:V}}:j.transport,F=W({...j,level:j.level??"info",messageKey:Y,errorKey:V,transport:M}),U=(B,G)=>{if(!G?.level||G.level.length===0)return!0;return G.level.includes(B)},R=Z?.useTransportsOnly===!0,b=Z?.disableInternalLogger===!0,T=Z?.disableFileLogging===!0,A=(Z?.transports?.length??0)>0,w=!(R||T)&&!!Z?.logFilePath,L=!(R||b),t=!(A||w||L),P=(B,G,O,E)=>{if(t||!U(B,Z?.logFilter))return;let y=g(O,Q.getContext(G)),f=Z?.autoRedact===!0?s(y):y,C=Z?.autoRedact===!0?l(G):G;if(A)d({level:B,request:C,data:f,store:E,options:$});if(w){let v=Z?.logFilePath;if(v)i({filePath:v,level:B,request:C,data:f,store:E,options:$}).catch(()=>{})}if(!L)return;let{main:c,contextLines:h}=a({level:B,request:C,data:f,store:E,options:$}),S=h.length>0?`${c}
|
|
6
|
+
${h.join(`
|
|
7
|
+
`)}`:c;switch(B){case"DEBUG":{console.debug(S);break}case"INFO":{console.info(S);break}case"WARNING":{console.warn(S);break}case"ERROR":{console.error(S);break}default:{console.log(S);break}}},k=(B,G,O,E)=>{if(t||!U(B,Z?.logFilter))return;let y={beforeTime:process.hrtime.bigint()};P(B,G,{message:O,context:E},y)};return{pino:F,mergeContext:(B,G)=>{Q.mergeContext(B,G)},getContext:(B)=>Q.getContext(B),log:P,handleHttpError:(B,G,O)=>{U0(B,G,O,$,Q)},debug:(B,G,O)=>{k("DEBUG",B,G,O)},info:(B,G,O)=>{k("INFO",B,G,O)},warn:(B,G,O)=>{k("WARNING",B,G,O)},error:(B,G,O)=>{k("ERROR",B,G,O)}}},J0=($,W)=>b0($,T0,W);var p$=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),j0=($,W,N)=>{let Q=new WeakMap,Z=(H,J,j,X,z)=>{let K=J,V={beforeTime:Q.get(K)??process.hrtime.bigint()},M=N.getContext(K),F=Object.keys(M).length>0||z?{...M,...z,wsId:J.id}:{wsId:J.id};W.log(H,p$(j),{message:X,context:F,status:200},V)};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 d$=($={})=>{let W=e($),N=new WeakSet,Q=p(),Z=J0(W,Q),H=j0(W,Z,Q),J={...Z,debug:(z,K,Y)=>{N.add(z),Z.debug(z,K,Y)},info:(z,K,Y)=>{N.add(z),Z.info(z,K,Y)},warn:(z,K,Y)=>{N.add(z),Z.warn(z,K,Y)},error:(z,K,Y)=>{N.add(z),Z.error(z,K,Y)}},X=new g$({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)).onStart(({server:z})=>{if(z)$0(z,W);else{let K=Number(process.env.PORT)||3000,Y=process.env.HOST||"localhost";$0({port:K,hostname:Y,protocol:"http"},W)}}).onRequest(({store:z})=>{z.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:z,set:K,store:Y})=>{try{if(N.has(z))return;let V=typeof K.status==="number"?K.status:200,M="INFO";if(V>=500)M="ERROR";else if(V>=400)M="WARNING";let F=Q.getContext(z),U={status:V};if(Object.keys(F).length>0)U.context={...F};J.log(M,z,U,Y)}finally{Q.clearContext(z)}}).onError(({request:z,error:K,store:Y})=>{try{J.handleHttpError(z,K,Y)}finally{Q.clearContext(z)}}).as("scoped");return Object.assign(X,{wrapWs:H})},o2=d$;export{e as resolveOptions,d$ as logixlysia,o2 as default,j0 as createWsHandlerWrapper,J0 as createPluginLogger,b0 as createLogger};
|
|
8
8
|
|
|
9
|
-
//# debugId=
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiBFbXB0eUVseXNpYVNsb3RcbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIGFwcFxuICAgICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9kZSBhZGFwdGVyIGZhbGxiYWNrXG4gICAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwXG4gICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwcm9jZXNzLmVudi5IT1NUIHx8ICdsb2NhbGhvc3QnXG4gICAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uUmVxdWVzdCgoeyBzdG9yZSB9KSA9PiB7XG4gICAgICAgIHN0b3JlLmJlZm9yZVRpbWUgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgfSlcbiAgICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgICBpZiAoZGlkQ3VzdG9tTG9nLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdHlwZW9mIHNldC5zdGF0dXMgPT09ICdudW1iZXInID8gc2V0LnN0YXR1cyA6IDIwMFxuICAgICAgICBsZXQgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicgPSAnSU5GTydcbiAgICAgICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdFUlJPUidcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnV0FSTklORydcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIHsgc3RhdHVzIH0sIHN0b3JlKVxuICAgICAgfSlcbiAgICAgIC5vbkVycm9yKCh7IHJlcXVlc3QsIGVycm9yLCBzdG9yZSB9KSA9PiB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSlcbiAgICAgIC8vIEVuc3VyZSBwbHVnaW4gbGlmZWN5Y2xlIGhvb2tzIChvblJlcXVlc3Qvb25BZnRlckhhbmRsZS9vbkVycm9yKSBhcHBseSB0byB0aGUgcGFyZW50IGFwcC5cbiAgICAgIC5hcygnc2NvcGVkJykgYXMgTG9naXhseXNpYVxuICApXG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB2ZXJzaW9uID0gZWx5c2lhUGtnLnZlcnNpb25cbiAgY29uc3QgdmVyc2lvbkxpbmUgPSB2ZXJzaW9uID8gYEVseXNpYSB2JHt2ZXJzaW9ufWAgOiAnRWx5c2lhJ1xuXG4gIGNvbnN0IHJvd3M6IFJvd1NwZWNbXSA9IFtcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdjZW50ZXInLCB0ZXh0OiB2ZXJzaW9uTGluZSB9LFxuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2xlZnQnLCB0ZXh0OiB1cmxEaXNwbGF5TGluZSB9XG4gIF1cbiAgaWYgKGxvZ2l4bHlzaWFMaW5lKSB7XG4gICAgcm93cy5wdXNoKHsga2luZDogJ2xlZnQnLCB0ZXh0OiBsb2dpeGx5c2lhTGluZSB9KVxuICB9XG4gIHJvd3MucHVzaCh7IGtpbmQ6ICdlbXB0eScgfSlcblxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChcbiAgICB2ZXJzaW9uTGluZS5sZW5ndGgsXG4gICAgdXJsRGlzcGxheUxpbmUubGVuZ3RoLFxuICAgIC4uLihsb2dpeGx5c2lhTGluZSA/IFtsb2dpeGx5c2lhTGluZS5sZW5ndGhdIDogWzBdKVxuICApXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0XG5cbiAgY29uc3QgdG9wID0gYOKUjCR7J+KUgCcucmVwZWF0KGlubmVyV2lkdGgpfeKUkGBcbiAgY29uc3QgYm90ID0gYOKUlCR7J+KUgCcucmVwZWF0KGlubmVyV2lkdGgpfeKUmGBcbiAgY29uc3QgZW1wdHlSb3cgPSBg4pSCJHsnICcucmVwZWF0KGlubmVyV2lkdGgpfeKUgmBcblxuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW3RvcF1cbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGlmIChyb3cua2luZCA9PT0gJ2VtcHR5Jykge1xuICAgICAgb3V0LnB1c2goZW1wdHlSb3cpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAocm93LmtpbmQgPT09ICdjZW50ZXInKSB7XG4gICAgICBvdXQucHVzaChg4pSCJHtjZW50ZXJUZXh0KHJvdy50ZXh0LCBpbm5lcldpZHRoKX3ilIJgKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJvdy50ZXh0XG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSB0ZXh0Lmxlbmd0aCAtIDQpXG4gICAgb3V0LnB1c2goYOKUgiAgJHt0ZXh0fSR7JyAnLnJlcGVhdChwYWRkaW5nKX0gIOKUgmApXG4gIH1cbiAgb3V0LnB1c2goYm90KVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHYgPSBsb2dpeGx5c2lhUGtnLnZlcnNpb25cbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gYCAgICAgbG9naXhseXNpYSB2JHt2fWBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSwgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG4gIGNvbnN0IHVybERpc3BsYXlMaW5lID0gYPCfpoogICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKHVybERpc3BsYXlMaW5lLCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUoKSkpXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zID0ge30sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlubyA9IHBpbm9cbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8ge1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIC4uLnByZXR0eVByaW50T3B0aW9ucyxcbiAgICAgICAgICBtZXNzYWdlS2V5LFxuICAgICAgICAgIGVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuXG4gIGNvbnN0IHBpbm9Mb2dnZXI6IFBpbm8gPSBwaW5vRmFjdG9yeSh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5LFxuICAgIHRyYW5zcG9ydFxuICB9KVxuXG4gIGNvbnN0IHNob3VsZExvZyA9IChsZXZlbDogTG9nTGV2ZWwsIGxvZ0ZpbHRlcj86IExvZ0ZpbHRlcik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghbG9nRmlsdGVyPy5sZXZlbCB8fCBsb2dGaWx0ZXIubGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKGxldmVsKVxuICB9XG5cbiAgY29uc3QgbG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxvZ0RhdGEgPSBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YSkgOiBkYXRhXG4gICAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gICAgbG9nVG9UcmFuc3BvcnRzKHtcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICBzdG9yZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgICAgbGV2ZWwsXG4gICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgIHN0b3JlLFxuICAgICAgb3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucylcbiAgICB9LFxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0SW5mbywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFN0b3JlRGF0YSwgT3B0aW9uc11cbik6IHZvaWQgPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9UcmFuc3BvcnRzSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyB7XG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgcmVxdWVzdDogYXJnc1sxXSxcbiAgICAgICAgICBkYXRhOiBhcmdzWzJdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdLFxuICAgICAgICAgIG9wdGlvbnM6IGFyZ3NbNF1cbiAgICAgICAgfVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IHRyYW5zcG9ydHMgPSBvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXVxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGJlZm9yZVRpbWU6IHN0b3JlLmJlZm9yZVRpbWVcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRyYW5zcG9ydCBmYWlsdXJlcyBtdXN0IG5ldmVyIGNyYXNoIGFwcGxpY2F0aW9uIGxvZ2dpbmcuXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG4vLyBQZXItZmlsZSBtdXRleCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgcm90YXRpb25cbmNvbnN0IGZpbGVMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbmNvbnN0IGFjcXVpcmVMb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBmaWxlTG9ja3MuZ2V0KGZpbGVQYXRoKSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGxldCByZXNvbHZlTG9jazogKCkgPT4gdm9pZFxuICBjb25zdCBuZXdMb2NrID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgcmVzb2x2ZUxvY2sgPSByZXNvbHZlXG4gIH0pXG5cbiAgcmV0dXJuIHByaW9yLnRoZW4oKCkgPT4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBsb2NrIGFmdGVyIGFjcXVpcmluZyB0aGUgcHJpb3IgbG9jayB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIGZpbGVMb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgICAvLyBDcml0aWNhbCBzZWN0aW9uIGNhbiBub3cgcHJvY2VlZFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNvbHZlTG9jayEoKVxuICAgICAgaWYgKGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGZpbGVMb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgbGV0IHBhdGhuYW1lID0gJy8nXG4gIHRyeSB7XG4gICAgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICBwYXRobmFtZSA9IHJlcXVlc3QudXJsXG4gIH1cblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7cGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBhbnkgZmlsZSBvcGVyYXRpb25zIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHJlbGVhc2VMb2NrID0gYXdhaXQgYWNxdWlyZUxvY2soZmlsZVBhdGgpXG5cbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZmlsZSB3cml0ZSBlcnJvcnMgdG8gc3RkZXJyIHNvIHRoZXkncmUgbm90IGNvbXBsZXRlbHkgc2lsZW50XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICBlcnJvclxuICAgICAgKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgIGlmIChzaG91bGQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgcm90YXRpb24gZXJyb3JzIGJ1dCBkb24ndCBjcmFzaCAtIGxvZyBlbnRyeSB3YXMgYWxyZWFkeSB3cml0dGVuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIGxvY2tcbiAgICByZWxlYXNlTG9jaygpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIENvbXByZXNzaW9uIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGNvbXByZXNzaW9uIG9mIHRoZSBzYW1lIGZpbGVcbmNvbnN0IGNvbXByZXNzaW9uTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrISgpXG4gICAgICBpZiAoY29tcHJlc3Npb25Mb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGNvbXByZXNzaW9uTG9ja3MuZGVsZXRlKGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcsIGRhdGU6IERhdGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBTdHJpbmcoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKVxuICByZXR1cm4gYCR7ZmlsZVBhdGh9LiR7eXl5eX0tJHttbX0tJHtkZH0tJHtISH0tJHtNTX0tJHtzc30tJHtTU1N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3QgYmFzZVJvdGF0ZWQgPSBnZXRSb3RhdGVkRmlsZU5hbWUoZmlsZVBhdGgsIG5ldyBEYXRlKCkpXG4gIGNvbnN0IHJvdGF0ZWQgPSBgJHtiYXNlUm90YXRlZH0tJHtwcm9jZXNzLmhydGltZS5iaWdpbnQoKX1gXG4gIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZClcbiAgcmV0dXJuIHJvdGF0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrKGZpbGVQYXRoKVxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGZpbGUgc3RpbGwgZXhpc3RzIChtaWdodCBoYXZlIGJlZW4gY29tcHJlc3NlZCBieSBhbm90aGVyIHByb2Nlc3MpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgYWxyZWFkeSBjb21wcmVzc2VkIG9yIGRlbGV0ZWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2ZpbGVQYXRofS5nemAsIGNvbXByZXNzZWQpXG4gICAgYXdhaXQgZnMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGNvbXByZXNzIGZpbGUgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzXG4gICAgLmZpbHRlcihcbiAgICAgIChcbiAgICAgICAgcmVzdWx0XG4gICAgICApOiByZXN1bHQgaXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDx7XG4gICAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgICBzdGF0OiBpbXBvcnQoJ25vZGU6ZnMnKS5TdGF0c1xuICAgICAgfT4gPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdcbiAgICApXG4gICAgLm1hcChyZXN1bHQgPT4gcmVzdWx0LnZhbHVlKVxuXG4gIGlmIChzdGF0cy5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHN0YXRzLnNvcnQoKGEsIGIpID0+IGIuc3RhdC5tdGltZU1zIC0gYS5zdGF0Lm10aW1lTXMpXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuc2xpY2UobWF4RmlsZXMpXG5cbiAgLy8gRGVsZXRlIGZpbGVzIGluZGl2aWR1YWxseSwgY29udGludWluZyBldmVuIGlmIHNvbWUgZmFpbFxuICBjb25zdCBkZWxldGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpXG4gIClcblxuICAvLyBMb2cgZmFpbHVyZXMgYnV0IGRvbid0IGNyYXNoXG4gIGRlbGV0ZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpZHgpID0+IHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gZGVsZXRlIHJvdGF0ZWQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBjbGVhbnVwQnlUaW1lID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhBZ2VNczogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzXG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzXG4gICAgLmZpbHRlcihcbiAgICAgIChcbiAgICAgICAgcmVzdWx0XG4gICAgICApOiByZXN1bHQgaXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDx7XG4gICAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgICBzdGF0OiBpbXBvcnQoJ25vZGU6ZnMnKS5TdGF0c1xuICAgICAgfT4gPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdcbiAgICApXG4gICAgLm1hcChyZXN1bHQgPT4gcmVzdWx0LnZhbHVlKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG5cbiAgLy8gRGVsZXRlIGZpbGVzIGluZGl2aWR1YWxseSwgY29udGludWluZyBldmVuIGlmIHNvbWUgZmFpbFxuICBjb25zdCBkZWxldGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpXG4gIClcblxuICAvLyBMb2cgZmFpbHVyZXMgYnV0IGRvbid0IGNyYXNoXG4gIGRlbGV0ZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpZHgpID0+IHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gZGVsZXRlIG9sZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb25cbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwZXJmb3JtUm90YXRpb24gPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgcm90YXRlRmlsZShmaWxlUGF0aClcbiAgaWYgKCFyb3RhdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzaG91bGRDb21wcmVzcyA9IGNvbmZpZy5jb21wcmVzcyA9PT0gdHJ1ZVxuICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICBjb25zdCBhbGdvID0gY29uZmlnLmNvbXByZXNzaW9uID8/ICdnemlwJ1xuICAgIGlmIChhbGdvID09PSAnZ3ppcCcpIHtcbiAgICAgIGF3YWl0IGNvbXByZXNzRmlsZShyb3RhdGVkKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcbiAgICBpZiAocmV0ZW50aW9uLnR5cGUgPT09ICdjb3VudCcpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBCeUNvdW50KGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGNsZWFudXBCeVRpbWUoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBPcHRpb25hbCBpbnRlcnZhbC1iYXNlZCByb3RhdGlvbiBjbGVhbnVwIChjcmVhdGUgaW50ZXJ2YWwgZGlyZWN0b3JpZXMgLyBuYW1pbmcpIGlzIG5vdCByZXF1aXJlZCBieSB0ZXN0cy5cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJjb25zdCBFTUFJTF9SRUdFWCA9IC9bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfS9nXG5jb25zdCBJUFY0X1JFR0VYID0gL1xcYig/OlxcZHsxLDN9XFwuKXszfVxcZHsxLDN9XFxiL2dcbi8qKiBEaWdpdCBydW5zIHRoYXQgbWF5IGJlIGZvcm1hdHRlZCBQQU5zIChzcGFjZXMvZGFzaGVzKTsgdmFsaWRhdGVkIHdpdGggTHVobiBiZWZvcmUgcmVkYWN0aW5nLiAqL1xuY29uc3QgQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYID0gL1xcYig/OlxcZFsgLV0qPyl7MTMsMTl9XFxiL2dcbmNvbnN0IEpXVF9SRUdFWCA9IC9leUpbYS16QS1aMC05Xy1dK1xcLmV5SlthLXpBLVowLTlfLV0rXFwuW2EtekEtWjAtOV8tXSsvZ1xuXG5jb25zdCBQQU5fTUlOX0xFTiA9IDEzXG5jb25zdCBQQU5fTUFYX0xFTiA9IDE5XG5cbmNvbnN0IFJFREFDVEVEX1RFWFQgPSAnW1JFREFDVEVEXSdcbmNvbnN0IENJUkNVTEFSX1JFRiA9ICdbQ2lyY3VsYXJdJ1xuXG4vKipcbiAqIEhvc3QgYW5kIHVzZXJpbmZvIGNhbm5vdCBjb250YWluIGBbUkVEQUNURURdYCDigJQgYFtgIGJlZ2lucyBhbiBJUHY2IGxpdGVyYWwgaW4gVVJMcyBhbmQgYnJlYWtzIHBhcnNpbmcuXG4gKi9cbmNvbnN0IFVSTF9TQUZFX1JFREFDVCA9ICdyZWRhY3RlZCdcblxuY29uc3QgcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHJlZGFjdFN0cmluZyh2YWx1ZSkucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG5cbi8qKiBBcHBseSBQSUkgcmVkYWN0aW9uIHRvIGEgcmVxdWVzdCBVUkwgd2hpbGUga2VlcGluZyB0aGUgcmVzdWx0IHBhcnNlYWJsZSBieSB0aGUgVVJML1JlcXVlc3QgY29uc3RydWN0b3JzLiAqL1xuY29uc3QgcmVkYWN0UmVxdWVzdFVybCA9ICh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsU3RyaW5nKVxuICAgIGlmICh1LnVzZXJuYW1lICE9PSAnJykge1xuICAgICAgdS51c2VybmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS51c2VybmFtZSlcbiAgICB9XG4gICAgaWYgKHUucGFzc3dvcmQgIT09ICcnKSB7XG4gICAgICB1LnBhc3N3b3JkID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnBhc3N3b3JkKVxuICAgIH1cbiAgICB1Lmhvc3RuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1Lmhvc3RuYW1lKVxuICAgIHUucGF0aG5hbWUgPSByZWRhY3RTdHJpbmcodS5wYXRobmFtZSlcbiAgICB1LnNlYXJjaCA9IHJlZGFjdFN0cmluZyh1LnNlYXJjaClcbiAgICB1Lmhhc2ggPSByZWRhY3RTdHJpbmcodS5oYXNoKVxuICAgIHJldHVybiB1LnRvU3RyaW5nKClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh1cmxTdHJpbmcpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuICB9XG59XG5cbi8qKiBMdWhuIGNoZWNrc3VtOyBgZGlnaXRzYCBtdXN0IGNvbnRhaW4gb25seSBgMC05YCBhbmQgbGVuZ3RoIGluIFBBTiByYW5nZS4gKi9cbmNvbnN0IHBhc3Nlc0x1aG4gPSAoZGlnaXRzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGRpZ2l0cy5sZW5ndGggPCBQQU5fTUlOX0xFTiB8fCBkaWdpdHMubGVuZ3RoID4gUEFOX01BWF9MRU4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGxldCBhbHRlcm5hdGUgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSBkaWdpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiA1Nykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGxldCBuID0gY29kZSAtIDQ4XG4gICAgaWYgKGFsdGVybmF0ZSkge1xuICAgICAgbiAqPSAyXG4gICAgICBpZiAobiA+IDkpIHtcbiAgICAgICAgbiAtPSA5XG4gICAgICB9XG4gICAgfVxuICAgIHN1bSArPSBuXG4gICAgYWx0ZXJuYXRlID0gIWFsdGVybmF0ZVxuICB9XG5cbiAgcmV0dXJuIHN1bSAlIDEwID09PSAwXG59XG5cbmNvbnN0IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICB0ZXh0LnJlcGxhY2UoQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYLCBtYXRjaCA9PiB7XG4gICAgY29uc3QgZGlnaXRzID0gbWF0Y2gucmVwbGFjZSgvXFxEL2csICcnKVxuICAgIGlmIChcbiAgICAgIGRpZ2l0cy5sZW5ndGggPj0gUEFOX01JTl9MRU4gJiZcbiAgICAgIGRpZ2l0cy5sZW5ndGggPD0gUEFOX01BWF9MRU4gJiZcbiAgICAgIHBhc3Nlc0x1aG4oZGlnaXRzKVxuICAgICkge1xuICAgICAgcmV0dXJuIFJFREFDVEVEX1RFWFRcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoXG4gIH0pXG5cbmV4cG9ydCBjb25zdCByZWRhY3RTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRleHRcblxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShFTUFJTF9SRUdFWCwgUkVEQUNURURfVEVYVClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSVBWNF9SRUdFWCwgUkVEQUNURURfVEVYVClcbiAgcmVzdWx0ID0gcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMocmVzdWx0KVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShKV1RfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5jb25zdCByZWRhY3RFcnJvckNsb25lID0gKFxuICBvcmlnaW5hbEVycm9yOiBFcnJvcixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3IubWVzc2FnZSlcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxFcnJvcikgYXMgb2JqZWN0XG4gIGNvbnN0IG5ld0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90bykgYXMgRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIG5ld0Vycm9yLm1lc3NhZ2UgPSByZWRhY3RlZE1lc3NhZ2VcbiAgbmV3RXJyb3IubmFtZSA9IG9yaWdpbmFsRXJyb3IubmFtZVxuXG4gIGlmIChvcmlnaW5hbEVycm9yLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICBuZXdFcnJvci5zdGFjayA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKVxuICB9XG5cbiAgY29uc3QgZXJyb3JSZWNvcmQgPSBvcmlnaW5hbEVycm9yIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlcnJvclJlY29yZCkpIHtcbiAgICBpZiAoa2V5ICE9PSAnbWVzc2FnZScgJiYga2V5ICE9PSAnbmFtZScgJiYga2V5ICE9PSAnc3RhY2snKSB7XG4gICAgICBuZXdFcnJvcltrZXldID0gcmVkYWN0SW5uZXIoZXJyb3JSZWNvcmRba2V5XSwgaW5Qcm9ncmVzcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3RXJyb3Jcbn1cblxuY29uc3QgcmVkYWN0QXJyYXlJdGVtcyA9IChcbiAgdmFsdWU6IHVua25vd25bXSxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiB1bmtub3duW10gPT4ge1xuICBjb25zdCByZWRhY3RlZEFycmF5OiB1bmtub3duW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB2YWx1ZS5sZW5ndGggfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHJlZGFjdGVkQXJyYXlbaV0gPSByZWRhY3RJbm5lcih2YWx1ZVtpXSwgaW5Qcm9ncmVzcylcbiAgfVxuICByZXR1cm4gcmVkYWN0ZWRBcnJheVxufVxuXG5jb25zdCByZWRhY3RSZWNvcmRFbnRyaWVzID0gKFxuICByZWNvcmRWYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmRWYWx1ZSkpIHtcbiAgICByZWRhY3RlZFJlY29yZFtrZXldID0gcmVkYWN0SW5uZXIocmVjb3JkVmFsdWVba2V5XSwgaW5Qcm9ncmVzcylcbiAgfVxuICByZXR1cm4gcmVkYWN0ZWRSZWNvcmRcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG5jb25zdCByZWRhY3RJbm5lciA9IDxUPih2YWx1ZTogVCwgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+KTogVCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodmFsdWUpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIG9iamVjdFxuICBpZiAoaW5Qcm9ncmVzcy5oYXMob2JqKSkge1xuICAgIHJldHVybiBDSVJDVUxBUl9SRUYgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgIHJlZGFjdEVycm9yQ2xvbmUodmFsdWUsIGluUHJvZ3Jlc3MpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgIHJlZGFjdEFycmF5SXRlbXModmFsdWUsIGluUHJvZ3Jlc3MpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICByZWRhY3RSZWNvcmRFbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzKVxuICApIGFzIHVua25vd24gYXMgVFxufVxuXG5leHBvcnQgY29uc3QgcmVkYWN0ID0gPFQ+KHZhbHVlOiBUKTogVCA9PiByZWRhY3RJbm5lcih2YWx1ZSwgbmV3IFdlYWtTZXQoKSlcblxuLyoqXG4gKiBDbG9uZSByZXF1ZXN0IFVSTCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBQcmVzZXJ2ZXMgYm9keSBhbmQgc2lnbmFsIHNvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGlzIHN0aWxsIHVzYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZGFjdFJlcXVlc3QgPSAocmVxdWVzdDogUmVxdWVzdCk6IFJlcXVlc3QgPT4ge1xuICBjb25zdCByZWRhY3RlZFVybCA9IHJlZGFjdFJlcXVlc3RVcmwocmVxdWVzdC51cmwpXG4gIGNvbnN0IG5leHRIZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICBsZXQgaGVhZGVyc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiByZXF1ZXN0LmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcmVkYWN0ZWQgPSByZWRhY3RTdHJpbmcodmFsdWUpXG4gICAgaWYgKHJlZGFjdGVkICE9PSB2YWx1ZSkge1xuICAgICAgaGVhZGVyc0NoYW5nZWQgPSB0cnVlXG4gICAgfVxuICAgIG5leHRIZWFkZXJzLnNldChuYW1lLCByZWRhY3RlZClcbiAgfVxuXG4gIGNvbnN0IHJlZGFjdGVkTWV0aG9kID0gcmVkYWN0U3RyaW5nKHJlcXVlc3QubWV0aG9kKVxuICBjb25zdCB1cmxDaGFuZ2VkID0gcmVkYWN0ZWRVcmwgIT09IHJlcXVlc3QudXJsXG4gIGNvbnN0IG1ldGhvZENoYW5nZWQgPSByZWRhY3RlZE1ldGhvZCAhPT0gcmVxdWVzdC5tZXRob2RcblxuICBpZiAoISh1cmxDaGFuZ2VkIHx8IGhlYWRlcnNDaGFuZ2VkIHx8IG1ldGhvZENoYW5nZWQpKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RcbiAgfVxuXG4gIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiAnaGFsZicgfSA9IHtcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT09IG51bGwpIHtcbiAgICBpbml0LmJvZHkgPSByZXF1ZXN0LmJvZHlcbiAgICBpbml0LmR1cGxleCA9ICdoYWxmJ1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHJlZGFjdGVkVXJsLCBpbml0KVxufVxuIiwKICAgICJpbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkTG9nT3V0cHV0IHtcbiAgY29udGV4dExpbmVzOiBzdHJpbmdbXVxuICBtYWluOiBzdHJpbmdcbn1cblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuLyoqIFJlc29sdmVzIGNsaWVudCBJUCBmcm9tIHgtZm9yd2FyZGVkLWZvciAoZmlyc3QgSVApIG9yIHgtcmVhbC1pcC4gRW1wdHkgd2hlbiBuZWl0aGVyIGhlYWRlciBpcyBzZXQgKGUuZy4gbG9jYWxob3N0KS4gKi9cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgaWYgKGZvcndhcmRlZCkge1xuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbiA9IChtczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKG1zID49IDEwMDApIHtcbiAgICBjb25zdCBzZWMgPSBtcyAvIDEwMDBcbiAgICBpZiAoc2VjID49IDEwKSB7XG4gICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChzZWMpfXNgXG4gICAgfVxuICAgIGNvbnN0IG9uZURlY2ltYWwgPSBzZWMudG9GaXhlZCgxKVxuICAgIHJldHVybiBvbmVEZWNpbWFsLmVuZHNXaXRoKCcuMCcpID8gYCR7TWF0aC5yb3VuZChzZWMpfXNgIDogYCR7b25lRGVjaW1hbH1zYFxuICB9XG4gIGlmIChtcyA+IDAgJiYgbXMgPCAxKSB7XG4gICAgcmV0dXJuIGAke21zLnRvRml4ZWQoMil9bXNgXG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMpfW1zYFxufVxuXG5jb25zdCBnZXRTbG93VGhyZXNob2xkcyA9IChcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyBzbG93OiBudW1iZXI7IHZlcnlTbG93OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIHJldHVybiB7XG4gICAgc2xvdzogY29uZmlnPy5zbG93VGhyZXNob2xkID8/IERFRkFVTFRfU0xPV19NUyxcbiAgICB2ZXJ5U2xvdzogY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1ZFUllfU0xPV19NU1xuICB9XG59XG5cbmNvbnN0IGNvbG9yRHVyYXRpb25UZXh0ID0gKFxuICBtczogbnVtYmVyLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgdGV4dDogc3RyaW5nOyBpc1ZlcnlTbG93OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCByYXcgPSBmb3JtYXREdXJhdGlvbihtcylcbiAgY29uc3QgeyBzbG93LCB2ZXJ5U2xvdyB9ID0gZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3QgaXNWZXJ5U2xvdyA9IG1zID49IHZlcnlTbG93XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4geyB0ZXh0OiByYXcsIGlzVmVyeVNsb3cgfVxuICB9XG5cbiAgbGV0IGNvbG9yZWQgPSByYXdcbiAgaWYgKG1zIDwgc2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay5ncmVlbihyYXcpXG4gIH0gZWxzZSBpZiAobXMgPCB2ZXJ5U2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay55ZWxsb3cocmF3KVxuICB9IGVsc2Uge1xuICAgIGNvbG9yZWQgPSBjaGFsay5yZWQuYm9sZChyYXcpXG4gIH1cblxuICByZXR1cm4geyB0ZXh0OiBjb2xvcmVkLCBpc1ZlcnlTbG93IH1cbn1cblxuY29uc3QgZ2V0U3BlZWRUb2tlbiA9IChpc1ZlcnlTbG93OiBib29sZWFuLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmVyeVNsb3cpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBiYWRnZSA9ICfimqEgc2xvdydcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCAke2JhZGdlfWBcbiAgfVxuICByZXR1cm4gYCAke2NoYWxrLnllbGxvdyhiYWRnZSl9YFxufVxuXG4vKiogTG9naXhseXNpYSBicmFuZDogZm94IGVtb2ppIHdpdGggbGV2ZWwtY29sb3JlZCBiYWNrZ3JvdW5kIHdoZW4gY29sb3JzIGFyZSBlbmFibGVkLiAqL1xuY29uc3QgZ2V0TGV2ZWxJY29uID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gJ/CfpoonXG4gIH1cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2soJyDwn6aKICcpXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB2YWx1ZS5tZXNzYWdlXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJDb250ZXh0VHJlZUxpbmVzID0gKFxuICBjdHg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcbiAgaWYgKGRlcHRoIDwgMSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGNvbGxlY3RDb250ZXh0RW50cmllcyhjdHgsICcnLCBkZXB0aClcbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKG9wdGlvbnMuY29uZmlnPy5zaG93Q29udGV4dFRyZWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcblxuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuXG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAoXG4gICAgY3R4ICYmXG4gICAgdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShjdHgpICYmXG4gICAgT2JqZWN0LmtleXMoY3R4IGFzIG9iamVjdCkubGVuZ3RoID4gMCAmJlxuICAgIGRlcHRoID49IDFcbiAgKSB7XG4gICAgZW50cmllcy5wdXNoKFxuICAgICAgLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJycsIGRlcHRoKVxuICAgIClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAnZXJyb3InIGluIGRhdGEgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihkYXRhLmVycm9yKVxuICAgIGlmIChtc2cpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgbXNnXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuY29uc3QgZ2V0Q29udGV4dFN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb2dPdXRwdXQgPSAoe1xuICBsZXZlbCxcbiAgcmVxdWVzdCxcbiAgZGF0YSxcbiAgc3RvcmUsXG4gIG9wdGlvbnNcbn06IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufSk6IEZvcm1hdHRlZExvZ091dHB1dCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBmb3JtYXQgPSBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/PyBERUZBVUxUX0xPR19GT1JNQVRcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gU3RyaW5nKG5vdy5nZXRUaW1lKCkpXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXG5cbiAgY29uc3Qgc2hvd1RyZWUgPSBjb25maWc/LnNob3dDb250ZXh0VHJlZSAhPT0gZmFsc2VcbiAgY29uc3QgY3R4U3RyaW5nID1cbiAgICBzaG93VHJlZSAmJlxuICAgIGRhdGEuY29udGV4dCAmJlxuICAgIHR5cGVvZiBkYXRhLmNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoZGF0YS5jb250ZXh0KSAmJlxuICAgIE9iamVjdC5rZXlzKGRhdGEuY29udGV4dCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcbiAgICAgID8gJydcbiAgICAgIDogZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXG5cbiAgY29uc3QgY29sb3JlZExldmVsID0gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IG1ldGhvZFBhZGRlZCA9IHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCkucGFkRW5kKE1FVEhPRF9QQUQpXG4gIGNvbnN0IGNvbG9yZWRNZXRob2QgPSBnZXRDb2xvcmVkTWV0aG9kKG1ldGhvZFBhZGRlZCwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkUGF0aG5hbWUgPSBnZXRDb2xvcmVkUGF0aG5hbWUocGF0aG5hbWUsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFN0YXR1cyA9IGdldENvbG9yZWRTdGF0dXMoc3RhdHVzLCB1c2VDb2xvcnMpXG4gIGNvbnN0IHsgdGV4dDogY29sb3JlZER1cmF0aW9uLCBpc1ZlcnlTbG93IH0gPSBjb2xvckR1cmF0aW9uVGV4dChcbiAgICBkdXJhdGlvbk1zLFxuICAgIHVzZUNvbG9ycyxcbiAgICBvcHRpb25zXG4gIClcbiAgY29uc3Qgc3BlZWRUb2tlbiA9IGdldFNwZWVkVG9rZW4oaXNWZXJ5U2xvdywgdXNlQ29sb3JzKVxuICBjb25zdCBpY29uID0gZ2V0TGV2ZWxJY29uKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IHN0YXR1c1RleHQgPSBnZXRTdGF0dXNUZXh0KHN0YXR1c0NvZGUpXG4gIGNvbnN0IHNlcnZpY2VUb2tlbiA9IGdldFNlcnZpY2VUb2tlbihvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdFxuICAgIC5yZXBsYWNlQWxsKCd7bm93fScsIHRpbWVzdGFtcClcbiAgICAucmVwbGFjZUFsbCgne2Vwb2NofScsIGVwb2NoKVxuICAgIC5yZXBsYWNlQWxsKCd7bGV2ZWx9JywgY29sb3JlZExldmVsKVxuICAgIC5yZXBsYWNlQWxsKCd7aWNvbn0nLCBpY29uKVxuICAgIC5yZXBsYWNlQWxsKCd7ZHVyYXRpb259JywgY29sb3JlZER1cmF0aW9uKVxuICAgIC5yZXBsYWNlQWxsKCd7bWV0aG9kfScsIGNvbG9yZWRNZXRob2QpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRobmFtZX0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRofScsIGNvbG9yZWRQYXRobmFtZSlcbiAgICAucmVwbGFjZUFsbCgne3N0YXR1c30nLCBjb2xvcmVkU3RhdHVzKVxuICAgIC5yZXBsYWNlQWxsKCd7c3RhdHVzVGV4dH0nLCBzdGF0dXNUZXh0KVxuICAgIC5yZXBsYWNlQWxsKCd7bWVzc2FnZX0nLCBtZXNzYWdlKVxuICAgIC5yZXBsYWNlQWxsKCd7aXB9JywgaXApXG4gICAgLnJlcGxhY2VBbGwoJ3tjb250ZXh0fScsIGN0eFN0cmluZylcbiAgICAucmVwbGFjZUFsbCgne3NlcnZpY2V9Jywgc2VydmljZVRva2VuKVxuICAgIC5yZXBsYWNlQWxsKCd7c3BlZWR9Jywgc3BlZWRUb2tlbilcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbWFpbiwgY29udGV4dExpbmVzIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLihpbnB1dC5vcHRpb25zLmNvbmZpZyA/PyB7fSksXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcygnRVJST1InKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cbiAgY29uc3QgbG9nRGF0YSA9IGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhKSA6IGRhdGFcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdDogbG9nUmVxdWVzdCwgZGF0YTogbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgbGV2ZWwsXG4gICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICBkYXRhOiBsb2dEYXRhLFxuICAgIHN0b3JlLFxuICAgIG9wdGlvbnNcbiAgfSlcblxuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID1cbiAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cbiAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDQVQsd0JBQVMsb0JBRVQsSUFBTSxJQUFtQyxJQUFNLENBQzdDLEdBQUksQ0FFRixPQURnQixFQUFjLFlBQVksR0FBRyxFQUM5QixxQkFBcUIsRUFDcEMsS0FBTSxDQUNOLE1BQU8sQ0FBQyxLQUVULEVBRUcsSUFBdUMsSUFBTSxDQUNqRCxHQUFJLENBRUYsT0FEZ0IsRUFBYyxZQUFZLEdBQUcsRUFDOUIsb0JBQW9CLEVBQ25DLEtBQU0sQ0FDTixNQUFPLENBQUMsS0FFVCxFQUVHLEdBQWEsQ0FBQyxFQUFjLElBQTBCLENBQzFELEdBQUksRUFBSyxRQUFVLEVBQ2pCLE9BQU8sRUFBSyxNQUFNLEVBQUcsQ0FBSyxFQUc1QixJQUFNLEVBQU8sS0FBSyxPQUFPLEVBQVEsRUFBSyxRQUFVLENBQUMsRUFDM0MsRUFBUSxFQUFRLEVBQUssT0FBUyxFQUNwQyxNQUFPLEdBQUcsSUFBSSxPQUFPLENBQUksSUFBSSxJQUFP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
|
|
9
|
+
//# debugId=AE2E6CC6E9342ED764756E2164756E21
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2xvZ2dlci9pbmRleC50cyIsICJzcmMvb3V0cHV0L2luZGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvdXRpbHMvcm90YXRpb24udHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgInNyYy93ZWJzb2NrZXQvd3JhcC13cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmUtb3B0aW9ucydcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbi8qKlxuICogRW1wdHkgc2luZ2xldG9uIHNsb3RzIG11c3Qgbm90IHVzZSBgUmVjb3JkPHN0cmluZywgbmV2ZXI+YDogaW50ZXJzZWN0aW5nIHRoYXQgd2l0aCBFbHlzaWEncyBgQ29udGV4dGBcbiAqIG1ha2VzIGV2ZXJ5IGtleSAoaW5jbHVkaW5nIGBzdG9yZWApIGJlY29tZSBgbmV2ZXJgIGJlY2F1c2UgZWFjaCBrZXkgaXMgbWVyZ2VkIHdpdGggYG5ldmVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXB0eUVseXNpYVNsb3Qge1xuICByZWFkb25seSBfX2xvZ2l4bHlzaWFFbXB0eT86IG5ldmVyXG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b24ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IEVtcHR5RWx5c2lhU2xvdFxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZS5zdG9yZWAgaXMgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YDsgYExvZ2l4bHlzaWFTdG9yZWAgaXMgaW50ZW50aW9uYWxseSBjbG9zZWQgKHNlZSAjMjIwKS5cbi8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzdG9yZSBpcyBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8JycsIExvZ2l4bHlzaWFTaW5nbGV0b24+XG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWFQbHVnaW4gPSBMb2dpeGx5c2lhICYge1xuICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKHJhd09wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWFQbHVnaW4gPT4ge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMocmF3T3B0aW9ucylcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyBzdG9yZSB9KSA9PiB7XG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IHR5cGUgTG9nUHJlc2V0ID0gJ2RldicgfCAncHJvZCcgfCAnanNvbidcblxuY29uc3QgUFJFU0VUX0RFRkFVTFRTOiBSZWNvcmQ8TG9nUHJlc2V0LCBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4+ID0ge1xuICBkZXY6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIHByb2Q6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2UsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBhdXRvUmVkYWN0OiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAganNvbjoge1xuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5sb2dSb3RhdGlvbiB8fCBvdmVycmlkZS5sb2dSb3RhdGlvbikge1xuICAgIG1lcmdlZC5sb2dSb3RhdGlvbiA9IHtcbiAgICAgIC4uLmJhc2UubG9nUm90YXRpb24sXG4gICAgICAuLi5vdmVycmlkZS5sb2dSb3RhdGlvblxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLnRpbWVzdGFtcCB8fCBvdmVycmlkZS50aW1lc3RhbXApIHtcbiAgICBtZXJnZWQudGltZXN0YW1wID0ge1xuICAgICAgLi4uYmFzZS50aW1lc3RhbXAsXG4gICAgICAuLi5vdmVycmlkZS50aW1lc3RhbXBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkXG59XG5cbi8qKiBBcHBsaWVzIHByZXNldCBkZWZhdWx0czsgZXhwbGljaXQgYGNvbmZpZ2Aga2V5cyBvdmVycmlkZSBwcmVzZXQgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcHRpb25zID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IE9wdGlvbnMgPT4ge1xuICBjb25zdCBwcmVzZXQgPSBvcHRpb25zLnByZXNldFxuICBpZiAoIXByZXNldCkge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBjb25zdCBwcmVzZXRDb25maWcgPSBQUkVTRVRfREVGQVVMVFNbcHJlc2V0XVxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY29uZmlnOiBtZXJnZUNvbmZpZyhwcmVzZXRDb25maWcsIG9wdGlvbnMuY29uZmlnKVxuICB9XG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgPSAoKTogUmVxdWVzdENvbnRleHRTdG9yZSA9PiB7XG4gIGNvbnN0IGJhZ3MgPSBuZXcgV2Vha01hcDxDb250ZXh0S2V5LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKVxuXG4gIGNvbnN0IGdldE9yQ3JlYXRlID0gKGtleTogQ29udGV4dEtleSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBsZXQgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgIGlmICghYmFnKSB7XG4gICAgICBiYWcgPSB7fVxuICAgICAgYmFncy5zZXQoa2V5LCBiYWcpXG4gICAgfVxuICAgIHJldHVybiBiYWdcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VDb250ZXh0KGtleSwgcGFydGlhbCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhZyA9IGdldE9yQ3JlYXRlKGtleSlcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFnLCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICAgIHJldHVybiBiYWcgPyB7IC4uLmJhZyB9IDoge31cbiAgICB9LFxuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBlbHlzaWFQa2cudmVyc2lvblxuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcm93LnRleHRcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIHRleHQubGVuZ3RoIC0gNClcbiAgICBvdXQucHVzaChg4pSCICAke3RleHR9JHsnICcucmVwZWF0KHBhZGRpbmcpfSAg4pSCYClcbiAgfVxuICBvdXQucHVzaChib3QpXG4gIHJldHVybiBvdXQuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgdiA9IGxvZ2l4bHlzaWFQa2cudmVyc2lvblxuICBpZiAoIXYpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBgICAgICBsb2dpeGx5c2lhIHYke3Z9YFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lLCByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcbiAgY29uc3QgdXJsRGlzcGxheUxpbmUgPSBg8J+miiAgJHt1cmx9YFxuXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xuICBpZiAoZm9ybWF0ID09PSAnc2ltcGxlJykge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIodXJsRGlzcGxheUxpbmUsIGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSgpKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB7XG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHJlZGFjdCwgcmVkYWN0UmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vID0gcGlubyxcbiAgZXh0ZXJuYWxDb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb250ZXh0U3RvcmUgPSBleHRlcm5hbENvbnRleHRTdG9yZSA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XG5cbiAgY29uc3QgcHJldHR5UHJpbnRPcHRpb25zID1cbiAgICB0eXBlb2YgcHJldHR5UHJpbnQgPT09ICdvYmplY3QnICYmIHByZXR0eVByaW50ICE9PSBudWxsXG4gICAgICA/IChwcmV0dHlQcmludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZW5hYmxlUHJldHR5UHJpbnQgPVxuICAgIHByZXR0eVByaW50ID09PSB0cnVlIHx8IHByZXR0eVByaW50T3B0aW9ucyAhPT0gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxuICAgIGVuYWJsZVByZXR0eVByaW50ICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXG5cbiAgY29uc3QgbWVzc2FnZUtleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8ubWVzc2FnZUtleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgcGlub09wdGlvbnMubWVzc2FnZUtleVxuICBjb25zdCBlcnJvcktleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8uZXJyb3JLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBwaW5vT3B0aW9ucy5lcnJvcktleVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHNob3VsZFByZXR0eVByaW50XG4gICAgPyB7XG4gICAgICAgIHRhcmdldDogJ3Bpbm8tcHJldHR5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbG9yaXplOiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWUsXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgICAgIG1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIDogcGlub09wdGlvbnMudHJhbnNwb3J0XG5cbiAgY29uc3QgcGlub0xvZ2dlcjogUGlubyA9IHBpbm9GYWN0b3J5KHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXksXG4gICAgZXJyb3JLZXksXG4gICAgdHJhbnNwb3J0XG4gIH0pXG5cbiAgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgICBkYXRhLFxuICAgICAgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICApXG4gICAgY29uc3QgbG9nRGF0YSA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICAgIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICAgIGlmIChoYXNUcmFuc3BvcnRzKSB7XG4gICAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvKiBJZ25vcmUgZXJyb3JzICovXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgc3RvcmUsXG4gICAgICBvcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBtZXNzYWdlLCBjb250ZXh0IH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLFxuICAgIG1lcmdlQ29udGV4dDogKHJlcXVlc3QsIHBhcnRpYWwpID0+IHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbClcbiAgICB9LFxuICAgIGdldENvbnRleHQ6IHJlcXVlc3QgPT4gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCksXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucywgY29udGV4dFN0b3JlKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5pbnRlcmZhY2UgTG9nVG9UcmFuc3BvcnRzSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3RJbmZvLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8vIFBlci1maWxlIG11dGV4IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyByb3RhdGlvblxuY29uc3QgZmlsZUxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUxvY2sgPSAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICByZXR1cm4gcHJpb3IudGhlbigoKSA9PiB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxvY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwcmlvciBsb2NrIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgZmlsZUxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGZpbGVMb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgbGV0IHBhdGhuYW1lID0gJy8nXG4gIHRyeSB7XG4gICAgY29uc3QgeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgICBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXMgPyBgJHtyYXdQYXRobmFtZX0ke3NlYXJjaH1gIDogcmF3UGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgdG8gcmF3IFVSTCBpZiBwYXJzaW5nIGZhaWxzXG4gICAgcGF0aG5hbWUgPSByZXF1ZXN0LnVybFxuICB9XG5cbiAgY29uc3QgbGluZSA9IGAke2xldmVsfSAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tcyAke3JlcXVlc3QubWV0aG9kfSAke3BhdGhuYW1lfSAke21lc3NhZ2V9XFxuYFxuXG4gIC8vIEFjcXVpcmUgbG9jayBiZWZvcmUgYW55IGZpbGUgb3BlcmF0aW9ucyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICBjb25zdCByZWxlYXNlTG9jayA9IGF3YWl0IGFjcXVpcmVMb2NrKGZpbGVQYXRoKVxuXG4gIHRyeSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAgIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGZpbGUgd3JpdGUgZXJyb3JzIHRvIHN0ZGVyciBzbyB0aGV5J3JlIG5vdCBjb21wbGV0ZWx5IHNpbGVudFxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gd3JpdGUgdG8gbG9nIGZpbGUgJHtmaWxlUGF0aH06YCxcbiAgICAgICAgZXJyb3JcbiAgICAgIClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3Qgcm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gICAgaWYgKCFyb3RhdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgICBpZiAoc2hvdWxkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBwZXJmb3JtUm90YXRpb24oZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHJvdGF0aW9uIGVycm9ycyBidXQgZG9uJ3QgY3Jhc2ggLSBsb2cgZW50cnkgd2FzIGFscmVhZHkgd3JpdHRlblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHJvdGF0ZSBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmVsZWFzZSBsb2NrXG4gICAgcmVsZWFzZUxvY2soKVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHtcbiAgZ2V0Um90YXRlZEZpbGVzLFxuICBwYXJzZVJldGVudGlvbixcbiAgcGFyc2VTaXplLFxuICBzaG91bGRSb3RhdGVCeVNpemVcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5cbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeShnemlwKVxuXG4vLyBDb21wcmVzc2lvbiBsb2NrIHRvIHByZXZlbnQgY29uY3VycmVudCBjb21wcmVzc2lvbiBvZiB0aGUgc2FtZSBmaWxlXG5jb25zdCBjb21wcmVzc2lvbkxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUNvbXByZXNzaW9uTG9jayA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gIGNvbnN0IHByaW9yID0gY29tcHJlc3Npb25Mb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICByZXR1cm4gcHJpb3IudGhlbigoKSA9PiB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxvY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwcmlvciBsb2NrIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgY29tcHJlc3Npb25Mb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgICAvLyBDcml0aWNhbCBzZWN0aW9uIGNhbiBub3cgcHJvY2VlZFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNvbHZlTG9jaz8uKClcbiAgICAgIGlmIChjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPT09IG5ld0xvY2spIHtcbiAgICAgICAgY29tcHJlc3Npb25Mb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IFN0cmluZyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKS5wYWRTdGFydCgzLCAnMCcpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfS0ke1NTU31gXG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBiYXNlUm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgY29uc3Qgcm90YXRlZCA9IGAke2Jhc2VSb3RhdGVkfS0ke3Byb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpfWBcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGFjcXVpcmVDb21wcmVzc2lvbkxvY2soZmlsZVBhdGgpXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMgKG1pZ2h0IGhhdmUgYmVlbiBjb21wcmVzc2VkIGJ5IGFub3RoZXIgcHJvY2VzcylcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBhbHJlYWR5IGNvbXByZXNzZWQgb3IgZGVsZXRlZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIHJlbGVhc2UoKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBpZiAoY29uZmlnLm1heFNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IG1heFNpemUgPSBwYXJzZVNpemUoY29uZmlnLm1heFNpemUpXG4gIHJldHVybiBhd2FpdCBzaG91bGRSb3RhdGVCeVNpemUoZmlsZVBhdGgsIG1heFNpemUpXG59XG5cbmNvbnN0IGNsZWFudXBCeUNvdW50ID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhGaWxlczogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGhhbmRsZSBpbmRpdmlkdWFsIGZpbGUgc3RhdCBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gIGNvbnN0IHN0YXRzUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgc3RhdHMsIGlnbm9yZSBmaWxlcyB0aGF0IHdlcmUgZGVsZXRlZCBjb25jdXJyZW50bHlcbiAgY29uc3Qgc3RhdHMgPSBzdGF0c1Jlc3VsdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKFxuICAgICAgICByZXN1bHRcbiAgICAgICk6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIHN0YXQ6IGltcG9ydCgnbm9kZTpmcycpLlN0YXRzXG4gICAgICB9PiA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgIClcbiAgICAubWFwKHJlc3VsdCA9PiByZXN1bHQudmFsdWUpXG5cbiAgaWYgKHN0YXRzLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5zbGljZShtYXhGaWxlcylcblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgcm90YXRlZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb25cbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGNsZWFudXBCeVRpbWUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEFnZU1zOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGhhbmRsZSBpbmRpdmlkdWFsIGZpbGUgc3RhdCBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gIGNvbnN0IHN0YXRzUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgc3RhdHNcbiAgY29uc3Qgc3RhdHMgPSBzdGF0c1Jlc3VsdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKFxuICAgICAgICByZXN1bHRcbiAgICAgICk6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIHN0YXQ6IGltcG9ydCgnbm9kZTpmcycpLlN0YXRzXG4gICAgICB9PiA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgIClcbiAgICAubWFwKHJlc3VsdCA9PiByZXN1bHQudmFsdWUpXG5cbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiBtYXhBZ2VNcylcblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgb2xkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1Sb3RhdGlvbiA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuICBpZiAoIXJvdGF0ZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29uZmlnLmNvbXByZXNzID09PSB0cnVlXG4gIGlmIChzaG91bGRDb21wcmVzcykge1xuICAgIGNvbnN0IGFsZ28gPSBjb25maWcuY29tcHJlc3Npb24gPz8gJ2d6aXAnXG4gICAgaWYgKGFsZ28gPT09ICdnemlwJykge1xuICAgICAgYXdhaXQgY29tcHJlc3NGaWxlKHJvdGF0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5Q291bnQoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5VGltZShmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGludGVydmFsLWJhc2VkIHJvdGF0aW9uIGNsZWFudXAgKGNyZWF0ZSBpbnRlcnZhbCBkaXJlY3RvcmllcyAvIG5hbWluZykgaXMgbm90IHJlcXVpcmVkIGJ5IHRlc3RzLlxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuY29uc3QgU0laRV9SRUdFWCA9IC9eKFxcZCsoPzpcXC5cXGQrKT8pKGt8a2J8bXxtYnxnfGdiKSQvaVxuY29uc3QgSU5URVJWQUxfUkVHRVggPSAvXihcXGQrKShofGR8dykkL2lcbmNvbnN0IFJPVEFURURfUkVHRVggPVxuICAvXFwuKFxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KD86LVxcZHszfSk/KD86LVxcZCspPykoPzpcXC5neik/JC9cblxuZXhwb3J0IGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgY29uc3QgYXNOdW1iZXIgPSBOdW1iZXIodHJpbW1lZClcbiAgaWYgKE51bWJlci5pc0Zpbml0ZShhc051bWJlcikpIHtcbiAgICByZXR1cm4gYXNOdW1iZXJcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaChTSVpFX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemUgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IGJhc2UgPSAxMDI0XG4gIGlmICh1bml0LnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNFxuICB9IGVsc2UgaWYgKHVuaXQuc3RhcnRzV2l0aCgnZycpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50ICogYmFzZSlcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlSW50ZXJ2YWwgPSAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUudHJpbSgpLm1hdGNoKElOVEVSVkFMX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBtcyA9IDYwICogNjAgKiAxMDAwXG4gIGlmICh1bml0ID09PSAnZCcpIHtcbiAgICBtcyA9IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndycpIHtcbiAgICBtcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cblxuICByZXR1cm4gYW1vdW50ICogbXNcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmV0ZW50aW9uID0gKFxuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nXG4pOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvdW50JywgdmFsdWUgfVxuICB9XG4gIHJldHVybiB7IHR5cGU6ICd0aW1lJywgdmFsdWU6IHBhcnNlSW50ZXJ2YWwodmFsdWUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZUJ5U2l6ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZUJ5dGVzOiBudW1iZXJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0LnNpemUgPiBtYXhTaXplQnl0ZXNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlID0gYmFzZW5hbWUoZmlsZVBhdGgpXG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdXG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG4gICAgLmZpbHRlcihuYW1lID0+IG5hbWUuc3RhcnRzV2l0aChgJHtiYXNlfS5gKSAmJiBST1RBVEVEX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgLm1hcChuYW1lID0+IGAke2Rpcn0vJHtuYW1lfWApXG59XG4iLAogICAgIi8vIExvY2FsIHBhcnQg4omkNjQsIGRvbWFpbiDiiaQyNTMsIFRMRCAy4oCTNjMgKFJGQyA1MzIxIC8gMTAzNS1pc2ggbGltaXRzOyBib3VuZGVkIHRvIGF2b2lkIFJlRG9TKVxuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvW2EtekEtWjAtOS5fJSstXXsxLDY0fUBbYS16QS1aMC05Li1dezEsMjUzfVxcLlthLXpBLVpdezIsNjN9L2dcbmNvbnN0IElQVjRfUkVHRVggPSAvXFxiKD86XFxkezEsM31cXC4pezN9XFxkezEsM31cXGIvZ1xuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKlxuICogSG9zdCBhbmQgdXNlcmluZm8gY2Fubm90IGNvbnRhaW4gYFtSRURBQ1RFRF1gIOKAlCBgW2AgYmVnaW5zIGFuIElQdjYgbGl0ZXJhbCBpbiBVUkxzIGFuZCBicmVha3MgcGFyc2luZy5cbiAqL1xuY29uc3QgVVJMX1NBRkVfUkVEQUNUID0gJ3JlZGFjdGVkJ1xuXG5jb25zdCByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcmVkYWN0U3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcblxuLyoqIEFwcGx5IFBJSSByZWRhY3Rpb24gdG8gYSByZXF1ZXN0IFVSTCB3aGlsZSBrZWVwaW5nIHRoZSByZXN1bHQgcGFyc2VhYmxlIGJ5IHRoZSBVUkwvUmVxdWVzdCBjb25zdHJ1Y3RvcnMuICovXG5jb25zdCByZWRhY3RSZXF1ZXN0VXJsID0gKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIHUuc2VhcmNoID0gcmVkYWN0U3RyaW5nKHUuc2VhcmNoKVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuZXhwb3J0IGNvbnN0IHJlZGFjdFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzdWx0ID0gdGV4dFxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5tZXNzYWdlKVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbEVycm9yKSBhcyBvYmplY3RcbiAgY29uc3QgbmV3RXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvKSBhcyBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgbmV3RXJyb3IubWVzc2FnZSA9IHJlZGFjdGVkTWVzc2FnZVxuICBuZXdFcnJvci5uYW1lID0gb3JpZ2luYWxFcnJvci5uYW1lXG5cbiAgaWYgKG9yaWdpbmFsRXJyb3Iuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgIG5ld0Vycm9yLnN0YWNrID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3Iuc3RhY2spXG4gIH1cblxuICBjb25zdCBlcnJvclJlY29yZCA9IG9yaWdpbmFsRXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9yUmVjb3JkKSkge1xuICAgIGlmIChrZXkgIT09ICdtZXNzYWdlJyAmJiBrZXkgIT09ICduYW1lJyAmJiBrZXkgIT09ICdzdGFjaycpIHtcbiAgICAgIG5ld0Vycm9yW2tleV0gPSByZWRhY3RJbm5lcihlcnJvclJlY29yZFtrZXldLCBpblByb2dyZXNzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFcnJvclxufVxuXG5jb25zdCByZWRhY3RBcnJheUl0ZW1zID0gKFxuICB2YWx1ZTogdW5rbm93bltdLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IHVua25vd25bXSA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkQXJyYXk6IHVua25vd25bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHZhbHVlLmxlbmd0aCB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVkYWN0ZWRBcnJheVtpXSA9IHJlZGFjdElubmVyKHZhbHVlW2ldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZEFycmF5XG59XG5cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZFZhbHVlKSkge1xuICAgIHJlZGFjdGVkUmVjb3JkW2tleV0gPSByZWRhY3RJbm5lcihyZWNvcmRWYWx1ZVtrZXldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZFJlY29yZFxufVxuXG5jb25zdCB3aXRoUmVlbnRyYW5jeUd1YXJkID0gPFQ+KFxuICBvYmo6IG9iamVjdCxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBydW46ICgpID0+IFRcbik6IFQgPT4ge1xuICBpblByb2dyZXNzLmFkZChvYmopXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJ1bigpXG4gIH0gZmluYWxseSB7XG4gICAgaW5Qcm9ncmVzcy5kZWxldGUob2JqKVxuICB9XG59XG5cbmNvbnN0IHJlZGFjdElubmVyID0gPFQ+KHZhbHVlOiBULCBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4pOiBUID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0QXJyYXlJdGVtcyh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgIHJlZGFjdFJlY29yZEVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluUHJvZ3Jlc3MpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQpOiBUID0+IHJlZGFjdElubmVyKHZhbHVlLCBuZXcgV2Vha1NldCgpKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMIGFuZCBoZWFkZXJzIGZvciBsb2dnaW5nIHdpdGggdGhlIHNhbWUgc3RyaW5nIHJlZGFjdGlvbiBhcyB7QGxpbmsgcmVkYWN0fS5cbiAqIFByZXNlcnZlcyBib2R5IGFuZCBzaWduYWwgc28gdGhlIG9yaWdpbmFsIHJlcXVlc3QgaXMgc3RpbGwgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChyZXF1ZXN0OiBSZXF1ZXN0KTogUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkVXJsID0gcmVkYWN0UmVxdWVzdFVybChyZXF1ZXN0LnVybClcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICBpZiAocmVkYWN0ZWQgIT09IHZhbHVlKSB7XG4gICAgICBoZWFkZXJzQ2hhbmdlZCA9IHRydWVcbiAgICB9XG4gICAgbmV4dEhlYWRlcnMuc2V0KG5hbWUsIHJlZGFjdGVkKVxuICB9XG5cbiAgY29uc3QgcmVkYWN0ZWRNZXRob2QgPSByZWRhY3RTdHJpbmcocmVxdWVzdC5tZXRob2QpXG4gIGNvbnN0IHVybENoYW5nZWQgPSByZWRhY3RlZFVybCAhPT0gcmVxdWVzdC51cmxcbiAgY29uc3QgbWV0aG9kQ2hhbmdlZCA9IHJlZGFjdGVkTWV0aG9kICE9PSByZXF1ZXN0Lm1ldGhvZFxuXG4gIGlmICghKHVybENoYW5nZWQgfHwgaGVhZGVyc0NoYW5nZWQgfHwgbWV0aG9kQ2hhbmdlZCkpIHtcbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86ICdoYWxmJyB9ID0ge1xuICAgIG1ldGhvZDogcmVkYWN0ZWRNZXRob2QsXG4gICAgaGVhZGVyczogbmV4dEhlYWRlcnMsXG4gICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbFxuICB9XG5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPT0gbnVsbCkge1xuICAgIGluaXQuYm9keSA9IHJlcXVlc3QuYm9keVxuICAgIGluaXQuZHVwbGV4ID0gJ2hhbGYnXG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QocmVkYWN0ZWRVcmwsIGluaXQpXG59XG4iLAogICAgImltcG9ydCB7IFNUQVRVU19DT0RFUyB9IGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxuXG5jb25zdCBERUZBVUxUX1NMT1dfTVMgPSA1MDBcbmNvbnN0IERFRkFVTFRfVkVSWV9TTE9XX01TID0gMTAwMFxuY29uc3QgTUVUSE9EX1BBRCA9IDdcblxuY29uc3QgREVGQVVMVF9MT0dfRk9STUFUID1cbiAgJ3tub3d9IHtzZXJ2aWNlfXtpY29ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHtkdXJhdGlvbn0ge21lc3NhZ2V9e3NwZWVkfSdcblxuY29uc3QgTE9HX0ZPUk1BVF9SRUdFWCA9XG4gIC9cXHsobm93fGVwb2NofGxldmVsfGljb258ZHVyYXRpb258bWV0aG9kfHBhdGhuYW1lfHBhdGh8cXVlcnl8c3RhdHVzfHN0YXR1c1RleHR8bWVzc2FnZXxpcHxjb250ZXh0fHNlcnZpY2V8c3BlZWQpXFx9L2dcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuY29uc3QgZm9ybWF0VGltZXN0YW1wID0gKGRhdGU6IERhdGUsIHBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBjb25zdCB5eXl5ID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IHBhZDMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSlcblxuICByZXR1cm4gcGF0dGVyblxuICAgIC5yZXBsYWNlQWxsKCd5eXl5JywgeXl5eSlcbiAgICAucmVwbGFjZUFsbCgnbW0nLCBtbSlcbiAgICAucmVwbGFjZUFsbCgnZGQnLCBkZClcbiAgICAucmVwbGFjZUFsbCgnSEgnLCBISClcbiAgICAucmVwbGFjZUFsbCgnTU0nLCBNTSlcbiAgICAucmVwbGFjZUFsbCgnc3MnLCBzcylcbiAgICAucmVwbGFjZUFsbCgnU1NTJywgU1NTKVxufVxuXG4vKiogUmVzb2x2ZXMgY2xpZW50IElQIGZyb20geC1mb3J3YXJkZWQtZm9yIChmaXJzdCBJUCkgb3IgeC1yZWFsLWlwLiBFbXB0eSB3aGVuIG5laXRoZXIgaGVhZGVyIGlzIHNldCAoZS5nLiBsb2NhbGhvc3QpLiAqL1xuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyB0ZXh0OiBzdHJpbmc7IGlzVmVyeVNsb3c6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHJhdyA9IGZvcm1hdER1cmF0aW9uKG1zKVxuICBjb25zdCB7IHNsb3csIHZlcnlTbG93IH0gPSBnZXRTbG93VGhyZXNob2xkcyhvcHRpb25zKVxuICBjb25zdCBpc1ZlcnlTbG93ID0gbXMgPj0gdmVyeVNsb3dcblxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB7IHRleHQ6IHJhdywgaXNWZXJ5U2xvdyB9XG4gIH1cblxuICBsZXQgY29sb3JlZCA9IHJhd1xuICBpZiAobXMgPCBzbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLmdyZWVuKHJhdylcbiAgfSBlbHNlIGlmIChtcyA8IHZlcnlTbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnllbGxvdyhyYXcpXG4gIH0gZWxzZSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnJlZC5ib2xkKHJhdylcbiAgfVxuXG4gIHJldHVybiB7IHRleHQ6IGNvbG9yZWQsIGlzVmVyeVNsb3cgfVxufVxuXG5jb25zdCBnZXRTcGVlZFRva2VuID0gKGlzVmVyeVNsb3c6IGJvb2xlYW4sIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghaXNWZXJ5U2xvdykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJhZGdlID0gJ+KaoSBzbG93J1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgICR7YmFkZ2V9YFxuICB9XG4gIHJldHVybiBgICR7Y2hhbGsueWVsbG93KGJhZGdlKX1gXG59XG5cbi8qKiBMb2dpeGx5c2lhIGJyYW5kOiBmb3ggZW1vamkgd2l0aCBsZXZlbC1jb2xvcmVkIGJhY2tncm91bmQgd2hlbiBjb2xvcnMgYXJlIGVuYWJsZWQuICovXG5jb25zdCBnZXRMZXZlbEljb24gPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiAn8J+miidcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjaygnIPCfpoogJylcbiAgfVxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjaygnIPCfpoogJylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzQ29kZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGV4dCA9IFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXVxuICByZXR1cm4gdGV4dCA/PyAnJ1xufVxuXG5jb25zdCBnZXRTZXJ2aWNlVG9rZW4gPSAob3B0aW9uczogT3B0aW9ucywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMuY29uZmlnPy5zZXJ2aWNlPy50cmltKClcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYnJhY2tldGVkID0gYFske25hbWV9XWBcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCR7YnJhY2tldGVkfSBgXG4gIH1cbiAgcmV0dXJuIGAke2NoYWxrLmRpbShicmFja2V0ZWQpfSBgXG59XG5cbmNvbnN0IHN0cmluZ2lmeVRyZWVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCdcbiAgfVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJ1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1lc3NhZ2VcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxufVxuXG4vKiogTmVzdGVkIG9iamVjdHMgdG8gZXhwYW5kIGluIHRoZSBjb250ZXh0IHRyZWUgKGV4Y2x1ZGVzIEFycmF5cywgRXJyb3IsIERhdGUpLiAqL1xuY29uc3QgaXNFeHBhbmRhYmxlT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcblxuY29uc3QgY29sbGVjdENvbnRleHRFbnRyaWVzID0gKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVwdGhSZW1haW5pbmc6IG51bWJlclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3Qgb3V0OiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2t9YCA6IGtcbiAgICBjb25zdCBleHBhbmRhYmxlID0gaXNFeHBhbmRhYmxlT2JqZWN0KHYpICYmIGRlcHRoUmVtYWluaW5nID4gMVxuXG4gICAgaWYgKGV4cGFuZGFibGUpIHtcbiAgICAgIG91dC5wdXNoKC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyh2LCBrZXksIGRlcHRoUmVtYWluaW5nIC0gMSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5wdXNoKFtrZXksIHN0cmluZ2lmeVRyZWVWYWx1ZSh2KV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzID0gKFxuICBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10sXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGxhc3QgPSBlbnRyaWVzLmxlbmd0aCAtIDFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnJhbmNoID0gaSA9PT0gbGFzdCA/ICfilJTilIAnIDogJ+KUnOKUgCdcbiAgICBjb25zdCBwYWlyID0gZW50cmllc1tpXVxuICAgIGlmICghcGFpcikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgW2ssIHZdID0gcGFpclxuICAgIGNvbnN0IGtleVBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay5jeWFuKGspIDoga1xuICAgIGNvbnN0IHZhbFBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay53aGl0ZSh2KSA6IHZcbiAgICBsaW5lcy5wdXNoKGAgICR7YnJhbmNofSAke2tleVBhcnR9ICAke3ZhbFBhcnR9YClcbiAgfVxuICByZXR1cm4gbGluZXNcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckNvbnRleHRUcmVlTGluZXMgPSAoXG4gIGN0eDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuICBpZiAoZGVwdGggPCAxKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCwgJycsIGRlcHRoKVxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuXG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG5cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmIChcbiAgICBjdHggJiZcbiAgICB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGN0eCkgJiZcbiAgICBPYmplY3Qua2V5cyhjdHggYXMgb2JqZWN0KS5sZW5ndGggPiAwICYmXG4gICAgZGVwdGggPj0gMVxuICApIHtcbiAgICBlbnRyaWVzLnB1c2goXG4gICAgICAuLi5jb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnJywgZGVwdGgpXG4gICAgKVxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InICYmICdlcnJvcicgaW4gZGF0YSAmJiBkYXRhLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtc2cgPSBwYXJzZUVycm9yKGRhdGEuZXJyb3IpXG4gICAgaWYgKG1zZykge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3InLCBtc2ddKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBsZXQgcmF3UGF0aG5hbWU6IHN0cmluZ1xuICBsZXQgc2VhcmNoOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJhd1BhdGhuYW1lID0gdXJsLnBhdGhuYW1lXG4gICAgc2VhcmNoID0gdXJsLnNlYXJjaFxuICB9IGNhdGNoIHtcbiAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgIHNlYXJjaCA9ICcnXG4gIH1cbiAgY29uc3QgcXVlcnkgPSBzZWFyY2hcbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3F1ZXJ5fWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcblxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBjb25zdCBjdHhTdHJpbmcgPVxuICAgIHNob3dUcmVlICYmXG4gICAgZGF0YS5jb250ZXh0ICYmXG4gICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHQpICYmXG4gICAgT2JqZWN0LmtleXMoZGF0YS5jb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuICAgICAgPyAnJ1xuICAgICAgOiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcblxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgbWV0aG9kUGFkZGVkID0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRClcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QobWV0aG9kUGFkZGVkLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgeyB0ZXh0OiBjb2xvcmVkRHVyYXRpb24sIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIG9wdGlvbnNcbiAgKVxuICBjb25zdCBzcGVlZFRva2VuID0gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpXG4gIGNvbnN0IGljb24gPSBnZXRMZXZlbEljb24obGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3Qgc3RhdHVzVGV4dCA9IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSlcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne25vd30nOiB0aW1lc3RhbXAsXG4gICAgJ3tlcG9jaH0nOiBlcG9jaCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne2ljb259JzogaWNvbixcbiAgICAne2R1cmF0aW9ufSc6IGNvbG9yZWREdXJhdGlvbixcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aH0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3txdWVyeX0nOiBxdWVyeSxcbiAgICAne3N0YXR1c30nOiBjb2xvcmVkU3RhdHVzLFxuICAgICd7c3RhdHVzVGV4dH0nOiBzdGF0dXNUZXh0LFxuICAgICd7bWVzc2FnZX0nOiBtZXNzYWdlLFxuICAgICd7aXB9JzogaXAsXG4gICAgJ3tjb250ZXh0fSc6IGN0eFN0cmluZyxcbiAgICAne3NlcnZpY2V9Jzogc2VydmljZVRva2VuLFxuICAgICd7c3BlZWR9Jzogc3BlZWRUb2tlblxuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbWFpbiwgY29udGV4dExpbmVzIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLihpbnB1dC5vcHRpb25zLmNvbmZpZyA/PyB7fSksXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQge1xuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcygnRVJST1InKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cbiAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gY29udGV4dFN0b3JlXG4gICAgPyBtZXJnZUxvZ0RhdGFDb250ZXh0KGRhdGEsIGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpKVxuICAgIDogZGF0YVxuICBjb25zdCBsb2dEYXRhID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICBjb25zdCBsb2dSZXF1ZXN0ID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0OiBsb2dSZXF1ZXN0LCBkYXRhOiBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gIGlmICghKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICBsZXZlbCxcbiAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgc3RvcmUsXG4gICAgb3B0aW9uc1xuICB9KVxuXG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIsIE9wdGlvbnMsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0TGlrZSB7XG4gIHJlYWRvbmx5IGRhdGE/OiB7IHN0b3JlPzogeyBsb2dnZXI/OiBMb2dnZXIgfSB9XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3NIYW5kbGVySG9va3M8XG4gIFRNZXNzYWdlID0gdW5rbm93bixcbiAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSA9IFdlYlNvY2tldExpa2Vcbj4ge1xuICBjbG9zZT86ICh3czogVFdzKSA9PiB2b2lkXG4gIG1lc3NhZ2U/OiAod3M6IFRXcywgbWVzc2FnZTogVE1lc3NhZ2UpID0+IHZvaWRcbiAgb3Blbj86ICh3czogVFdzKSA9PiB2b2lkXG59XG5cbmNvbnN0IHdzU3ludGhldGljUmVxdWVzdCA9IChwYXRoOiBzdHJpbmcpOiBSZXF1ZXN0ID0+XG4gIG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9naXhseXNpYS5sb2NhbCR7cGF0aH1gLCB7IG1ldGhvZDogJ1dTJyB9KVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKSA9PiB7XG4gIGNvbnN0IHdzVGltaW5ncyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYmlnaW50PigpXG5cbiAgY29uc3QgbG9nV3MgPSAoXG4gICAgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicsXG4gICAgd3M6IFdlYlNvY2tldExpa2UsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBleHRyYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleSA9IHdzIGFzIG9iamVjdFxuICAgIGNvbnN0IGJlZm9yZVRpbWUgPSB3c1RpbWluZ3MuZ2V0KGtleSkgPz8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lIH1cbiAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KGtleSlcbiAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgIE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwIHx8IGV4dHJhXG4gICAgICAgID8geyAuLi5hY2N1bXVsYXRlZCwgLi4uZXh0cmEsIHdzSWQ6IHdzLmlkIH1cbiAgICAgICAgOiB7IHdzSWQ6IHdzLmlkIH1cblxuICAgIGxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHdzU3ludGhldGljUmVxdWVzdChwYXRoKSxcbiAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgIHN0b3JlXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIDxcbiAgICBUTWVzc2FnZSxcbiAgICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlLFxuICAgIGNvbnN0IFRIb29rcyBleHRlbmRzIFdzSGFuZGxlckhvb2tzPFRNZXNzYWdlLCBUV3M+XG4gID4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGhvb2tzOiBUSG9va3NcbiAgKTogVEhvb2tzID0+XG4gICAgKHtcbiAgICAgIC4uLmhvb2tzLFxuICAgICAgb3Blbih3cykge1xuICAgICAgICB3c1RpbWluZ3Muc2V0KHdzIGFzIG9iamVjdCwgcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkpXG4gICAgICAgIGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgb3BlbmVkJylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2Uod3MsIG1lc3NhZ2UpIHtcbiAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiBtZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsb3NlKHdzKSB7XG4gICAgICAgIGhvb2tzLmNsb3NlPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IGNsb3NlZCcpXG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgfVxuICAgIH0pIGFzIFRIb29rc1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDSVQsSUFBTSxHQUFxRSxDQUN6RSxJQUFLLENBQ0gsbUJBQW9CLEdBQ3BCLHFCQUFzQixTQUN0QixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixFQUNBLEtBQU0sQ0FDSixtQkFBb0IsR0FDcEIsVUFBVyxHQUNYLGdCQUFpQixHQUNqQixXQUFZLEdBQ1osS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixDQUNGLEVBRU0sR0FBYyxDQUNsQixFQUNBLElBQ21DLENBQ25DLEdBQUksQ0FBQyxFQUNILE9BQU8sRUFHVCxJQUFNLEVBQXlDLElBQUssS0FBUyxDQUFTLEVBRXRFLEdBQUksRUFBSyxNQUFRLEVBQVMsS0FDeEIsRUFBTyxLQUFPLElBQ1QsRUFBSyxRQUNMLEVBQVMsUUFDUixFQUFLLE1BQU0sY0FBZ0IsUUFDL0IsRUFBUyxNQUFNLGNBQWdCLE9BQzNCLENBQ0UsWUFBYSxFQUFTLE1BQU0sYUFBZSxFQUFLLE1BQU0sV0FDeEQsRUFDQSxDQUFDLENBQ1AsRUFHRixHQUFJLEVBQUssV0FBYSxFQUFTLFVBQzdCLEVB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LFVBQVMsTUFBSyxXQUFZLENBQzFDLEdBQUksQ0FDRixHQUFJLEVBQWEsSUFBSSxDQUFPLEVBQzFCLE9BR0YsSUFBTSxFQUFTLE9BQU8sRUFBSSxTQUFXLFNBQVcsRUFBSSxPQUFTLElBQ3pELEVBQXNDLE9BQzFDLEdBQUksR0FBVSxJQUNaLEVBQVEsUUFDSCxRQUFJLEdBQVUsSUFDbkIsRUFBUSxVQUdWLElBQU0sRUFBYyxFQUFhLFdBQVcsQ0FBTyxFQUM3QyxFQUFnQyxDQUFFLFFBQU8sRUFDL0MsR0FBSSxPQUFPLEtBQUssQ0FBVyxFQUFFLE9BQVMsRUFDcEMsRUFBSyxRQUFVLElBQUssQ0FBWSxFQUdsQyxFQUFPLElBQUksRUFBTyxFQUFTLEVBQU0sQ0FBSyxTQUN0QyxDQUNBLEVBQWEsYUFBYSxDQUFPLEdBRXBDLEVBQ0EsUUFBUSxFQUFHLFVBQVMsUUFBTyxXQUFZLENBQ3RDLEdBQUksQ0FDRixFQUFPLGdCQUFnQixFQUFTLEVBQU8sQ0FBSyxTQUM1QyxDQUNBLEVBQWEsYUFBYSxDQUFPLEdBRXBDLEVBQ0EsR0FBRyxRQUFRLEVBRWQsT0FBTyxPQUFPLE9BQU8sRUFBUSxDQUFFLFFBQU8sQ0FBQyxHQW9CMUIiLAogICJkZWJ1Z0lkIjogIkFFMkU2Q0M2RTkzNDJFRDc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/dist/otel.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Logger as PinoLogger } from "pino";
|
|
2
|
+
type Pino = PinoLogger<never, boolean>;
|
|
3
|
+
type RequestInfo = Request;
|
|
4
|
+
type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
|
|
5
|
+
interface StoreData {
|
|
6
|
+
beforeTime: bigint;
|
|
7
|
+
}
|
|
8
|
+
interface Logger {
|
|
9
|
+
debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
10
|
+
error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
11
|
+
getContext: (key: RequestInfo | object) => Readonly<Record<string, unknown>>;
|
|
12
|
+
handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
|
|
13
|
+
info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
14
|
+
log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
|
|
15
|
+
mergeContext: (key: RequestInfo | object, partial: Record<string, unknown>) => void;
|
|
16
|
+
pino: Pino;
|
|
17
|
+
warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
18
|
+
}
|
|
19
|
+
interface TraceContextFields {
|
|
20
|
+
span_id?: string;
|
|
21
|
+
trace_id?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Injects active OpenTelemetry span IDs into the request context bag when
|
|
25
|
+
* `@opentelemetry/api` is installed and a span is active.
|
|
26
|
+
*/
|
|
27
|
+
declare const injectTraceContext: (logger: Pick<Logger, "mergeContext">, request: Request) => TraceContextFields | undefined;
|
|
28
|
+
export { injectTraceContext, injectTraceContext as default, TraceContextFields };
|
package/dist/otel.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{createRequire as K}from"node:module";var L=K(import.meta.url),k,M=()=>{if(k!==void 0)return k;try{k=L("@opentelemetry/api")}catch{k=null}return k},P=(F,G)=>{let z=M();if(!z)return;let B=z.trace.getSpan(z.context.active());if(!B)return;let{traceId:H,spanId:J}=B.spanContext(),E={trace_id:H,span_id:J};return F.mergeContext(G,E),E};export{P as injectTraceContext,P as default};
|
|
2
|
+
|
|
3
|
+
//# debugId=7D793B81D059B46E64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+IHsgdHJhY2VJZDogc3RyaW5nOyBzcGFuSWQ6IHN0cmluZyB9IH0gfCB1bmRlZmluZWRcbiAgfVxufVxuXG5sZXQgb3RlbEFwaTogT3RlbEFwaSB8IG51bGwgfCB1bmRlZmluZWRcblxuY29uc3QgZ2V0T3RlbEFwaSA9ICgpOiBPdGVsQXBpIHwgbnVsbCA9PiB7XG4gIGlmIChvdGVsQXBpICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb3RlbEFwaVxuICB9XG4gIHRyeSB7XG4gICAgb3RlbEFwaSA9IHJlcXVpcmVPdGVsKCdAb3BlbnRlbGVtZXRyeS9hcGknKSBhcyBPdGVsQXBpXG4gIH0gY2F0Y2gge1xuICAgIG90ZWxBcGkgPSBudWxsXG4gIH1cbiAgcmV0dXJuIG90ZWxBcGlcbn1cblxuLyoqXG4gKiBJbmplY3RzIGFjdGl2ZSBPcGVuVGVsZW1ldHJ5IHNwYW4gSURzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgd2hlblxuICogYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgaW5zdGFsbGVkIGFuZCBhIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0VHJhY2VDb250ZXh0ID0gKFxuICBsb2dnZXI6IFBpY2s8TG9nZ2VyLCAnbWVyZ2VDb250ZXh0Jz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFRyYWNlQ29udGV4dEZpZWxkcyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGFwaSA9IGdldE90ZWxBcGkoKVxuICBpZiAoIWFwaSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3BhbiA9IGFwaS50cmFjZS5nZXRTcGFuKGFwaS5jb250ZXh0LmFjdGl2ZSgpKVxuICBpZiAoIXNwYW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgdHJhY2VJZCwgc3BhbklkIH0gPSBzcGFuLnNwYW5Db250ZXh0KClcbiAgY29uc3QgZmllbGRzID0ge1xuICAgIHRyYWNlX2lkOiB0cmFjZUlkLFxuICAgIHNwYW5faWQ6IHNwYW5JZFxuICB9IHNhdGlzZmllcyBUcmFjZUNvbnRleHRGaWVsZHNcbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBmaWVsZHMpXG4gIHJldHVybiBmaWVsZHNcbn1cblxuZXhwb3J0IHsgaW5qZWN0VHJhY2VDb250ZXh0IGFzIGRlZmF1bHQgfVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsd0JBQVMsb0JBR1QsSUFBTSxFQUFjLEVBQWMsWUFBWSxHQUFHLEVBZ0I3QyxFQUVFLEVBQWEsSUFBc0IsQ0FDdkMsR0FBSSxJQUFZLE9BQ2QsT0FBTyxFQUVULEdBQUksQ0FDRixFQUFVLEVBQVksb0JBQW9CLEVBQzFDLEtBQU0sQ0FDTixFQUFVLEtBRVosT0FBTyxHQU9JLEVBQXFCLENBQ2hDLEVBQ0EsSUFDbUMsQ0FDbkMsSUFBTSxFQUFNLEVBQVcsRUFDdkIsR0FBSSxDQUFDLEVBQ0gsT0FHRixJQUFNLEVBQU8sRUFBSSxNQUFNLFFBQVEsRUFBSSxRQUFRLE9BQU8sQ0FBQyxFQUNuRCxHQUFJLENBQUMsRUFDSCxPQUdGLElBQVEsVUFBUyxVQUFXLEVBQUssWUFBWSxFQUN2QyxFQUFTLENBQ2IsU0FBVSxFQUNWLFFBQVMsQ0FDWCxFQUVBLE9BREEsRUFBTyxhQUFhLEVBQVMsQ0FBTSxFQUM1QiIsCiAgImRlYnVnSWQiOiAiN0Q3OTNCODFEMDU5QjQ2RTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/package.json
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logixlysia",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.5.0",
|
|
4
4
|
"description": "🦊 Logixlysia is a logger for Elysia",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./otel": {
|
|
14
|
+
"types": "./dist/otel.d.ts",
|
|
15
|
+
"import": "./dist/otel.js",
|
|
16
|
+
"default": "./dist/otel.js"
|
|
17
|
+
},
|
|
18
|
+
"./ai": {
|
|
19
|
+
"types": "./dist/ai.d.ts",
|
|
20
|
+
"import": "./dist/ai.js",
|
|
21
|
+
"default": "./dist/ai.js"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
7
25
|
"files": [
|
|
8
26
|
"dist",
|
|
9
27
|
"README.md"
|
|
@@ -41,12 +59,23 @@
|
|
|
41
59
|
"pino-pretty": "^13.1.3"
|
|
42
60
|
},
|
|
43
61
|
"devDependencies": {
|
|
44
|
-
"@
|
|
62
|
+
"@elysiajs/node": "^1.4.5",
|
|
63
|
+
"@types/bun": "^1.3.14",
|
|
45
64
|
"bunup": "^0.16.31",
|
|
46
65
|
"elysia": "^1.4.28"
|
|
47
66
|
},
|
|
48
67
|
"peerDependencies": {
|
|
68
|
+
"@opentelemetry/api": "^1.9.0",
|
|
69
|
+
"ai": "^6.0.0",
|
|
49
70
|
"elysia": "^1.4.28",
|
|
50
71
|
"typescript": "^6.0.2"
|
|
72
|
+
},
|
|
73
|
+
"peerDependenciesMeta": {
|
|
74
|
+
"@opentelemetry/api": {
|
|
75
|
+
"optional": true
|
|
76
|
+
},
|
|
77
|
+
"ai": {
|
|
78
|
+
"optional": true
|
|
79
|
+
}
|
|
51
80
|
}
|
|
52
81
|
}
|