logixlysia 5.2.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,88 +1,71 @@
1
- import { Elysia } from "elysia";
2
- interface RequestInfo {
3
- headers: {
4
- get: (key: string) => string | null
5
- };
6
- method: string;
7
- url: string;
8
- }
9
- type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR" | string;
10
- interface LogData {
11
- status?: number;
12
- message?: string;
13
- context?: Record<string, string | number | boolean | null>;
14
- stack?: string;
15
- metrics?: {
16
- memoryUsage?: number
17
- cpuUsage?: number
18
- responseSize?: number
19
- };
20
- }
21
- interface Logger {
22
- store?: StoreData;
23
- log(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData): void;
24
- handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): Promise<void>;
25
- customLogFormat?: string;
26
- info(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
27
- error(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
28
- warn(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
29
- debug(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
30
- }
31
- interface StoreData {
1
+ import { Elysia, SingletonBase } from "elysia";
2
+ import { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from "pino";
3
+ type Pino = PinoLogger<never, boolean>;
4
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
5
+ type StoreData = {
32
6
  beforeTime: bigint;
33
- logger?: Logger;
34
- hasCustomLog?: boolean;
35
- }
36
- interface LogixlysiaContext {
37
- store: {
38
- logger: Logger
39
- beforeTime: bigint
40
- hasCustomLog: boolean
41
- };
42
- request: RequestInfo;
43
- }
44
- declare class HttpError extends Error {
45
- status: number;
46
- constructor(status: number, message: string);
47
- }
48
- type TransportFunction = (level: LogLevel, message: string, meta: {
49
- request: RequestInfo
50
- data: LogData
51
- store: StoreData
52
- }) => Promise<void> | void;
53
- interface Transport {
54
- log: TransportFunction;
55
- }
56
- interface TimestampConfig {
57
- translateTime?: boolean | string;
58
- }
59
- interface Options {
7
+ };
8
+ type LogixlysiaStore = {
9
+ logger: Logger;
10
+ pino: Pino;
11
+ beforeTime?: bigint;
12
+ [key: string]: unknown;
13
+ };
14
+ type Transport = {
15
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
16
+ };
17
+ type LogRotationConfig = {
18
+ /**
19
+ * Max log file size before rotation, e.g. '10m', '5k', or a byte count.
20
+ */
21
+ maxSize?: string | number;
22
+ /**
23
+ * Keep at most N files or keep files for a duration like '7d'.
24
+ */
25
+ maxFiles?: number | string;
26
+ /**
27
+ * Rotate at a fixed interval, e.g. '1d', '12h'.
28
+ */
29
+ interval?: string;
30
+ compress?: boolean;
31
+ compression?: "gzip";
32
+ };
33
+ type Options = {
60
34
  config?: {
61
- customLogFormat?: string
62
- logFilePath?: string
63
- logRotation?: {
64
- maxSize?: number
65
- maxFiles?: number
66
- compress?: boolean
67
- }
68
- logFilter?: {
69
- level?: LogLevel | LogLevel[]
70
- method?: string | string[]
71
- status?: number | number[]
72
- } | null
73
- ip?: boolean
74
- useColors?: boolean
75
- showStartupMessage?: boolean
76
- startupMessageFormat?: "banner" | "simple"
77
- transports?: Transport[]
78
- timestamp?: TimestampConfig
79
- disableInternalLogger?: boolean
80
- disableFileLogging?: boolean
81
- useTransportsOnly?: boolean
35
+ showStartupMessage?: boolean;
36
+ startupMessageFormat?: "simple" | "banner";
37
+ useColors?: boolean;
38
+ ip?: boolean;
39
+ timestamp?: {
40
+ translateTime?: string;
41
+ };
42
+ customLogFormat?: string;
43
+ transports?: Transport[];
44
+ useTransportsOnly?: boolean;
45
+ disableInternalLogger?: boolean;
46
+ disableFileLogging?: boolean;
47
+ logFilePath?: string;
48
+ logRotation?: LogRotationConfig;
49
+ pino?: (PinoLoggerOptions & {
50
+ prettyPrint?: boolean;
51
+ }) | undefined;
82
52
  };
83
- }
84
- declare function createLogger(options?: Options): Logger;
85
- declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): Promise<void>;
86
- declare function logToTransports(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData, options?: Options): Promise<void>;
87
- declare function logixlysia(options?: Options): Elysia;
88
- export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogLevel, LogData, HttpError };
53
+ };
54
+ type Logger = {
55
+ pino: Pino;
56
+ log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
57
+ handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
58
+ debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
59
+ info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
60
+ warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
61
+ error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
62
+ };
63
+ type LogixlysiaContext = {
64
+ request: Request;
65
+ store: LogixlysiaStore;
66
+ };
67
+ type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
68
+ store: LogixlysiaStore;
69
+ }>;
70
+ declare const logixlysia: (options?: Options) => Logixlysia;
71
+ export { logixlysia, logixlysia as default, Transport, StoreData, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel };
package/dist/index.js CHANGED
@@ -1,13 +1,6 @@
1
- import{Elysia as J}from"elysia";var D=(r,o)=>{let t=Math.max(0,(o-r.length)/2),n=" ".repeat(t);return`${n}${r}${n}`.padEnd(o)};function d(r,o){let t=r?.hostname??"localhost",n=r?.port??3000,e=r?.protocol??"http";if(o?.config?.startupMessageFormat!=="simple"){let i=`\uD83E\uDD8A Elysia is running at ${e}://${t}:${n}`,m=Math.max(22,i.length)+4,w="─".repeat(m),f=D("",m);console.log(`
2
- ┌${w}
3
- │${f}
4
- │${D("Elysia with Logixlysia",m)}│
5
- │${f}│
6
- │${D(i,m)}│
7
- │${f}│
8
- └${w}┘
9
- `)}else console.log(`\uD83E\uDD8A Elysia is running at ${e}://${t}:${n}`)}import u from"chalk";import{StatusMap as N}from"elysia";function T(r){if(typeof r==="number")return r;return N[r]||500}function S(r,o){let t=r.toString();if(!o)return t;if(r>=500)return u.red(t);if(r>=400)return u.yellow(t);if(r>=300)return u.cyan(t);if(r>=200)return u.green(t);return u.white(t)}import I from"chalk";import l from"chalk";var C={INFO:l.bgGreen.black,WARNING:l.bgYellow.black,ERROR:l.bgRed.black},F={GET:l.green,POST:l.yellow,PUT:l.blue,PATCH:l.magentaBright,DELETE:l.red,HEAD:l.cyan,OPTIONS:l.magenta};import $ from"chalk";var q=[{unit:"s",threshold:1e9,decimalPlaces:2},{unit:"ms",threshold:1e6,decimalPlaces:0},{unit:"µs",threshold:1000,decimalPlaces:0},{unit:"ns",threshold:1,decimalPlaces:0}];function b(r,o){let t=Number(process.hrtime.bigint()-r);for(let{unit:n,threshold:e,decimalPlaces:s}of q)if(t>=e){let i=`${(t/e).toFixed(s)}${n}`.padStart(8).padEnd(16);return o?$.gray(i):i}return o?$.gray("0ns".padStart(8).padEnd(16)):"0ns".padStart(8).padEnd(16)}function x(r,o){let t=r.toUpperCase();return o?C[t]?.(t.padEnd(7))||t:t.padEnd(7)}function y(r,o){let t=F[r];return o&&t?t(r.padEnd(7)):r.padEnd(7)}function O(r){try{return new URL(r.url).pathname}catch{return}}var g=(r)=>r.toString().padStart(2,"0");function B(r){let o=r.getFullYear(),t=g(r.getMonth()+1),n=g(r.getDate()),e=g(r.getHours()),s=g(r.getMinutes()),a=g(r.getSeconds()),i=r.getMilliseconds().toString().padStart(3,"0");return`${o}-${t}-${n} ${e}:${s}:${a}.${i}`}function G(r,o){let t={yyyy:r.getFullYear(),yy:r.getFullYear().toString().slice(-2),mm:g(r.getMonth()+1),dd:g(r.getDate()),HH:g(r.getHours()),MM:g(r.getMinutes()),ss:g(r.getSeconds()),SSS:g(r.getMilliseconds()),Z:-r.getTimezoneOffset()/60};return o.replace(/yyyy|yy|mm|dd|HH|MM|ss|SSS|Z/g,(n)=>(t[n]??"").toString())}function E(r,o){if(!o?.translateTime)return r.toISOString();if(o.translateTime===!0||o.translateTime==="SYS:STANDARD")return B(r);return G(r,o.translateTime)}var A="\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {context} {ip}";function W(r,o){if(o?.config?.useColors!==void 0)return o.config.useColors&&process.env.NO_COLOR===void 0;return r&&process.env.NO_COLOR===void 0}function c(r,o,t,n,e,s=!0){let a=W(s,e),i=new Date,m={now:a?I.bgYellow(I.black(E(i,e?.config?.timestamp))):E(i,e?.config?.timestamp),epoch:Math.floor(i.getTime()/1000).toString(),level:x(r,s),duration:b(n.beforeTime,s),method:y(o.method,s),pathname:O(o),status:S(t.status||200,s),message:t.message||"",context:t.context?(()=>{try{return JSON.stringify(t.context)}catch(f){return`[Error serializing context: ${f instanceof Error?f.message:"Unknown error"}]`}})():"",ip:e?.config?.ip&&o.headers.get("x-forwarded-for")?`IP: ${o.headers.get("x-forwarded-for")}`:""};return(e?.config?.customLogFormat||A).replace(/{(\w+)}/g,(f,P)=>{if(P in m)return m[P]||"";return""})}async function p(r,o,t,n,e){if(!e?.config?.transports||e.config.transports.length===0)return;let s=c(r,o,t,n,e,!1),a=e.config.transports.map((i)=>i.log(r,s,{request:o,data:t,store:n}));await Promise.all(a)}import{promises as H}from"node:fs";import{dirname as _}from"node:path";var k=new Set;async function Y(r){let o=_(r);if(!k.has(o))await H.mkdir(o,{recursive:!0}),k.add(o)}async function h(r,o,t,n,e,s){await Y(r);let a=`${c(o,t,n,e,s,!1)}
10
- `;await H.appendFile(r,a,{flag:"a"})}var M=(r,o)=>Array.isArray(r)?r.includes(o):r===o;function U(r,o,t,n){let e=n?.config?.logFilter;if(!e)return!0;return(!e.level||M(e.level,r))&&(!e.status||M(e.status,o))&&(!e.method||M(e.method,t))}async function R(r,o,t,n){let s={status:o.status||500,message:o.message,stack:o.stack},a=[];if(!(n?.config?.useTransportsOnly||n?.config?.disableInternalLogger))console.error(c("ERROR",r,s,t,n));if(!n?.config?.useTransportsOnly&&n?.config?.logFilePath&&!n?.config?.disableFileLogging)a.push(h(n.config.logFilePath,"ERROR",r,s,t,n));if(n?.config?.transports?.length)a.push(p("ERROR",r,s,t,n));await Promise.all(a)}function z(){let r=process.memoryUsage().heapUsed/1024/1024,o=process.cpuUsage();return{memoryUsage:r,cpuUsage:o.user/1e6}}async function L(r,o,t,n,e){if(!U(r,t.status||200,o.method,e))return;if(!t.metrics)t.metrics=z();if(r==="ERROR"&&!t.stack)t.stack=Error(`Error: ${t.message||"Unknown error"}`).stack;let s=c(r,o,t,n,e,!0),a=[];if(!(e?.config?.useTransportsOnly||e?.config?.disableInternalLogger))console.log(s);if(!e?.config?.useTransportsOnly&&e?.config?.logFilePath&&!e?.config?.disableFileLogging)a.push(h(e.config.logFilePath,r,o,t,n,e));if(e?.config?.transports?.length)a.push(p(r,o,t,n,e));await Promise.all(a)}function v(r){let o={store:void 0,log:(t,n,e,s)=>L(t,n,e,s,r),handleHttpError:async(t,n,e)=>await R(t,n,e,r),customLogFormat:r?.config?.customLogFormat,info:(t,n,e,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,L("INFO",t,{message:n,context:e,status:200},a,r)},error:(t,n,e,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,L("ERROR",t,{message:n,context:e,status:500},a,r)},warn:(t,n,e,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,L("WARNING",t,{message:n,context:e,status:200},a,r)},debug:(t,n,e,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,L("DEBUG",t,{message:n,context:e,status:200},a,r)}};return o}function j(r){let o=v(r);return new J({name:"Logixlysia"}).onStart((t)=>{if(r?.config?.showStartupMessage??!0)d(t.server,r)}).onRequest((t)=>{let n={...t.store,beforeTime:process.hrtime.bigint(),logger:o,hasCustomLog:!1};t.store=n,o.store=n}).onAfterHandle({as:"global"},({request:t,set:n,store:e})=>{let s=e;if(!s.hasCustomLog){let a=T(n.status||200);o.log("INFO",t,{status:a,message:String(n.headers?.["x-message"]||"")},s)}}).onError({as:"global"},async({request:t,error:n,set:e,store:s})=>{let a=T(e.status||500);await o.handleHttpError(t,{...n,status:a},s)})}export{p as logToTransports,R as handleHttpError,j as default,v as createLogger};
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};
11
4
 
