logixlysia 6.0.0 → 6.1.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/README.md ADDED
@@ -0,0 +1,49 @@
1
+ <div align="center">
2
+ <h1><code>🦊</code> Logixlysia</h1>
3
+ <strong>Logixlysia is a logging library for ElysiaJS</strong>
4
+ <img src="../../apps/docs/app/opengraph-image.png" alt="Logixlysia" width="100%" height="auto" />
5
+ </div>
6
+
7
+ ## `📩` Installation
8
+
9
+ ```bash
10
+ bun add logixlysia
11
+ ```
12
+
13
+ ## `📝` Usage
14
+
15
+ ```ts
16
+ import { Elysia } from 'elysia'
17
+ import logixlysia from 'logixlysia' // or import { logixlysia } from 'logixlysia'
18
+
19
+ const app = new Elysia({
20
+ name: "Elysia with Logixlysia"
21
+ })
22
+ .use(
23
+ logixlysia({
24
+ config: {
25
+ showStartupMessage: true,
26
+ startupMessageFormat: 'simple',
27
+ timestamp: {
28
+ translateTime: 'yyyy-mm-dd HH:MM:ss.SSS'
29
+ },
30
+ logFilePath: './logs/example.log',
31
+ ip: true,
32
+ customLogFormat:
33
+ '🦊 {now} {level} {duration} {method} {pathname} {status} {message} {ip}'
34
+ }
35
+ }))
36
+ .get('/', () => {
37
+ return { message: 'Welcome to Basic Elysia with Logixlysia' }
38
+ })
39
+
40
+ app.listen(3000)
41
+ ```
42
+
43
+ ## `📚` Documentation
44
+
45
+ Check out the [website](https://logixlysia.vercel.app) for more detailed documentation and examples.
46
+
47
+ ## `📄` License
48
+
49
+ Licensed under the [MIT License](LICENSE).
package/dist/index.d.ts CHANGED
@@ -1,20 +1,21 @@
1
1
  import { Elysia, SingletonBase } from "elysia";
2
2
  import { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from "pino";
3
3
  type Pino = PinoLogger<never, boolean>;
4
+ type RequestInfo = Request;
4
5
  type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
5
- type StoreData = {
6
+ interface StoreData {
6
7
  beforeTime: bigint;
7
- };
8
- type LogixlysiaStore = {
8
+ }
9
+ interface LogixlysiaStore {
9
10
  logger: Logger;
10
11
  pino: Pino;
11
12
  beforeTime?: bigint;
12
13
  [key: string]: unknown;
13
- };
14
- type Transport = {
14
+ }
15
+ interface Transport {
15
16
  log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
16
- };
17
- type LogRotationConfig = {
17
+ }
18
+ interface LogRotationConfig {
18
19
  /**
19
20
  * Max log file size before rotation, e.g. '10m', '5k', or a byte count.
20
21
  */
@@ -29,8 +30,15 @@ type LogRotationConfig = {
29
30
  interval?: string;
30
31
  compress?: boolean;
31
32
  compression?: "gzip";
32
- };
33
- type Options = {
33
+ }
34
+ interface LogFilter {
35
+ /**
36
+ * Array of log levels to allow. If specified, only logs with these levels will be processed.
37
+ * If not specified, all log levels will be allowed.
38
+ */
39
+ level?: LogLevel[];
40
+ }
41
+ interface Options {
34
42
  config?: {
35
43
  showStartupMessage?: boolean;
36
44
  startupMessageFormat?: "simple" | "banner";
@@ -40,6 +48,7 @@ type Options = {
40
48
  translateTime?: string;
41
49
  };
42
50
  customLogFormat?: string;
51
+ logFilter?: LogFilter;
43
52
  transports?: Transport[];
44
53
  useTransportsOnly?: boolean;
45
54
  disableInternalLogger?: boolean;
@@ -50,8 +59,8 @@ type Options = {
50
59
  prettyPrint?: boolean;
51
60
  }) | undefined;
52
61
  };
53
- };
54
- type Logger = {
62
+ }
63
+ interface Logger {
55
64
  pino: Pino;
56
65
  log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
57
66
  handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
@@ -59,11 +68,11 @@ type Logger = {
59
68
  info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
60
69
  warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
61
70
  error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
62
- };
63
- type LogixlysiaContext = {
71
+ }
72
+ interface LogixlysiaContext {
64
73
  request: Request;
65
74
  store: LogixlysiaStore;
66
- };
75
+ }
67
76
  type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
68
77
  store: LogixlysiaStore;
69
78
  }>;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import{Elysia as Hn}from"elysia";import v from"elysia/package.json";var u=(n,o)=>{if(n.length>=o)return n.slice(0,o);let r=Math.floor((o-n.length)/2),b=o-n.length-r;return`${" ".repeat(r)}${n}${" ".repeat(b)}`},B=(n)=>{let o=`Elysia v${v.version}`,b=Math.max(n.length,o.length)+4,c=`┌${"─".repeat(b)}┐`,i=`└${"─".repeat(b)}┘`,f=`│${" ".repeat(b)}│`,m=`│${u(o,b)}│`,L=`│ ${n}${" ".repeat(Math.max(0,b-n.length-4))} │`;return[c,f,m,f,L,f,i].join(`
2
- `)};var V=(n,o)=>{if(!(o.config?.showStartupMessage??!0))return;let{port:b,hostname:c,protocol:i}=n;if(b===void 0||!c||!i)return;let m=`\uD83E\uDD8A Elysia is running at ${`${i}://${c}:${b}`}`;if((o.config?.startupMessageFormat??"banner")==="simple"){console.log(m);return}console.log(B(m))};import p from"pino";var j=(...n)=>{let o=typeof n[0]==="string"?{level:n[0],request:n[1],data:n[2],store:n[3],options:n[4]}:n[0],{level:r,request:b,data:c,store:i,options:f}=o,m=f.config?.transports??[];if(m.length===0)return;let L=typeof c.message==="string"?c.message:"",O={request:{method:b.method,url:b.url},...c,beforeTime:i.beforeTime};for(let $ of m)try{let R=$.log(r,L,O);if(R&&typeof R.catch==="function")R.catch(()=>{})}catch{}};import{appendFile as In}from"node:fs/promises";import{dirname as On}from"node:path";import{promises as d}from"node:fs";var Y=async(n)=>{await d.mkdir(n,{recursive:!0})};import{promises as T}from"node:fs";import{promisify as cn}from"node:util";import{gzip as bn}from"node:zlib";import{promises as Z}from"node:fs";import{basename as l,dirname as a}from"node:path";var e=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,nn=/^(\d+)(h|d|w)$/i,on=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,_=(n)=>{if(typeof n==="number")return n;let o=n.trim(),r=Number(o);if(Number.isFinite(r))return r;let b=o.match(e);if(!b)throw Error(`Invalid size format: ${n}`);let c=Number(b[1]),i=b[2].toLowerCase(),f=1024;if(i.startsWith("m"))f=1048576;else if(i.startsWith("g"))f=1073741824;return Math.floor(c*f)},rn=(n)=>{let o=n.trim().match(nn);if(!o)throw Error(`Invalid interval format: ${n}`);let r=Number(o[1]),b=o[2].toLowerCase(),c=3600000;if(b==="d")c=86400000;else if(b==="w")c=604800000;return r*c},H=(n)=>{if(typeof n==="number")return{type:"count",value:n};return{type:"time",value:rn(n)}},A=async(n,o)=>{try{return(await Z.stat(n)).size>o}catch{return!1}},U=async(n)=>{let o=a(n),r=l(n),b;try{b=await Z.readdir(o)}catch{return[]}return b.filter((c)=>c.startsWith(`${r}.`)&&on.test(c)).map((c)=>`${o}/${c}`)};var fn=cn(bn),D=(n)=>String(n).padStart(2,"0"),mn=(n,o)=>{let r=o.getFullYear(),b=D(o.getMonth()+1),c=D(o.getDate()),i=D(o.getHours()),f=D(o.getMinutes()),m=D(o.getSeconds());return`${n}.${r}-${b}-${c}-${i}-${f}-${m}`},Rn=async(n)=>{try{if((await T.stat(n)).size===0)return""}catch{return""}let o=mn(n,new Date);return await T.rename(n,o),o},$n=async(n)=>{let o=await T.readFile(n),r=await fn(o);await T.writeFile(`${n}.gz`,r),await T.rm(n,{force:!0})},S=async(n,o)=>{if(o.maxSize===void 0)return!1;let r=_(o.maxSize);return await A(n,r)},Ln=async(n,o)=>{let r=await U(n);if(r.length<=o)return;let b=await Promise.all(r.map(async(i)=>({path:i,stat:await T.stat(i)})));b.sort((i,f)=>f.stat.mtimeMs-i.stat.mtimeMs);let c=b.slice(o);await Promise.all(c.map(({path:i})=>T.rm(i,{force:!0})))},wn=async(n,o)=>{let r=await U(n);if(r.length===0)return;let b=Date.now(),i=(await Promise.all(r.map(async(f)=>({path:f,stat:await T.stat(f)})))).filter(({stat:f})=>b-f.mtimeMs>o);await Promise.all(i.map(({path:f})=>T.rm(f,{force:!0})))},k=async(n,o)=>{let r=await Rn(n);if(!r)return;if(o.compress===!0){if((o.compression??"gzip")==="gzip")await $n(r)}if(o.maxFiles!==void 0){let c=H(o.maxFiles);if(c.type==="count")await Ln(n,c.value);else await wn(n,c.value)}};var N=async(...n)=>{let o=typeof n[0]==="string"?(()=>{let[G,F,K,W,J,Q]=n;return{filePath:G,level:F,request:K,data:W,store:J,options:Q}})():n[0],{filePath:r,level:b,request:c,data:i,store:f,options:m}=o,L=m.config,O=L?.useTransportsOnly===!0,$=L?.disableFileLogging===!0;if(O||$)return;let R=typeof i.message==="string"?i.message:"",w=f.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-f.beforeTime)/1e6,g=`${b} ${w.toFixed(2)}ms ${c.method} ${new URL(c.url).pathname} ${R}
3
- `;await Y(On(r)),await In(r,g,{encoding:"utf-8"});let y=L?.logRotation;if(!y)return;if(await S(r,y))await k(r,y)};import I from"chalk";import{StatusMap as yn}from"elysia";var Tn=/^\d+$/,gn=/[_-]+/g,Fn=/([a-z0-9])([A-Z])/g,En=/([A-Z])([A-Z][a-z])/g,Kn=/['’]/g,Gn=/[^a-z0-9\s]+/g,Dn=/\s+/g,M=(n)=>{let o=n.trim();if(!o)return"";return o.replace(gn," ").replace(Fn,"$1 $2").replace(En,"$1 $2").replace(Kn,"").toLowerCase().replace(Gn," ").replace(Dn," ").trim()},Xn=(()=>{let n=new Map;for(let[o,r]of Object.entries(yn))n.set(M(o),r);return n})(),s=(n)=>{if(typeof n==="number"&&Number.isFinite(n))return n;if(typeof n==="string"){let o=n.trim();if(Tn.test(o))return Number(o);return Xn.get(M(o))??500}return 500};var X=(n)=>String(n).padStart(2,"0"),jn=(n)=>String(n).padStart(3,"0"),Nn=(n)=>{let r=n.config?.useColors??!0,b=typeof process<"u"&&process.stdout?.isTTY===!0;return r&&b},Wn=(n,o)=>{if(!o)return n.toISOString();let r=String(n.getFullYear()),b=X(n.getMonth()+1),c=X(n.getDate()),i=X(n.getHours()),f=X(n.getMinutes()),m=X(n.getSeconds()),L=jn(n.getMilliseconds());return o.replaceAll("yyyy",r).replaceAll("mm",b).replaceAll("dd",c).replaceAll("HH",i).replaceAll("MM",f).replaceAll("ss",m).replaceAll("SSS",L)},Jn=(n)=>{let o=n.headers.get("x-forwarded-for");if(o)return o.split(",")[0]?.trim()??"";return n.headers.get("x-real-ip")??""},Qn=(n,o)=>{if(!o)return n;if(n==="ERROR")return I.bgRed.black(n);if(n==="WARNING")return I.bgYellow.black(n);if(n==="DEBUG")return I.bgBlue.black(n);return I.bgGreen.black(n)},Zn=(n,o)=>{if(!o)return n;let r=n.toUpperCase();if(r==="GET")return I.green.bold(r);if(r==="POST")return I.blue.bold(r);if(r==="PUT")return I.yellow.bold(r);if(r==="PATCH")return I.yellowBright.bold(r);if(r==="DELETE")return I.red.bold(r);if(r==="OPTIONS")return I.cyan.bold(r);if(r==="HEAD")return I.greenBright.bold(r);if(r==="TRACE")return I.magenta.bold(r);if(r==="CONNECT")return I.cyanBright.bold(r);return I.white.bold(r)},Un=(n,o)=>{if(!o)return n;let r=Number.parseInt(n,10);if(!Number.isFinite(r))return n;if(r>=500)return I.red(n);if(r>=400)return I.yellow(n);if(r>=300)return I.cyan(n);if(r>=200)return I.green(n);return I.gray(n)},zn=(n,o)=>{if(!o)return n;return I.gray(n)},Bn=(n,o)=>{if(!o)return n;return I.bgHex("#FFA500").black(n)},Vn=(n,o)=>{if(!o)return n;return I.whiteBright(n)},Yn=(n)=>{if(typeof n==="object"&&n!==null)return JSON.stringify(n);return""},P=({level:n,request:o,data:r,store:b,options:c})=>{let i=c.config,f=Nn(c),m=i?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",L=new Date,O=String(L.getTime()),$=Wn(L,i?.timestamp?.translateTime),R=Bn($,f),w=typeof r.message==="string"?r.message:"",g=b.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-b.beforeTime)/1e6,y=new URL(o.url).pathname,E=r.status,G=E===null||E===void 0?200:s(E),F=String(G),K=i?.ip===!0?Jn(o):"",W=Yn(r.context),J=Qn(n,f),Q=Zn(o.method,f),z=Vn(y,f),C=Un(F,f),h=zn(`${g.toFixed(2)}ms`,f);return m.replaceAll("{now}",R).replaceAll("{epoch}",O).replaceAll("{level}",J).replaceAll("{duration}",h).replaceAll("{method}",Q).replaceAll("{pathname}",z).replaceAll("{path}",z).replaceAll("{status}",C).replaceAll("{message}",w).replaceAll("{ip}",K).replaceAll("{context}",W)};var x=(n)=>{let o="An error occurred";if(n instanceof Error)o=n.message;else if(n&&typeof n==="object"&&"message"in n)o=n.message;else o=String(n);return console.error(`Parsing error: ${o}`),o};var _n=(n)=>typeof n==="object"&&n!==null&&("status"in n)&&typeof n.status==="number",t=(n,o,r,b)=>{let c=b.config,i=c?.useTransportsOnly===!0,f=c?.disableInternalLogger===!0,m=c?.disableFileLogging===!0,L=_n(o)?o.status:500,O=x(o),$="ERROR",R={status:L,message:O,error:o};if(j({level:"ERROR",request:n,data:R,store:r,options:b}),!(i||m)){let w=c?.logFilePath;if(w)N({filePath:w,level:"ERROR",request:n,data:R,store:r,options:b}).catch(()=>{})}if(i||f)return;console.error(`ERROR ${n.method} ${new URL(n.url).pathname} ${O}`)};var q=(n={})=>{let o=n.config,r=o?.pino,{prettyPrint:b,...c}=r??{},f=b===!0&&c.transport===void 0?p.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:o?.timestamp?.translateTime,messageKey:c.messageKey,errorKey:c.errorKey}}):c.transport,m=p({...c,level:c.level??"info",messageKey:c.messageKey,errorKey:c.errorKey,transport:f}),L=($,R,w,g)=>{j({level:$,request:R,data:w,store:g,options:n});let y=o?.useTransportsOnly===!0,E=o?.disableInternalLogger===!0,G=o?.disableFileLogging===!0;if(!(y||G)){let K=o?.logFilePath;if(K)N({filePath:K,level:$,request:R,data:w,store:g,options:n}).catch(()=>{})}if(y||E)return;let F=P({level:$,request:R,data:w,store:g,options:n});switch($){case"DEBUG":{console.debug(F);break}case"INFO":{console.info(F);break}case"WARNING":{console.warn(F);break}case"ERROR":{console.error(F);break}default:{console.log(F);break}}},O=($,R,w,g)=>{let y={beforeTime:process.hrtime.bigint()};L($,R,{message:w,context:g},y)};return{pino:m,log:L,handleHttpError:($,R,w)=>{t($,R,w,n)},debug:($,R,w)=>{O("DEBUG",$,R,w)},info:($,R,w)=>{O("INFO",$,R,w)},warn:($,R,w)=>{O("WARNING",$,R,w)},error:($,R,w)=>{O("ERROR",$,R,w)}}};var An=(n={})=>{let o=new WeakSet,r=q(n),b={...r,debug:(i,f,m)=>{o.add(i),r.debug(i,f,m)},info:(i,f,m)=>{o.add(i),r.info(i,f,m)},warn:(i,f,m)=>{o.add(i),r.warn(i,f,m)},error:(i,f,m)=>{o.add(i),r.error(i,f,m)}};return new Hn({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",b).state("pino",b.pino).state("beforeTime",BigInt(0)).onStart(({server:i})=>{if(i)V(i,n)}).onRequest(({store:i})=>{i.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:i,set:f,store:m})=>{if(o.has(i))return;let L=typeof f.status==="number"?f.status:200,O="INFO";if(L>=500)O="ERROR";else if(L>=400)O="WARNING";b.log(O,i,{status:L},m)}).onError(({request:i,error:f,store:m})=>{b.handleHttpError(i,f,m)}).as("scoped")},jo=An;export{An as logixlysia,jo as default};
1
+ import{Elysia as m0}from"elysia";import o from"elysia/package.json";var s=(n,b)=>{if(n.length>=b)return n.slice(0,b);let $=Math.floor((b-n.length)/2),R=b-n.length-$;return`${" ".repeat($)}${n}${" ".repeat(R)}`},M=(n)=>{let b=`Elysia v${o.version}`,R=Math.max(n.length,b.length)+4,I=`┌${"─".repeat(R)}┐`,w=`└${"─".repeat(R)}┘`,E=`│${" ".repeat(R)}│`,X=`│${s(b,R)}│`,J=`│ ${n}${" ".repeat(Math.max(0,R-n.length-4))} │`;return[I,E,X,E,J,E,w].join(`
2
+ `)};var S=(n,b)=>{if(!(b.config?.showStartupMessage??!0))return;let{port:R,hostname:I,protocol:w}=n;if(R===void 0||!I||!w)return;let X=`\uD83E\uDD8A Elysia is running at ${`${w}://${I}:${R}`}`;if((b.config?.startupMessageFormat??"banner")==="simple"){console.log(X);return}console.log(M(X))};import g from"pino";var Y=(...n)=>{let b=typeof n[0]==="string"?{level:n[0],request:n[1],data:n[2],store:n[3],options:n[4]}:n[0],{level:$,request:R,data:I,store:w,options:E}=b,X=E.config?.transports??[];if(X.length===0)return;let J=typeof I.message==="string"?I.message:"",K={request:{method:R.method,url:R.url},...I,beforeTime:w.beforeTime};for(let L of X)try{let f=L.log($,J,K);if(f&&typeof f.catch==="function")f.catch(()=>{})}catch{}};import{appendFile as D0}from"node:fs/promises";import{dirname as J0}from"node:path";import{promises as l}from"node:fs";var m=async(n)=>{await l.mkdir(n,{recursive:!0})};import{promises as Z}from"node:fs";import{promisify as w0}from"node:util";import{gzip as R0}from"node:zlib";import{promises as W}from"node:fs";import{basename as t,dirname as a}from"node:path";var e=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,n0=/^(\d+)(h|d|w)$/i,b0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,k=(n)=>{if(typeof n==="number")return n;let b=n.trim(),$=Number(b);if(Number.isFinite($))return $;let R=b.match(e);if(!R)throw Error(`Invalid size format: ${n}`);let I=Number(R[1]),w=R[2].toLowerCase(),E=1024;if(w.startsWith("m"))E=1048576;else if(w.startsWith("g"))E=1073741824;return Math.floor(I*E)},$0=(n)=>{let b=n.trim().match(n0);if(!b)throw Error(`Invalid interval format: ${n}`);let $=Number(b[1]),R=b[2].toLowerCase(),I=3600000;if(R==="d")I=86400000;else if(R==="w")I=604800000;return $*I},P=(n)=>{if(typeof n==="number")return{type:"count",value:n};return{type:"time",value:$0(n)}},x=async(n,b)=>{try{return(await W.stat(n)).size>b}catch{return!1}},A=async(n)=>{let b=a(n),$=t(n),R;try{R=await W.readdir(b)}catch{return[]}return R.filter((I)=>I.startsWith(`${$}.`)&&b0.test(I)).map((I)=>`${b}/${I}`)};var I0=w0(R0),O=(n)=>String(n).padStart(2,"0"),E0=(n,b)=>{let $=b.getFullYear(),R=O(b.getMonth()+1),I=O(b.getDate()),w=O(b.getHours()),E=O(b.getMinutes()),X=O(b.getSeconds());return`${n}.${$}-${R}-${I}-${w}-${E}-${X}`},X0=async(n)=>{try{if((await Z.stat(n)).size===0)return""}catch{return""}let b=E0(n,new Date);return await Z.rename(n,b),b},f0=async(n)=>{let b=await Z.readFile(n),$=await I0(b);await Z.writeFile(`${n}.gz`,$),await Z.rm(n,{force:!0})},C=async(n,b)=>{if(b.maxSize===void 0)return!1;let $=k(b.maxSize);return await x(n,$)},G0=async(n,b)=>{let $=await A(n);if($.length<=b)return;let R=await Promise.all($.map(async(w)=>({path:w,stat:await Z.stat(w)})));R.sort((w,E)=>E.stat.mtimeMs-w.stat.mtimeMs);let I=R.slice(b);await Promise.all(I.map(({path:w})=>Z.rm(w,{force:!0})))},j0=async(n,b)=>{let $=await A(n);if($.length===0)return;let R=Date.now(),w=(await Promise.all($.map(async(E)=>({path:E,stat:await Z.stat(E)})))).filter(({stat:E})=>R-E.mtimeMs>b);await Promise.all(w.map(({path:E})=>Z.rm(E,{force:!0})))},q=async(n,b)=>{let $=await X0(n);if(!$)return;if(b.compress===!0){if((b.compression??"gzip")==="gzip")await f0($)}if(b.maxFiles!==void 0){let I=P(b.maxFiles);if(I.type==="count")await G0(n,I.value);else await j0(n,I.value)}};var _=async(...n)=>{let b=typeof n[0]==="string"?(()=>{let[z,B,T,V,N,c]=n;return{filePath:z,level:B,request:T,data:V,store:N,options:c}})():n[0],{filePath:$,level:R,request:I,data:w,store:E,options:X}=b,J=X.config,K=J?.useTransportsOnly===!0,L=J?.disableFileLogging===!0;if(K||L)return;let f=typeof w.message==="string"?w.message:"",G=E.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-E.beforeTime)/1e6,j=`${R} ${G.toFixed(2)}ms ${I.method} ${new URL(I.url).pathname} ${f}
3
+ `;await m(J0($)),await D0($,j,{encoding:"utf-8"});let Q=J?.logRotation;if(!Q)return;if(await C($,Q))await q($,Q)};import D from"chalk";import{StatusMap as K0}from"elysia";var L0=/^\d+$/,Q0=/[_-]+/g,Z0=/([a-z0-9])([A-Z])/g,F0=/([A-Z])([A-Z][a-z])/g,T0=/['’]/g,V0=/[^a-z0-9\s]+/g,z0=/\s+/g,i=(n)=>{let b=n.trim();if(!b)return"";return b.replace(Q0," ").replace(Z0,"$1 $2").replace(F0,"$1 $2").replace(T0,"").toLowerCase().replace(V0," ").replace(z0," ").trim()},B0=(()=>{let n=new Map;for(let[b,$]of Object.entries(K0))n.set(i(b),$);return n})(),v=(n)=>{if(typeof n==="number"&&Number.isFinite(n))return n;if(typeof n==="string"){let b=n.trim();if(L0.test(b))return Number(b);return B0.get(i(b))??500}return 500};var U=(n)=>String(n).padStart(2,"0"),O0=(n)=>String(n).padStart(3,"0"),U0=(n)=>{let $=n.config?.useColors??!0,R=typeof process<"u"&&process.stdout?.isTTY===!0;return $&&R},Y0=(n,b)=>{if(!b)return n.toISOString();let $=String(n.getFullYear()),R=U(n.getMonth()+1),I=U(n.getDate()),w=U(n.getHours()),E=U(n.getMinutes()),X=U(n.getSeconds()),J=O0(n.getMilliseconds());return b.replaceAll("yyyy",$).replaceAll("mm",R).replaceAll("dd",I).replaceAll("HH",w).replaceAll("MM",E).replaceAll("ss",X).replaceAll("SSS",J)},_0=(n)=>{let b=n.headers.get("x-forwarded-for");if(b)return b.split(",")[0]?.trim()??"";return n.headers.get("x-real-ip")??""},y0=(n,b)=>{if(!b)return n;if(n==="ERROR")return D.bgRed.black(n);if(n==="WARNING")return D.bgYellow.black(n);if(n==="DEBUG")return D.bgBlue.black(n);return D.bgGreen.black(n)},N0=(n,b)=>{if(!b)return n;let $=n.toUpperCase();if($==="GET")return D.green.bold($);if($==="POST")return D.blue.bold($);if($==="PUT")return D.yellow.bold($);if($==="PATCH")return D.yellowBright.bold($);if($==="DELETE")return D.red.bold($);if($==="OPTIONS")return D.cyan.bold($);if($==="HEAD")return D.greenBright.bold($);if($==="TRACE")return D.magenta.bold($);if($==="CONNECT")return D.cyanBright.bold($);return D.white.bold($)},c0=(n,b)=>{if(!b)return n;let $=Number.parseInt(n,10);if(!Number.isFinite($))return n;if($>=500)return D.red(n);if($>=400)return D.yellow(n);if($>=300)return D.cyan(n);if($>=200)return D.green(n);return D.gray(n)},W0=(n,b)=>{if(!b)return n;return D.gray(n)},A0=(n,b)=>{if(!b)return n;return D.bgHex("#FFA500").black(n)},H0=(n,b)=>{if(!b)return n;return D.whiteBright(n)},M0=(n)=>{if(typeof n==="object"&&n!==null)return JSON.stringify(n);return""},y=({level:n,request:b,data:$,store:R,options:I})=>{let w=I.config,E=U0(I),X=w?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",J=new Date,K=String(J.getTime()),L=Y0(J,w?.timestamp?.translateTime),f=A0(L,E),G=typeof $.message==="string"?$.message:"",j=R.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-R.beforeTime)/1e6,Q=new URL(b.url).pathname,F=$.status,z=F===null||F===void 0?200:v(F),B=String(z),T=w?.ip===!0?_0(b):"",V=M0($.context),N=y0(n,E),c=N0(b.method,E),H=H0(Q,E),u=c0(B,E),d=W0(`${j.toFixed(2)}ms`,E);return X.replaceAll("{now}",f).replaceAll("{epoch}",K).replaceAll("{level}",N).replaceAll("{duration}",d).replaceAll("{method}",c).replaceAll("{pathname}",H).replaceAll("{path}",H).replaceAll("{status}",u).replaceAll("{message}",G).replaceAll("{ip}",T).replaceAll("{context}",V)};var h=(n)=>{let b="An error occurred";if(n instanceof Error)b=n.message;else if(n&&typeof n==="object"&&"message"in n)b=n.message;else b=String(n);return b};var S0=(n)=>typeof n==="object"&&n!==null&&("status"in n)&&typeof n.status==="number",r=(n,b,$,R)=>{let I=R.config,w=I?.useTransportsOnly===!0,E=I?.disableInternalLogger===!0,X=I?.disableFileLogging===!0,J=S0(b)?b.status:500,K=h(b),L="ERROR",f={status:J,message:K,error:b};if(Y({level:"ERROR",request:n,data:f,store:$,options:R}),!(w||X)){let j=I?.logFilePath;if(j)_({filePath:j,level:"ERROR",request:n,data:f,store:$,options:R}).catch(()=>{})}if(w||E)return;let G=y({level:"ERROR",request:n,data:f,store:$,options:R});console.error(G)};var p=(n={})=>{let b=n.config,$=b?.pino,{prettyPrint:R,...I}=$??{},E=R===!0&&I.transport===void 0?g.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:b?.timestamp?.translateTime,messageKey:I.messageKey,errorKey:I.errorKey}}):I.transport,X=g({...I,level:I.level??"info",messageKey:I.messageKey,errorKey:I.errorKey,transport:E}),J=(f,G)=>{if(!G?.level||G.level.length===0)return!0;return G.level.includes(f)},K=(f,G,j,Q)=>{if(!J(f,b?.logFilter))return;Y({level:f,request:G,data:j,store:Q,options:n});let F=b?.useTransportsOnly===!0,z=b?.disableInternalLogger===!0,B=b?.disableFileLogging===!0;if(!(F||B)){let V=b?.logFilePath;if(V)_({filePath:V,level:f,request:G,data:j,store:Q,options:n}).catch(()=>{})}if(F||z)return;let T=y({level:f,request:G,data:j,store:Q,options:n});switch(f){case"DEBUG":{console.debug(T);break}case"INFO":{console.info(T);break}case"WARNING":{console.warn(T);break}case"ERROR":{console.error(T);break}default:{console.log(T);break}}},L=(f,G,j,Q)=>{let F={beforeTime:process.hrtime.bigint()};K(f,G,{message:j,context:Q},F)};return{pino:X,log:K,handleHttpError:(f,G,j)=>{r(f,G,j,n)},debug:(f,G,j)=>{L("DEBUG",f,G,j)},info:(f,G,j)=>{L("INFO",f,G,j)},warn:(f,G,j)=>{L("WARNING",f,G,j)},error:(f,G,j)=>{L("ERROR",f,G,j)}}};var k0=(n={})=>{let b=new WeakSet,$=p(n),R={...$,debug:(w,E,X)=>{b.add(w),$.debug(w,E,X)},info:(w,E,X)=>{b.add(w),$.info(w,E,X)},warn:(w,E,X)=>{b.add(w),$.warn(w,E,X)},error:(w,E,X)=>{b.add(w),$.error(w,E,X)}};return new m0({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",R).state("pino",R.pino).state("beforeTime",BigInt(0)).onStart(({server:w})=>{if(w)S(w,n)}).onRequest(({store:w})=>{w.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:w,set:E,store:X})=>{if(b.has(w))return;let J=typeof E.status==="number"?E.status:200,K="INFO";if(J>=500)K="ERROR";else if(J>=400)K="WARNING";R.log(K,w,{status:J},X)}).onError(({request:w,error:E,store:X})=>{R.handleHttpError(w,E,X)}).as("scoped")},Un=k0;export{k0 as logixlysia,Un as default};
4
4
 
5
- //# debugId=7FAFEF1E34BEF02764756E2164756E21
6
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPFxuICAnTG9naXhseXNpYScsXG4gIFNpbmdsZXRvbkJhc2UgJiB7IHN0b3JlOiBMb2dpeGx5c2lhU3RvcmUgfVxuPlxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIGFwcFxuICAgICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KSA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub25SZXF1ZXN0KCh7IHN0b3JlIH0pID0+IHtcbiAgICAgICAgc3RvcmUuYmVmb3JlVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICB9KVxuICAgICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICAgIGlmIChkaWRDdXN0b21Mb2cuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2Ygc2V0LnN0YXR1cyA9PT0gJ251bWJlcicgPyBzZXQuc3RhdHVzIDogMjAwXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgcmVxdWVzdCwgeyBzdGF0dXMgfSwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgbG9naXhseXNpYVxuIiwKICAgICJpbXBvcnQgZWx5c2lhUGtnIGZyb20gJ2VseXNpYS9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQubGVuZ3RoID49IHdpZHRoKSB7XG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXG4gIH1cblxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XG4gIHJldHVybiBgJHsnICcucmVwZWF0KGxlZnQpfSR7dGV4dH0keycgJy5yZXBlYXQocmlnaHQpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IGBFbHlzaWEgdiR7ZWx5c2lhUGtnLnZlcnNpb259YFxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChtZXNzYWdlLmxlbmd0aCwgdmVyc2lvbkxpbmUubGVuZ3RoKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNCAvLyAyIHNwYWNlcyBwYWRkaW5nIG9uIGJvdGggc2lkZXNcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eSA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IHZlcnNpb25Sb3cgPSBg4pSCJHtjZW50ZXJUZXh0KHZlcnNpb25MaW5lLCBpbm5lcldpZHRoKX3ilIJgXG4gIGNvbnN0IG1lc3NhZ2VSb3cgPSBg4pSCICAke21lc3NhZ2V9JHsnICcucmVwZWF0KE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSBtZXNzYWdlLmxlbmd0aCAtIDQpKX0gIOKUgmBcblxuICByZXR1cm4gW3RvcCwgZW1wdHksIHZlcnNpb25Sb3csIGVtcHR5LCBtZXNzYWdlUm93LCBlbXB0eSwgYm90XS5qb2luKCdcXG4nKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcihtZXNzYWdlKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBmb3JtYXRMaW5lIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8gcGluby50cmFuc3BvcnQoe1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlubyh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICAgIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0TGluZSh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgbWVzc2FnZSwgY29udGV4dCB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGlubzogcGlub0xvZ2dlcixcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG50eXBlIExvZ1RvVHJhbnNwb3J0c0lucHV0ID0ge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3RJbmZvLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbnR5cGUgTG9nVG9GaWxlSW5wdXQgPSB7XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcblxuICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgaWYgKHNob3VsZCkge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gZHVyYXRpb25cbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0hleCgnI0ZGQTUwMCcpLmJsYWNrKHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogc3RyaW5nID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9XG4gICAgY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz9cbiAgICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2lwfSB7Y29udGV4dH0nXG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcbiAgY29uc3QgdGltZXN0YW1wID0gZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycylcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcbiAgY29uc3QgaXAgPSBjb25maWc/LmlwID09PSB0cnVlID8gZ2V0SXAocmVxdWVzdCkgOiAnJ1xuICBjb25zdCBjdHhTdHJpbmcgPSBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcbiAgY29uc3QgY29sb3JlZExldmVsID0gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRNZXRob2QgPSBnZXRDb2xvcmVkTWV0aG9kKHJlcXVlc3QubWV0aG9kLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZER1cmF0aW9uID0gZ2V0Q29sb3JlZER1cmF0aW9uKFxuICAgIGAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tc2AsXG4gICAgdXNlQ29sb3JzXG4gIClcblxuICByZXR1cm4gZm9ybWF0XG4gICAgLnJlcGxhY2VBbGwoJ3tub3d9JywgdGltZXN0YW1wKVxuICAgIC5yZXBsYWNlQWxsKCd7ZXBvY2h9JywgZXBvY2gpXG4gICAgLnJlcGxhY2VBbGwoJ3tsZXZlbH0nLCBjb2xvcmVkTGV2ZWwpXG4gICAgLnJlcGxhY2VBbGwoJ3tkdXJhdGlvbn0nLCBjb2xvcmVkRHVyYXRpb24pXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXRob2R9JywgY29sb3JlZE1ldGhvZClcbiAgICAucmVwbGFjZUFsbCgne3BhdGhuYW1lfScsIGNvbG9yZWRQYXRobmFtZSlcbiAgICAucmVwbGFjZUFsbCgne3BhdGh9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7c3RhdHVzfScsIGNvbG9yZWRTdGF0dXMpXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXNzYWdlfScsIG1lc3NhZ2UpXG4gICAgLnJlcGxhY2VBbGwoJ3tpcH0nLCBpcClcbiAgICAucmVwbGFjZUFsbCgne2NvbnRleHR9JywgY3R4U3RyaW5nKVxufVxuXG5leHBvcnQgY29uc3QgbG9nV2l0aFBpbm8gPSAoXG4gIGxvZ2dlcjogUGlubyxcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdm9pZCA9PiB7XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIGxvZ2dlci5lcnJvcihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgbG9nZ2VyLndhcm4oZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICBsb2dnZXIuZGVidWcoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBsb2dnZXIuaW5mbyhkYXRhKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMSA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9nXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xuXG5jb25zdCBub3JtYWxpemVTdGF0dXNOYW1lID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcbiAgLy8gLSBzcGFjaW5nL3B1bmN0dWF0aW9uOiBcIk5vdC1Gb3VuZFwiLCBcIm5vdF9mb3VuZFwiXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8xLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcbiAgICAudHJpbSgpXG59XG5cbmNvbnN0IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUgPSAoKCkgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMoU3RhdHVzTWFwKSkge1xuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcbiAgfVxuXG4gIHJldHVybiBtYXBcbn0pKClcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBwYXJzZUVycm9yID0gKGVycm9yOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgbGV0IG1lc3NhZ2UgPSAnQW4gZXJyb3Igb2NjdXJyZWQnXG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZVxuICB9IGVsc2UgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IFN0cmluZyhlcnJvcilcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoYFBhcnNpbmcgZXJyb3I6ICR7bWVzc2FnZX1gKVxuXG4gIHJldHVybiBtZXNzYWdlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG5leHBvcnQgY29uc3QgaGFuZGxlSHR0cEVycm9yID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZXJyb3I6IHVua25vd24sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBzdGF0dXMgPSBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbiAgY29uc3QgbWVzc2FnZSA9IHBhcnNlRXJyb3IoZXJyb3IpXG5cbiAgY29uc3QgbGV2ZWw6IExvZ0xldmVsID0gJ0VSUk9SJ1xuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzLCBtZXNzYWdlLCBlcnJvciB9XG5cbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYCR7bGV2ZWx9ICR7cmVxdWVzdC5tZXRob2R9ICR7bmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWV9ICR7bWVzc2FnZX1gXG4gIClc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RUFFOUMsRUFXQSxPQVRZLElBQUksR0FBTyxDQUNyQixLQUFNLGFBQ04sT0FBUSxDQUNOLFlBQ0UsNEVBQ0YsS0FBTSxDQUFDLFVBQVcsTUFBTSxDQUMxQixDQUNGLENBQUMsRUFJSSxNQUFNLFNBQVUsQ0FBTSxFQUN0QixNQUFNLE9BQVEsRUFBTyxJQUFJLEVBQ3pCLE1BQU0sYUFBYyxPQUFPLENBQUMsQ0FBQyxFQUM3QixRQUFRLEVBQUcsWUFBYSxDQUN2QixHQUFJLEVBQ0YsRUFBWSxFQUFRLENBQU8sRUFFOUIsRUFDQSxVQUFVLEVBQUcsV0FBWSxDQUN4QixFQUFNLFdBQWEsUUFBUSxPQUFPLE9BQU8sRUFDMUMsRUFDQSxjQUFjLEVBQUcsVUFBUyxNQUFLLFdBQVksQ0FDMUMsR0FBSSxFQUFhLElBQUksQ0FBTyxFQUMxQixPQUdGLElBQU0sRUFBUyxPQUFPLEVBQUksU0FBVyxTQUFXLEVBQUksT0FBUyxJQUN6RCxFQUFzQyxPQUMxQyxHQUFJLEdBQVUsSUFDWixFQUFRLFFBQ0gsUUFBSSxHQUFVLElBQ25CLEVBQVEsVUFHVixFQUFPLElBQUksRUFBTyxFQUFTLENBQUUsUUFBTyxFQUFHLENBQUssRUFDN0MsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLFdBQVksQ0FDdEMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQUssRUFDN0MsRUFFQSxHQUFHLFFBQVEsR0FlSCIsCiAgImRlYnVnSWQiOiAiN0ZBRkVGMUUzNEJFRjAyNzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
5
+ //# debugId=E21AEBE3A9BD8B9764756E2164756E21
6
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPFxuICAnTG9naXhseXNpYScsXG4gIFNpbmdsZXRvbkJhc2UgJiB7IHN0b3JlOiBMb2dpeGx5c2lhU3RvcmUgfVxuPlxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIGFwcFxuICAgICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KSA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub25SZXF1ZXN0KCh7IHN0b3JlIH0pID0+IHtcbiAgICAgICAgc3RvcmUuYmVmb3JlVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICB9KVxuICAgICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICAgIGlmIChkaWRDdXN0b21Mb2cuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2Ygc2V0LnN0YXR1cyA9PT0gJ251bWJlcicgPyBzZXQuc3RhdHVzIDogMjAwXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgcmVxdWVzdCwgeyBzdGF0dXMgfSwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgbG9naXhseXNpYVxuIiwKICAgICJpbXBvcnQgZWx5c2lhUGtnIGZyb20gJ2VseXNpYS9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQubGVuZ3RoID49IHdpZHRoKSB7XG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXG4gIH1cblxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XG4gIHJldHVybiBgJHsnICcucmVwZWF0KGxlZnQpfSR7dGV4dH0keycgJy5yZXBlYXQocmlnaHQpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IGBFbHlzaWEgdiR7ZWx5c2lhUGtnLnZlcnNpb259YFxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChtZXNzYWdlLmxlbmd0aCwgdmVyc2lvbkxpbmUubGVuZ3RoKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNCAvLyAyIHNwYWNlcyBwYWRkaW5nIG9uIGJvdGggc2lkZXNcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eSA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IHZlcnNpb25Sb3cgPSBg4pSCJHtjZW50ZXJUZXh0KHZlcnNpb25MaW5lLCBpbm5lcldpZHRoKX3ilIJgXG4gIGNvbnN0IG1lc3NhZ2VSb3cgPSBg4pSCICAke21lc3NhZ2V9JHsnICcucmVwZWF0KE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSBtZXNzYWdlLmxlbmd0aCAtIDQpKX0gIOKUgmBcblxuICByZXR1cm4gW3RvcCwgZW1wdHksIHZlcnNpb25Sb3csIGVtcHR5LCBtZXNzYWdlUm93LCBlbXB0eSwgYm90XS5qb2luKCdcXG4nKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcihtZXNzYWdlKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YSxcbiAgTG9nRmlsdGVyXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IGZvcm1hdExpbmUgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHNob3VsZFByZXR0eVByaW50XG4gICAgPyBwaW5vLnRyYW5zcG9ydCh7XG4gICAgICAgIHRhcmdldDogJ3Bpbm8tcHJldHR5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbG9yaXplOiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWUsXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAgICAgbWVzc2FnZUtleTogcGlub09wdGlvbnMubWVzc2FnZUtleSxcbiAgICAgICAgICBlcnJvcktleTogcGlub09wdGlvbnMuZXJyb3JLZXlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICA6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuXG4gIGNvbnN0IHBpbm9Mb2dnZXI6IFBpbm8gPSBwaW5vKHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5LFxuICAgIHRyYW5zcG9ydFxuICB9KVxuXG4gIGNvbnN0IHNob3VsZExvZyA9IChsZXZlbDogTG9nTGV2ZWwsIGxvZ0ZpbHRlcj86IExvZ0ZpbHRlcik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghbG9nRmlsdGVyPy5sZXZlbCB8fCBsb2dGaWx0ZXIubGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKGxldmVsKVxuICB9XG5cbiAgY29uc3QgbG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdExpbmUoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucylcbiAgICB9LFxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0SW5mbywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFN0b3JlRGF0YSwgT3B0aW9uc11cbik6IHZvaWQgPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9UcmFuc3BvcnRzSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyB7XG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgcmVxdWVzdDogYXJnc1sxXSxcbiAgICAgICAgICBkYXRhOiBhcmdzWzJdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdLFxuICAgICAgICAgIG9wdGlvbnM6IGFyZ3NbNF1cbiAgICAgICAgfVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IHRyYW5zcG9ydHMgPSBvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXVxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGJlZm9yZVRpbWU6IHN0b3JlLmJlZm9yZVRpbWVcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRyYW5zcG9ydCBmYWlsdXJlcyBtdXN0IG5ldmVyIGNyYXNoIGFwcGxpY2F0aW9uIGxvZ2dpbmcuXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7bmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICBhd2FpdCBhcHBlbmRGaWxlKGZpbGVQYXRoLCBsaW5lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG5cbiAgY29uc3Qgcm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghcm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZCA9IGF3YWl0IHNob3VsZFJvdGF0ZShmaWxlUGF0aCwgcm90YXRpb24pXG4gIGlmIChzaG91bGQpIHtcbiAgICBhd2FpdCBwZXJmb3JtUm90YXRpb24oZmlsZVBhdGgsIHJvdGF0aW9uKVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHtcbiAgZ2V0Um90YXRlZEZpbGVzLFxuICBwYXJzZVJldGVudGlvbixcbiAgcGFyc2VTaXplLFxuICBzaG91bGRSb3RhdGVCeVNpemVcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5cbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeShnemlwKVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IHJvdGF0ZWQgPSBnZXRSb3RhdGVkRmlsZU5hbWUoZmlsZVBhdGgsIG5ldyBEYXRlKCkpXG4gIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZClcbiAgcmV0dXJuIHJvdGF0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgYXdhaXQgZnMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5zbGljZShtYXhGaWxlcylcbiAgYXdhaXQgUHJvbWlzZS5hbGwodG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpXG59XG5cbmNvbnN0IGNsZWFudXBCeVRpbWUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEFnZU1zOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1Sb3RhdGlvbiA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuICBpZiAoIXJvdGF0ZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29uZmlnLmNvbXByZXNzID09PSB0cnVlXG4gIGlmIChzaG91bGRDb21wcmVzcykge1xuICAgIGNvbnN0IGFsZ28gPSBjb25maWcuY29tcHJlc3Npb24gPz8gJ2d6aXAnXG4gICAgaWYgKGFsZ28gPT09ICdnemlwJykge1xuICAgICAgYXdhaXQgY29tcHJlc3NGaWxlKHJvdGF0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5Q291bnQoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5VGltZShmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGludGVydmFsLWJhc2VkIHJvdGF0aW9uIGNsZWFudXAgKGNyZWF0ZSBpbnRlcnZhbCBkaXJlY3RvcmllcyAvIG5hbWluZykgaXMgbm90IHJlcXVpcmVkIGJ5IHRlc3RzLlxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuY29uc3QgU0laRV9SRUdFWCA9IC9eKFxcZCsoPzpcXC5cXGQrKT8pKGt8a2J8bXxtYnxnfGdiKSQvaVxuY29uc3QgSU5URVJWQUxfUkVHRVggPSAvXihcXGQrKShofGR8dykkL2lcbmNvbnN0IFJPVEFURURfUkVHRVggPSAvXFwuKFxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgIHJldHVybiBhc051bWJlclxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgaWYgKGZvcndhcmRlZCkge1xuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZER1cmF0aW9uID0gKGR1cmF0aW9uOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheShkdXJhdGlvbilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdIZXgoJyNGRkE1MDAnKS5ibGFjayh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExpbmUgPSAoe1xuICBsZXZlbCxcbiAgcmVxdWVzdCxcbiAgZGF0YSxcbiAgc3RvcmUsXG4gIG9wdGlvbnNcbn06IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBmb3JtYXQgPVxuICAgIGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/XG4gICAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtpcH0ge2NvbnRleHR9J1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcbiAgY29uc3QgY3R4U3RyaW5nID0gZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gZ2V0Q29sb3JlZE1ldGhvZChyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkUGF0aG5hbWUgPSBnZXRDb2xvcmVkUGF0aG5hbWUocGF0aG5hbWUsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFN0YXR1cyA9IGdldENvbG9yZWRTdGF0dXMoc3RhdHVzLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWREdXJhdGlvbiA9IGdldENvbG9yZWREdXJhdGlvbihcbiAgICBgJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXNgLFxuICAgIHVzZUNvbG9yc1xuICApXG5cbiAgcmV0dXJuIGZvcm1hdFxuICAgIC5yZXBsYWNlQWxsKCd7bm93fScsIHRpbWVzdGFtcClcbiAgICAucmVwbGFjZUFsbCgne2Vwb2NofScsIGVwb2NoKVxuICAgIC5yZXBsYWNlQWxsKCd7bGV2ZWx9JywgY29sb3JlZExldmVsKVxuICAgIC5yZXBsYWNlQWxsKCd7ZHVyYXRpb259JywgY29sb3JlZER1cmF0aW9uKVxuICAgIC5yZXBsYWNlQWxsKCd7bWV0aG9kfScsIGNvbG9yZWRNZXRob2QpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRobmFtZX0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRofScsIGNvbG9yZWRQYXRobmFtZSlcbiAgICAucmVwbGFjZUFsbCgne3N0YXR1c30nLCBjb2xvcmVkU3RhdHVzKVxuICAgIC5yZXBsYWNlQWxsKCd7bWVzc2FnZX0nLCBtZXNzYWdlKVxuICAgIC5yZXBsYWNlQWxsKCd7aXB9JywgaXApXG4gICAgLnJlcGxhY2VBbGwoJ3tjb250ZXh0fScsIGN0eFN0cmluZylcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgZm9ybWF0TGluZSB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cblxuICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IGZvcm1hdExpbmUoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcbiAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDQVQsbUNBRUEsSUFBTSxFQUFhLENBQUMsRUFBYyxJQUEwQixDQUMxRCxHQUFJLEVBQUssUUFBVSxFQUNqQixPQUFPLEVBQUssTUFBTSxFQUFHLENBQUssRUFHNUIsSUFBTSxFQUFPLEtBQUssT0FBTyxFQUFRLEVBQUssUUFBVSxDQUFDLEVBQzNDLEVBQVEsRUFBUSxFQUFLLE9BQVMsRUFDcEMsTUFBTyxHQUFHLElBQUksT0FBTyxDQUFJLElBQUksSUFBTyxJQUFJLE9BQU8sQ0FBSyxLQUd6QyxFQUFlLENBQUMsSUFBNEIsQ0FDdkQsSUFBTSxFQUFjLFdBQVcsRUFBVSxVQUVuQyxFQURlLEtBQUssSUFBSSxFQUFRLE9BQVEsRUFBWSxNQUFNLEVBQzlCLEVBRTVCLEVBQU0sSUFBRyxJQUFJLE9BQU8sQ0FBVSxLQUM5QixFQUFNLElBQUcsSUFBSSxPQUFPLENBQVUsS0FDOUIsRUFBUSxJQUFHLElBQUksT0FBTyxDQUFVLEtBRWhDLEVBQWEsSUFBRyxFQUFXLEVBQWEsQ0FBVSxLQUNsRCxFQUFhLE1BQUssSUFBVSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUcsRUFBYSxFQUFR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QUFlLFVBQVcsRUFBUyxFQUFTLENBQU8sR0FFckQsTUFBTyxDQUFDLEVBQVMsRUFBUyxJQUFZLENBQ3BDLEVBQWUsUUFBUyxFQUFTLEVBQVMsQ0FBTyxFQUVyRCxHSC9ISyxJQUFNLEdBQWEsQ0FBQyxFQUFtQixDQUFDLElBQWtCLENBQy9ELElBQU0sRUFBZSxJQUFJLFFBQ25CLEVBQWEsRUFBYSxDQUFPLEVBQ2pDLEVBQVMsSUFDVixFQUNILE1BQU8sQ0FDTCxFQUNBLEVBQ0EsSUFDRyxDQUNILEVBQWEsSUFBSSxDQUFPLEVBQ3hCLEVBQVcsTUFBTSxFQUFTLEVBQVMsQ0FBTyxHQUU1QyxLQUFNLENBQ0osRUFDQSxFQUNBLElBQ0csQ0FDSCxFQUFhLElBQUksQ0FBTyxFQUN4QixFQUFXLEtBQUssRUFBUyxFQUFTLENBQU8sR0FFM0MsS0FBTSxDQUNKLEVBQ0EsRUFDQSxJQUNHLENBQ0gsRUFBYSxJQUFJLENBQU8sRUFDeEIsRUFBVyxLQUFLLEVBQVMsRUFBUyxDQUFPLEdBRTNDLE1BQU8sQ0FDTCxFQUNBLEVBQ0EsSUFDRyxDQUNILEVBQWEsSUFBSSxDQUFPLEVBQ3hCLEVBQVcsTUFBTSxFQUFTLEVBQVMsQ0FBTyxFQUU5QyxFQVdBLE9BVFksSUFBSSxHQUFPLENBQ3JCLEtBQU0sYUFDTixPQUFRLENBQ04sWUFDRSw0RUFDRixLQUFNLENBQUMsVUFBVyxNQUFNLENBQzFCLENBQ0YsQ0FBQyxFQUlJLE1BQU0sU0FBVSxDQUFNLEVBQ3RCLE1BQU0sT0FBUSxFQUFPLElBQUksRUFDekIsTUFBTSxhQUFjLE9BQU8sQ0FBQyxDQUFDLEVBQzdCLFFBQVEsRUFBRyxZQUFhLENBQ3ZCLEdBQUksRUFDRixFQUFZLEVBQVEsQ0FBTyxFQUU5QixFQUNBLFVBQVUsRUFBRyxXQUFZLENBQ3hCLEVBQU0sV0FBYSxRQUFRLE9BQU8sT0FBTyxFQUMxQyxFQUNBLGNBQWMsRUFBRyxVQUFTLE1BQUssV0FBWSxDQUMxQyxHQUFJLEVBQWEsSUFBSSxDQUFPLEVBQzFCLE9BR0YsSUFBTSxFQUFTLE9BQU8sRUFBSSxTQUFXLFNBQVcsRUFBSSxPQUFTLElBQ3pELEVBQXNDLE9BQzFDLEdBQUksR0FBVSxJQUNaLEVBQVEsUUFDSCxRQUFJLEdBQVUsSUFDbkIsRUFBUSxVQUdWLEVBQU8sSUFBSSxFQUFPLEVBQVMsQ0FBRSxRQUFPLEVBQUcsQ0FBSyxFQUM3QyxFQUNBLFFBQVEsRUFBRyxVQUFTLFFBQU8sV0FBWSxDQUN0QyxFQUFPLGdCQUFnQixFQUFTLEVBQU8sQ0FBSyxFQUM3QyxFQUVBLEdBQUcsUUFBUSxHQWVIIiwKICAiZGVidWdJZCI6ICJFMjFBRUJFM0E5QkQ4Qjk3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logixlysia",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,15 +38,16 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "chalk": "^5.6.2",
41
- "elysia": "^1.4.19",
42
41
  "pino": "^10.1.0",
43
42
  "pino-pretty": "^13.1.3"
44
43
  },
45
44
  "devDependencies": {
46
45
  "@types/bun": "^1.3.5",
47
- "bunup": "^0.16.11"
46
+ "bunup": "^0.16.17",
47
+ "elysia": "^1.4.19"
48
48
  },
49
49
  "peerDependencies": {
50
+ "elysia": "^1.4.19",
50
51
  "typescript": "^5.9.3"
51
52
  }
52
53
  }
package/src/interfaces.ts CHANGED
@@ -5,20 +5,22 @@ import type {
5
5
 
6
6
  export type Pino = PinoLogger<never, boolean>
7
7
 
8
+ export type RequestInfo = Request
9
+
8
10
  export type LogLevel = 'DEBUG' | 'INFO' | 'WARNING' | 'ERROR'
9
11
 
10
- export type StoreData = {
12
+ export interface StoreData {
11
13
  beforeTime: bigint
12
14
  }
13
15
 
14
- export type LogixlysiaStore = {
16
+ export interface LogixlysiaStore {
15
17
  logger: Logger
16
18
  pino: Pino
17
19
  beforeTime?: bigint
18
20
  [key: string]: unknown
19
21
  }
20
22
 
21
- export type Transport = {
23
+ export interface Transport {
22
24
  log: (
23
25
  level: LogLevel,
24
26
  message: string,
@@ -26,7 +28,7 @@ export type Transport = {
26
28
  ) => void | Promise<void>
27
29
  }
28
30
 
29
- export type LogRotationConfig = {
31
+ export interface LogRotationConfig {
30
32
  /**
31
33
  * Max log file size before rotation, e.g. '10m', '5k', or a byte count.
32
34
  */
@@ -43,7 +45,15 @@ export type LogRotationConfig = {
43
45
  compression?: 'gzip'
44
46
  }
45
47
 
46
- export type Options = {
48
+ export interface LogFilter {
49
+ /**
50
+ * Array of log levels to allow. If specified, only logs with these levels will be processed.
51
+ * If not specified, all log levels will be allowed.
52
+ */
53
+ level?: LogLevel[]
54
+ }
55
+
56
+ export interface Options {
47
57
  config?: {
48
58
  showStartupMessage?: boolean
49
59
  startupMessageFormat?: 'simple' | 'banner'
@@ -54,6 +64,9 @@ export type Options = {
54
64
  }
55
65
  customLogFormat?: string
56
66
 
67
+ // Filtering
68
+ logFilter?: LogFilter
69
+
57
70
  // Outputs
58
71
  transports?: Transport[]
59
72
  useTransportsOnly?: boolean
@@ -76,7 +89,7 @@ export class HttpError extends Error {
76
89
  }
77
90
  }
78
91
 
79
- export type Logger = {
92
+ export interface Logger {
80
93
  pino: Pino
81
94
  log: (
82
95
  level: LogLevel,
@@ -111,7 +124,7 @@ export type Logger = {
111
124
  ) => void
112
125
  }
113
126
 
114
- export type LogixlysiaContext = {
127
+ export interface LogixlysiaContext {
115
128
  request: Request
116
129
  store: LogixlysiaStore
117
130
  }
@@ -2,6 +2,7 @@ import type { LogLevel, Options, RequestInfo, StoreData } from '../interfaces'
2
2
  import { logToTransports } from '../output'
3
3
  import { logToFile } from '../output/file'
4
4
  import { parseError } from '../utils/error'
5
+ import { formatLine } from './create-logger'
5
6
 
6
7
  const isErrorWithStatus = (
7
8
  value: unknown
@@ -45,7 +46,6 @@ export const handleHttpError = (
45
46
  return
46
47
  }
47
48
 
48
- console.error(
49
- `${level} ${request.method} ${new URL(request.url).pathname} ${message}`
50
- )
49
+ const formattedMessage = formatLine({ level, request, data, store, options })
50
+ console.error(formattedMessage)
51
51
  }
@@ -5,7 +5,8 @@ import type {
5
5
  Options,
6
6
  Pino,
7
7
  RequestInfo,
8
- StoreData
8
+ StoreData,
9
+ LogFilter
9
10
  } from '../interfaces'
10
11
  import { logToTransports } from '../output'
11
12
  import { logToFile } from '../output/file'
@@ -41,12 +42,24 @@ export const createLogger = (options: Options = {}): Logger => {
41
42
  transport
42
43
  })
43
44
 
45
+ const shouldLog = (level: LogLevel, logFilter?: LogFilter): boolean => {
46
+ if (!logFilter?.level || logFilter.level.length === 0) {
47
+ return true
48
+ }
49
+ return logFilter.level.includes(level)
50
+ }
51
+
44
52
  const log = (
45
53
  level: LogLevel,
46
54
  request: RequestInfo,
47
55
  data: Record<string, unknown>,
48
56
  store: StoreData
49
57
  ): void => {
58
+ // Check if this log level should be filtered
59
+ if (!shouldLog(level, config?.logFilter)) {
60
+ return
61
+ }
62
+
50
63
  logToTransports({ level, request, data, store, options })
51
64
 
52
65
  const useTransportsOnly = config?.useTransportsOnly === true
@@ -4,7 +4,7 @@ import type { LogLevel, Options, RequestInfo, StoreData } from '../interfaces'
4
4
  import { ensureDir } from './fs'
5
5
  import { performRotation, shouldRotate } from './rotation-manager'
6
6
 
7
- type LogToFileInput = {
7
+ interface LogToFileInput {
8
8
  filePath: string
9
9
  level: LogLevel
10
10
  request: RequestInfo
@@ -1,6 +1,6 @@
1
1
  import type { LogLevel, Options, RequestInfo, StoreData } from '../interfaces'
2
2
 
3
- type LogToTransportsInput = {
3
+ interface LogToTransportsInput {
4
4
  level: LogLevel
5
5
  request: RequestInfo
6
6
  data: Record<string, unknown>
@@ -9,7 +9,5 @@ export const parseError = (error: unknown): string => {
9
9
  message = String(error)
10
10
  }
11
11
 
12
- console.error(`Parsing error: ${message}`)
13
-
14
12
  return message
15
13
  }