logixlysia
Version:
🦊 Logixlysia is a logger for Elysia
10 lines (9 loc) • 133 kB
JavaScript
import{Elysia as g$}from"elysia";var A0={dev:{showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0,showContextTree:!0,pino:{prettyPrint:!0}},prod:{showStartupMessage:!1,useColors:!1,showContextTree:!1,autoRedact:!0,pino:{prettyPrint:!1}},json:{showStartupMessage:!1,useColors:!1,showContextTree:!1,pino:{prettyPrint:!1}}},w0=($,W)=>{if(!W)return $;let N={...$,...W};if($.pino||W.pino)N.pino={...$.pino,...W.pino,...$.pino?.prettyPrint!==void 0||W.pino?.prettyPrint!==void 0?{prettyPrint:W.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||W.logFilter)N.logFilter={...$.logFilter,...W.logFilter};if($.logRotation||W.logRotation)N.logRotation={...$.logRotation,...W.logRotation};if($.timestamp||W.timestamp)N.timestamp={...$.timestamp,...W.timestamp};return N},e=($={})=>{let W=$.preset;if(!W)return $;let N=A0[W];return{...$,config:w0(N,$.config)}};var p=()=>{let $=new WeakMap,W=(N)=>{let Q=$.get(N);if(!Q)Q={},$.set(N,Q);return Q};return{mergeContext(N,Q){if(Object.keys(Q).length===0)return;let Z=W(N);Object.assign(Z,Q)},getContext(N){let Q=$.get(N);return Q?{...Q}:{}},clearContext(N){$.delete(N)}}},g=($,W)=>{let N=$.context,Q=Object.keys(W).length>0,Z=N!==void 0&&N!==null&&typeof N==="object"&&!Array.isArray(N)&&Object.keys(N).length>0;if(!(Q||Z))return $;let H={...W,...Z?N:{}};return{...$,context:H}};import{createRequire as H0}from"node:module";var E0=(()=>{try{return H0(import.meta.url)("elysia/package.json")}catch{return{}}})(),S0=(()=>{try{return H0(import.meta.url)("../../package.json")}catch{return{}}})(),L0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},X0=($,W)=>{let N=E0.version,Q=N?`Elysia v${N}`:"Elysia",Z=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(W)Z.push({kind:"left",text:W});Z.push({kind:"empty"});let J=Math.max(Q.length,$.length,...W?[W.length]:[0])+4,j=`┌${"─".repeat(J)}┐`,X=`└${"─".repeat(J)}┘`,z=`│${" ".repeat(J)}│`,K=[j];for(let Y of Z){if(Y.kind==="empty"){K.push(z);continue}if(Y.kind==="center"){K.push(`│${L0(Y.text,J)}│`);continue}let V=Y.text,M=Math.max(0,J-V.length-4);K.push(`│ ${V}${" ".repeat(M)} │`)}return K.push(X),K.join(`
`)},z0=()=>{let $=S0.version;if(!$)return null;return` logixlysia v${$}`};var $0=($,W)=>{if(!(W.config?.showStartupMessage??!0))return;let{port:Q,hostname:Z,protocol:H}=$;if(Q===void 0||!Z||!H)return;let J=`${H}://${Z}:${Q}`,j=`\uD83E\uDD8A Elysia is running at ${J}`,X=`\uD83E\uDD8A ${J}`;if((W.config?.startupMessageFormat??"banner")==="simple"){console.log(j);return}console.log(X0(X,z0()))};import T0 from"pino";var d=(...$)=>{let W=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:N,request:Q,data:Z,store:H,options:J}=W,j=J.config?.transports??[];if(j.length===0)return;let X=typeof Z.message==="string"?Z.message:"",z={request:{method:Q.method,url:Q.url},...Z,beforeTime:H.beforeTime};for(let K of j)try{let Y=K.log(N,X,z);if(Y&&typeof Y.catch==="function")Y.catch(()=>{})}catch{}};import{appendFile as i0}from"node:fs/promises";import{dirname as o0}from"node:path";import{promises as k0}from"node:fs";var K0=async($)=>{await k0.mkdir($,{recursive:!0})};import{promises as _}from"node:fs";import{promisify as P0}from"node:util";import{gzip as c0}from"node:zlib";import{promises as W0}from"node:fs";import{basename as y0,dirname as f0}from"node:path";var C0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,q0=/^(\d+)(h|d|w)$/i,x0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,Y0=($)=>{if(typeof $==="number")return $;let W=$.trim(),N=Number(W);if(Number.isFinite(N))return N;let Q=W.match(C0);if(!Q)throw Error(`Invalid size format: ${$}`);let Z=Number(Q[1]),H=Q[2].toLowerCase(),J=1024;if(H.startsWith("m"))J=1048576;else if(H.startsWith("g"))J=1073741824;return Math.floor(Z*J)},m0=($)=>{let W=$.trim().match(q0);if(!W)throw Error(`Invalid interval format: ${$}`);let N=Number(W[1]),Q=W[2].toLowerCase(),Z=3600000;if(Q==="d")Z=86400000;else if(Q==="w")Z=604800000;return N*Z},I0=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:m0($)}},B0=async($,W)=>{try{return(await W0.stat($)).size>W}catch{return!1}},N0=async($)=>{let W=f0($),N=y0($),Q;try{Q=await W0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&x0.test(Z)).map((Z)=>`${W}/${Z}`)};var h0=P0(c0),n=new Map,v0=($)=>{let W=n.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return n.set($,Q),()=>{if(N?.(),n.get($)===Q)n.delete($)}})},x=($)=>String($).padStart(2,"0"),p0=($,W)=>{let N=W.getFullYear(),Q=x(W.getMonth()+1),Z=x(W.getDate()),H=x(W.getHours()),J=x(W.getMinutes()),j=x(W.getSeconds()),X=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${H}-${J}-${j}-${X}`},g0=async($)=>{try{if((await _.stat($)).size===0)return""}catch{return""}let N=`${p0($,new Date)}-${process.hrtime.bigint()}`;return await _.rename($,N),N},d0=async($)=>{let W=await v0($);try{try{await _.access($)}catch{return}let N=await _.readFile($),Q=await h0(N);await _.writeFile(`${$}.gz`,Q),await _.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},G0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=Y0(W.maxSize);return await B0($,N)},n0=async($,W)=>{let N=await N0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(j)=>({path:j,stat:await _.stat(j)})))).filter((j)=>j.status==="fulfilled").map((j)=>j.value);if(Z.length<=W)return;Z.sort((j,X)=>X.stat.mtimeMs-j.stat.mtimeMs);let H=Z.slice(W);(await Promise.allSettled(H.map(({path:j})=>_.rm(j,{force:!0})))).forEach((j,X)=>{if(j.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${H[X].path}:`,j.reason)})},u0=async($,W)=>{let N=await N0($);if(N.length===0)return;let Q=Date.now(),J=(await Promise.allSettled(N.map(async(X)=>({path:X,stat:await _.stat(X)})))).filter((X)=>X.status==="fulfilled").map((X)=>X.value).filter(({stat:X})=>Q-X.mtimeMs>W);(await Promise.allSettled(J.map(({path:X})=>_.rm(X,{force:!0})))).forEach((X,z)=>{if(X.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${J[z].path}:`,X.reason)})},V0=async($,W)=>{let N=await g0($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await d0(N)}if(W.maxFiles!==void 0){let Z=I0(W.maxFiles);if(Z.type==="count")await n0($,Z.value);else await u0($,Z.value)}};var u=new Map,s0=($)=>{let W=u.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return u.set($,Q),()=>{if(N?.(),u.get($)===Q)u.delete($)}})},i=async(...$)=>{let W=typeof $[0]==="string"?(()=>{let[R,b,T,A,w,L]=$;return{filePath:R,level:b,request:T,data:A,store:w,options:L}})():$[0],{filePath:N,level:Q,request:Z,data:H,store:J,options:j}=W,X=j.config,z=X?.useTransportsOnly===!0,K=X?.disableFileLogging===!0;if(z||K)return;let Y=typeof H.message==="string"?H.message:"",V=J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6,M="/";try{let{pathname:R,search:b}=new URL(Z.url);M=X?.logQueryParams?`${R}${b}`:R}catch{M=Z.url}let F=`${Q} ${V.toFixed(2)}ms ${Z.method} ${M} ${Y}
`,U=await s0(N);try{try{await K0(o0(N)),await i0(N,F,{encoding:"utf-8"})}catch(T){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,T),T}let R=X?.logRotation;if(!R)return;if(await G0(N,R))try{await V0(N,R)}catch(T){console.error(`[logixlysia] Failed to rotate log file ${N}:`,T)}}finally{U()}};var l0=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,r0=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,a0=/\b(?:\d[ -]*?){13,19}\b/g,t0=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var Q0=($)=>D($).replaceAll("[REDACTED]","redacted"),e0=($)=>{try{let W=new URL($);if(W.username!=="")W.username=Q0(W.username);if(W.password!=="")W.password=Q0(W.password);return W.hostname=Q0(W.hostname),W.pathname=D(W.pathname),W.search=D(W.search),W.hash=D(W.hash),W.toString()}catch{return D($).replaceAll("[REDACTED]","redacted")}},$$=($)=>{if($.length<13||$.length>19)return!1;let W=0,N=!1;for(let Q=$.length-1;Q>=0;Q--){let Z=$.charCodeAt(Q);if(Z<48||Z>57)return!1;let H=Z-48;if(N){if(H*=2,H>9)H-=9}W+=H,N=!N}return W%10===0},W$=($)=>$.replace(a0,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&$$(N))return"[REDACTED]";return W}),D=($)=>{let W=$;return W=W.replace(l0,"[REDACTED]"),W=W.replace(r0,"[REDACTED]"),W=W$(W),W=W.replace(t0,"[REDACTED]"),W},N$=($,W)=>{let N=D($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=D($.stack);let H=$;for(let J of Object.keys(H))if(J!=="message"&&J!=="name"&&J!=="stack")Z[J]=o(H[J],W);return Z},Q$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q++)N[Q]=o($[Q],W);return N},Z$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=o($[Q],W);return N},Z0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},o=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return D($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return Z0(Q,W,()=>N$($,W));if(Array.isArray($))return Z0(Q,W,()=>Q$($,W));return Z0(Q,W,()=>Z$($,W))},s=($)=>o($,new WeakSet),l=($)=>{let W=e0($.url),N=new Headers,Q=!1;for(let[X,z]of $.headers.entries()){let K=D(z);if(K!==z)Q=!0;N.set(X,K)}let Z=D($.method),H=W!==$.url,J=Z!==$.method;if(!(H||Q||J))return $;let j={method:Z,headers:N,redirect:$.redirect,signal:$.signal};if($.body!==null)j.body=$.body,j.duplex="half";return new Request(W,j)};import{STATUS_CODES as G$}from"node:http";import I from"chalk";import{StatusMap as J$}from"elysia";var j$=/^\d+$/,H$=/[_-]+/g,X$=/([a-z0-9])([A-Z])/g,z$=/([A-Z])([A-Z][a-z])/g,K$=/['’]/g,Y$=/[^a-z0-9\s]+/g,I$=/\s+/g,M0=($)=>{let W=$.trim();if(!W)return"";return W.replace(H$," ").replace(X$,"$1 $2").replace(z$,"$1 $2").replace(K$,"").toLowerCase().replace(Y$," ").replace(I$," ").trim()},B$=(()=>{let $=new Map;for(let[W,N]of Object.entries(J$))$.set(M0(W),N);return $})(),R0=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(j$.test(W))return Number(W);return B$.get(M0(W))??500}return 500};var r=($)=>{let W="An error occurred";if($ instanceof Error)W=$.message;else if($&&typeof $==="object"&&"message"in $)W=$.message;else W=String($);return W};var m=($)=>String($).padStart(2,"0"),V$=($)=>String($).padStart(3,"0"),M$=500,R$=1000,F$=7,O$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",U$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed)\}/g,F0=($)=>{let N=$.config?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},T$=($,W)=>{if(!W)return $.toISOString();let N=String($.getFullYear()),Q=m($.getMonth()+1),Z=m($.getDate()),H=m($.getHours()),J=m($.getMinutes()),j=m($.getSeconds()),X=V$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",H).replaceAll("MM",J).replaceAll("ss",j).replaceAll("SSS",X)},b$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},_$=($)=>{if($>=1000){let W=$/1000;if(W>=10)return`${Math.round(W)}s`;let N=W.toFixed(1);return N.endsWith(".0")?`${Math.round(W)}s`:`${N}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},D$=($)=>{let W=$.config;return{slow:W?.slowThreshold??M$,verySlow:W?.verySlowThreshold??R$}},A$=($,W,N)=>{let Q=_$($),{slow:Z,verySlow:H}=D$(N),J=$>=H;if(!W)return{text:Q,isVerySlow:J};let j=Q;if($<Z)j=I.green(Q);else if($<H)j=I.yellow(Q);else j=I.red.bold(Q);return{text:j,isVerySlow:J}},w$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${I.yellow(N)}`},E$=($,W)=>{if(!W)return"\uD83E\uDD8A";if($==="ERROR")return I.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return I.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return I.bgBlue.black(" \uD83E\uDD8A ");return I.bgGreen.black(" \uD83E\uDD8A ")},S$=($,W)=>{if(!W)return $;if($==="ERROR")return I.bgRed.black($);if($==="WARNING")return I.bgYellow.black($);if($==="DEBUG")return I.bgBlue.black($);return I.bgGreen.black($)},L$=($,W)=>{if(!W)return $;let N=$.toUpperCase();if(N==="GET")return I.green.bold(N);if(N==="POST")return I.blue.bold(N);if(N==="PUT")return I.yellow.bold(N);if(N==="PATCH")return I.yellowBright.bold(N);if(N==="DELETE")return I.red.bold(N);if(N==="OPTIONS")return I.cyan.bold(N);if(N==="HEAD")return I.greenBright.bold(N);if(N==="TRACE")return I.magenta.bold(N);if(N==="CONNECT")return I.cyanBright.bold(N);return I.white.bold(N)},k$=($,W)=>{if(!W)return $;let N=Number.parseInt($,10);if(!Number.isFinite(N))return $;if(N>=500)return I.red($);if(N>=400)return I.yellow($);if(N>=300)return I.cyan($);if(N>=200)return I.green($);return I.gray($)},y$=($,W)=>{if(!W)return $;return I.gray($)},f$=($,W)=>{if(!W)return $;return I.whiteBright($)},C$=($)=>{return G$[$]??""},q$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${I.dim(Q)} `},x$=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},m$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),O0=($,W,N)=>{let Q=[];for(let[Z,H]of Object.entries($)){let J=W?`${W}.${Z}`:Z;if(m$(H)&&N>1)Q.push(...O0(H,J,N-1));else Q.push([J,x$(H)])}return Q},P$=($,W)=>{if($.length===0)return[];let N=[],Q=$.length-1;for(let Z=0;Z<$.length;Z++){let H=Z===Q?"└─":"├─",J=$[Z];if(!J)continue;let[j,X]=J,z=W?I.cyan(j):j,K=W?I.white(X):X;N.push(` ${H} ${z} ${K}`)}return N};var c$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=F0(N),Z=N.config?.contextDepth??1,H=[],J=W.context;if(J&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0&&Z>=1)H.push(...O0(J,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0){let j=r(W.error);if(j)H.push(["error",j])}return P$(H,Q)},h$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},a=({level:$,request:W,data:N,store:Q,options:Z})=>{let H=Z.config,J=F0(Z),j=H?.customLogFormat??O$,X=new Date,z=String(X.getTime()),K=T$(X,H?.timestamp?.translateTime),Y=y$(K,J),V=typeof N.message==="string"?N.message:"",M=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,F,U;try{let q=new URL(W.url);F=q.pathname,U=q.search}catch{F=W.url||"/",U=""}let R=U,b=H?.logQueryParams?`${F}${R}`:F,T=N.status,A=T===null||T===void 0?200:R0(T),w=String(A),L=H?.ip===!0?b$(W):"",P=H?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":h$(N.context),k=S$($,J),B=W.method.toUpperCase().padEnd(F$),G=L$(B,J),O=f$(b,J),E=k$(w,J),{text:y,isVerySlow:f}=A$(M,J,Z),C=w$(f,J),c=E$($,J),h=C$(A),S=q$(Z,J),v={"{now}":Y,"{epoch}":z,"{level}":k,"{icon}":c,"{duration}":y,"{method}":G,"{pathname}":O,"{path}":O,"{query}":R,"{status}":E,"{statusText}":h,"{message}":V,"{ip}":L,"{context}":P,"{service}":S,"{speed}":C},_0=j.replace(U$,(q)=>v[q]??q),D0=c$($,N,Z);return{main:_0,contextLines:D0}};var v$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",U0=($,W,N,Q,Z)=>{let H=Q.config,J=H?.logFilter;if(J?.level&&J.level.length>0&&!J.level.includes("ERROR"))return;let j=H?.useTransportsOnly===!0,X=H?.disableInternalLogger===!0,z=H?.disableFileLogging===!0,K=v$(W)?W.status:500,Y=r(W),V="ERROR",M={status:K,message:Y,error:W},F=Z?g(M,Z.getContext($)):M,U=H?.autoRedact===!0?s(F):F,R=H?.autoRedact===!0?l($):$;if(d({level:V,request:R,data:U,store:N,options:Q}),!(j||z)){let w=H?.logFilePath;if(w)i({filePath:w,level:V,request:R,data:U,store:N,options:Q}).catch(()=>{})}if(j||X)return;let{main:b,contextLines:T}=a({level:V,request:R,data:U,store:N,options:Q}),A=T.length>0?`${b}
${T.join(`
`)}`:b;console.error(A)};var b0=($={},W=T0,N)=>{let Q=N??p(),Z=$.config,H=Z?.pino,{prettyPrint:J,...j}=H??{},X=typeof J==="object"&&J!==null?J:void 0,K=(J===!0||X!==void 0)&&j.transport===void 0,Y=X?.messageKey??j.messageKey,V=X?.errorKey??j.errorKey,M=K?{target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...X,messageKey:Y,errorKey:V}}:j.transport,F=W({...j,level:j.level??"info",messageKey:Y,errorKey:V,transport:M}),U=(B,G)=>{if(!G?.level||G.level.length===0)return!0;return G.level.includes(B)},R=Z?.useTransportsOnly===!0,b=Z?.disableInternalLogger===!0,T=Z?.disableFileLogging===!0,A=(Z?.transports?.length??0)>0,w=!(R||T)&&!!Z?.logFilePath,L=!(R||b),t=!(A||w||L),P=(B,G,O,E)=>{if(t||!U(B,Z?.logFilter))return;let y=g(O,Q.getContext(G)),f=Z?.autoRedact===!0?s(y):y,C=Z?.autoRedact===!0?l(G):G;if(A)d({level:B,request:C,data:f,store:E,options:$});if(w){let v=Z?.logFilePath;if(v)i({filePath:v,level:B,request:C,data:f,store:E,options:$}).catch(()=>{})}if(!L)return;let{main:c,contextLines:h}=a({level:B,request:C,data:f,store:E,options:$}),S=h.length>0?`${c}
${h.join(`
`)}`:c;switch(B){case"DEBUG":{console.debug(S);break}case"INFO":{console.info(S);break}case"WARNING":{console.warn(S);break}case"ERROR":{console.error(S);break}default:{console.log(S);break}}},k=(B,G,O,E)=>{if(t||!U(B,Z?.logFilter))return;let y={beforeTime:process.hrtime.bigint()};P(B,G,{message:O,context:E},y)};return{pino:F,mergeContext:(B,G)=>{Q.mergeContext(B,G)},getContext:(B)=>Q.getContext(B),log:P,handleHttpError:(B,G,O)=>{U0(B,G,O,$,Q)},debug:(B,G,O)=>{k("DEBUG",B,G,O)},info:(B,G,O)=>{k("INFO",B,G,O)},warn:(B,G,O)=>{k("WARNING",B,G,O)},error:(B,G,O)=>{k("ERROR",B,G,O)}}},J0=($,W)=>b0($,T0,W);var p$=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),j0=($,W,N)=>{let Q=new WeakMap,Z=(H,J,j,X,z)=>{let K=J,V={beforeTime:Q.get(K)??process.hrtime.bigint()},M=N.getContext(K),F=Object.keys(M).length>0||z?{...M,...z,wsId:J.id}:{wsId:J.id};W.log(H,p$(j),{message:X,context:F,status:200},V)};return(H,J)=>({...J,open(j){if(Q.set(j,process.hrtime.bigint()),J.open?.(j),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket opened")},message(j,X){if(J.message?.(j,X),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket message",{payloadType:typeof X})},close(j){if(J.close?.(j),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket closed");N.clearContext(j),Q.delete(j)}})};var d$=($={})=>{let W=e($),N=new WeakSet,Q=p(),Z=J0(W,Q),H=j0(W,Z,Q),J={...Z,debug:(z,K,Y)=>{N.add(z),Z.debug(z,K,Y)},info:(z,K,Y)=>{N.add(z),Z.info(z,K,Y)},warn:(z,K,Y)=>{N.add(z),Z.warn(z,K,Y)},error:(z,K,Y)=>{N.add(z),Z.error(z,K,Y)}},X=new g$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",J).state("pino",J.pino).state("beforeTime",BigInt(0)).onStart(({server:z})=>{if(z)$0(z,W);else{let K=Number(process.env.PORT)||3000,Y=process.env.HOST||"localhost";$0({port:K,hostname:Y,protocol:"http"},W)}}).onRequest(({store:z})=>{z.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:z,set:K,store:Y})=>{try{if(N.has(z))return;let V=typeof K.status==="number"?K.status:200,M="INFO";if(V>=500)M="ERROR";else if(V>=400)M="WARNING";let F=Q.getContext(z),U={status:V};if(Object.keys(F).length>0)U.context={...F};J.log(M,z,U,Y)}finally{Q.clearContext(z)}}).onError(({request:z,error:K,store:Y})=>{try{J.handleHttpError(z,K,Y)}finally{Q.clearContext(z)}}).as("scoped");return Object.assign(X,{wrapWs:H})},o2=d$;export{e as resolveOptions,d$ as logixlysia,o2 as default,j0 as createWsHandlerWrapper,J0 as createPluginLogger,b0 as createLogger};
//# debugId=AE2E6CC6E9342ED764756E2164756E21
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2xvZ2dlci9pbmRleC50cyIsICJzcmMvb3V0cHV0L2luZGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvdXRpbHMvcm90YXRpb24udHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgInNyYy93ZWJzb2NrZXQvd3JhcC13cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmUtb3B0aW9ucydcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbi8qKlxuICogRW1wdHkgc2luZ2xldG9uIHNsb3RzIG11c3Qgbm90IHVzZSBgUmVjb3JkPHN0cmluZywgbmV2ZXI+YDogaW50ZXJzZWN0aW5nIHRoYXQgd2l0aCBFbHlzaWEncyBgQ29udGV4dGBcbiAqIG1ha2VzIGV2ZXJ5IGtleSAoaW5jbHVkaW5nIGBzdG9yZWApIGJlY29tZSBgbmV2ZXJgIGJlY2F1c2UgZWFjaCBrZXkgaXMgbWVyZ2VkIHdpdGggYG5ldmVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXB0eUVseXNpYVNsb3Qge1xuICByZWFkb25seSBfX2xvZ2l4bHlzaWFFbXB0eT86IG5ldmVyXG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b24ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IEVtcHR5RWx5c2lhU2xvdFxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZS5zdG9yZWAgaXMgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YDsgYExvZ2l4bHlzaWFTdG9yZWAgaXMgaW50ZW50aW9uYWxseSBjbG9zZWQgKHNlZSAjMjIwKS5cbi8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzdG9yZSBpcyBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8JycsIExvZ2l4bHlzaWFTaW5nbGV0b24+XG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWFQbHVnaW4gPSBMb2dpeGx5c2lhICYge1xuICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKHJhd09wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWFQbHVnaW4gPT4ge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMocmF3T3B0aW9ucylcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyBzdG9yZSB9KSA9PiB7XG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IHR5cGUgTG9nUHJlc2V0ID0gJ2RldicgfCAncHJvZCcgfCAnanNvbidcblxuY29uc3QgUFJFU0VUX0RFRkFVTFRTOiBSZWNvcmQ8TG9nUHJlc2V0LCBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4+ID0ge1xuICBkZXY6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIHByb2Q6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2UsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBhdXRvUmVkYWN0OiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAganNvbjoge1xuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5sb2dSb3RhdGlvbiB8fCBvdmVycmlkZS5sb2dSb3RhdGlvbikge1xuICAgIG1lcmdlZC5sb2dSb3RhdGlvbiA9IHtcbiAgICAgIC4uLmJhc2UubG9nUm90YXRpb24sXG4gICAgICAuLi5vdmVycmlkZS5sb2dSb3RhdGlvblxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLnRpbWVzdGFtcCB8fCBvdmVycmlkZS50aW1lc3RhbXApIHtcbiAgICBtZXJnZWQudGltZXN0YW1wID0ge1xuICAgICAgLi4uYmFzZS50aW1lc3RhbXAsXG4gICAgICAuLi5vdmVycmlkZS50aW1lc3RhbXBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkXG59XG5cbi8qKiBBcHBsaWVzIHByZXNldCBkZWZhdWx0czsgZXhwbGljaXQgYGNvbmZpZ2Aga2V5cyBvdmVycmlkZSBwcmVzZXQgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcHRpb25zID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IE9wdGlvbnMgPT4ge1xuICBjb25zdCBwcmVzZXQgPSBvcHRpb25zLnByZXNldFxuICBpZiAoIXByZXNldCkge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBjb25zdCBwcmVzZXRDb25maWcgPSBQUkVTRVRfREVGQVVMVFNbcHJlc2V0XVxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY29uZmlnOiBtZXJnZUNvbmZpZyhwcmVzZXRDb25maWcsIG9wdGlvbnMuY29uZmlnKVxuICB9XG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgPSAoKTogUmVxdWVzdENvbnRleHRTdG9yZSA9PiB7XG4gIGNvbnN0IGJhZ3MgPSBuZXcgV2Vha01hcDxDb250ZXh0S2V5LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKVxuXG4gIGNvbnN0IGdldE9yQ3JlYXRlID0gKGtleTogQ29udGV4dEtleSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBsZXQgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgIGlmICghYmFnKSB7XG4gICAgICBiYWcgPSB7fVxuICAgICAgYmFncy5zZXQoa2V5LCBiYWcpXG4gICAgfVxuICAgIHJldHVybiBiYWdcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VDb250ZXh0KGtleSwgcGFydGlhbCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhZyA9IGdldE9yQ3JlYXRlKGtleSlcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFnLCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICAgIHJldHVybiBiYWcgPyB7IC4uLmJhZyB9IDoge31cbiAgICB9LFxuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBlbHlzaWFQa2cudmVyc2lvblxuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcm93LnRleHRcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIHRleHQubGVuZ3RoIC0gNClcbiAgICBvdXQucHVzaChg4pSCICAke3RleHR9JHsnICcucmVwZWF0KHBhZGRpbmcpfSAg4pSCYClcbiAgfVxuICBvdXQucHVzaChib3QpXG4gIHJldHVybiBvdXQuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgdiA9IGxvZ2l4bHlzaWFQa2cudmVyc2lvblxuICBpZiAoIXYpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBgICAgICBsb2dpeGx5c2lhIHYke3Z9YFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lLCByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcbiAgY29uc3QgdXJsRGlzcGxheUxpbmUgPSBg8J+miiAgJHt1cmx9YFxuXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xuICBpZiAoZm9ybWF0ID09PSAnc2ltcGxlJykge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIodXJsRGlzcGxheUxpbmUsIGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSgpKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB7XG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHJlZGFjdCwgcmVkYWN0UmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vID0gcGlubyxcbiAgZXh0ZXJuYWxDb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb250ZXh0U3RvcmUgPSBleHRlcm5hbENvbnRleHRTdG9yZSA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XG5cbiAgY29uc3QgcHJldHR5UHJpbnRPcHRpb25zID1cbiAgICB0eXBlb2YgcHJldHR5UHJpbnQgPT09ICdvYmplY3QnICYmIHByZXR0eVByaW50ICE9PSBudWxsXG4gICAgICA/IChwcmV0dHlQcmludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZW5hYmxlUHJldHR5UHJpbnQgPVxuICAgIHByZXR0eVByaW50ID09PSB0cnVlIHx8IHByZXR0eVByaW50T3B0aW9ucyAhPT0gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxuICAgIGVuYWJsZVByZXR0eVByaW50ICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXG5cbiAgY29uc3QgbWVzc2FnZUtleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8ubWVzc2FnZUtleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgcGlub09wdGlvbnMubWVzc2FnZUtleVxuICBjb25zdCBlcnJvcktleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8uZXJyb3JLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBwaW5vT3B0aW9ucy5lcnJvcktleVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHNob3VsZFByZXR0eVByaW50XG4gICAgPyB7XG4gICAgICAgIHRhcmdldDogJ3Bpbm8tcHJldHR5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbG9yaXplOiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWUsXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgICAgIG1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIDogcGlub09wdGlvbnMudHJhbnNwb3J0XG5cbiAgY29uc3QgcGlub0xvZ2dlcjogUGlubyA9IHBpbm9GYWN0b3J5KHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXksXG4gICAgZXJyb3JLZXksXG4gICAgdHJhbnNwb3J0XG4gIH0pXG5cbiAgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgICBkYXRhLFxuICAgICAgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICApXG4gICAgY29uc3QgbG9nRGF0YSA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICAgIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICAgIGlmIChoYXNUcmFuc3BvcnRzKSB7XG4gICAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvKiBJZ25vcmUgZXJyb3JzICovXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgc3RvcmUsXG4gICAgICBvcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBtZXNzYWdlLCBjb250ZXh0IH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLFxuICAgIG1lcmdlQ29udGV4dDogKHJlcXVlc3QsIHBhcnRpYWwpID0+IHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbClcbiAgICB9LFxuICAgIGdldENvbnRleHQ6IHJlcXVlc3QgPT4gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCksXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucywgY29udGV4dFN0b3JlKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5pbnRlcmZhY2UgTG9nVG9UcmFuc3BvcnRzSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3RJbmZvLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8vIFBlci1maWxlIG11dGV4IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyByb3RhdGlvblxuY29uc3QgZmlsZUxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUxvY2sgPSAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICByZXR1cm4gcHJpb3IudGhlbigoKSA9PiB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxvY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwcmlvciBsb2NrIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgZmlsZUxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGZpbGVMb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5c