12
- //# debugId=C43B828C0DA6DD5064756E2164756E21
13
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICIuLi9zcmMvaGVscGVycy9zdGF0dXMudHMiLCAiLi4vc3JjL2xvZ2dlci9idWlsZC1sb2ctbWVzc2FnZS50cyIsICIuLi9zcmMvaGVscGVycy9jb2xvci1tYXBwaW5nLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2R1cmF0aW9uLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2xvZy50cyIsICIuLi9zcmMvaGVscGVycy9tZXRob2QudHMiLCAiLi4vc3JjL2hlbHBlcnMvcGF0aC50cyIsICIuLi9zcmMvaGVscGVycy90aW1lc3RhbXAudHMiLCAiLi4vc3JjL291dHB1dC9jb25zb2xlLnRzIiwgIi4uL3NyYy9vdXRwdXQvZmlsZS50cyIsICIuLi9zcmMvbG9nZ2VyL2ZpbHRlci50cyIsICIuLi9zcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgIi4uL3NyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5cbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IEh0dHBFcnJvciwgT3B0aW9ucywgU2VydmVyLCBTdG9yZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9naXhseXNpYShvcHRpb25zPzogT3B0aW9ucyk6IEVseXNpYSB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxuXG4gIHJldHVybiBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYSdcbiAgfSlcbiAgICAub25TdGFydChjdHggPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucz8uY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICAgICAgaWYgKHNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgICAgICBzdGFydFNlcnZlcihjdHguc2VydmVyIGFzIFNlcnZlciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoY3R4ID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0ge1xuICAgICAgICAuLi5jdHguc3RvcmUsXG4gICAgICAgIGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpLFxuICAgICAgICBsb2dnZXI6IGxvZyxcbiAgICAgICAgaGFzQ3VzdG9tTG9nOiBmYWxzZVxuICAgICAgfVxuICAgICAgY3R4LnN0b3JlID0gc3RvcmVcbiAgICAgIGxvZy5zdG9yZSA9IHN0b3JlXG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSh7IGFzOiAnZ2xvYmFsJyB9LCAoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIGFzIFN0b3JlRGF0YVxuXG4gICAgICBpZiAoIXN0b3JlRGF0YS5oYXNDdXN0b21Mb2cpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDIwMClcbiAgICAgICAgbG9nLmxvZyhcbiAgICAgICAgICAnSU5GTycsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmcoc2V0LmhlYWRlcnM/LlsneC1tZXNzYWdlJ10gfHwgJycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdG9yZURhdGFcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoeyBhczogJ2dsb2JhbCcgfSwgYXN5bmMgKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDUwMClcbiAgICAgIGF3YWl0IGxvZy5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgLi4uZXJyb3IsIHN0YXR1cyB9IGFzIEh0dHBFcnJvcixcbiAgICAgICAgc3RvcmUgYXMgU3RvcmVEYXRhXG4gICAgICApXG4gICAgfSlcbn1cblxuZXhwb3J0IHR5cGUge1xuICBIdHRwRXJyb3IsXG4gIExvZ0RhdGEsXG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4vb3V0cHV0J1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNlcnZlciB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGNyZWF0ZUJveFRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFkZGluZ0xlbmd0aCA9IE1hdGgubWF4KDAsICh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZGRpbmdMZW5ndGgpXG4gIHJldHVybiBgJHtwYWRkaW5nfSR7dGV4dH0ke3BhZGRpbmd9YC5wYWRFbmQod2lkdGgpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0U2VydmVyKGNvbmZpZzogU2VydmVyLCBvcHRpb25zPzogT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBob3N0bmFtZSA9IGNvbmZpZz8uaG9zdG5hbWUgPz8gJ2xvY2FsaG9zdCdcbiAgY29uc3QgcG9ydCA9IGNvbmZpZz8ucG9ydCA/PyAzMDAwXG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnPy5wcm90b2NvbCA/PyAnaHR0cCdcbiAgY29uc3Qgc2hvd0Jhbm5lciA9IG9wdGlvbnM/LmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgIT09ICdzaW1wbGUnXG5cbiAgaWYgKHNob3dCYW5uZXIpIHtcbiAgICBjb25zdCB0aXRsZSA9ICdFbHlzaWEgd2l0aCBMb2dpeGx5c2lhJ1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgY29uc3QgYm94V2lkdGggPSBNYXRoLm1heCh0aXRsZS5sZW5ndGgsIG1lc3NhZ2UubGVuZ3RoKSArIDRcbiAgICBjb25zdCBib3JkZXIgPSAn4pSAJy5yZXBlYXQoYm94V2lkdGgpXG4gICAgY29uc3QgZW1wdHlMaW5lID0gY3JlYXRlQm94VGV4dCgnJywgYm94V2lkdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgXG4gICAgICDilIwke2JvcmRlcn3ilJBcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KHRpdGxlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUgiR7Y3JlYXRlQm94VGV4dChtZXNzYWdlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUlCR7Ym9yZGVyfeKUmFxuICAgIGApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKHN0YXR1czogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG4gIHJldHVybiAoU3RhdHVzTWFwIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3N0YXR1c10gfHwgNTAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXR1c1N0cmluZyhcbiAgc3RhdHVzOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzU3RyID0gc3RhdHVzLnRvU3RyaW5nKClcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzU3RyXG4gIH1cblxuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzU3RyKVxuICB9XG4gIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzU3RyKVxuICB9XG4gIHJldHVybiBjaGFsay53aGl0ZShzdGF0dXNTdHIpXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IHtcbiAgZHVyYXRpb25TdHJpbmcsXG4gIGZvcm1hdFRpbWVzdGFtcCxcbiAgbG9nU3RyaW5nLFxuICBtZXRob2RTdHJpbmcsXG4gIHBhdGhTdHJpbmcsXG4gIHN0YXR1c1N0cmluZ1xufSBmcm9tICcuLi9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dDb21wb25lbnRzLFxuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBkZWZhdWx0TG9nRm9ybWF0ID1cbiAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtjb250ZXh0fSB7aXB9J1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzOiBib29sZWFuLCBvcHRpb25zPzogT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy51c2VDb2xvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvcHRpb25zLmNvbmZpZy51c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiB1c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2dNZXNzYWdlKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgdXNlQ29sb3JzID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0dWFsbHlVc2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzLCBvcHRpb25zKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGNvbXBvbmVudHM6IExvZ0NvbXBvbmVudHMgPSB7XG4gICAgbm93OiBhY3R1YWxseVVzZUNvbG9yc1xuICAgICAgPyBjaGFsay5iZ1llbGxvdyhcbiAgICAgICAgICBjaGFsay5ibGFjayhmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCkpXG4gICAgICAgIClcbiAgICAgIDogZm9ybWF0VGltZXN0YW1wKG5vdywgb3B0aW9ucz8uY29uZmlnPy50aW1lc3RhbXApLFxuICAgIGVwb2NoOiBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygpLFxuICAgIGxldmVsOiBsb2dTdHJpbmcobGV2ZWwsIHVzZUNvbG9ycyksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uU3RyaW5nKHN0b3JlLmJlZm9yZVRpbWUsIHVzZUNvbG9ycyksXG4gICAgbWV0aG9kOiBtZXRob2RTdHJpbmcocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycyksXG4gICAgcGF0aG5hbWU6IHBhdGhTdHJpbmcocmVxdWVzdCksXG4gICAgc3RhdHVzOiBzdGF0dXNTdHJpbmcoZGF0YS5zdGF0dXMgfHwgMjAwLCB1c2VDb2xvcnMpLFxuICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSB8fCAnJyxcbiAgICBjb250ZXh0OiBkYXRhLmNvbnRleHRcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGBbRXJyb3Igc2VyaWFsaXppbmcgY29udGV4dDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31dYFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiAnJyxcbiAgICBpcDpcbiAgICAgIG9wdGlvbnM/LmNvbmZpZz8uaXAgJiYgcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgICAgICAgPyBgSVA6ICR7cmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJyl9YFxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBsb2dGb3JtYXQgPSBvcHRpb25zPy5jb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCB8fCBkZWZhdWx0TG9nRm9ybWF0XG5cbiAgcmV0dXJuIGxvZ0Zvcm1hdC5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5IGluIGNvbXBvbmVudHMpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRzW2tleSBhcyBrZXlvZiBMb2dDb21wb25lbnRzXSB8fCAnJ1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgdHlwZSB7IENvbG9yTWFwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVsQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBJTkZPOiBjaGFsay5iZ0dyZWVuLmJsYWNrLFxuICBXQVJOSU5HOiBjaGFsay5iZ1llbGxvdy5ibGFjayxcbiAgRVJST1I6IGNoYWxrLmJnUmVkLmJsYWNrXG59XG5cbmV4cG9ydCBjb25zdCBIdHRwTWV0aG9kQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBHRVQ6IGNoYWxrLmdyZWVuLFxuICBQT1NUOiBjaGFsay55ZWxsb3csXG4gIFBVVDogY2hhbGsuYmx1ZSxcbiAgUEFUQ0g6IGNoYWxrLm1hZ2VudGFCcmlnaHQsXG4gIERFTEVURTogY2hhbGsucmVkLFxuICBIRUFEOiBjaGFsay5jeWFuLFxuICBPUFRJT05TOiBjaGFsay5tYWdlbnRhXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuY29uc3QgdGltZVVuaXRzID0gW1xuICB7IHVuaXQ6ICdzJywgdGhyZXNob2xkOiAxZTksIGRlY2ltYWxQbGFjZXM6IDIgfSxcbiAgeyB1bml0OiAnbXMnLCB0aHJlc2hvbGQ6IDFlNiwgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICfCtXMnLCB0aHJlc2hvbGQ6IDFlMywgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICducycsIHRocmVzaG9sZDogMSwgZGVjaW1hbFBsYWNlczogMCB9XG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGR1cmF0aW9uU3RyaW5nKFxuICBiZWZvcmVUaW1lOiBiaWdpbnQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgbmFub3NlY29uZHMgPSBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBiZWZvcmVUaW1lKVxuXG4gIGZvciAoY29uc3QgeyB1bml0LCB0aHJlc2hvbGQsIGRlY2ltYWxQbGFjZXMgfSBvZiB0aW1lVW5pdHMpIHtcbiAgICBpZiAobmFub3NlY29uZHMgPj0gdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChuYW5vc2Vjb25kcyAvIHRocmVzaG9sZCkudG9GaXhlZChkZWNpbWFsUGxhY2VzKVxuICAgICAgY29uc3QgdGltZVN0ciA9IGAke3ZhbHVlfSR7dW5pdH1gLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbiAgICAgIHJldHVybiB1c2VDb2xvcnMgPyBjaGFsay5ncmF5KHRpbWVTdHIpIDogdGltZVN0clxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1c2VDb2xvcnNcbiAgICA/IGNoYWxrLmdyYXkoJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KSlcbiAgICA6ICcwbnMnLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBMb2dMZXZlbENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dTdHJpbmcobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsZXZlbFN0ciA9IGxldmVsLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gTG9nTGV2ZWxDb2xvck1hcFtsZXZlbFN0cl0/LihsZXZlbFN0ci5wYWRFbmQoNykpIHx8IGxldmVsU3RyXG4gICAgOiBsZXZlbFN0ci5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHsgSHR0cE1ldGhvZENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXRob2RTdHJpbmcoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yRnVuY3Rpb24gPSBIdHRwTWV0aG9kQ29sb3JNYXBbbWV0aG9kXVxuICByZXR1cm4gdXNlQ29sb3JzICYmIGNvbG9yRnVuY3Rpb25cbiAgICA/IGNvbG9yRnVuY3Rpb24obWV0aG9kLnBhZEVuZCg3KSlcbiAgICA6IG1ldGhvZC5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhTdHJpbmcoXG4gIHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mb1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0SW5mby51cmwpLnBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIHJldHVyblxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGltZXN0YW1wQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuLy8gY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gJ3l5eXktbW0tZGQgSEg6TU06c3MnXG5jb25zdCBTWVNfVElNRSA9ICdTWVM6U1RBTkRBUkQnXG5cbmNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcblxuZnVuY3Rpb24gZm9ybWF0U3lzdGVtVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgbWludXRlcyA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgbXMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKVxuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9LiR7bXN9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRDdXN0b21UaW1lKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge1xuICAgIHl5eXk6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICB5eTogZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgIG1tOiBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgZGQ6IHBhZChkYXRlLmdldERhdGUoKSksXG4gICAgSEg6IHBhZChkYXRlLmdldEhvdXJzKCkpLFxuICAgIE1NOiBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgIHNzOiBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpLFxuICAgIFNTUzogcGFkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLFxuICAgIFo6IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MFxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC95eXl5fHl5fG1tfGRkfEhIfE1NfHNzfFNTU3xaL2csIG1hdGNoID0+XG4gICAgKHRva2Vuc1ttYXRjaF0gPz8gJycpLnRvU3RyaW5nKClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZXN0YW1wKGRhdGU6IERhdGUsIGNvbmZpZz86IFRpbWVzdGFtcENvbmZpZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnPy50cmFuc2xhdGVUaW1lKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSB0cnVlIHx8IGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSBTWVNfVElNRSkge1xuICAgIHJldHVybiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGUpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0Q3VzdG9tVGltZShkYXRlLCBjb25maWcudHJhbnNsYXRlVGltZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9UcmFuc3BvcnRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzIHx8IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgZmFsc2UpXG5cbiAgY29uc3QgcHJvbWlzZXMgPSBvcHRpb25zLmNvbmZpZy50cmFuc3BvcnRzLm1hcCh0cmFuc3BvcnQgPT5cbiAgICB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCB7IHJlcXVlc3QsIGRhdGEsIHN0b3JlIH0pXG4gIClcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aClcbiAgY29uc3QgbG9nTWVzc2FnZSA9IGAke2J1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGZhbHNlKX1cXG5gXG4gIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGxvZ01lc3NhZ2UsIHsgZmxhZzogJ2EnIH0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSwgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi9idWlsZC1sb2ctbWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiBIdHRwRXJyb3IsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCA1MDBcbiAgY29uc3QgbG9nRGF0YSA9IHtcbiAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihidWlsZExvZ01lc3NhZ2UoJ0VSUk9SJywgcmVxdWVzdCwgbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgLy8gSGFuZGxlIGZpbGUgbG9nZ2luZ1xuICBpZiAoXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgJiZcbiAgICBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbGVQYXRoICYmXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nXG4gICkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cygnRVJST1InLCByZXF1ZXN0LCBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQWRkIG1ldHJpY3MgaWYgbm90IHByb3ZpZGVkXG4gIGlmICghZGF0YS5tZXRyaWNzKSB7XG4gICAgZGF0YS5tZXRyaWNzID0gZ2V0TWV0cmljcygpXG4gIH1cblxuICAvLyBBZGQgc3RhY2sgdHJhY2UgZm9yIGVycm9yc1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgIWRhdGEuc3RhY2spIHtcbiAgICBkYXRhLnN0YWNrID0gbmV3IEVycm9yKGBFcnJvcjogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApLnN0YWNrXG4gIH1cblxuICBjb25zdCBsb2dNZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgdHJ1ZSlcblxuICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW11cblxuICAvLyBIYW5kbGUgY29uc29sZSBsb2dnaW5nXG4gIGlmIChcbiAgICAhKFxuICAgICAgb3B0aW9ucz8uY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSB8fFxuICAgICAgb3B0aW9ucz8uY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXJcbiAgICApXG4gICkge1xuICAgIGNvbnNvbGUubG9nKGxvZ01lc3NhZ2UpXG4gIH1cblxuICAvLyBIYW5kbGUgZmlsZSBsb2dnaW5nXG4gIGlmIChcbiAgICAhb3B0aW9ucz8uY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSAmJlxuICAgIG9wdGlvbnM/LmNvbmZpZz8ubG9nRmlsZVBhdGggJiZcbiAgICAhb3B0aW9ucz8uY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmdcbiAgKSB7XG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIGxvZ1RvRmlsZShcbiAgICAgICAgb3B0aW9ucy5jb25maWcubG9nRmlsZVBhdGgsXG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBkYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXI6IExvZ2dlciA9IHtcbiAgICBzdG9yZTogdW5kZWZpbmVkLFxuICAgIGxvZzogKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSkgPT5cbiAgICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogYXN5bmMgKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT5cbiAgICAgIGF3YWl0IGhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGN1c3RvbUxvZ0Zvcm1hdDogb3B0aW9ucz8uY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQsXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0lORk8nLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgICdFUlJPUicsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiA1MDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICAnV0FSTklORycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvZ2dlclxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZUNFVCxJQUFNLEVBQWdCLENBQUMsRUFBYyxJQUEwQixDQUM3RCxJQUFNLEVBQWdCLEtBQUssSUFBSSxHQUFJLEVBQVEsRUFBSyxRQUFVLENBQUMsRUFDckQsRUFBVSxJQUFJLE9BQU8sQ0FBYSxFQUN4QyxNQUFPLEdBQUcsSUFBVSxJQUFPLElBQVUsT0FBTyxDQUFLLEdBR25ELFNBQXdCLENBQVcsQ0FBQyxFQUFnQixFQUF5QixDQUMzRSxJQUFNLEVBQVcsR0FBUSxVQUFZLFlBQy9CLEVBQU8sR0FBUSxNQUFRLEtBQ3ZCLEVBQVcsR0FBUSxVQUFZLE9BR3JDLEdBRm1CLEdBQVMsUUFBUSx1QkFBeUIsU0FFN0MsQ0FFZCxJQUFNLEVBQVUscUNBQTBCLE9BQWMsS0FBWSxJQUM5RCxFQUFXLEtBQUssSUFBSSxHQUFjLEVBQVEsTUFBTSxFQUFJLEVBQ3BELEVBQVMsSUFBRyxPQUFPLENBQVEsRUFDM0IsRUFBWSxFQUFjLEdBQUksQ0FBUSxFQUU1QyxRQUFRLElBQUk7QUFBQSxTQUNSO0FBQUEsU0FD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
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=
package/package.json CHANGED
@@ -1,98 +1,52 @@
1
1
  {
2
2
  "name": "logixlysia",
3
- "version": "5.2.0",
3
+ "version": "6.0.0",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
7
  "files": [
8
+ "src",
10
9
  "dist",
11
- "README.md",
12
- "LICENSE"
10
+ "README.md"
13
11
  ],
14
- "author": "PunGrumpy",
15
- "publisher": "PunGrumpy",
16
- "maintainers": [
17
- "PunGrumpy"
18
- ],
19
- "contributors": [
20
- {
21
- "name": "n0ky4",
22
- "url": "https://github.com/n0ky4"
23
- }
24
- ],
25
- "publishConfig": {
26
- "access": "public"
27
- },
28
- "license": "MIT",
29
12
  "scripts": {
30
- "lint": "ultracite lint",
31
- "format": "ultracite format",
32
- "test": "bun test --timeout 5000",
33
- "test:ci": "bun test --timeout 5000 --coverage --coverage-reporter=lcov",
34
- "dev": "cd website && bun dev",
35
- "prepare": "husky",
36
- "test:coverage": "bun test --timeout 5000 --coverage",
37
- "clean": "git clean -fdx",
13
+ "dev": "bunup --watch",
38
14
  "build": "bunup",
39
- "build:watch": "bunup --watch"
40
- },
41
- "os": [
42
- "darwin",
43
- "linux",
44
- "win32"
45
- ],
46
- "badges": [
47
- {
48
- "name": "npm",
49
- "url": "https://img.shields.io/npm/v/logixlysia.svg",
50
- "description": "npm version",
51
- "href": "https://www.npmjs.com/package/logixlysia"
52
- },
53
- {
54
- "name": "npm",
55
- "url": "https://img.shields.io/npm/dt/logixlysia.svg",
56
- "description": "npm downloads",
57
- "href": "https://www.npmjs.com/package/logixlysia"
58
- },
59
- {
60
- "name": "GitHub issues",
61
- "url": "https://img.shields.io/github/issues/PunGrumpy/logixlysia.svg",
62
- "description": "GitHub issues",
63
- "href": "https://github.com/PunGrumpy/logixlysia/issues"
64
- }
65
- ],
66
- "repository": {
67
- "type": "git",
68
- "url": "git+https://github.com/PunGrumpy/logixlysia.git"
15
+ "test": "bun test",
16
+ "test:coverage": "bun test --coverage --coverage-reporter=lcov",
17
+ "clean": "git clean -fdx .turbo dist node_modules coverage",
18
+ "typecheck": "tsc --noEmit --emitDeclarationOnly false"
69
19
  },
20
+ "author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
70
21
  "bugs": {
71
22
  "url": "https://github.com/PunGrumpy/logixlysia/issues"
72
23
  },
73
24
  "homepage": "https://logixlysia.vercel.app",
74
25
  "keywords": [
75
- "web",
76
- "logging",
77
- "logger",
78
- "elysia",
79
- "elysiajs",
80
26
  "logixlysia",
81
- "middleware"
27
+ "elysiajs",
28
+ "logger"
82
29
  ],
30
+ "license": "MIT",
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org/"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/PunGrumpy/logixlysia.git"
38
+ },
83
39
  "dependencies": {
84
- "chalk": "^5.3.0",
85
- "elysia": "^1.1.23"
40
+ "chalk": "^5.6.2",
41
+ "elysia": "^1.4.19",
42
+ "pino": "^10.1.0",
43
+ "pino-pretty": "^13.1.3"
86
44
  },
87
45
  "devDependencies": {
88
- "@biomejs/biome": "2.0.5",
89
- "bun-types": "^1.1.33",
90
- "bunup": "^0.8.48",
91
- "globals": "^16.0.0",
92
- "husky": "^9.1.6",
93
- "ultracite": "^5.0.10"
46
+ "@types/bun": "^1.3.5",
47
+ "bunup": "^0.16.11"
94
48
  },
95
49
  "peerDependencies": {
96
- "typescript": "^5.2.2"
50
+ "typescript": "^5.9.3"
97
51
  }
98
52
  }
@@ -0,0 +1,26 @@
1
+ import elysiaPkg from 'elysia/package.json'
2
+
3
+ const centerText = (text: string, width: number): string => {
4
+ if (text.length >= width) {
5
+ return text.slice(0, width)
6
+ }
7
+
8
+ const left = Math.floor((width - text.length) / 2)
9
+ const right = width - text.length - left
10
+ return `${' '.repeat(left)}${text}${' '.repeat(right)}`
11
+ }
12
+
13
+ export const renderBanner = (message: string): string => {
14
+ const versionLine = `Elysia v${elysiaPkg.version}`
15
+ const contentWidth = Math.max(message.length, versionLine.length)
16
+ const innerWidth = contentWidth + 4 // 2 spaces padding on both sides
17
+
18
+ const top = `┌${'─'.repeat(innerWidth)}┐`
19
+ const bot = `└${'─'.repeat(innerWidth)}┘`
20
+ const empty = `│${' '.repeat(innerWidth)}│`
21
+
22
+ const versionRow = `│${centerText(versionLine, innerWidth)}│`
23
+ const messageRow = `│ ${message}${' '.repeat(Math.max(0, innerWidth - message.length - 4))} │`
24
+
25
+ return [top, empty, versionRow, empty, messageRow, empty, bot].join('\n')
26
+ }
@@ -0,0 +1,28 @@
1
+ import type { Options } from '../interfaces'
2
+ import { renderBanner } from './banner'
3
+
4
+ export const startServer = (
5
+ server: { port?: number; hostname?: string; protocol?: string | null },
6
+ options: Options
7
+ ): void => {
8
+ const showStartupMessage = options.config?.showStartupMessage ?? true
9
+ if (!showStartupMessage) {
10
+ return
11
+ }
12
+
13
+ const { port, hostname, protocol } = server
14
+ if (port === undefined || !hostname || !protocol) {
15
+ return
16
+ }
17
+
18
+ const url = `${protocol}://${hostname}:${port}`
19
+ const message = `🦊 Elysia is running at ${url}`
20
+
21
+ const format = options.config?.startupMessageFormat ?? 'banner'
22
+ if (format === 'simple') {
23
+ console.log(message)
24
+ return
25
+ }
26
+
27
+ console.log(renderBanner(message))
28
+ }