logixlysia 5.1.1 โ 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/index.cjs +12 -12
- package/dist/index.d.cts +22 -8
- package/dist/index.d.ts +22 -8
- package/dist/index.js +12 -12
- package/package.json +10 -8
package/README.md
CHANGED
|
@@ -28,6 +28,12 @@ const app = new Elysia({
|
|
|
28
28
|
},
|
|
29
29
|
ip: true,
|
|
30
30
|
logFilePath: './logs/example.log',
|
|
31
|
+
logRotation: {
|
|
32
|
+
maxSize: '10m',
|
|
33
|
+
interval: '1d',
|
|
34
|
+
maxFiles: '7d',
|
|
35
|
+
compress: true
|
|
36
|
+
},
|
|
31
37
|
customLogFormat:
|
|
32
38
|
'๐ฆ {now} {level} {duration} {method} {pathname} {status} {message} {ip} {epoch}',
|
|
33
39
|
logFilter: {
|
package/dist/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
var
|
|
2
|
-
โ${
|
|
3
|
-
โ${
|
|
4
|
-
โ${
|
|
5
|
-
โ${
|
|
6
|
-
โ${
|
|
7
|
-
โ${
|
|
8
|
-
โ${
|
|
9
|
-
`)}else console.log(`\uD83E\uDD8A Elysia is running at ${
|
|
10
|
-
`;await
|
|
1
|
+
var lr=require("node:module");var pr=Object.create;var{getPrototypeOf:mr,defineProperty:x,getOwnPropertyNames:J,getOwnPropertyDescriptor:ar}=Object,q=Object.prototype.hasOwnProperty;var S=(r,o,n)=>{n=r!=null?pr(mr(r)):{};let t=o||!r||!r.__esModule?x(n,"default",{value:r,enumerable:!0}):n;for(let s of J(r))if(!q.call(t,s))x(t,s,{get:()=>r[s],enumerable:!0});return t},A=new WeakMap,ir=(r)=>{var o=A.get(r),n;if(o)return o;if(o=x({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")J(r).map((t)=>!q.call(o,t)&&x(o,t,{get:()=>r[t],enumerable:!(n=ar(r,t))||n.enumerable}));return A.set(r,o),o};var Lr=(r,o)=>{for(var n in o)x(r,n,{get:o[n],enumerable:!0,configurable:!0,set:(t)=>o[n]=()=>t})};var Gr={};Lr(Gr,{logToTransports:()=>l,handleHttpError:()=>E,default:()=>cr,createLogger:()=>R});module.exports=ir(Gr);var gr=require("elysia");var F=(r,o)=>{let n=Math.max(0,(o-r.length)/2),t=" ".repeat(n);return`${t}${r}${t}`.padEnd(o)};function d(r,o){let n=r?.hostname??"localhost",t=r?.port??3000,s=r?.protocol??"http";if(o?.config?.startupMessageFormat!=="simple"){let c=`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`,p=Math.max(22,c.length)+4,y="โ".repeat(p),i=F("",p);console.log(`
|
|
2
|
+
โ${y}โ
|
|
3
|
+
โ${i}โ
|
|
4
|
+
โ${F("Elysia with Logixlysia",p)}โ
|
|
5
|
+
โ${i}โ
|
|
6
|
+
โ${F(c,p)}โ
|
|
7
|
+
โ${i}โ
|
|
8
|
+
โ${y}โ
|
|
9
|
+
`)}else console.log(`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`)}var f=S(require("chalk")),Q=require("elysia");function N(r){if(typeof r==="number")return r;return Q.StatusMap[r]||500}function v(r,o){let n=r.toString();if(!o)return n;if(r>=500)return f.default.red(n);if(r>=400)return f.default.yellow(n);if(r>=300)return f.default.cyan(n);if(r>=200)return f.default.green(n);return f.default.white(n)}var O=S(require("pino"));var W=S(require("chalk"));var m=S(require("chalk")),G={INFO:m.default.bgGreen.black,WARNING:m.default.bgYellow.black,ERROR:m.default.bgRed.black},K={GET:m.default.green,POST:m.default.yellow,PUT:m.default.blue,PATCH:m.default.magentaBright,DELETE:m.default.red,HEAD:m.default.cyan,OPTIONS:m.default.magenta};var B=S(require("chalk")),fr=[{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 M(r,o){let n=Number(process.hrtime.bigint()-r);for(let{unit:t,threshold:s,decimalPlaces:e}of fr)if(n>=s){let c=`${(n/s).toFixed(e)}${t}`.padStart(8).padEnd(16);return o?B.default.gray(c):c}return o?B.default.gray("0ns".padStart(8).padEnd(16)):"0ns".padStart(8).padEnd(16)}function $(r,o){let n=r.toUpperCase();return o?G[n]?.(n.padEnd(7))||n:n.padEnd(7)}function I(r,o){let n=K[r];return o&&n?n(r.padEnd(7)):r.padEnd(7)}function U(r){try{return new URL(r.url).pathname}catch{return}}var a=(r)=>r.toString().padStart(2,"0");function br(r){let o=r.getFullYear(),n=a(r.getMonth()+1),t=a(r.getDate()),s=a(r.getHours()),e=a(r.getMinutes()),g=a(r.getSeconds()),c=r.getMilliseconds().toString().padStart(3,"0");return`${o}-${n}-${t} ${s}:${e}:${g}.${c}`}function Or(r,o){let n={yyyy:r.getFullYear(),yy:r.getFullYear().toString().slice(-2),mm:a(r.getMonth()+1),dd:a(r.getDate()),HH:a(r.getHours()),MM:a(r.getMinutes()),ss:a(r.getSeconds()),SSS:a(r.getMilliseconds()),Z:-r.getTimezoneOffset()/60};return o.replace(/yyyy|yy|mm|dd|HH|MM|ss|SSS|Z/g,(t)=>(n[t]??"").toString())}function H(r,o){if(!o?.translateTime)return r.toISOString();if(o.translateTime===!0||o.translateTime==="SYS:STANDARD")return br(r);return Or(r,o.translateTime)}var yr="\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {context} {ip}";function xr(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 L(r,o,n,t,s,e=!0){let g=xr(e,s),c=new Date,p={now:g?W.default.bgYellow(W.default.black(H(c,s?.config?.timestamp))):H(c,s?.config?.timestamp),epoch:Math.floor(c.getTime()/1000).toString(),level:$(r,e),duration:M(t.beforeTime,e),method:I(o.method,e),pathname:U(o),status:v(n.status||200,e),message:n.message||"",context:n.context?(()=>{try{return JSON.stringify(n.context)}catch(i){return`[Error serializing context: ${i instanceof Error?i.message:"Unknown error"}]`}})():"",ip:s?.config?.ip&&o.headers.get("x-forwarded-for")?`IP: ${o.headers.get("x-forwarded-for")}`:""};return(s?.config?.customLogFormat||yr).replace(/{(\w+)}/g,(i,k)=>{if(k in p)return p[k]||"";return""})}async function l(r,o,n,t,s){if(!s?.config?.transports||s.config.transports.length===0)return;let e=L(r,o,n,t,s,!1),g=s.config.transports.map((c)=>c.log(r,e,{request:o,data:n,store:t}));await Promise.all(g)}var _=require("node:fs"),sr=require("node:path");var C=require("node:fs"),b=require("node:path"),Sr=/^(\d+(?:\.\d+)?)\s*([kmg])?b?$/,wr=/^(\d+)\s*([hdw])$/,Er=/^(\d+)\s*d$/;function X(r){if(typeof r==="number")return r;let o={k:1024,m:1048576,g:1073741824},n=r.toLowerCase().match(Sr);if(!n?.[1])throw Error(`Invalid size format: ${r}`);let t=Number.parseFloat(n[1]),s=n[2]??"";return Math.floor(t*(o[s]??1))}function T(r){let o={h:3600000,d:86400000,w:604800000},n=r.toLowerCase().match(wr);if(!n)throw Error(`Invalid interval format: ${r}`);let t=n[1],s=n[2];if(!t)throw Error(`Invalid interval format: ${r}`);if(!s)throw Error(`Invalid interval format: ${r}`);return Number.parseInt(t,10)*(o[s]??0)}function Z(r){if(typeof r==="number")return{type:"count",value:r};let o=r.toLowerCase().match(Er);if(o?.[1])return{type:"time",value:Number.parseInt(o[1],10)*24*60*60*1000};throw Error(`Invalid retention format: ${r}`)}async function Dr(r){try{return(await C.promises.stat(r)).mtime.getTime()}catch{return Date.now()}}var j=new Map;async function V(r,o){let n=Date.now(),t=j.get(r);if(t!==void 0)return n-t>=o;let s=await Dr(r);return j.set(r,s),n-s>=o}function h(r){j.set(r,Date.now())}async function z(r){let o=b.dirname(r),n=b.basename(r);try{let t=await C.promises.readdir(o),s=new RegExp(`^${n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.\\d{4}-\\d{2}-\\d{2}(-\\d{2}-\\d{2}-\\d{2})?(\\.gz)?$`),e=t.filter((c)=>s.test(c)).map((c)=>b.join(o,c));return(await Promise.all(e.map(async(c)=>{let p=await C.promises.stat(c);return{file:c,mtime:p.mtime.getTime()}}))).sort((c,p)=>p.mtime-c.mtime).map((c)=>c.file)}catch{return[]}}var u=require("node:fs"),P=require("node:stream/promises"),rr=require("node:zlib");function Rr(r,o){let n=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),s=String(o.getDate()).padStart(2,"0"),e=String(o.getHours()).padStart(2,"0"),g=String(o.getMinutes()).padStart(2,"0"),c=String(o.getSeconds()).padStart(2,"0");return`${r}.${n}-${t}-${s}-${e}-${g}-${c}`}async function kr(r){try{if((await u.promises.stat(r)).size===0)return"";let n=Rr(r,new Date);return await u.promises.rename(r,n),h(r),n}catch(o){if(o.code!=="ENOENT")console.error(`Failed to rotate log file ${r}:`,o);return""}}async function dr(r){try{let o=`${r}.gz`,n=u.createReadStream(r),t=u.createWriteStream(o),s=rr.createGzip();await P.pipeline(n,s,t),await u.promises.unlink(r)}catch(o){console.error(`Failed to compress file ${r}:`,o)}}async function vr(r,o){if(!o.maxFiles)return;try{let n=await z(r);if(n.length===0)return;let t=Z(o.maxFiles);if(t.type==="count"){let s=n.slice(t.value);await Promise.all(s.map((e)=>u.promises.unlink(e)))}else if(t.type==="time"){let s=Date.now()-t.value,e=await Promise.all(n.map(async(g)=>{return(await u.promises.stat(g)).mtime.getTime()<s?g:null}));await Promise.all(e.filter((g)=>g!==null).map((g)=>u.promises.unlink(g)))}}catch(n){console.error(`Failed to clean old log files for ${r}:`,n)}}async function or(r,o){try{let n=await kr(r);if(!n)return;if(o.compress)await dr(n);await vr(r,o)}catch(n){console.error(`Failed to perform rotation for ${r}:`,n)}}async function nr(r,o){try{await u.promises.access(r)}catch{return!1}if(o.maxSize)try{let n=X(o.maxSize);if((await u.promises.stat(r)).size>=n)return!0}catch(n){console.error(`Failed to check file size for ${r}:`,n)}if(o.interval)try{let n=T(o.interval),t=await u.promises.stat(r);if(Date.now()-t.mtimeMs>=n)return!0}catch(n){console.error(`Failed to check file age for ${r}:`,n)}return!1}var tr=new Set;async function Mr(r){let o=sr.dirname(r);if(!tr.has(o))await _.promises.mkdir(o,{recursive:!0}),tr.add(o)}async function $r(r,o){let n=o?.config?.logRotation;if(!n)return;let t=!1;if(n.maxSize)t=await nr(r,n);if(!t&&n.interval)try{let s=T(n.interval);t=await V(r,s)}catch(s){console.error("Invalid interval format in log rotation config:",s)}if(t)await or(r,n)}async function w(r,o,n,t,s,e){await Mr(r),await $r(r,e);let g=`${L(o,n,t,s,e,!1)}
|
|
10
|
+
`;await _.promises.appendFile(r,g,{flag:"a"})}var Y=(r,o)=>Array.isArray(r)?r.includes(o):r===o;function er(r,o,n,t){let s=t?.config?.logFilter;if(!s)return!0;return(!s.level||Y(s.level,r))&&(!s.status||Y(s.status,o))&&(!s.method||Y(s.method,n))}async function E(r,o,n,t){let e={status:o.status||500,message:o.message,stack:o.stack},g=[];if(!(t?.config?.useTransportsOnly||t?.config?.disableInternalLogger))console.error(L("ERROR",r,e,n,t));if(!t?.config?.useTransportsOnly&&t?.config?.logFilePath&&!t?.config?.disableFileLogging)g.push(w(t.config.logFilePath,"ERROR",r,e,n,t));if(t?.config?.transports?.length)g.push(l("ERROR",r,e,n,t));await Promise.all(g)}function Ir(){let r=process.memoryUsage().heapUsed/1024/1024,o=process.cpuUsage();return{memoryUsage:r,cpuUsage:o.user/1e6}}function Ur(r){return{level:r.level||"info",timestamp:r.timestamp??!0,messageKey:r.messageKey||"msg",errorKey:r.errorKey||"err",base:r.base||{pid:process.pid}}}function Hr(r){return O.default.transport({target:"pino-pretty",options:{colorize:!0,translateTime:"HH:MM:ss Z",ignore:"pid,hostname",...typeof r==="object"?r:{}}})}function Cr(r){let o=r?.config?.pino||{},{prettyPrint:n,transport:t,...s}=o,e={...Ur(o),...s};if(n)return O.default(e,Hr(n));if(t){if(typeof t==="object"&&"target"in t)return O.default(e,O.default.transport(t));console.warn("Invalid transport configuration provided, falling back to default")}return O.default(e)}function Tr(r){switch(r.toUpperCase()){case"DEBUG":return"debug";case"INFO":return"info";case"WARNING":case"WARN":return"warn";case"ERROR":return"error";default:return console.warn(`Unknown log level "${r}", defaulting to "info"`),"info"}}function Fr(r,o,n,t,s){let e=Tr(o),g=r[e],c=Boolean(s?.config?.pino?.transport||s?.config?.pino?.prettyPrint);if((!s?.config?.useTransportsOnly||c)&&typeof g==="function")g.call(r,n,t)}async function Nr(r,o,n,t,s,e){let g=[];if(!(s?.config?.useTransportsOnly||s?.config?.disableInternalLogger))console.log(e);if(!s?.config?.useTransportsOnly&&s?.config?.logFilePath&&!s?.config?.disableFileLogging)g.push(w(s.config.logFilePath,r,o,n,t,s));if(s?.config?.transports?.length)g.push(l(r,o,n,t,s));await Promise.all(g)}async function D(r,o,n,t,s,e){if(!er(o,t.status||200,n.method,e))return;if(!t.metrics)t.metrics=Ir();if(o==="ERROR"&&!t.stack){let ur=Error(t.message||"Unknown error");t.stack=ur.stack}let g=e?.config?.pino?.errorKey||"err",c=o==="ERROR"&&t.stack?{name:"Error",message:t.message||"Unknown error",stack:t.stack}:void 0,p=n.headers.get("x-forwarded-for"),y=e?.config?.ip&&p?p.split(",")[0]?.trim():void 0,i={method:n.method,url:n.url,status:t.status,message:t.message,context:t.context,metrics:t.metrics,duration:Number(process.hrtime.bigint()-s.beforeTime)/1e6,ip:y,[g]:c};Fr(r,o,i,t.message||"Request processed",e);let k=L(o,n,t,s,e,!0);await Nr(o,n,t,s,e,k)}function R(r){let o=Cr(r),n={store:void 0,pino:o,log:(t,s,e,g)=>D(o,t,s,e,g,r),handleHttpError:async(t,s,e)=>await E(t,s,e,r),customLogFormat:r?.config?.customLogFormat,info:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,D(o,"INFO",t,{message:s,context:e,status:200},c,r)},error:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,D(o,"ERROR",t,{message:s,context:e,status:500},c,r)},warn:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,D(o,"WARNING",t,{message:s,context:e,status:200},c,r)},debug:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,D(o,"DEBUG",t,{message:s,context:e,status:200},c,r)}};return n}function cr(r){let o=R(r);return new gr.Elysia({name:"Logixlysia"}).onStart((n)=>{if(r?.config?.showStartupMessage??!0)d(n.server,r)}).onRequest((n)=>{let t={...n.store,beforeTime:process.hrtime.bigint(),logger:o,pino:o.pino,hasCustomLog:!1};n.store=t,o.store=t}).onAfterHandle({as:"global"},({request:n,set:t,store:s})=>{let e=s;if(!e.hasCustomLog){let g=N(t.status||200);o.log("INFO",n,{status:g,message:String(t.headers?.["x-message"]||"")},e)}}).onError({as:"global"},async({request:n,error:t,set:s,store:e})=>{let g=N(s.status||500);await o.handleHttpError(n,{...t,status:g},e)})}
|
|
11
11
|
|
|
12
|
-
//# debugId=
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICIuLi9zcmMvaGVscGVycy9zdGF0dXMudHMiLCAiLi4vc3JjL2xvZ2dlci9idWlsZC1sb2ctbWVzc2FnZS50cyIsICIuLi9zcmMvaGVscGVycy9jb2xvci1tYXBwaW5nLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2R1cmF0aW9uLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2xvZy50cyIsICIuLi9zcmMvaGVscGVycy9tZXRob2QudHMiLCAiLi4vc3JjL2hlbHBlcnMvcGF0aC50cyIsICIuLi9zcmMvaGVscGVycy90aW1lc3RhbXAudHMiLCAiLi4vc3JjL291dHB1dC9jb25zb2xlLnRzIiwgIi4uL3NyYy9vdXRwdXQvZmlsZS50cyIsICIuLi9zcmMvbG9nZ2VyL2ZpbHRlci50cyIsICIuLi9zcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgIi4uL3NyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5cbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IEh0dHBFcnJvciwgT3B0aW9ucywgU2VydmVyLCBTdG9yZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9naXhseXNpYShvcHRpb25zPzogT3B0aW9ucyk6IEVseXNpYSB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxuXG4gIHJldHVybiBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYSdcbiAgfSlcbiAgICAub25TdGFydChjdHggPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucz8uY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICAgICAgaWYgKHNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgICAgICBzdGFydFNlcnZlcihjdHguc2VydmVyIGFzIFNlcnZlciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoY3R4ID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0ge1xuICAgICAgICAuLi5jdHguc3RvcmUsXG4gICAgICAgIGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpLFxuICAgICAgICBsb2dnZXI6IGxvZyxcbiAgICAgICAgaGFzQ3VzdG9tTG9nOiBmYWxzZVxuICAgICAgfVxuICAgICAgY3R4LnN0b3JlID0gc3RvcmVcbiAgICAgIGxvZy5zdG9yZSA9IHN0b3JlXG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSh7IGFzOiAnZ2xvYmFsJyB9LCAoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIGFzIFN0b3JlRGF0YVxuXG4gICAgICBpZiAoIXN0b3JlRGF0YS5oYXNDdXN0b21Mb2cpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDIwMClcbiAgICAgICAgbG9nLmxvZyhcbiAgICAgICAgICAnSU5GTycsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmcoc2V0LmhlYWRlcnM/LlsneC1tZXNzYWdlJ10gfHwgJycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdG9yZURhdGFcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoeyBhczogJ2dsb2JhbCcgfSwgKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDUwMClcbiAgICAgIGxvZy5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgLi4uZXJyb3IsIHN0YXR1cyB9IGFzIEh0dHBFcnJvcixcbiAgICAgICAgc3RvcmUgYXMgU3RvcmVEYXRhXG4gICAgICApXG4gICAgfSlcbn1cblxuZXhwb3J0IHR5cGUge1xuICBIdHRwRXJyb3IsXG4gIExvZ0RhdGEsXG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4vb3V0cHV0J1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNlcnZlciB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGNyZWF0ZUJveFRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFkZGluZ0xlbmd0aCA9IE1hdGgubWF4KDAsICh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZGRpbmdMZW5ndGgpXG4gIHJldHVybiBgJHtwYWRkaW5nfSR7dGV4dH0ke3BhZGRpbmd9YC5wYWRFbmQod2lkdGgpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0U2VydmVyKGNvbmZpZzogU2VydmVyLCBvcHRpb25zPzogT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBob3N0bmFtZSA9IGNvbmZpZz8uaG9zdG5hbWUgPz8gJ2xvY2FsaG9zdCdcbiAgY29uc3QgcG9ydCA9IGNvbmZpZz8ucG9ydCA/PyAzMDAwXG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnPy5wcm90b2NvbCA/PyAnaHR0cCdcbiAgY29uc3Qgc2hvd0Jhbm5lciA9IG9wdGlvbnM/LmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgIT09ICdzaW1wbGUnXG5cbiAgaWYgKHNob3dCYW5uZXIpIHtcbiAgICBjb25zdCB0aXRsZSA9ICdFbHlzaWEgd2l0aCBMb2dpeGx5c2lhJ1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgY29uc3QgYm94V2lkdGggPSBNYXRoLm1heCh0aXRsZS5sZW5ndGgsIG1lc3NhZ2UubGVuZ3RoKSArIDRcbiAgICBjb25zdCBib3JkZXIgPSAn4pSAJy5yZXBlYXQoYm94V2lkdGgpXG4gICAgY29uc3QgZW1wdHlMaW5lID0gY3JlYXRlQm94VGV4dCgnJywgYm94V2lkdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgXG4gICAgICDilIwke2JvcmRlcn3ilJBcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KHRpdGxlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUgiR7Y3JlYXRlQm94VGV4dChtZXNzYWdlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUlCR7Ym9yZGVyfeKUmFxuICAgIGApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKHN0YXR1czogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG4gIHJldHVybiAoU3RhdHVzTWFwIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3N0YXR1c10gfHwgNTAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXR1c1N0cmluZyhcbiAgc3RhdHVzOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzU3RyID0gc3RhdHVzLnRvU3RyaW5nKClcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzU3RyXG4gIH1cblxuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzU3RyKVxuICB9XG4gIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzU3RyKVxuICB9XG4gIHJldHVybiBjaGFsay53aGl0ZShzdGF0dXNTdHIpXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IHtcbiAgZHVyYXRpb25TdHJpbmcsXG4gIGZvcm1hdFRpbWVzdGFtcCxcbiAgbG9nU3RyaW5nLFxuICBtZXRob2RTdHJpbmcsXG4gIHBhdGhTdHJpbmcsXG4gIHN0YXR1c1N0cmluZ1xufSBmcm9tICcuLi9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dDb21wb25lbnRzLFxuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBkZWZhdWx0TG9nRm9ybWF0ID1cbiAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtjb250ZXh0fSB7aXB9J1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzOiBib29sZWFuLCBvcHRpb25zPzogT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy51c2VDb2xvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvcHRpb25zLmNvbmZpZy51c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiB1c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2dNZXNzYWdlKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgdXNlQ29sb3JzID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0dWFsbHlVc2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzLCBvcHRpb25zKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGNvbXBvbmVudHM6IExvZ0NvbXBvbmVudHMgPSB7XG4gICAgbm93OiBhY3R1YWxseVVzZUNvbG9yc1xuICAgICAgPyBjaGFsay5iZ1llbGxvdyhcbiAgICAgICAgICBjaGFsay5ibGFjayhmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCkpXG4gICAgICAgIClcbiAgICAgIDogZm9ybWF0VGltZXN0YW1wKG5vdywgb3B0aW9ucz8uY29uZmlnPy50aW1lc3RhbXApLFxuICAgIGVwb2NoOiBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygpLFxuICAgIGxldmVsOiBsb2dTdHJpbmcobGV2ZWwsIHVzZUNvbG9ycyksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uU3RyaW5nKHN0b3JlLmJlZm9yZVRpbWUsIHVzZUNvbG9ycyksXG4gICAgbWV0aG9kOiBtZXRob2RTdHJpbmcocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycyksXG4gICAgcGF0aG5hbWU6IHBhdGhTdHJpbmcocmVxdWVzdCksXG4gICAgc3RhdHVzOiBzdGF0dXNTdHJpbmcoZGF0YS5zdGF0dXMgfHwgMjAwLCB1c2VDb2xvcnMpLFxuICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSB8fCAnJyxcbiAgICBjb250ZXh0OiBkYXRhLmNvbnRleHRcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGBbRXJyb3Igc2VyaWFsaXppbmcgY29udGV4dDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31dYFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiAnJyxcbiAgICBpcDpcbiAgICAgIG9wdGlvbnM/LmNvbmZpZz8uaXAgJiYgcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgICAgICAgPyBgSVA6ICR7cmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJyl9YFxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBsb2dGb3JtYXQgPSBvcHRpb25zPy5jb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCB8fCBkZWZhdWx0TG9nRm9ybWF0XG5cbiAgcmV0dXJuIGxvZ0Zvcm1hdC5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5IGluIGNvbXBvbmVudHMpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRzW2tleSBhcyBrZXlvZiBMb2dDb21wb25lbnRzXSB8fCAnJ1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgdHlwZSB7IENvbG9yTWFwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVsQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBJTkZPOiBjaGFsay5iZ0dyZWVuLmJsYWNrLFxuICBXQVJOSU5HOiBjaGFsay5iZ1llbGxvdy5ibGFjayxcbiAgRVJST1I6IGNoYWxrLmJnUmVkLmJsYWNrXG59XG5cbmV4cG9ydCBjb25zdCBIdHRwTWV0aG9kQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBHRVQ6IGNoYWxrLmdyZWVuLFxuICBQT1NUOiBjaGFsay55ZWxsb3csXG4gIFBVVDogY2hhbGsuYmx1ZSxcbiAgUEFUQ0g6IGNoYWxrLm1hZ2VudGFCcmlnaHQsXG4gIERFTEVURTogY2hhbGsucmVkLFxuICBIRUFEOiBjaGFsay5jeWFuLFxuICBPUFRJT05TOiBjaGFsay5tYWdlbnRhXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuY29uc3QgdGltZVVuaXRzID0gW1xuICB7IHVuaXQ6ICdzJywgdGhyZXNob2xkOiAxZTksIGRlY2ltYWxQbGFjZXM6IDIgfSxcbiAgeyB1bml0OiAnbXMnLCB0aHJlc2hvbGQ6IDFlNiwgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICfCtXMnLCB0aHJlc2hvbGQ6IDFlMywgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICducycsIHRocmVzaG9sZDogMSwgZGVjaW1hbFBsYWNlczogMCB9XG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGR1cmF0aW9uU3RyaW5nKFxuICBiZWZvcmVUaW1lOiBiaWdpbnQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgbmFub3NlY29uZHMgPSBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBiZWZvcmVUaW1lKVxuXG4gIGZvciAoY29uc3QgeyB1bml0LCB0aHJlc2hvbGQsIGRlY2ltYWxQbGFjZXMgfSBvZiB0aW1lVW5pdHMpIHtcbiAgICBpZiAobmFub3NlY29uZHMgPj0gdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChuYW5vc2Vjb25kcyAvIHRocmVzaG9sZCkudG9GaXhlZChkZWNpbWFsUGxhY2VzKVxuICAgICAgY29uc3QgdGltZVN0ciA9IGAke3ZhbHVlfSR7dW5pdH1gLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbiAgICAgIHJldHVybiB1c2VDb2xvcnMgPyBjaGFsay5ncmF5KHRpbWVTdHIpIDogdGltZVN0clxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1c2VDb2xvcnNcbiAgICA/IGNoYWxrLmdyYXkoJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KSlcbiAgICA6ICcwbnMnLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBMb2dMZXZlbENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dTdHJpbmcobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsZXZlbFN0ciA9IGxldmVsLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gTG9nTGV2ZWxDb2xvck1hcFtsZXZlbFN0cl0/LihsZXZlbFN0ci5wYWRFbmQoNykpIHx8IGxldmVsU3RyXG4gICAgOiBsZXZlbFN0ci5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHsgSHR0cE1ldGhvZENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXRob2RTdHJpbmcoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yRnVuY3Rpb24gPSBIdHRwTWV0aG9kQ29sb3JNYXBbbWV0aG9kXVxuICByZXR1cm4gdXNlQ29sb3JzICYmIGNvbG9yRnVuY3Rpb25cbiAgICA/IGNvbG9yRnVuY3Rpb24obWV0aG9kLnBhZEVuZCg3KSlcbiAgICA6IG1ldGhvZC5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhTdHJpbmcoXG4gIHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mb1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0SW5mby51cmwpLnBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIHJldHVyblxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGltZXN0YW1wQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuLy8gY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gJ3l5eXktbW0tZGQgSEg6TU06c3MnXG5jb25zdCBTWVNfVElNRSA9ICdTWVM6U1RBTkRBUkQnXG5cbmNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcblxuZnVuY3Rpb24gZm9ybWF0U3lzdGVtVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgbWludXRlcyA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgbXMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKVxuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9LiR7bXN9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRDdXN0b21UaW1lKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge1xuICAgIHl5eXk6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICB5eTogZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgIG1tOiBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgZGQ6IHBhZChkYXRlLmdldERhdGUoKSksXG4gICAgSEg6IHBhZChkYXRlLmdldEhvdXJzKCkpLFxuICAgIE1NOiBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgIHNzOiBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpLFxuICAgIFNTUzogcGFkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLFxuICAgIFo6IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MFxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC95eXl5fHl5fG1tfGRkfEhIfE1NfHNzfFNTU3xaL2csIG1hdGNoID0+XG4gICAgKHRva2Vuc1ttYXRjaF0gPz8gJycpLnRvU3RyaW5nKClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZXN0YW1wKGRhdGU6IERhdGUsIGNvbmZpZz86IFRpbWVzdGFtcENvbmZpZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnPy50cmFuc2xhdGVUaW1lKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSB0cnVlIHx8IGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSBTWVNfVElNRSkge1xuICAgIHJldHVybiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGUpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0Q3VzdG9tVGltZShkYXRlLCBjb25maWcudHJhbnNsYXRlVGltZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9UcmFuc3BvcnRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzIHx8IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgZmFsc2UpXG5cbiAgY29uc3QgcHJvbWlzZXMgPSBvcHRpb25zLmNvbmZpZy50cmFuc3BvcnRzLm1hcCh0cmFuc3BvcnQgPT5cbiAgICB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCB7IHJlcXVlc3QsIGRhdGEsIHN0b3JlIH0pXG4gIClcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aClcbiAgY29uc3QgbG9nTWVzc2FnZSA9IGAke2J1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGZhbHNlKX1cXG5gXG4gIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGxvZ01lc3NhZ2UsIHsgZmxhZzogJ2EnIH0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVIdHRwRXJyb3IoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogSHR0cEVycm9yLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnJvci5zdGF0dXMgfHwgNTAwXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYnVpbGRMb2dNZXNzYWdlKCdFUlJPUicsIHJlcXVlc3QsIHsgc3RhdHVzOiBzdGF0dXNDb2RlIH0sIHN0b3JlLCBvcHRpb25zKVxuICApXG5cbiAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdXG5cbiAgaWYgKG9wdGlvbnM/LmNvbmZpZz8ubG9nRmlsZVBhdGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbG9nVG9GaWxlKFxuICAgICAgICBvcHRpb25zLmNvbmZpZy5sb2dGaWxlUGF0aCxcbiAgICAgICAgJ0VSUk9SJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBzdGF0dXM6IHN0YXR1c0NvZGUgfSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICApXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQWRkIG1ldHJpY3MgaWYgbm90IHByb3ZpZGVkXG4gIGlmICghZGF0YS5tZXRyaWNzKSB7XG4gICAgZGF0YS5tZXRyaWNzID0gZ2V0TWV0cmljcygpXG4gIH1cblxuICAvLyBBZGQgc3RhY2sgdHJhY2UgZm9yIGVycm9yc1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgIWRhdGEuc3RhY2spIHtcbiAgICBkYXRhLnN0YWNrID0gbmV3IEVycm9yKGBFcnJvcjogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApLnN0YWNrXG4gIH1cblxuICBjb25zdCBsb2dNZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgdHJ1ZSlcbiAgY29uc29sZS5sb2cobG9nTWVzc2FnZSlcblxuICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW11cblxuICBpZiAob3B0aW9ucz8uY29uZmlnPy5sb2dGaWxlUGF0aCkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXI6IExvZ2dlciA9IHtcbiAgICBzdG9yZTogdW5kZWZpbmVkLFxuICAgIGxvZzogKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSkgPT5cbiAgICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT5cbiAgICAgIGhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGN1c3RvbUxvZ0Zvcm1hdDogb3B0aW9ucz8uY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQsXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0lORk8nLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgICdFUlJPUicsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiA1MDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICAnV0FSTklORycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvZ2dlclxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIm96QkFBdUIsSUFBdkIsb0JDRUEsSUFBTSxFQUFnQixDQUFDLEVBQWMsSUFBMEIsQ0FDN0QsSUFBTSxFQUFnQixLQUFLLElBQUksR0FBSSxFQUFRLEVBQUssUUFBVSxDQUFDLEVBQ3JELEVBQVUsSUFBSSxPQUFPLENBQWEsRUFDeEMsTUFBTyxHQUFHLElBQVUsSUFBTyxJQUFVLE9BQU8sQ0FBSyxHQUduRCxTQUF3QixDQUFXLENBQUMsRUFBZ0IsRUFBeUIsQ0FDM0UsSUFBTSxFQUFXLEdBQVEsVUFBWSxZQUMvQixFQUFPLEdBQVEsTUFBUSxLQUN2QixFQUFXLEdBQVEsVUFBWSxPQUdyQyxHQUZtQixHQUFTLFFBQVEsdUJBQXlCLFNBRTdDLENBRWQsSUFBTSxFQUFVLHFDQUEwQixPQUFjLEtBQVksSUFDOUQsRUFBVyxLQUFLLElBQUksR0FBYyxFQUFRLE1BQU0sRUFBSSxFQUNwRCxFQUFTLElBQUcsT0FBTyxDQUFRLEVBQzNCLEVBQVksRUFBYyxHQUFJLENBQVEsRUFFNUMsUUFBUSxJQUFJO0FBQUEsU0FDUjtBQUFBLFNBQ0E7QUFBQSxTQUNB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S0FBTyxDQUVkLEdBRDJCLEdBQVMsUUFBUSxvQkFBc0IsR0FFaEUsRUFBWSxFQUFJLE9BQWtCLENBQU8sRUFFNUMsRUFDQSxVQUFVLEtBQU8sQ0FDaEIsSUFBTSxFQUFRLElBQ1QsRUFBSSxNQUNQLFdBQVksUUFBUSxPQUFPLE9BQU8sRUFDbEMsT0FBUSxFQUNSLGFBQWMsRUFDaEIsRUFDQSxFQUFJLE1BQVEsRUFDWixFQUFJLE1BQVEsRUFDYixFQUNBLGNBQWMsQ0FBRSxHQUFJLFFBQVMsRUFBRyxFQUFHLFVBQVMsTUFBSyxXQUFZLENBQzVELElBQU0sRUFBWSxFQUVsQixJQUFLLEVBQVUsYUFBYyxDQUMzQixJQUFNLEVBQVMsRUFBYyxFQUFJLFFBQVUsR0FBRyxFQUM5QyxFQUFJLElBQ0YsT0FDQSxFQUNBLENBQ0UsU0FDQSxRQUFTLE9BQU8sRUFBSSxVQUFVLGNBQWdCLEVBQUUsQ0FDbEQsRUFDQSxDQUNGLEdBRUgsRUFDQSxRQUFRLENBQUUsR0FBSSxRQUFTLEVBQUcsRUFBRyxVQUFTLFFBQU8sTUFBSyxXQUFZLENBQzdELElBQU0sRUFBUyxFQUFjLEVBQUksUUFBVSxHQUFHLEVBQzlDLEVBQUksZ0JBQ0YsRUFDQSxJQUFLLEVBQU8sUUFBTyxFQUNuQixDQUNGLEVBQ0QiLAogICJkZWJ1Z0lkIjogIjUwMTlGMTQyQzc2REU5OTI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
12
|
+
//# debugId=4E8C290D9DF35B1E64756E2164756E21
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL2xvZ2dlci9jcmVhdGUtbG9nZ2VyLnRzIiwgInNyYy9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UudHMiLCAic3JjL2hlbHBlcnMvY29sb3ItbWFwcGluZy50cyIsICJzcmMvaGVscGVycy9kdXJhdGlvbi50cyIsICJzcmMvaGVscGVycy9sb2cudHMiLCAic3JjL2hlbHBlcnMvbWV0aG9kLnRzIiwgInNyYy9oZWxwZXJzL3BhdGgudHMiLCAic3JjL2hlbHBlcnMvdGltZXN0YW1wLnRzIiwgInNyYy9vdXRwdXQvY29uc29sZS50cyIsICJzcmMvb3V0cHV0L2ZpbGUudHMiLCAic3JjL3V0aWxzL3JvdGF0aW9uLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvbG9nZ2VyL2ZpbHRlci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcblxuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBTZXJ2ZXIsIFN0b3JlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dpeGx5c2lhKG9wdGlvbnM/OiBPcHRpb25zKTogRWx5c2lhIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG5cbiAgcmV0dXJuIG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuICAgIC5vblN0YXJ0KGN0eCA9PiB7XG4gICAgICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zPy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gICAgICBpZiAoc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKGN0eC5zZXJ2ZXIgYXMgU2VydmVyLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdChjdHggPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB7XG4gICAgICAgIC4uLmN0eC5zdG9yZSxcbiAgICAgICAgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCksXG4gICAgICAgIGxvZ2dlcjogbG9nLFxuICAgICAgICBwaW5vOiBsb2cucGlubywgLy8gRXhwb3NlIFBpbm8gbG9nZ2VyIGRpcmVjdGx5XG4gICAgICAgIGhhc0N1c3RvbUxvZzogZmFsc2VcbiAgICAgIH1cbiAgICAgIGN0eC5zdG9yZSA9IHN0b3JlXG4gICAgICBsb2cuc3RvcmUgPSBzdG9yZVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJIYW5kbGUoeyBhczogJ2dsb2JhbCcgfSwgKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSBhcyBTdG9yZURhdGFcblxuICAgICAgaWYgKCFzdG9yZURhdGEuaGFzQ3VzdG9tTG9nKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCAyMDApXG4gICAgICAgIGxvZy5sb2coXG4gICAgICAgICAgJ0lORk8nLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nKHNldC5oZWFkZXJzPy5bJ3gtbWVzc2FnZSddIHx8ICcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RvcmVEYXRhXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKHsgYXM6ICdnbG9iYWwnIH0sIGFzeW5jICh7IHJlcXVlc3QsIGVycm9yLCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCA1MDApXG4gICAgICBhd2FpdCBsb2cuaGFuZGxlSHR0cEVycm9yKFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IC4uLmVycm9yLCBzdGF0dXMgfSBhcyBIdHRwRXJyb3IsXG4gICAgICAgIHN0b3JlIGFzIFN0b3JlRGF0YVxuICAgICAgKVxuICAgIH0pXG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgSHR0cEVycm9yLFxuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ2l4bHlzaWFDb250ZXh0LFxuICBMb2dMZXZlbCxcbiAgTG9nUm90YXRpb25Db25maWcsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU2VydmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgY3JlYXRlQm94VGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYWRkaW5nTGVuZ3RoID0gTWF0aC5tYXgoMCwgKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcGFkZGluZyA9ICcgJy5yZXBlYXQocGFkZGluZ0xlbmd0aClcbiAgcmV0dXJuIGAke3BhZGRpbmd9JHt0ZXh0fSR7cGFkZGluZ31gLnBhZEVuZCh3aWR0aClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoY29uZmlnOiBTZXJ2ZXIsIG9wdGlvbnM/OiBPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGhvc3RuYW1lID0gY29uZmlnPy5ob3N0bmFtZSA/PyAnbG9jYWxob3N0J1xuICBjb25zdCBwb3J0ID0gY29uZmlnPy5wb3J0ID8/IDMwMDBcbiAgY29uc3QgcHJvdG9jb2wgPSBjb25maWc/LnByb3RvY29sID8/ICdodHRwJ1xuICBjb25zdCBzaG93QmFubmVyID0gb3B0aW9ucz8uY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCAhPT0gJ3NpbXBsZSdcblxuICBpZiAoc2hvd0Jhbm5lcikge1xuICAgIGNvbnN0IHRpdGxlID0gJ0VseXNpYSB3aXRoIExvZ2l4bHlzaWEnXG4gICAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgICBjb25zdCBib3hXaWR0aCA9IE1hdGgubWF4KHRpdGxlLmxlbmd0aCwgbWVzc2FnZS5sZW5ndGgpICsgNFxuICAgIGNvbnN0IGJvcmRlciA9ICfilIAnLnJlcGVhdChib3hXaWR0aClcbiAgICBjb25zdCBlbXB0eUxpbmUgPSBjcmVhdGVCb3hUZXh0KCcnLCBib3hXaWR0aClcblxuICAgIGNvbnNvbGUubG9nKGBcbiAgICAgIOKUjCR7Ym9yZGVyfeKUkFxuICAgICAg4pSCJHtlbXB0eUxpbmV94pSCXG4gICAgICDilIIke2NyZWF0ZUJveFRleHQodGl0bGUsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KG1lc3NhZ2UsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSUJHtib3JkZXJ94pSYXG4gICAgYClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gKVxuICB9XG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoc3RhdHVzOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cbiAgcmV0dXJuIChTdGF0dXNNYXAgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPilbc3RhdHVzXSB8fCA1MDBcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhdHVzU3RyaW5nKFxuICBzdGF0dXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGF0dXNTdHIgPSBzdGF0dXMudG9TdHJpbmcoKVxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNTdHJcbiAgfVxuXG4gIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXNTdHIpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLndoaXRlKHN0YXR1c1N0cilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dnZXIgYXMgUGlub0xvZ2dlciB9IGZyb20gJ3Bpbm8nXG5pbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vQ29uZmlnLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQaW5vQ29uZmlnKHBpbm9Db25maWc6IFBpbm9Db25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICBsZXZlbDogcGlub0NvbmZpZy5sZXZlbCB8fCAnaW5mbycsXG4gICAgdGltZXN0YW1wOiBwaW5vQ29uZmlnLnRpbWVzdGFtcCA/PyB0cnVlLFxuICAgIG1lc3NhZ2VLZXk6IHBpbm9Db25maWcubWVzc2FnZUtleSB8fCAnbXNnJyxcbiAgICBlcnJvcktleTogcGlub0NvbmZpZy5lcnJvcktleSB8fCAnZXJyJyxcbiAgICBiYXNlOiBwaW5vQ29uZmlnLmJhc2UgfHwgeyBwaWQ6IHByb2Nlc3MucGlkIH1cbiAgfSBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmV0dHlUcmFuc3BvcnQocHJldHR5UHJpbnQ6IGJvb2xlYW4gfCBvYmplY3QpIHtcbiAgcmV0dXJuIHBpbm8udHJhbnNwb3J0KHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgICB0cmFuc2xhdGVUaW1lOiAnSEg6TU06c3MgWicsXG4gICAgICBpZ25vcmU6ICdwaWQsaG9zdG5hbWUnLFxuICAgICAgLi4uKHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgPyBwcmV0dHlQcmludCA6IHt9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnM/OiBPcHRpb25zKTogUGlub0xvZ2dlciB7XG4gIGNvbnN0IHBpbm9Db25maWcgPSBvcHRpb25zPy5jb25maWc/LnBpbm8gfHwge31cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgdHJhbnNwb3J0LCAuLi5yZXN0IH0gPSBwaW5vQ29uZmlnXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAuLi5idWlsZFBpbm9Db25maWcocGlub0NvbmZpZyksXG4gICAgLi4ucmVzdFxuICB9XG5cbiAgaWYgKHByZXR0eVByaW50ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gcGlubyhjb25maWcsIGNyZWF0ZVByZXR0eVRyYW5zcG9ydChwcmV0dHlQcmludCkpXG4gIH1cblxuICBpZiAodHJhbnNwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc3BvcnQgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIHRyYW5zcG9ydCkge1xuICAgICAgcmV0dXJuIHBpbm8oXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcGluby50cmFuc3BvcnQoXG4gICAgICAgICAgdHJhbnNwb3J0IGFzIHBpbm8uVHJhbnNwb3J0U2luZ2xlT3B0aW9ucyB8IHBpbm8uVHJhbnNwb3J0TXVsdGlPcHRpb25zXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0ludmFsaWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwaW5vKGNvbmZpZylcbn1cblxuZnVuY3Rpb24gbWFwTG9nTGV2ZWxUb1Bpbm8obGV2ZWw6IExvZ0xldmVsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChsZXZlbC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1ZydcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mbydcbiAgICBjYXNlICdXQVJOSU5HJzpcbiAgICBjYXNlICdXQVJOJzpcbiAgICAgIHJldHVybiAnd2FybidcbiAgICBjYXNlICdFUlJPUic6XG4gICAgICByZXR1cm4gJ2Vycm9yJ1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gbG9nIGxldmVsIFwiJHtsZXZlbH1cIiwgZGVmYXVsdGluZyB0byBcImluZm9cImApXG4gICAgICByZXR1cm4gJ2luZm8nXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFBpbm9Mb2coXG4gIHBpbm9Mb2dnZXI6IFBpbm9Mb2dnZXIsXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbG9nT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHBpbm9MZXZlbCA9IG1hcExvZ0xldmVsVG9QaW5vKGxldmVsKVxuICBjb25zdCBsb2dNZXRob2QgPSBwaW5vTG9nZ2VyW3Bpbm9MZXZlbCBhcyBrZXlvZiBQaW5vTG9nZ2VyXSBhcyAoXG4gICAgLi4uYXJnczogdW5rbm93bltdXG4gICkgPT4gdm9pZFxuICBjb25zdCBoYXNDdXN0b21QaW5vT3V0cHV0ID0gQm9vbGVhbihcbiAgICBvcHRpb25zPy5jb25maWc/LnBpbm8/LnRyYW5zcG9ydCB8fCBvcHRpb25zPy5jb25maWc/LnBpbm8/LnByZXR0eVByaW50XG4gIClcbiAgY29uc3Qgc2hvdWxkRW1pdFBpbm8gPVxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGhhc0N1c3RvbVBpbm9PdXRwdXRcblxuICBpZiAoc2hvdWxkRW1pdFBpbm8gJiYgdHlwZW9mIGxvZ01ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxvZ01ldGhvZC5jYWxsKHBpbm9Mb2dnZXIsIGxvZ09iamVjdCwgbWVzc2FnZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVPdXRwdXRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgbG9nTWVzc2FnZT86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBmaWxlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ICYmXG4gICAgb3B0aW9ucz8uY29uZmlnPy5sb2dGaWxlUGF0aCAmJlxuICAgICFvcHRpb25zPy5jb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZ1xuICApIHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbG9nVG9GaWxlKFxuICAgICAgICBvcHRpb25zLmNvbmZpZy5sb2dGaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRyYW5zcG9ydCBsb2dnaW5nXG4gIGlmIChvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCkge1xuICAgIHByb21pc2VzLnB1c2gobG9nVG9UcmFuc3BvcnRzKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBwaW5vTG9nZ2VyOiBQaW5vTG9nZ2VyLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCFkYXRhLm1ldHJpY3MpIHtcbiAgICBkYXRhLm1ldHJpY3MgPSBnZXRNZXRyaWNzKClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAhZGF0YS5zdGFjaykge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKVxuICAgIGRhdGEuc3RhY2sgPSBlcnIuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IGVycm9yS2V5ID0gb3B0aW9ucz8uY29uZmlnPy5waW5vPy5lcnJvcktleSB8fCAnZXJyJ1xuICBjb25zdCBlcnIgPVxuICAgIGxldmVsID09PSAnRVJST1InICYmIGRhdGEuc3RhY2tcbiAgICAgID8ge1xuICAgICAgICAgIG5hbWU6ICdFcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgICBzdGFjazogZGF0YS5zdGFja1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZvcndhcmRlZEZvciA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNsaWVudElwID1cbiAgICBvcHRpb25zPy5jb25maWc/LmlwICYmIGZvcndhcmRlZEZvclxuICAgICAgPyBmb3J3YXJkZWRGb3Iuc3BsaXQoJywnKVswXT8udHJpbSgpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGxvZ09iamVjdCA9IHtcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgY29udGV4dDogZGF0YS5jb250ZXh0LFxuICAgIG1ldHJpY3M6IGRhdGEubWV0cmljcyxcbiAgICBkdXJhdGlvbjogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDAsXG4gICAgaXA6IGNsaWVudElwLFxuICAgIFtlcnJvcktleV06IGVyclxuICB9XG5cbiAgZW1pdFBpbm9Mb2coXG4gICAgcGlub0xvZ2dlcixcbiAgICBsZXZlbCxcbiAgICBsb2dPYmplY3QsXG4gICAgZGF0YS5tZXNzYWdlIHx8ICdSZXF1ZXN0IHByb2Nlc3NlZCcsXG4gICAgb3B0aW9uc1xuICApXG5cbiAgY29uc3QgbG9nTWVzc2FnZSA9IGJ1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHRydWUpXG5cbiAgYXdhaXQgaGFuZGxlT3V0cHV0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGxvZ01lc3NhZ2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBwaW5vTG9nZ2VyID0gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnMpXG5cbiAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSB7XG4gICAgc3RvcmU6IHVuZGVmaW5lZCxcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLCAvLyBFeHBvc2UgdGhlIFBpbm8gaW5zdGFuY2VcbiAgICBsb2c6IChsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUpID0+XG4gICAgICBsb2cocGlub0xvZ2dlciwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBoYW5kbGVIdHRwRXJyb3I6IGFzeW5jIChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+XG4gICAgICBhd2FpdCBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBjdXN0b21Mb2dGb3JtYXQ6IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdJTkZPJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICBwaW5vTG9nZ2VyLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogNTAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgcGlub0xvZ2dlcixcbiAgICAgICAgJ1dBUk5JTkcnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdERUJVRycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBsb2dnZXJcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQge1xuICBkdXJhdGlvblN0cmluZyxcbiAgZm9ybWF0VGltZXN0YW1wLFxuICBsb2dTdHJpbmcsXG4gIG1ldGhvZFN0cmluZyxcbiAgcGF0aFN0cmluZyxcbiAgc3RhdHVzU3RyaW5nXG59IGZyb20gJy4uL2hlbHBlcnMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0NvbXBvbmVudHMsXG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGRlZmF1bHRMb2dGb3JtYXQgPVxuICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2NvbnRleHR9IHtpcH0nXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnM6IGJvb2xlYW4sIG9wdGlvbnM/OiBPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zPy5jb25maWc/LnVzZUNvbG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuY29uZmlnLnVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG4gIH1cbiAgcmV0dXJuIHVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvZ01lc3NhZ2UoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zLFxuICB1c2VDb2xvcnMgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBjb25zdCBhY3R1YWxseVVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnMsIG9wdGlvbnMpXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgY29tcG9uZW50czogTG9nQ29tcG9uZW50cyA9IHtcbiAgICBub3c6IGFjdHVhbGx5VXNlQ29sb3JzXG4gICAgICA/IGNoYWxrLmJnWWVsbG93KFxuICAgICAgICAgIGNoYWxrLmJsYWNrKGZvcm1hdFRpbWVzdGFtcChub3csIG9wdGlvbnM/LmNvbmZpZz8udGltZXN0YW1wKSlcbiAgICAgICAgKVxuICAgICAgOiBmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCksXG4gICAgZXBvY2g6IE1hdGguZmxvb3Iobm93LmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCksXG4gICAgbGV2ZWw6IGxvZ1N0cmluZyhsZXZlbCwgdXNlQ29sb3JzKSxcbiAgICBkdXJhdGlvbjogZHVyYXRpb25TdHJpbmcoc3RvcmUuYmVmb3JlVGltZSwgdXNlQ29sb3JzKSxcbiAgICBtZXRob2Q6IG1ldGhvZFN0cmluZyhyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKSxcbiAgICBwYXRobmFtZTogcGF0aFN0cmluZyhyZXF1ZXN0KSxcbiAgICBzdGF0dXM6IHN0YXR1c1N0cmluZyhkYXRhLnN0YXR1cyB8fCAyMDAsIHVzZUNvbG9ycyksXG4gICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICcnLFxuICAgIGNvbnRleHQ6IGRhdGEuY29udGV4dFxuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYFtFcnJvciBzZXJpYWxpemluZyBjb250ZXh0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfV1gXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6ICcnLFxuICAgIGlwOlxuICAgICAgb3B0aW9ucz8uY29uZmlnPy5pcCAmJiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICAgICAgICA/IGBJUDogJHtyZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKX1gXG4gICAgICAgIDogJydcbiAgfVxuXG4gIGNvbnN0IGxvZ0Zvcm1hdCA9IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0IHx8IGRlZmF1bHRMb2dGb3JtYXRcblxuICByZXR1cm4gbG9nRm9ybWF0LnJlcGxhY2UoL3soXFx3Kyl9L2csIChfLCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmIChrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudHNba2V5IGFzIGtleW9mIExvZ0NvbXBvbmVudHNdIHx8ICcnXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9KVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCB0eXBlIHsgQ29sb3JNYXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgTG9nTGV2ZWxDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIElORk86IGNoYWxrLmJnR3JlZW4uYmxhY2ssXG4gIFdBUk5JTkc6IGNoYWxrLmJnWWVsbG93LmJsYWNrLFxuICBFUlJPUjogY2hhbGsuYmdSZWQuYmxhY2tcbn1cblxuZXhwb3J0IGNvbnN0IEh0dHBNZXRob2RDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIEdFVDogY2hhbGsuZ3JlZW4sXG4gIFBPU1Q6IGNoYWxrLnllbGxvdyxcbiAgUFVUOiBjaGFsay5ibHVlLFxuICBQQVRDSDogY2hhbGsubWFnZW50YUJyaWdodCxcbiAgREVMRVRFOiBjaGFsay5yZWQsXG4gIEhFQUQ6IGNoYWxrLmN5YW4sXG4gIE9QVElPTlM6IGNoYWxrLm1hZ2VudGFcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5jb25zdCB0aW1lVW5pdHMgPSBbXG4gIHsgdW5pdDogJ3MnLCB0aHJlc2hvbGQ6IDFlOSwgZGVjaW1hbFBsYWNlczogMiB9LFxuICB7IHVuaXQ6ICdtcycsIHRocmVzaG9sZDogMWU2LCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ8K1cycsIHRocmVzaG9sZDogMWUzLCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ25zJywgdGhyZXNob2xkOiAxLCBkZWNpbWFsUGxhY2VzOiAwIH1cbl1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHVyYXRpb25TdHJpbmcoXG4gIGJlZm9yZVRpbWU6IGJpZ2ludCxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIGJlZm9yZVRpbWUpXG5cbiAgZm9yIChjb25zdCB7IHVuaXQsIHRocmVzaG9sZCwgZGVjaW1hbFBsYWNlcyB9IG9mIHRpbWVVbml0cykge1xuICAgIGlmIChuYW5vc2Vjb25kcyA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKG5hbm9zZWNvbmRzIC8gdGhyZXNob2xkKS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpXG4gICAgICBjb25zdCB0aW1lU3RyID0gYCR7dmFsdWV9JHt1bml0fWAucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxuICAgICAgcmV0dXJuIHVzZUNvbG9ycyA/IGNoYWxrLmdyYXkodGltZVN0cikgOiB0aW1lU3RyXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gY2hhbGsuZ3JheSgnMG5zJy5wYWRTdGFydCg4KS5wYWRFbmQoMTYpKVxuICAgIDogJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IExvZ0xldmVsQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZ1N0cmluZyhsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGxldmVsU3RyID0gbGV2ZWwudG9VcHBlckNhc2UoKVxuICByZXR1cm4gdXNlQ29sb3JzXG4gICAgPyBMb2dMZXZlbENvbG9yTWFwW2xldmVsU3RyXT8uKGxldmVsU3RyLnBhZEVuZCg3KSkgfHwgbGV2ZWxTdHJcbiAgICA6IGxldmVsU3RyLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgeyBIdHRwTWV0aG9kQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ldGhvZFN0cmluZyhcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3JGdW5jdGlvbiA9IEh0dHBNZXRob2RDb2xvck1hcFttZXRob2RdXG4gIHJldHVybiB1c2VDb2xvcnMgJiYgY29sb3JGdW5jdGlvblxuICAgID8gY29sb3JGdW5jdGlvbihtZXRob2QucGFkRW5kKDcpKVxuICAgIDogbWV0aG9kLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGF0aFN0cmluZyhcbiAgcmVxdWVzdEluZm86IFJlcXVlc3RJbmZvXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3RJbmZvLnVybCkucGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBUaW1lc3RhbXBDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG4vLyBjb25zdCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQgPSAneXl5eS1tbS1kZCBISDpNTTpzcydcbmNvbnN0IFNZU19USU1FID0gJ1NZUzpTVEFOREFSRCdcblxuY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuXG5mdW5jdGlvbiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRheSA9IHBhZChkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzZWNvbmRzID0gcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBtcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpXG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30uJHttc31gXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEN1c3RvbVRpbWUoZGF0ZTogRGF0ZSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7XG4gICAgeXl5eTogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIHl5OiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKS5zbGljZSgtMiksXG4gICAgbW06IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSxcbiAgICBkZDogcGFkKGRhdGUuZ2V0RGF0ZSgpKSxcbiAgICBISDogcGFkKGRhdGUuZ2V0SG91cnMoKSksXG4gICAgTU06IHBhZChkYXRlLmdldE1pbnV0ZXMoKSksXG4gICAgc3M6IHBhZChkYXRlLmdldFNlY29uZHMoKSksXG4gICAgU1NTOiBwYWQoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSksXG4gICAgWjogLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwXG4gIH1cblxuICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXl8eXl8bW18ZGR8SEh8TU18c3N8U1NTfFovZywgbWF0Y2ggPT5cbiAgICAodG9rZW5zW21hdGNoXSA/PyAnJykudG9TdHJpbmcoKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lc3RhbXAoZGF0ZTogRGF0ZSwgY29uZmlnPzogVGltZXN0YW1wQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWc/LnRyYW5zbGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBpZiAoY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IHRydWUgfHwgY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IFNZU19USU1FKSB7XG4gICAgcmV0dXJuIGZvcm1hdFN5c3RlbVRpbWUoZGF0ZSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRDdXN0b21UaW1lKGRhdGUsIGNvbmZpZy50cmFuc2xhdGVUaW1lKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dUb1RyYW5zcG9ydHMoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHMgfHwgb3B0aW9ucy5jb25maWcudHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSlcblxuICBjb25zdCBwcm9taXNlcyA9IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubWFwKHRyYW5zcG9ydCA9PlxuICAgIHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIHsgcmVxdWVzdCwgZGF0YSwgc3RvcmUgfSlcbiAgKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBzaG91bGRSb3RhdGVCeVRpbWUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBpdFxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0FuZFJvdGF0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IG9wdGlvbnM/LmNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbkNvbmZpZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG5lZWRzUm90YXRpb24gPSBmYWxzZVxuXG4gIC8vIENoZWNrIHNpemUtYmFzZWQgcm90YXRpb25cbiAgaWYgKHJvdGF0aW9uQ29uZmlnLm1heFNpemUpIHtcbiAgICBuZWVkc1JvdGF0aW9uID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbkNvbmZpZylcbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKCFuZWVkc1JvdGF0aW9uICYmIHJvdGF0aW9uQ29uZmlnLmludGVydmFsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVydmFsTXMgPSBwYXJzZUludGVydmFsKHJvdGF0aW9uQ29uZmlnLmludGVydmFsKVxuICAgICAgbmVlZHNSb3RhdGlvbiA9IGF3YWl0IHNob3VsZFJvdGF0ZUJ5VGltZShmaWxlUGF0aCwgaW50ZXJ2YWxNcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQgaW4gbG9nIHJvdGF0aW9uIGNvbmZpZzonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBQZXJmb3JtIHJvdGF0aW9uIGlmIG5lZWRlZFxuICBpZiAobmVlZHNSb3RhdGlvbikge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb25Db25maWcpXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ1RvRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZGF0YTogTG9nRGF0YSxcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoZmlsZVBhdGgpXG5cbiAgLy8gQ2hlY2sgYW5kIHBlcmZvcm0gcm90YXRpb24gaWYgbmVlZGVkXG4gIGF3YWl0IGNoZWNrQW5kUm90YXRlKGZpbGVQYXRoLCBvcHRpb25zKVxuXG4gIGNvbnN0IGxvZ01lc3NhZ2UgPSBgJHtidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSl9XFxuYFxuICBhd2FpdCBmcy5hcHBlbmRGaWxlKGZpbGVQYXRoLCBsb2dNZXNzYWdlLCB7IGZsYWc6ICdhJyB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCdcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRSZXRlbnRpb24ge1xuICB0eXBlOiAnY291bnQnIHwgJ3RpbWUnXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuLy8gUmVnZXggcGF0dGVybnMgZGVmaW5lZCBhdCB0b3AgbGV2ZWwgZm9yIHBlcmZvcm1hbmNlXG5jb25zdCBTSVpFX1BBVFRFUk4gPSAvXihcXGQrKD86XFwuXFxkKyk/KVxccyooW2ttZ10pP2I/JC9cbmNvbnN0IElOVEVSVkFMX1BBVFRFUk4gPSAvXihcXGQrKVxccyooW2hkd10pJC9cbmNvbnN0IFJFVEVOVElPTl9QQVRURVJOID0gL14oXFxkKylcXHMqZCQvXG5cbi8qKlxuICogUGFyc2Ugc2l6ZSBzdHJpbmcgdG8gYnl0ZXNcbiAqIFN1cHBvcnRzOiAnMTBtJywgJzFnJywgJzEwMGsnLCBvciByYXcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNpemUoc2l6ZTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBzaXplXG4gIH1cblxuICBjb25zdCB1bml0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICBrOiAxMDI0LFxuICAgIG06IDEwMjQgKiAxMDI0LFxuICAgIGc6IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBzaXplLnRvTG93ZXJDYXNlKCkubWF0Y2goU0laRV9QQVRURVJOKVxuICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7c2l6ZX1gKVxuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdID8/ICcnXG5cbiAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUgKiAodW5pdHNbdW5pdF0gPz8gMSkpXG59XG5cbi8qKlxuICogUGFyc2UgaW50ZXJ2YWwgc3RyaW5nIHRvIG1pbGxpc2Vjb25kc1xuICogU3VwcG9ydHM6ICcxaCcsICcxZCcsICcxdydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoaW50ZXJ2YWw6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHVuaXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIGg6IDYwICogNjAgKiAxMDAwLCAvLyBob3VyXG4gICAgZDogMjQgKiA2MCAqIDYwICogMTAwMCwgLy8gZGF5XG4gICAgdzogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAgLy8gd2Vla1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBpbnRlcnZhbC50b0xvd2VyQ2FzZSgpLm1hdGNoKElOVEVSVkFMX1BBVFRFUk4pXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke2ludGVydmFsfWApXG4gIH1cblxuICBjb25zdCB2YWx1ZVN0ciA9IG1hdGNoWzFdXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXSBhcyBzdHJpbmdcblxuICBpZiAoIXZhbHVlU3RyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHtpbnRlcnZhbH1gKVxuICB9XG4gIGlmICghdW5pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7aW50ZXJ2YWx9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlU3RyLCAxMClcbiAgcmV0dXJuIHZhbHVlICogKHVuaXRzW3VuaXRdID8/IDApXG59XG5cbi8qKlxuICogUGFyc2UgcmV0ZW50aW9uIHN0cmluZyBvciBudW1iZXJcbiAqIFJldHVybnMgb2JqZWN0IHdpdGggdHlwZSAoY291bnQgb3IgdGltZSkgYW5kIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldGVudGlvbihyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IFBhcnNlZFJldGVudGlvbiB7XG4gIGlmICh0eXBlb2YgcmV0ZW50aW9uID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlOiByZXRlbnRpb24gfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhIHRpbWUtYmFzZWQgcmV0ZW50aW9uIChlLmcuLCAnN2QnLCAnMzBkJylcbiAgY29uc3QgbWF0Y2ggPSByZXRlbnRpb24udG9Mb3dlckNhc2UoKS5tYXRjaChSRVRFTlRJT05fUEFUVEVSTilcbiAgaWYgKG1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCBkYXlzID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMClcbiAgICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCB9IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmV0ZW50aW9uIGZvcm1hdDogJHtyZXRlbnRpb259YClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIHNob3VsZCBiZSByb3RhdGVkIGJhc2VkIG9uIHNpemVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNob3VsZFJvdGF0ZUJ5U2l6ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZTogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXRzLnNpemUgPj0gbWF4U2l6ZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGZvciBhIGZpbGVcbiAqIFVzZXMgZmlsZSBtb2RpZmljYXRpb24gdGltZSBhcyBhIHByb3h5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldExhc3RSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0cy5tdGltZS5nZXRUaW1lKClcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCB1c2UgY3VycmVudCB0aW1lXG4gICAgcmV0dXJuIERhdGUubm93KClcbiAgfVxufVxuXG4vLyBUcmFjayBsYXN0IHJvdGF0aW9uIHRpbWVzIGluIG1lbW9yeSB0byBhdm9pZCBleGNlc3NpdmUgZmlsZSBjaGVja3NcbmNvbnN0IHJvdGF0aW9uVGltZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4vKipcbiAqIENoZWNrIGlmIGZpbGUgc2hvdWxkIGJlIHJvdGF0ZWQgYmFzZWQgb24gdGltZSBpbnRlcnZhbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvdWxkUm90YXRlQnlUaW1lKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBpbnRlcnZhbDogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gIGNvbnN0IGNhY2hlZFRpbWUgPSByb3RhdGlvblRpbWVDYWNoZS5nZXQoZmlsZVBhdGgpXG4gIGlmIChjYWNoZWRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm93IC0gY2FjaGVkVGltZSA+PSBpbnRlcnZhbFxuICB9XG5cbiAgLy8gR2V0IGxhc3Qgcm90YXRpb24gdGltZSBmcm9tIGZpbGVcbiAgY29uc3QgbGFzdFJvdGF0aW9uID0gYXdhaXQgZ2V0TGFzdFJvdGF0aW9uVGltZShmaWxlUGF0aClcbiAgcm90YXRpb25UaW1lQ2FjaGUuc2V0KGZpbGVQYXRoLCBsYXN0Um90YXRpb24pXG5cbiAgcmV0dXJuIG5vdyAtIGxhc3RSb3RhdGlvbiA+PSBpbnRlcnZhbFxufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICByb3RhdGlvblRpbWVDYWNoZS5zZXQoZmlsZVBhdGgsIERhdGUubm93KCkpXG59XG5cbi8qKlxuICogR2V0IHJvdGF0ZWQgZmlsZXMgZm9yIGEgZ2l2ZW4gbG9nIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgICAvLyBNYXRjaCBmaWxlcyBsaWtlOiBhcHAubG9nLjIwMjUtMTAtMTAsIGFwcC5sb2cuMjAyNS0xMC0xMC5nelxuICAgIGNvbnN0IHJvdGF0ZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgIGBeJHtiYXNlTmFtZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpfVxcXFwuXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn0oLVxcXFxkezJ9LVxcXFxkezJ9LVxcXFxkezJ9KT8oXFxcXC5neik/JGBcbiAgICApXG4gICAgY29uc3Qgcm90YXRlZEZpbGVzID0gZmlsZXNcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiByb3RhdGVkUGF0dGVybi50ZXN0KGZpbGUpKVxuICAgICAgLm1hcChmaWxlID0+IGpvaW4oZGlyLCBmaWxlKSlcblxuICAgIC8vIFNvcnQgYnkgbW9kaWZpY2F0aW9uIHRpbWUgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBmaWxlc1dpdGhTdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGUpXG4gICAgICAgIHJldHVybiB7IGZpbGUsIG10aW1lOiBzdGF0cy5tdGltZS5nZXRUaW1lKCkgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gZmlsZXNXaXRoU3RhdHNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLm10aW1lIC0gYS5tdGltZSlcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLmZpbGUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ25vZGU6c3RyZWFtL3Byb21pc2VzJ1xuaW1wb3J0IHsgY3JlYXRlR3ppcCB9IGZyb20gJ25vZGU6emxpYidcblxuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlSW50ZXJ2YWwsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHVwZGF0ZVJvdGF0aW9uVGltZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJvdGF0ZWQgZmlsZSBuYW1lIHdpdGggdGltZXN0YW1wXG4gKiBFeGFtcGxlOiBhcHAubG9nIC0+IGFwcC5sb2cuMjAyNS0xMC0xMC0xNC0zMC00NVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoOiBzdHJpbmcsIHRpbWVzdGFtcDogRGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHllYXIgPSB0aW1lc3RhbXAuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZGF5ID0gU3RyaW5nKHRpbWVzdGFtcC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgaG91cnMgPSBTdHJpbmcodGltZXN0YW1wLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgbWludXRlcyA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcodGltZXN0YW1wLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKVxuXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtob3Vyc30tJHttaW51dGVzfS0ke3NlY29uZHN9YFxufVxuXG4vKipcbiAqIFJvdGF0ZSBhIGxvZyBmaWxlIGJ5IHJlbmFtaW5nIGl0IHdpdGggYSB0aW1lc3RhbXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGhhcyBjb250ZW50XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0cy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEb24ndCByb3RhdGUgZW1wdHkgZmlsZXNcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJvdGF0ZWRQYXRoID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICAgIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZFBhdGgpXG4gICAgdXBkYXRlUm90YXRpb25UaW1lKGZpbGVQYXRoKVxuXG4gICAgcmV0dXJuIHJvdGF0ZWRQYXRoXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHJvdGF0ZWRcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByb3RhdGUgbG9nIGZpbGUgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbi8qKlxuICogQ29tcHJlc3MgYSBmaWxlIHVzaW5nIGd6aXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXByZXNzRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3NlZFBhdGggPSBgJHtmaWxlUGF0aH0uZ3pgXG4gICAgY29uc3Qgc291cmNlID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aClcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNyZWF0ZVdyaXRlU3RyZWFtKGNvbXByZXNzZWRQYXRoKVxuICAgIGNvbnN0IGd6aXAgPSBjcmVhdGVHemlwKClcblxuICAgIGF3YWl0IHBpcGVsaW5lKHNvdXJjZSwgZ3ppcCwgZGVzdGluYXRpb24pXG5cbiAgICAvLyBEZWxldGUgdGhlIG9yaWdpbmFsIGZpbGUgYWZ0ZXIgc3VjY2Vzc2Z1bCBjb21wcmVzc2lvblxuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIG9sZCByb3RhdGVkIGZpbGVzIGJhc2VkIG9uIHJldGVudGlvbiBwb2xpY3lcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFuT2xkRmlsZXMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy5tYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByb3RhdGVkRmlsZXMgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gICAgaWYgKHJvdGF0ZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcblxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgLy8gS2VlcCBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAgICBjb25zdCBmaWxlc1RvRGVsZXRlID0gcm90YXRlZEZpbGVzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGZpbGVzVG9EZWxldGUubWFwKGZpbGUgPT4gZnMudW5saW5rKGZpbGUpKSlcbiAgICB9IGVsc2UgaWYgKHJldGVudGlvbi50eXBlID09PSAndGltZScpIHtcbiAgICAgIC8vIERlbGV0ZSBmaWxlcyBvbGRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdGltZVxuICAgICAgY29uc3QgY3V0b2ZmVGltZSA9IERhdGUubm93KCkgLSByZXRlbnRpb24udmFsdWVcbiAgICAgIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZSlcbiAgICAgICAgICByZXR1cm4gc3RhdHMubXRpbWUuZ2V0VGltZSgpIDwgY3V0b2ZmVGltZSA/IGZpbGUgOiBudWxsXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1RvRGVsZXRlXG4gICAgICAgICAgLmZpbHRlcigoZmlsZSk6IGZpbGUgaXMgc3RyaW5nID0+IGZpbGUgIT09IG51bGwpXG4gICAgICAgICAgLm1hcChmaWxlID0+IGZzLnVubGluayhmaWxlKSlcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIG9sZCBsb2cgZmlsZXMgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybSBjb21wbGV0ZSByb3RhdGlvbjogcm90YXRlLCBjb21wcmVzcyAoaWYgZW5hYmxlZCksIGFuZCBjbGVhbiBvbGQgZmlsZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Sb3RhdGlvbihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gUm90YXRlIHRoZSBmaWxlXG4gICAgY29uc3Qgcm90YXRlZFBhdGggPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuXG4gICAgaWYgKCFyb3RhdGVkUGF0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29tcHJlc3MgaWYgZW5hYmxlZCAoZGVmYXVsdHMgdG8gZ3ppcClcbiAgICBpZiAoY29uZmlnLmNvbXByZXNzKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZFBhdGgpXG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gb2xkIGZpbGVzXG4gICAgYXdhaXQgY2xlYW5PbGRGaWxlcyhmaWxlUGF0aCwgY29uZmlnKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwZXJmb3JtIHJvdGF0aW9uIGZvciAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG91bGRSb3RhdGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGZpbGUgZXhpc3RlbmNlXG4gICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vIHJvdGF0aW9uIG5lZWRlZFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gQ2hlY2sgc2l6ZS1iYXNlZCByb3RhdGlvblxuICBpZiAoY29uZmlnLm1heFNpemUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF4U2l6ZUJ5dGVzID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgICAgaWYgKHN0YXRzLnNpemUgPj0gbWF4U2l6ZUJ5dGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIHNpemUgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKGNvbmZpZy5pbnRlcnZhbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcnZhbE1zID0gcGFyc2VJbnRlcnZhbChjb25maWcuaW50ZXJ2YWwpXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gc3RhdHMubXRpbWVNc1xuICAgICAgaWYgKGFnZSA+PSBpbnRlcnZhbE1zKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBwYXJzZSBvciBzdGF0IGVycm9ycyBhbmQgdHJlYXQgYXMgbm8tb3BcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIGFnZSBmb3IgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSwgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi9idWlsZC1sb2ctbWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiBIdHRwRXJyb3IsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCA1MDBcbiAgY29uc3QgbG9nRGF0YSA9IHtcbiAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihidWlsZExvZ01lc3NhZ2UoJ0VSUk9SJywgcmVxdWVzdCwgbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgLy8gSGFuZGxlIGZpbGUgbG9nZ2luZ1xuICBpZiAoXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgJiZcbiAgICBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbGVQYXRoICYmXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nXG4gICkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cygnRVJST1InLCByZXF1ZXN0LCBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJnMEJBQXVCLElBQXZCLHFCQ0VBLElBQU0sRUFBZ0IsQ0FBQyxFQUFjLElBQTBCLENBQzdELElBQU0sRUFBZ0IsS0FBSyxJQUFJLEdBQUksRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUNyRCxFQUFVLElBQUksT0FBTyxDQUFhLEVBQ3hDLE1BQU8sR0FBRyxJQUFVLElBQU8sSUFBVSxPQUFPLENBQUssR0FHbkQsU0FBd0IsQ0FBVyxDQUFDLEVBQWdCLEVBQXlCLENBQzNFLElBQU0sRUFBVyxHQUFRLFVBQVksWUFDL0IsRUFBTyxHQUFRLE1BQVEsS0FDdkIsRUFBVyxHQUFRLFVBQVksT0FHckMsR0FGbUIsR0FBUyxRQUFRLHVCQUF5QixTQUU3QyxDQUVkLElBQU0sRUFBVSxxQ0FBMEIsT0FBYyxLQUFZLElBQzlELEVBQVcsS0FBSyxJQUFJLEdBQWMsRUFBUSxNQUFNLEVBQUksRUFDcEQsRUFBUyxJQUFHLE9BQU8sQ0FBUSxFQUMzQixFQUFZLEVBQWMsR0FBSSxDQUFRLEVBRTVD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QUNoQixLQUFNLFlBQ1IsQ0FBQyxFQUNFLFFBQVEsS0FBTyxDQUVkLEdBRDJCLEdBQVMsUUFBUSxvQkFBc0IsR0FFaEUsRUFBWSxFQUFJLE9BQWtCLENBQU8sRUFFNUMsRUFDQSxVQUFVLEtBQU8sQ0FDaEIsSUFBTSxFQUFRLElBQ1QsRUFBSSxNQUNQLFdBQVksUUFBUSxPQUFPLE9BQU8sRUFDbEMsT0FBUSxFQUNSLEtBQU0sRUFBSSxLQUNWLGFBQWMsRUFDaEIsRUFDQSxFQUFJLE1BQVEsRUFDWixFQUFJLE1BQVEsRUFDYixFQUNBLGNBQWMsQ0FBRSxHQUFJLFFBQVMsRUFBRyxFQUFHLFVBQVMsTUFBSyxXQUFZLENBQzVELElBQU0sRUFBWSxFQUVsQixHQUFJLENBQUMsRUFBVSxhQUFjLENBQzNCLElBQU0sRUFBUyxFQUFjLEVBQUksUUFBVSxHQUFHLEVBQzlDLEVBQUksSUFDRixPQUNBLEVBQ0EsQ0FDRSxTQUNBLFFBQVMsT0FBTyxFQUFJLFVBQVUsY0FBZ0IsRUFBRSxDQUNsRCxFQUNBLENBQ0YsR0FFSCxFQUNBLFFBQVEsQ0FBRSxHQUFJLFFBQVMsRUFBRyxPQUFTLFVBQVMsUUFBTyxNQUFLLFdBQVksQ0FDbkUsSUFBTSxFQUFTLEVBQWMsRUFBSSxRQUFVLEdBQUcsRUFDOUMsTUFBTSxFQUFJLGdCQUNSLEVBQ0EsSUFBSyxFQUFPLFFBQU8sRUFDbkIsQ0FDRixFQUNEIiwKICAiZGVidWdJZCI6ICI0RThDMjkwRDlERjM1QjFFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Elysia } from "elysia";
|
|
2
|
+
import { LoggerOptions, Logger as PinoLogger } from "pino";
|
|
2
3
|
interface RequestInfo {
|
|
3
4
|
headers: {
|
|
4
5
|
get: (key: string) => string | null
|
|
@@ -20,8 +21,9 @@ interface LogData {
|
|
|
20
21
|
}
|
|
21
22
|
interface Logger {
|
|
22
23
|
store?: StoreData;
|
|
24
|
+
pino: PinoLogger;
|
|
23
25
|
log(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData): void;
|
|
24
|
-
handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): void
|
|
26
|
+
handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): Promise<void>;
|
|
25
27
|
customLogFormat?: string;
|
|
26
28
|
info(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
27
29
|
error(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
@@ -31,11 +33,13 @@ interface Logger {
|
|
|
31
33
|
interface StoreData {
|
|
32
34
|
beforeTime: bigint;
|
|
33
35
|
logger?: Logger;
|
|
36
|
+
pino?: PinoLogger;
|
|
34
37
|
hasCustomLog?: boolean;
|
|
35
38
|
}
|
|
36
39
|
interface LogixlysiaContext {
|
|
37
40
|
store: {
|
|
38
41
|
logger: Logger
|
|
42
|
+
pino: PinoLogger
|
|
39
43
|
beforeTime: bigint
|
|
40
44
|
hasCustomLog: boolean
|
|
41
45
|
};
|
|
@@ -56,15 +60,21 @@ interface Transport {
|
|
|
56
60
|
interface TimestampConfig {
|
|
57
61
|
translateTime?: boolean | string;
|
|
58
62
|
}
|
|
63
|
+
type PinoConfig = LoggerOptions & {
|
|
64
|
+
prettyPrint?: boolean | Record<string, unknown>
|
|
65
|
+
};
|
|
66
|
+
interface LogRotationConfig {
|
|
67
|
+
maxSize?: string | number;
|
|
68
|
+
maxFiles?: string | number;
|
|
69
|
+
interval?: string;
|
|
70
|
+
compress?: boolean;
|
|
71
|
+
compression?: "gzip";
|
|
72
|
+
}
|
|
59
73
|
interface Options {
|
|
60
74
|
config?: {
|
|
61
75
|
customLogFormat?: string
|
|
62
76
|
logFilePath?: string
|
|
63
|
-
logRotation?:
|
|
64
|
-
maxSize?: number
|
|
65
|
-
maxFiles?: number
|
|
66
|
-
compress?: boolean
|
|
67
|
-
}
|
|
77
|
+
logRotation?: LogRotationConfig
|
|
68
78
|
logFilter?: {
|
|
69
79
|
level?: LogLevel | LogLevel[]
|
|
70
80
|
method?: string | string[]
|
|
@@ -76,10 +86,14 @@ interface Options {
|
|
|
76
86
|
startupMessageFormat?: "banner" | "simple"
|
|
77
87
|
transports?: Transport[]
|
|
78
88
|
timestamp?: TimestampConfig
|
|
89
|
+
disableInternalLogger?: boolean
|
|
90
|
+
disableFileLogging?: boolean
|
|
91
|
+
useTransportsOnly?: boolean
|
|
92
|
+
pino?: PinoConfig
|
|
79
93
|
};
|
|
80
94
|
}
|
|
81
95
|
declare function createLogger(options?: Options): Logger;
|
|
82
|
-
declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): void
|
|
96
|
+
declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): Promise<void>;
|
|
83
97
|
declare function logToTransports(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData, options?: Options): Promise<void>;
|
|
84
98
|
declare function logixlysia(options?: Options): Elysia;
|
|
85
|
-
export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogLevel, LogData, HttpError };
|
|
99
|
+
export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogRotationConfig, LogLevel, LogData, HttpError };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Elysia } from "elysia";
|
|
2
|
+
import { LoggerOptions, Logger as PinoLogger } from "pino";
|
|
2
3
|
interface RequestInfo {
|
|
3
4
|
headers: {
|
|
4
5
|
get: (key: string) => string | null
|
|
@@ -20,8 +21,9 @@ interface LogData {
|
|
|
20
21
|
}
|
|
21
22
|
interface Logger {
|
|
22
23
|
store?: StoreData;
|
|
24
|
+
pino: PinoLogger;
|
|
23
25
|
log(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData): void;
|
|
24
|
-
handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): void
|
|
26
|
+
handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): Promise<void>;
|
|
25
27
|
customLogFormat?: string;
|
|
26
28
|
info(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
27
29
|
error(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
@@ -31,11 +33,13 @@ interface Logger {
|
|
|
31
33
|
interface StoreData {
|
|
32
34
|
beforeTime: bigint;
|
|
33
35
|
logger?: Logger;
|
|
36
|
+
pino?: PinoLogger;
|
|
34
37
|
hasCustomLog?: boolean;
|
|
35
38
|
}
|
|
36
39
|
interface LogixlysiaContext {
|
|
37
40
|
store: {
|
|
38
41
|
logger: Logger
|
|
42
|
+
pino: PinoLogger
|
|
39
43
|
beforeTime: bigint
|
|
40
44
|
hasCustomLog: boolean
|
|
41
45
|
};
|
|
@@ -56,15 +60,21 @@ interface Transport {
|
|
|
56
60
|
interface TimestampConfig {
|
|
57
61
|
translateTime?: boolean | string;
|
|
58
62
|
}
|
|
63
|
+
type PinoConfig = LoggerOptions & {
|
|
64
|
+
prettyPrint?: boolean | Record<string, unknown>
|
|
65
|
+
};
|
|
66
|
+
interface LogRotationConfig {
|
|
67
|
+
maxSize?: string | number;
|
|
68
|
+
maxFiles?: string | number;
|
|
69
|
+
interval?: string;
|
|
70
|
+
compress?: boolean;
|
|
71
|
+
compression?: "gzip";
|
|
72
|
+
}
|
|
59
73
|
interface Options {
|
|
60
74
|
config?: {
|
|
61
75
|
customLogFormat?: string
|
|
62
76
|
logFilePath?: string
|
|
63
|
-
logRotation?:
|
|
64
|
-
maxSize?: number
|
|
65
|
-
maxFiles?: number
|
|
66
|
-
compress?: boolean
|
|
67
|
-
}
|
|
77
|
+
logRotation?: LogRotationConfig
|
|
68
78
|
logFilter?: {
|
|
69
79
|
level?: LogLevel | LogLevel[]
|
|
70
80
|
method?: string | string[]
|
|
@@ -76,10 +86,14 @@ interface Options {
|
|
|
76
86
|
startupMessageFormat?: "banner" | "simple"
|
|
77
87
|
transports?: Transport[]
|
|
78
88
|
timestamp?: TimestampConfig
|
|
89
|
+
disableInternalLogger?: boolean
|
|
90
|
+
disableFileLogging?: boolean
|
|
91
|
+
useTransportsOnly?: boolean
|
|
92
|
+
pino?: PinoConfig
|
|
79
93
|
};
|
|
80
94
|
}
|
|
81
95
|
declare function createLogger(options?: Options): Logger;
|
|
82
|
-
declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): void
|
|
96
|
+
declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): Promise<void>;
|
|
83
97
|
declare function logToTransports(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData, options?: Options): Promise<void>;
|
|
84
98
|
declare function logixlysia(options?: Options): Elysia;
|
|
85
|
-
export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogLevel, LogData, HttpError };
|
|
99
|
+
export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogRotationConfig, LogLevel, LogData, HttpError };
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{Elysia as
|
|
2
|
-
โ${
|
|
3
|
-
โ${
|
|
4
|
-
โ${
|
|
5
|
-
โ${
|
|
6
|
-
โ${
|
|
7
|
-
โ${
|
|
8
|
-
โ${
|
|
9
|
-
`)}else console.log(`\uD83E\uDD8A Elysia is running at ${
|
|
10
|
-
`;await
|
|
1
|
+
import{Elysia as Mr}from"elysia";var U=(r,o)=>{let n=Math.max(0,(o-r.length)/2),t=" ".repeat(n);return`${t}${r}${t}`.padEnd(o)};function w(r,o){let n=r?.hostname??"localhost",t=r?.port??3000,s=r?.protocol??"http";if(o?.config?.startupMessageFormat!=="simple"){let c=`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`,u=Math.max(22,c.length)+4,f="โ".repeat(u),i=U("",u);console.log(`
|
|
2
|
+
โ${f}โ
|
|
3
|
+
โ${i}โ
|
|
4
|
+
โ${U("Elysia with Logixlysia",u)}โ
|
|
5
|
+
โ${i}โ
|
|
6
|
+
โ${U(c,u)}โ
|
|
7
|
+
โ${i}โ
|
|
8
|
+
โ${f}โ
|
|
9
|
+
`)}else console.log(`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`)}import b from"chalk";import{StatusMap as h}from"elysia";function H(r){if(typeof r==="number")return r;return h[r]||500}function E(r,o){let n=r.toString();if(!o)return n;if(r>=500)return b.red(n);if(r>=400)return b.yellow(n);if(r>=300)return b.cyan(n);if(r>=200)return b.green(n);return b.white(n)}import x from"pino";import B from"chalk";import a from"chalk";var C={INFO:a.bgGreen.black,WARNING:a.bgYellow.black,ERROR:a.bgRed.black},T={GET:a.green,POST:a.yellow,PUT:a.blue,PATCH:a.magentaBright,DELETE:a.red,HEAD:a.cyan,OPTIONS:a.magenta};import K from"chalk";var z=[{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 D(r,o){let n=Number(process.hrtime.bigint()-r);for(let{unit:t,threshold:s,decimalPlaces:e}of z)if(n>=s){let c=`${(n/s).toFixed(e)}${t}`.padStart(8).padEnd(16);return o?K.gray(c):c}return o?K.gray("0ns".padStart(8).padEnd(16)):"0ns".padStart(8).padEnd(16)}function R(r,o){let n=r.toUpperCase();return o?C[n]?.(n.padEnd(7))||n:n.padEnd(7)}function k(r,o){let n=T[r];return o&&n?n(r.padEnd(7)):r.padEnd(7)}function d(r){try{return new URL(r.url).pathname}catch{return}}var m=(r)=>r.toString().padStart(2,"0");function P(r){let o=r.getFullYear(),n=m(r.getMonth()+1),t=m(r.getDate()),s=m(r.getHours()),e=m(r.getMinutes()),g=m(r.getSeconds()),c=r.getMilliseconds().toString().padStart(3,"0");return`${o}-${n}-${t} ${s}:${e}:${g}.${c}`}function rr(r,o){let n={yyyy:r.getFullYear(),yy:r.getFullYear().toString().slice(-2),mm:m(r.getMonth()+1),dd:m(r.getDate()),HH:m(r.getHours()),MM:m(r.getMinutes()),ss:m(r.getSeconds()),SSS:m(r.getMilliseconds()),Z:-r.getTimezoneOffset()/60};return o.replace(/yyyy|yy|mm|dd|HH|MM|ss|SSS|Z/g,(t)=>(n[t]??"").toString())}function v(r,o){if(!o?.translateTime)return r.toISOString();if(o.translateTime===!0||o.translateTime==="SYS:STANDARD")return P(r);return rr(r,o.translateTime)}var or="\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {context} {ip}";function nr(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 L(r,o,n,t,s,e=!0){let g=nr(e,s),c=new Date,u={now:g?B.bgYellow(B.black(v(c,s?.config?.timestamp))):v(c,s?.config?.timestamp),epoch:Math.floor(c.getTime()/1000).toString(),level:R(r,e),duration:D(t.beforeTime,e),method:k(o.method,e),pathname:d(o),status:E(n.status||200,e),message:n.message||"",context:n.context?(()=>{try{return JSON.stringify(n.context)}catch(i){return`[Error serializing context: ${i instanceof Error?i.message:"Unknown error"}]`}})():"",ip:s?.config?.ip&&o.headers.get("x-forwarded-for")?`IP: ${o.headers.get("x-forwarded-for")}`:""};return(s?.config?.customLogFormat||or).replace(/{(\w+)}/g,(i,S)=>{if(S in u)return u[S]||"";return""})}async function l(r,o,n,t,s){if(!s?.config?.transports||s.config.transports.length===0)return;let e=L(r,o,n,t,s,!1),g=s.config.transports.map((c)=>c.log(r,e,{request:o,data:n,store:t}));await Promise.all(g)}import{promises as X}from"node:fs";import{dirname as yr}from"node:path";import{promises as F}from"node:fs";import{basename as tr,dirname as sr,join as er}from"node:path";var gr=/^(\d+(?:\.\d+)?)\s*([kmg])?b?$/,cr=/^(\d+)\s*([hdw])$/,ur=/^(\d+)\s*d$/;function W(r){if(typeof r==="number")return r;let o={k:1024,m:1048576,g:1073741824},n=r.toLowerCase().match(gr);if(!n?.[1])throw Error(`Invalid size format: ${r}`);let t=Number.parseFloat(n[1]),s=n[2]??"";return Math.floor(t*(o[s]??1))}function M(r){let o={h:3600000,d:86400000,w:604800000},n=r.toLowerCase().match(cr);if(!n)throw Error(`Invalid interval format: ${r}`);let t=n[1],s=n[2];if(!t)throw Error(`Invalid interval format: ${r}`);if(!s)throw Error(`Invalid interval format: ${r}`);return Number.parseInt(t,10)*(o[s]??0)}function j(r){if(typeof r==="number")return{type:"count",value:r};let o=r.toLowerCase().match(ur);if(o?.[1])return{type:"time",value:Number.parseInt(o[1],10)*24*60*60*1000};throw Error(`Invalid retention format: ${r}`)}async function pr(r){try{return(await F.stat(r)).mtime.getTime()}catch{return Date.now()}}var N=new Map;async function _(r,o){let n=Date.now(),t=N.get(r);if(t!==void 0)return n-t>=o;let s=await pr(r);return N.set(r,s),n-s>=o}function Y(r){N.set(r,Date.now())}async function A(r){let o=sr(r),n=tr(r);try{let t=await F.readdir(o),s=new RegExp(`^${n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.\\d{4}-\\d{2}-\\d{2}(-\\d{2}-\\d{2}-\\d{2})?(\\.gz)?$`),e=t.filter((c)=>s.test(c)).map((c)=>er(o,c));return(await Promise.all(e.map(async(c)=>{let u=await F.stat(c);return{file:c,mtime:u.mtime.getTime()}}))).sort((c,u)=>u.mtime-c.mtime).map((c)=>c.file)}catch{return[]}}import{createReadStream as mr,createWriteStream as ar,promises as p}from"node:fs";import{pipeline as ir}from"node:stream/promises";import{createGzip as Lr}from"node:zlib";function lr(r,o){let n=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),s=String(o.getDate()).padStart(2,"0"),e=String(o.getHours()).padStart(2,"0"),g=String(o.getMinutes()).padStart(2,"0"),c=String(o.getSeconds()).padStart(2,"0");return`${r}.${n}-${t}-${s}-${e}-${g}-${c}`}async function fr(r){try{if((await p.stat(r)).size===0)return"";let n=lr(r,new Date);return await p.rename(r,n),Y(r),n}catch(o){if(o.code!=="ENOENT")console.error(`Failed to rotate log file ${r}:`,o);return""}}async function br(r){try{let o=`${r}.gz`,n=mr(r),t=ar(o),s=Lr();await ir(n,s,t),await p.unlink(r)}catch(o){console.error(`Failed to compress file ${r}:`,o)}}async function Or(r,o){if(!o.maxFiles)return;try{let n=await A(r);if(n.length===0)return;let t=j(o.maxFiles);if(t.type==="count"){let s=n.slice(t.value);await Promise.all(s.map((e)=>p.unlink(e)))}else if(t.type==="time"){let s=Date.now()-t.value,e=await Promise.all(n.map(async(g)=>{return(await p.stat(g)).mtime.getTime()<s?g:null}));await Promise.all(e.filter((g)=>g!==null).map((g)=>p.unlink(g)))}}catch(n){console.error(`Failed to clean old log files for ${r}:`,n)}}async function J(r,o){try{let n=await fr(r);if(!n)return;if(o.compress)await br(n);await Or(r,o)}catch(n){console.error(`Failed to perform rotation for ${r}:`,n)}}async function q(r,o){try{await p.access(r)}catch{return!1}if(o.maxSize)try{let n=W(o.maxSize);if((await p.stat(r)).size>=n)return!0}catch(n){console.error(`Failed to check file size for ${r}:`,n)}if(o.interval)try{let n=M(o.interval),t=await p.stat(r);if(Date.now()-t.mtimeMs>=n)return!0}catch(n){console.error(`Failed to check file age for ${r}:`,n)}return!1}var Q=new Set;async function xr(r){let o=yr(r);if(!Q.has(o))await X.mkdir(o,{recursive:!0}),Q.add(o)}async function Sr(r,o){let n=o?.config?.logRotation;if(!n)return;let t=!1;if(n.maxSize)t=await q(r,n);if(!t&&n.interval)try{let s=M(n.interval);t=await _(r,s)}catch(s){console.error("Invalid interval format in log rotation config:",s)}if(t)await J(r,n)}async function O(r,o,n,t,s,e){await xr(r),await Sr(r,e);let g=`${L(o,n,t,s,e,!1)}
|
|
10
|
+
`;await X.appendFile(r,g,{flag:"a"})}var G=(r,o)=>Array.isArray(r)?r.includes(o):r===o;function Z(r,o,n,t){let s=t?.config?.logFilter;if(!s)return!0;return(!s.level||G(s.level,r))&&(!s.status||G(s.status,o))&&(!s.method||G(s.method,n))}async function $(r,o,n,t){let e={status:o.status||500,message:o.message,stack:o.stack},g=[];if(!(t?.config?.useTransportsOnly||t?.config?.disableInternalLogger))console.error(L("ERROR",r,e,n,t));if(!t?.config?.useTransportsOnly&&t?.config?.logFilePath&&!t?.config?.disableFileLogging)g.push(O(t.config.logFilePath,"ERROR",r,e,n,t));if(t?.config?.transports?.length)g.push(l("ERROR",r,e,n,t));await Promise.all(g)}function wr(){let r=process.memoryUsage().heapUsed/1024/1024,o=process.cpuUsage();return{memoryUsage:r,cpuUsage:o.user/1e6}}function Er(r){return{level:r.level||"info",timestamp:r.timestamp??!0,messageKey:r.messageKey||"msg",errorKey:r.errorKey||"err",base:r.base||{pid:process.pid}}}function Dr(r){return x.transport({target:"pino-pretty",options:{colorize:!0,translateTime:"HH:MM:ss Z",ignore:"pid,hostname",...typeof r==="object"?r:{}}})}function Rr(r){let o=r?.config?.pino||{},{prettyPrint:n,transport:t,...s}=o,e={...Er(o),...s};if(n)return x(e,Dr(n));if(t){if(typeof t==="object"&&"target"in t)return x(e,x.transport(t));console.warn("Invalid transport configuration provided, falling back to default")}return x(e)}function kr(r){switch(r.toUpperCase()){case"DEBUG":return"debug";case"INFO":return"info";case"WARNING":case"WARN":return"warn";case"ERROR":return"error";default:return console.warn(`Unknown log level "${r}", defaulting to "info"`),"info"}}function dr(r,o,n,t,s){let e=kr(o),g=r[e],c=Boolean(s?.config?.pino?.transport||s?.config?.pino?.prettyPrint);if((!s?.config?.useTransportsOnly||c)&&typeof g==="function")g.call(r,n,t)}async function vr(r,o,n,t,s,e){let g=[];if(!(s?.config?.useTransportsOnly||s?.config?.disableInternalLogger))console.log(e);if(!s?.config?.useTransportsOnly&&s?.config?.logFilePath&&!s?.config?.disableFileLogging)g.push(O(s.config.logFilePath,r,o,n,t,s));if(s?.config?.transports?.length)g.push(l(r,o,n,t,s));await Promise.all(g)}async function y(r,o,n,t,s,e){if(!Z(o,t.status||200,n.method,e))return;if(!t.metrics)t.metrics=wr();if(o==="ERROR"&&!t.stack){let V=Error(t.message||"Unknown error");t.stack=V.stack}let g=e?.config?.pino?.errorKey||"err",c=o==="ERROR"&&t.stack?{name:"Error",message:t.message||"Unknown error",stack:t.stack}:void 0,u=n.headers.get("x-forwarded-for"),f=e?.config?.ip&&u?u.split(",")[0]?.trim():void 0,i={method:n.method,url:n.url,status:t.status,message:t.message,context:t.context,metrics:t.metrics,duration:Number(process.hrtime.bigint()-s.beforeTime)/1e6,ip:f,[g]:c};dr(r,o,i,t.message||"Request processed",e);let S=L(o,n,t,s,e,!0);await vr(o,n,t,s,e,S)}function I(r){let o=Rr(r),n={store:void 0,pino:o,log:(t,s,e,g)=>y(o,t,s,e,g,r),handleHttpError:async(t,s,e)=>await $(t,s,e,r),customLogFormat:r?.config?.customLogFormat,info:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"INFO",t,{message:s,context:e,status:200},c,r)},error:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"ERROR",t,{message:s,context:e,status:500},c,r)},warn:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"WARNING",t,{message:s,context:e,status:200},c,r)},debug:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"DEBUG",t,{message:s,context:e,status:200},c,r)}};return n}function $r(r){let o=I(r);return new Mr({name:"Logixlysia"}).onStart((n)=>{if(r?.config?.showStartupMessage??!0)w(n.server,r)}).onRequest((n)=>{let t={...n.store,beforeTime:process.hrtime.bigint(),logger:o,pino:o.pino,hasCustomLog:!1};n.store=t,o.store=t}).onAfterHandle({as:"global"},({request:n,set:t,store:s})=>{let e=s;if(!e.hasCustomLog){let g=H(t.status||200);o.log("INFO",n,{status:g,message:String(t.headers?.["x-message"]||"")},e)}}).onError({as:"global"},async({request:n,error:t,set:s,store:e})=>{let g=H(s.status||500);await o.handleHttpError(n,{...t,status:g},e)})}export{l as logToTransports,$ as handleHttpError,$r as default,I as createLogger};
|
|
11
11
|
|
|
12
|
-
//# debugId=
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICIuLi9zcmMvaGVscGVycy9zdGF0dXMudHMiLCAiLi4vc3JjL2xvZ2dlci9idWlsZC1sb2ctbWVzc2FnZS50cyIsICIuLi9zcmMvaGVscGVycy9jb2xvci1tYXBwaW5nLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2R1cmF0aW9uLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2xvZy50cyIsICIuLi9zcmMvaGVscGVycy9tZXRob2QudHMiLCAiLi4vc3JjL2hlbHBlcnMvcGF0aC50cyIsICIuLi9zcmMvaGVscGVycy90aW1lc3RhbXAudHMiLCAiLi4vc3JjL291dHB1dC9jb25zb2xlLnRzIiwgIi4uL3NyYy9vdXRwdXQvZmlsZS50cyIsICIuLi9zcmMvbG9nZ2VyL2ZpbHRlci50cyIsICIuLi9zcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgIi4uL3NyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5cbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IEh0dHBFcnJvciwgT3B0aW9ucywgU2VydmVyLCBTdG9yZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9naXhseXNpYShvcHRpb25zPzogT3B0aW9ucyk6IEVseXNpYSB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxuXG4gIHJldHVybiBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYSdcbiAgfSlcbiAgICAub25TdGFydChjdHggPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucz8uY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICAgICAgaWYgKHNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgICAgICBzdGFydFNlcnZlcihjdHguc2VydmVyIGFzIFNlcnZlciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoY3R4ID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0ge1xuICAgICAgICAuLi5jdHguc3RvcmUsXG4gICAgICAgIGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpLFxuICAgICAgICBsb2dnZXI6IGxvZyxcbiAgICAgICAgaGFzQ3VzdG9tTG9nOiBmYWxzZVxuICAgICAgfVxuICAgICAgY3R4LnN0b3JlID0gc3RvcmVcbiAgICAgIGxvZy5zdG9yZSA9IHN0b3JlXG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSh7IGFzOiAnZ2xvYmFsJyB9LCAoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIGFzIFN0b3JlRGF0YVxuXG4gICAgICBpZiAoIXN0b3JlRGF0YS5oYXNDdXN0b21Mb2cpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDIwMClcbiAgICAgICAgbG9nLmxvZyhcbiAgICAgICAgICAnSU5GTycsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmcoc2V0LmhlYWRlcnM/LlsneC1tZXNzYWdlJ10gfHwgJycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdG9yZURhdGFcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoeyBhczogJ2dsb2JhbCcgfSwgKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDUwMClcbiAgICAgIGxvZy5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgLi4uZXJyb3IsIHN0YXR1cyB9IGFzIEh0dHBFcnJvcixcbiAgICAgICAgc3RvcmUgYXMgU3RvcmVEYXRhXG4gICAgICApXG4gICAgfSlcbn1cblxuZXhwb3J0IHR5cGUge1xuICBIdHRwRXJyb3IsXG4gIExvZ0RhdGEsXG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4vb3V0cHV0J1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNlcnZlciB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGNyZWF0ZUJveFRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFkZGluZ0xlbmd0aCA9IE1hdGgubWF4KDAsICh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZGRpbmdMZW5ndGgpXG4gIHJldHVybiBgJHtwYWRkaW5nfSR7dGV4dH0ke3BhZGRpbmd9YC5wYWRFbmQod2lkdGgpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0U2VydmVyKGNvbmZpZzogU2VydmVyLCBvcHRpb25zPzogT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBob3N0bmFtZSA9IGNvbmZpZz8uaG9zdG5hbWUgPz8gJ2xvY2FsaG9zdCdcbiAgY29uc3QgcG9ydCA9IGNvbmZpZz8ucG9ydCA/PyAzMDAwXG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnPy5wcm90b2NvbCA/PyAnaHR0cCdcbiAgY29uc3Qgc2hvd0Jhbm5lciA9IG9wdGlvbnM/LmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgIT09ICdzaW1wbGUnXG5cbiAgaWYgKHNob3dCYW5uZXIpIHtcbiAgICBjb25zdCB0aXRsZSA9ICdFbHlzaWEgd2l0aCBMb2dpeGx5c2lhJ1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgY29uc3QgYm94V2lkdGggPSBNYXRoLm1heCh0aXRsZS5sZW5ndGgsIG1lc3NhZ2UubGVuZ3RoKSArIDRcbiAgICBjb25zdCBib3JkZXIgPSAn4pSAJy5yZXBlYXQoYm94V2lkdGgpXG4gICAgY29uc3QgZW1wdHlMaW5lID0gY3JlYXRlQm94VGV4dCgnJywgYm94V2lkdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgXG4gICAgICDilIwke2JvcmRlcn3ilJBcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KHRpdGxlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUgiR7Y3JlYXRlQm94VGV4dChtZXNzYWdlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUlCR7Ym9yZGVyfeKUmFxuICAgIGApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKHN0YXR1czogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG4gIHJldHVybiAoU3RhdHVzTWFwIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3N0YXR1c10gfHwgNTAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXR1c1N0cmluZyhcbiAgc3RhdHVzOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzU3RyID0gc3RhdHVzLnRvU3RyaW5nKClcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzU3RyXG4gIH1cblxuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzU3RyKVxuICB9XG4gIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzU3RyKVxuICB9XG4gIHJldHVybiBjaGFsay53aGl0ZShzdGF0dXNTdHIpXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IHtcbiAgZHVyYXRpb25TdHJpbmcsXG4gIGZvcm1hdFRpbWVzdGFtcCxcbiAgbG9nU3RyaW5nLFxuICBtZXRob2RTdHJpbmcsXG4gIHBhdGhTdHJpbmcsXG4gIHN0YXR1c1N0cmluZ1xufSBmcm9tICcuLi9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dDb21wb25lbnRzLFxuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBkZWZhdWx0TG9nRm9ybWF0ID1cbiAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtjb250ZXh0fSB7aXB9J1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzOiBib29sZWFuLCBvcHRpb25zPzogT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy51c2VDb2xvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvcHRpb25zLmNvbmZpZy51c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiB1c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2dNZXNzYWdlKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgdXNlQ29sb3JzID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0dWFsbHlVc2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzLCBvcHRpb25zKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGNvbXBvbmVudHM6IExvZ0NvbXBvbmVudHMgPSB7XG4gICAgbm93OiBhY3R1YWxseVVzZUNvbG9yc1xuICAgICAgPyBjaGFsay5iZ1llbGxvdyhcbiAgICAgICAgICBjaGFsay5ibGFjayhmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCkpXG4gICAgICAgIClcbiAgICAgIDogZm9ybWF0VGltZXN0YW1wKG5vdywgb3B0aW9ucz8uY29uZmlnPy50aW1lc3RhbXApLFxuICAgIGVwb2NoOiBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygpLFxuICAgIGxldmVsOiBsb2dTdHJpbmcobGV2ZWwsIHVzZUNvbG9ycyksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uU3RyaW5nKHN0b3JlLmJlZm9yZVRpbWUsIHVzZUNvbG9ycyksXG4gICAgbWV0aG9kOiBtZXRob2RTdHJpbmcocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycyksXG4gICAgcGF0aG5hbWU6IHBhdGhTdHJpbmcocmVxdWVzdCksXG4gICAgc3RhdHVzOiBzdGF0dXNTdHJpbmcoZGF0YS5zdGF0dXMgfHwgMjAwLCB1c2VDb2xvcnMpLFxuICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSB8fCAnJyxcbiAgICBjb250ZXh0OiBkYXRhLmNvbnRleHRcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGBbRXJyb3Igc2VyaWFsaXppbmcgY29udGV4dDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31dYFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiAnJyxcbiAgICBpcDpcbiAgICAgIG9wdGlvbnM/LmNvbmZpZz8uaXAgJiYgcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgICAgICAgPyBgSVA6ICR7cmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJyl9YFxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBsb2dGb3JtYXQgPSBvcHRpb25zPy5jb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCB8fCBkZWZhdWx0TG9nRm9ybWF0XG5cbiAgcmV0dXJuIGxvZ0Zvcm1hdC5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5IGluIGNvbXBvbmVudHMpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRzW2tleSBhcyBrZXlvZiBMb2dDb21wb25lbnRzXSB8fCAnJ1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgdHlwZSB7IENvbG9yTWFwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVsQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBJTkZPOiBjaGFsay5iZ0dyZWVuLmJsYWNrLFxuICBXQVJOSU5HOiBjaGFsay5iZ1llbGxvdy5ibGFjayxcbiAgRVJST1I6IGNoYWxrLmJnUmVkLmJsYWNrXG59XG5cbmV4cG9ydCBjb25zdCBIdHRwTWV0aG9kQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBHRVQ6IGNoYWxrLmdyZWVuLFxuICBQT1NUOiBjaGFsay55ZWxsb3csXG4gIFBVVDogY2hhbGsuYmx1ZSxcbiAgUEFUQ0g6IGNoYWxrLm1hZ2VudGFCcmlnaHQsXG4gIERFTEVURTogY2hhbGsucmVkLFxuICBIRUFEOiBjaGFsay5jeWFuLFxuICBPUFRJT05TOiBjaGFsay5tYWdlbnRhXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuY29uc3QgdGltZVVuaXRzID0gW1xuICB7IHVuaXQ6ICdzJywgdGhyZXNob2xkOiAxZTksIGRlY2ltYWxQbGFjZXM6IDIgfSxcbiAgeyB1bml0OiAnbXMnLCB0aHJlc2hvbGQ6IDFlNiwgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICfCtXMnLCB0aHJlc2hvbGQ6IDFlMywgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICducycsIHRocmVzaG9sZDogMSwgZGVjaW1hbFBsYWNlczogMCB9XG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGR1cmF0aW9uU3RyaW5nKFxuICBiZWZvcmVUaW1lOiBiaWdpbnQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgbmFub3NlY29uZHMgPSBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBiZWZvcmVUaW1lKVxuXG4gIGZvciAoY29uc3QgeyB1bml0LCB0aHJlc2hvbGQsIGRlY2ltYWxQbGFjZXMgfSBvZiB0aW1lVW5pdHMpIHtcbiAgICBpZiAobmFub3NlY29uZHMgPj0gdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChuYW5vc2Vjb25kcyAvIHRocmVzaG9sZCkudG9GaXhlZChkZWNpbWFsUGxhY2VzKVxuICAgICAgY29uc3QgdGltZVN0ciA9IGAke3ZhbHVlfSR7dW5pdH1gLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbiAgICAgIHJldHVybiB1c2VDb2xvcnMgPyBjaGFsay5ncmF5KHRpbWVTdHIpIDogdGltZVN0clxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1c2VDb2xvcnNcbiAgICA/IGNoYWxrLmdyYXkoJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KSlcbiAgICA6ICcwbnMnLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBMb2dMZXZlbENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dTdHJpbmcobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsZXZlbFN0ciA9IGxldmVsLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gTG9nTGV2ZWxDb2xvck1hcFtsZXZlbFN0cl0/LihsZXZlbFN0ci5wYWRFbmQoNykpIHx8IGxldmVsU3RyXG4gICAgOiBsZXZlbFN0ci5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHsgSHR0cE1ldGhvZENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXRob2RTdHJpbmcoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yRnVuY3Rpb24gPSBIdHRwTWV0aG9kQ29sb3JNYXBbbWV0aG9kXVxuICByZXR1cm4gdXNlQ29sb3JzICYmIGNvbG9yRnVuY3Rpb25cbiAgICA/IGNvbG9yRnVuY3Rpb24obWV0aG9kLnBhZEVuZCg3KSlcbiAgICA6IG1ldGhvZC5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhTdHJpbmcoXG4gIHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mb1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0SW5mby51cmwpLnBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIHJldHVyblxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGltZXN0YW1wQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuLy8gY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gJ3l5eXktbW0tZGQgSEg6TU06c3MnXG5jb25zdCBTWVNfVElNRSA9ICdTWVM6U1RBTkRBUkQnXG5cbmNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcblxuZnVuY3Rpb24gZm9ybWF0U3lzdGVtVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgbWludXRlcyA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgbXMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKVxuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9LiR7bXN9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRDdXN0b21UaW1lKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge1xuICAgIHl5eXk6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICB5eTogZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgIG1tOiBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgZGQ6IHBhZChkYXRlLmdldERhdGUoKSksXG4gICAgSEg6IHBhZChkYXRlLmdldEhvdXJzKCkpLFxuICAgIE1NOiBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgIHNzOiBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpLFxuICAgIFNTUzogcGFkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLFxuICAgIFo6IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MFxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC95eXl5fHl5fG1tfGRkfEhIfE1NfHNzfFNTU3xaL2csIG1hdGNoID0+XG4gICAgKHRva2Vuc1ttYXRjaF0gPz8gJycpLnRvU3RyaW5nKClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZXN0YW1wKGRhdGU6IERhdGUsIGNvbmZpZz86IFRpbWVzdGFtcENvbmZpZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnPy50cmFuc2xhdGVUaW1lKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSB0cnVlIHx8IGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSBTWVNfVElNRSkge1xuICAgIHJldHVybiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGUpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0Q3VzdG9tVGltZShkYXRlLCBjb25maWcudHJhbnNsYXRlVGltZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9UcmFuc3BvcnRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzIHx8IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgZmFsc2UpXG5cbiAgY29uc3QgcHJvbWlzZXMgPSBvcHRpb25zLmNvbmZpZy50cmFuc3BvcnRzLm1hcCh0cmFuc3BvcnQgPT5cbiAgICB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCB7IHJlcXVlc3QsIGRhdGEsIHN0b3JlIH0pXG4gIClcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aClcbiAgY29uc3QgbG9nTWVzc2FnZSA9IGAke2J1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGZhbHNlKX1cXG5gXG4gIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGxvZ01lc3NhZ2UsIHsgZmxhZzogJ2EnIH0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVIdHRwRXJyb3IoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogSHR0cEVycm9yLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnJvci5zdGF0dXMgfHwgNTAwXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYnVpbGRMb2dNZXNzYWdlKCdFUlJPUicsIHJlcXVlc3QsIHsgc3RhdHVzOiBzdGF0dXNDb2RlIH0sIHN0b3JlLCBvcHRpb25zKVxuICApXG5cbiAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdXG5cbiAgaWYgKG9wdGlvbnM/LmNvbmZpZz8ubG9nRmlsZVBhdGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbG9nVG9GaWxlKFxuICAgICAgICBvcHRpb25zLmNvbmZpZy5sb2dGaWxlUGF0aCxcbiAgICAgICAgJ0VSUk9SJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBzdGF0dXM6IHN0YXR1c0NvZGUgfSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICApXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQWRkIG1ldHJpY3MgaWYgbm90IHByb3ZpZGVkXG4gIGlmICghZGF0YS5tZXRyaWNzKSB7XG4gICAgZGF0YS5tZXRyaWNzID0gZ2V0TWV0cmljcygpXG4gIH1cblxuICAvLyBBZGQgc3RhY2sgdHJhY2UgZm9yIGVycm9yc1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgIWRhdGEuc3RhY2spIHtcbiAgICBkYXRhLnN0YWNrID0gbmV3IEVycm9yKGBFcnJvcjogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApLnN0YWNrXG4gIH1cblxuICBjb25zdCBsb2dNZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgdHJ1ZSlcbiAgY29uc29sZS5sb2cobG9nTWVzc2FnZSlcblxuICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW11cblxuICBpZiAob3B0aW9ucz8uY29uZmlnPy5sb2dGaWxlUGF0aCkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXI6IExvZ2dlciA9IHtcbiAgICBzdG9yZTogdW5kZWZpbmVkLFxuICAgIGxvZzogKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSkgPT5cbiAgICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT5cbiAgICAgIGhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGN1c3RvbUxvZ0Zvcm1hdDogb3B0aW9ucz8uY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQsXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0lORk8nLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgICdFUlJPUicsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiA1MDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICAnV0FSTklORycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvZ2dlclxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZUNFVCxJQUFNLEVBQWdCLENBQUMsRUFBYyxJQUEwQixDQUM3RCxJQUFNLEVBQWdCLEtBQUssSUFBSSxHQUFJLEVBQVEsRUFBSyxRQUFVLENBQUMsRUFDckQsRUFBVSxJQUFJLE9BQU8sQ0FBYSxFQUN4QyxNQUFPLEdBQUcsSUFBVSxJQUFPLElBQVUsT0FBTyxDQUFLLEdBR25ELFNBQXdCLENBQVcsQ0FBQyxFQUFnQixFQUF5QixDQUMzRSxJQUFNLEVBQVcsR0FBUSxVQUFZLFlBQy9CLEVBQU8sR0FBUSxNQUFRLEtBQ3ZCLEVBQVcsR0FBUSxVQUFZLE9BR3JDLEdBRm1CLEdBQVMsUUFBUSx1QkFBeUIsU0FFN0MsQ0FFZCxJQUFNLEVBQVUscUNBQTBCLE9BQWMsS0FBWSxJQUM5RCxFQUFXLEtBQUssSUFBSSxHQUFjLEVBQVEsTUFBTSxFQUFJLEVBQ3BELEVBQVMsSUFBRyxPQUFPLENBQVEsRUFDM0IsRUFBWSxFQUFjLEdBQUksQ0FBUSxFQUU1QyxRQUFRLElBQUk7QUFBQSxTQUNSO0FBQUEsU0FDQTtBQUFBLFNBQ0EsRUFU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RWQsR0FEMkIsR0FBUyxRQUFRLG9CQUFzQixHQUVoRSxFQUFZLEVBQUksT0FBa0IsQ0FBTyxFQUU1QyxFQUNBLFVBQVUsS0FBTyxDQUNoQixJQUFNLEVBQVEsSUFDVCxFQUFJLE1BQ1AsV0FBWSxRQUFRLE9BQU8sT0FBTyxFQUNsQyxPQUFRLEVBQ1IsYUFBYyxFQUNoQixFQUNBLEVBQUksTUFBUSxFQUNaLEVBQUksTUFBUSxFQUNiLEVBQ0EsY0FBYyxDQUFFLEdBQUksUUFBUyxFQUFHLEVBQUcsVUFBUyxNQUFLLFdBQVksQ0FDNUQsSUFBTSxFQUFZLEVBRWxCLElBQUssRUFBVSxhQUFjLENBQzNCLElBQU0sRUFBUyxFQUFjLEVBQUksUUFBVSxHQUFHLEVBQzlDLEVBQUksSUFDRixPQUNBLEVBQ0EsQ0FDRSxTQUNBLFFBQVMsT0FBTyxFQUFJLFVBQVUsY0FBZ0IsRUFBRSxDQUNsRCxFQUNBLENBQ0YsR0FFSCxFQUNBLFFBQVEsQ0FBRSxHQUFJLFFBQVMsRUFBRyxFQUFHLFVBQVMsUUFBTyxNQUFLLFdBQVksQ0FDN0QsSUFBTSxFQUFTLEVBQWMsRUFBSSxRQUFVLEdBQUcsRUFDOUMsRUFBSSxnQkFDRixFQUNBLElBQUssRUFBTyxRQUFPLEVBQ25CLENBQ0YsRUFDRCIsCiAgImRlYnVnSWQiOiAiRjU2QUE0RUZDMzRBM0Q2ODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
|
12
|
+
//# debugId=62A87E578A304FBB64756E2164756E21
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL2xvZ2dlci9jcmVhdGUtbG9nZ2VyLnRzIiwgInNyYy9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UudHMiLCAic3JjL2hlbHBlcnMvY29sb3ItbWFwcGluZy50cyIsICJzcmMvaGVscGVycy9kdXJhdGlvbi50cyIsICJzcmMvaGVscGVycy9sb2cudHMiLCAic3JjL2hlbHBlcnMvbWV0aG9kLnRzIiwgInNyYy9oZWxwZXJzL3BhdGgudHMiLCAic3JjL2hlbHBlcnMvdGltZXN0YW1wLnRzIiwgInNyYy9vdXRwdXQvY29uc29sZS50cyIsICJzcmMvb3V0cHV0L2ZpbGUudHMiLCAic3JjL3V0aWxzL3JvdGF0aW9uLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvbG9nZ2VyL2ZpbHRlci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcblxuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBTZXJ2ZXIsIFN0b3JlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dpeGx5c2lhKG9wdGlvbnM/OiBPcHRpb25zKTogRWx5c2lhIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG5cbiAgcmV0dXJuIG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuICAgIC5vblN0YXJ0KGN0eCA9PiB7XG4gICAgICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zPy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gICAgICBpZiAoc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKGN0eC5zZXJ2ZXIgYXMgU2VydmVyLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdChjdHggPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB7XG4gICAgICAgIC4uLmN0eC5zdG9yZSxcbiAgICAgICAgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCksXG4gICAgICAgIGxvZ2dlcjogbG9nLFxuICAgICAgICBwaW5vOiBsb2cucGlubywgLy8gRXhwb3NlIFBpbm8gbG9nZ2VyIGRpcmVjdGx5XG4gICAgICAgIGhhc0N1c3RvbUxvZzogZmFsc2VcbiAgICAgIH1cbiAgICAgIGN0eC5zdG9yZSA9IHN0b3JlXG4gICAgICBsb2cuc3RvcmUgPSBzdG9yZVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJIYW5kbGUoeyBhczogJ2dsb2JhbCcgfSwgKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSBhcyBTdG9yZURhdGFcblxuICAgICAgaWYgKCFzdG9yZURhdGEuaGFzQ3VzdG9tTG9nKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCAyMDApXG4gICAgICAgIGxvZy5sb2coXG4gICAgICAgICAgJ0lORk8nLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nKHNldC5oZWFkZXJzPy5bJ3gtbWVzc2FnZSddIHx8ICcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RvcmVEYXRhXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKHsgYXM6ICdnbG9iYWwnIH0sIGFzeW5jICh7IHJlcXVlc3QsIGVycm9yLCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCA1MDApXG4gICAgICBhd2FpdCBsb2cuaGFuZGxlSHR0cEVycm9yKFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IC4uLmVycm9yLCBzdGF0dXMgfSBhcyBIdHRwRXJyb3IsXG4gICAgICAgIHN0b3JlIGFzIFN0b3JlRGF0YVxuICAgICAgKVxuICAgIH0pXG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgSHR0cEVycm9yLFxuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ2l4bHlzaWFDb250ZXh0LFxuICBMb2dMZXZlbCxcbiAgTG9nUm90YXRpb25Db25maWcsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU2VydmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgY3JlYXRlQm94VGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYWRkaW5nTGVuZ3RoID0gTWF0aC5tYXgoMCwgKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcGFkZGluZyA9ICcgJy5yZXBlYXQocGFkZGluZ0xlbmd0aClcbiAgcmV0dXJuIGAke3BhZGRpbmd9JHt0ZXh0fSR7cGFkZGluZ31gLnBhZEVuZCh3aWR0aClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoY29uZmlnOiBTZXJ2ZXIsIG9wdGlvbnM/OiBPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGhvc3RuYW1lID0gY29uZmlnPy5ob3N0bmFtZSA/PyAnbG9jYWxob3N0J1xuICBjb25zdCBwb3J0ID0gY29uZmlnPy5wb3J0ID8/IDMwMDBcbiAgY29uc3QgcHJvdG9jb2wgPSBjb25maWc/LnByb3RvY29sID8/ICdodHRwJ1xuICBjb25zdCBzaG93QmFubmVyID0gb3B0aW9ucz8uY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCAhPT0gJ3NpbXBsZSdcblxuICBpZiAoc2hvd0Jhbm5lcikge1xuICAgIGNvbnN0IHRpdGxlID0gJ0VseXNpYSB3aXRoIExvZ2l4bHlzaWEnXG4gICAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgICBjb25zdCBib3hXaWR0aCA9IE1hdGgubWF4KHRpdGxlLmxlbmd0aCwgbWVzc2FnZS5sZW5ndGgpICsgNFxuICAgIGNvbnN0IGJvcmRlciA9ICfilIAnLnJlcGVhdChib3hXaWR0aClcbiAgICBjb25zdCBlbXB0eUxpbmUgPSBjcmVhdGVCb3hUZXh0KCcnLCBib3hXaWR0aClcblxuICAgIGNvbnNvbGUubG9nKGBcbiAgICAgIOKUjCR7Ym9yZGVyfeKUkFxuICAgICAg4pSCJHtlbXB0eUxpbmV94pSCXG4gICAgICDilIIke2NyZWF0ZUJveFRleHQodGl0bGUsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KG1lc3NhZ2UsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSUJHtib3JkZXJ94pSYXG4gICAgYClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gKVxuICB9XG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoc3RhdHVzOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cbiAgcmV0dXJuIChTdGF0dXNNYXAgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPilbc3RhdHVzXSB8fCA1MDBcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhdHVzU3RyaW5nKFxuICBzdGF0dXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGF0dXNTdHIgPSBzdGF0dXMudG9TdHJpbmcoKVxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNTdHJcbiAgfVxuXG4gIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXNTdHIpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLndoaXRlKHN0YXR1c1N0cilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dnZXIgYXMgUGlub0xvZ2dlciB9IGZyb20gJ3Bpbm8nXG5pbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vQ29uZmlnLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQaW5vQ29uZmlnKHBpbm9Db25maWc6IFBpbm9Db25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICBsZXZlbDogcGlub0NvbmZpZy5sZXZlbCB8fCAnaW5mbycsXG4gICAgdGltZXN0YW1wOiBwaW5vQ29uZmlnLnRpbWVzdGFtcCA/PyB0cnVlLFxuICAgIG1lc3NhZ2VLZXk6IHBpbm9Db25maWcubWVzc2FnZUtleSB8fCAnbXNnJyxcbiAgICBlcnJvcktleTogcGlub0NvbmZpZy5lcnJvcktleSB8fCAnZXJyJyxcbiAgICBiYXNlOiBwaW5vQ29uZmlnLmJhc2UgfHwgeyBwaWQ6IHByb2Nlc3MucGlkIH1cbiAgfSBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmV0dHlUcmFuc3BvcnQocHJldHR5UHJpbnQ6IGJvb2xlYW4gfCBvYmplY3QpIHtcbiAgcmV0dXJuIHBpbm8udHJhbnNwb3J0KHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgICB0cmFuc2xhdGVUaW1lOiAnSEg6TU06c3MgWicsXG4gICAgICBpZ25vcmU6ICdwaWQsaG9zdG5hbWUnLFxuICAgICAgLi4uKHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgPyBwcmV0dHlQcmludCA6IHt9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnM/OiBPcHRpb25zKTogUGlub0xvZ2dlciB7XG4gIGNvbnN0IHBpbm9Db25maWcgPSBvcHRpb25zPy5jb25maWc/LnBpbm8gfHwge31cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgdHJhbnNwb3J0LCAuLi5yZXN0IH0gPSBwaW5vQ29uZmlnXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAuLi5idWlsZFBpbm9Db25maWcocGlub0NvbmZpZyksXG4gICAgLi4ucmVzdFxuICB9XG5cbiAgaWYgKHByZXR0eVByaW50ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gcGlubyhjb25maWcsIGNyZWF0ZVByZXR0eVRyYW5zcG9ydChwcmV0dHlQcmludCkpXG4gIH1cblxuICBpZiAodHJhbnNwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc3BvcnQgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIHRyYW5zcG9ydCkge1xuICAgICAgcmV0dXJuIHBpbm8oXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcGluby50cmFuc3BvcnQoXG4gICAgICAgICAgdHJhbnNwb3J0IGFzIHBpbm8uVHJhbnNwb3J0U2luZ2xlT3B0aW9ucyB8IHBpbm8uVHJhbnNwb3J0TXVsdGlPcHRpb25zXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0ludmFsaWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwaW5vKGNvbmZpZylcbn1cblxuZnVuY3Rpb24gbWFwTG9nTGV2ZWxUb1Bpbm8obGV2ZWw6IExvZ0xldmVsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChsZXZlbC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1ZydcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mbydcbiAgICBjYXNlICdXQVJOSU5HJzpcbiAgICBjYXNlICdXQVJOJzpcbiAgICAgIHJldHVybiAnd2FybidcbiAgICBjYXNlICdFUlJPUic6XG4gICAgICByZXR1cm4gJ2Vycm9yJ1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gbG9nIGxldmVsIFwiJHtsZXZlbH1cIiwgZGVmYXVsdGluZyB0byBcImluZm9cImApXG4gICAgICByZXR1cm4gJ2luZm8nXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFBpbm9Mb2coXG4gIHBpbm9Mb2dnZXI6IFBpbm9Mb2dnZXIsXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbG9nT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHBpbm9MZXZlbCA9IG1hcExvZ0xldmVsVG9QaW5vKGxldmVsKVxuICBjb25zdCBsb2dNZXRob2QgPSBwaW5vTG9nZ2VyW3Bpbm9MZXZlbCBhcyBrZXlvZiBQaW5vTG9nZ2VyXSBhcyAoXG4gICAgLi4uYXJnczogdW5rbm93bltdXG4gICkgPT4gdm9pZFxuICBjb25zdCBoYXNDdXN0b21QaW5vT3V0cHV0ID0gQm9vbGVhbihcbiAgICBvcHRpb25zPy5jb25maWc/LnBpbm8/LnRyYW5zcG9ydCB8fCBvcHRpb25zPy5jb25maWc/LnBpbm8/LnByZXR0eVByaW50XG4gIClcbiAgY29uc3Qgc2hvdWxkRW1pdFBpbm8gPVxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGhhc0N1c3RvbVBpbm9PdXRwdXRcblxuICBpZiAoc2hvdWxkRW1pdFBpbm8gJiYgdHlwZW9mIGxvZ01ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxvZ01ldGhvZC5jYWxsKHBpbm9Mb2dnZXIsIGxvZ09iamVjdCwgbWVzc2FnZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVPdXRwdXRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgbG9nTWVzc2FnZT86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBmaWxlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ICYmXG4gICAgb3B0aW9ucz8uY29uZmlnPy5sb2dGaWxlUGF0aCAmJlxuICAgICFvcHRpb25zPy5jb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZ1xuICApIHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbG9nVG9GaWxlKFxuICAgICAgICBvcHRpb25zLmNvbmZpZy5sb2dGaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRyYW5zcG9ydCBsb2dnaW5nXG4gIGlmIChvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCkge1xuICAgIHByb21pc2VzLnB1c2gobG9nVG9UcmFuc3BvcnRzKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBwaW5vTG9nZ2VyOiBQaW5vTG9nZ2VyLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCFkYXRhLm1ldHJpY3MpIHtcbiAgICBkYXRhLm1ldHJpY3MgPSBnZXRNZXRyaWNzKClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAhZGF0YS5zdGFjaykge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKVxuICAgIGRhdGEuc3RhY2sgPSBlcnIuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IGVycm9yS2V5ID0gb3B0aW9ucz8uY29uZmlnPy5waW5vPy5lcnJvcktleSB8fCAnZXJyJ1xuICBjb25zdCBlcnIgPVxuICAgIGxldmVsID09PSAnRVJST1InICYmIGRhdGEuc3RhY2tcbiAgICAgID8ge1xuICAgICAgICAgIG5hbWU6ICdFcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgICBzdGFjazogZGF0YS5zdGFja1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZvcndhcmRlZEZvciA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNsaWVudElwID1cbiAgICBvcHRpb25zPy5jb25maWc/LmlwICYmIGZvcndhcmRlZEZvclxuICAgICAgPyBmb3J3YXJkZWRGb3Iuc3BsaXQoJywnKVswXT8udHJpbSgpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGxvZ09iamVjdCA9IHtcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgY29udGV4dDogZGF0YS5jb250ZXh0LFxuICAgIG1ldHJpY3M6IGRhdGEubWV0cmljcyxcbiAgICBkdXJhdGlvbjogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDAsXG4gICAgaXA6IGNsaWVudElwLFxuICAgIFtlcnJvcktleV06IGVyclxuICB9XG5cbiAgZW1pdFBpbm9Mb2coXG4gICAgcGlub0xvZ2dlcixcbiAgICBsZXZlbCxcbiAgICBsb2dPYmplY3QsXG4gICAgZGF0YS5tZXNzYWdlIHx8ICdSZXF1ZXN0IHByb2Nlc3NlZCcsXG4gICAgb3B0aW9uc1xuICApXG5cbiAgY29uc3QgbG9nTWVzc2FnZSA9IGJ1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHRydWUpXG5cbiAgYXdhaXQgaGFuZGxlT3V0cHV0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGxvZ01lc3NhZ2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBwaW5vTG9nZ2VyID0gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnMpXG5cbiAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSB7XG4gICAgc3RvcmU6IHVuZGVmaW5lZCxcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLCAvLyBFeHBvc2UgdGhlIFBpbm8gaW5zdGFuY2VcbiAgICBsb2c6IChsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUpID0+XG4gICAgICBsb2cocGlub0xvZ2dlciwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBoYW5kbGVIdHRwRXJyb3I6IGFzeW5jIChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+XG4gICAgICBhd2FpdCBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBjdXN0b21Mb2dGb3JtYXQ6IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdJTkZPJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICBwaW5vTG9nZ2VyLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogNTAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgcGlub0xvZ2dlcixcbiAgICAgICAgJ1dBUk5JTkcnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdERUJVRycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBsb2dnZXJcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQge1xuICBkdXJhdGlvblN0cmluZyxcbiAgZm9ybWF0VGltZXN0YW1wLFxuICBsb2dTdHJpbmcsXG4gIG1ldGhvZFN0cmluZyxcbiAgcGF0aFN0cmluZyxcbiAgc3RhdHVzU3RyaW5nXG59IGZyb20gJy4uL2hlbHBlcnMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0NvbXBvbmVudHMsXG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGRlZmF1bHRMb2dGb3JtYXQgPVxuICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2NvbnRleHR9IHtpcH0nXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnM6IGJvb2xlYW4sIG9wdGlvbnM/OiBPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zPy5jb25maWc/LnVzZUNvbG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuY29uZmlnLnVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG4gIH1cbiAgcmV0dXJuIHVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvZ01lc3NhZ2UoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zLFxuICB1c2VDb2xvcnMgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBjb25zdCBhY3R1YWxseVVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnMsIG9wdGlvbnMpXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgY29tcG9uZW50czogTG9nQ29tcG9uZW50cyA9IHtcbiAgICBub3c6IGFjdHVhbGx5VXNlQ29sb3JzXG4gICAgICA/IGNoYWxrLmJnWWVsbG93KFxuICAgICAgICAgIGNoYWxrLmJsYWNrKGZvcm1hdFRpbWVzdGFtcChub3csIG9wdGlvbnM/LmNvbmZpZz8udGltZXN0YW1wKSlcbiAgICAgICAgKVxuICAgICAgOiBmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCksXG4gICAgZXBvY2g6IE1hdGguZmxvb3Iobm93LmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCksXG4gICAgbGV2ZWw6IGxvZ1N0cmluZyhsZXZlbCwgdXNlQ29sb3JzKSxcbiAgICBkdXJhdGlvbjogZHVyYXRpb25TdHJpbmcoc3RvcmUuYmVmb3JlVGltZSwgdXNlQ29sb3JzKSxcbiAgICBtZXRob2Q6IG1ldGhvZFN0cmluZyhyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKSxcbiAgICBwYXRobmFtZTogcGF0aFN0cmluZyhyZXF1ZXN0KSxcbiAgICBzdGF0dXM6IHN0YXR1c1N0cmluZyhkYXRhLnN0YXR1cyB8fCAyMDAsIHVzZUNvbG9ycyksXG4gICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICcnLFxuICAgIGNvbnRleHQ6IGRhdGEuY29udGV4dFxuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYFtFcnJvciBzZXJpYWxpemluZyBjb250ZXh0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfV1gXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6ICcnLFxuICAgIGlwOlxuICAgICAgb3B0aW9ucz8uY29uZmlnPy5pcCAmJiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICAgICAgICA/IGBJUDogJHtyZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKX1gXG4gICAgICAgIDogJydcbiAgfVxuXG4gIGNvbnN0IGxvZ0Zvcm1hdCA9IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0IHx8IGRlZmF1bHRMb2dGb3JtYXRcblxuICByZXR1cm4gbG9nRm9ybWF0LnJlcGxhY2UoL3soXFx3Kyl9L2csIChfLCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmIChrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudHNba2V5IGFzIGtleW9mIExvZ0NvbXBvbmVudHNdIHx8ICcnXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9KVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCB0eXBlIHsgQ29sb3JNYXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgTG9nTGV2ZWxDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIElORk86IGNoYWxrLmJnR3JlZW4uYmxhY2ssXG4gIFdBUk5JTkc6IGNoYWxrLmJnWWVsbG93LmJsYWNrLFxuICBFUlJPUjogY2hhbGsuYmdSZWQuYmxhY2tcbn1cblxuZXhwb3J0IGNvbnN0IEh0dHBNZXRob2RDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIEdFVDogY2hhbGsuZ3JlZW4sXG4gIFBPU1Q6IGNoYWxrLnllbGxvdyxcbiAgUFVUOiBjaGFsay5ibHVlLFxuICBQQVRDSDogY2hhbGsubWFnZW50YUJyaWdodCxcbiAgREVMRVRFOiBjaGFsay5yZWQsXG4gIEhFQUQ6IGNoYWxrLmN5YW4sXG4gIE9QVElPTlM6IGNoYWxrLm1hZ2VudGFcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5jb25zdCB0aW1lVW5pdHMgPSBbXG4gIHsgdW5pdDogJ3MnLCB0aHJlc2hvbGQ6IDFlOSwgZGVjaW1hbFBsYWNlczogMiB9LFxuICB7IHVuaXQ6ICdtcycsIHRocmVzaG9sZDogMWU2LCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ8K1cycsIHRocmVzaG9sZDogMWUzLCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ25zJywgdGhyZXNob2xkOiAxLCBkZWNpbWFsUGxhY2VzOiAwIH1cbl1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHVyYXRpb25TdHJpbmcoXG4gIGJlZm9yZVRpbWU6IGJpZ2ludCxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIGJlZm9yZVRpbWUpXG5cbiAgZm9yIChjb25zdCB7IHVuaXQsIHRocmVzaG9sZCwgZGVjaW1hbFBsYWNlcyB9IG9mIHRpbWVVbml0cykge1xuICAgIGlmIChuYW5vc2Vjb25kcyA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKG5hbm9zZWNvbmRzIC8gdGhyZXNob2xkKS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpXG4gICAgICBjb25zdCB0aW1lU3RyID0gYCR7dmFsdWV9JHt1bml0fWAucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxuICAgICAgcmV0dXJuIHVzZUNvbG9ycyA/IGNoYWxrLmdyYXkodGltZVN0cikgOiB0aW1lU3RyXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gY2hhbGsuZ3JheSgnMG5zJy5wYWRTdGFydCg4KS5wYWRFbmQoMTYpKVxuICAgIDogJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IExvZ0xldmVsQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZ1N0cmluZyhsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGxldmVsU3RyID0gbGV2ZWwudG9VcHBlckNhc2UoKVxuICByZXR1cm4gdXNlQ29sb3JzXG4gICAgPyBMb2dMZXZlbENvbG9yTWFwW2xldmVsU3RyXT8uKGxldmVsU3RyLnBhZEVuZCg3KSkgfHwgbGV2ZWxTdHJcbiAgICA6IGxldmVsU3RyLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgeyBIdHRwTWV0aG9kQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ldGhvZFN0cmluZyhcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3JGdW5jdGlvbiA9IEh0dHBNZXRob2RDb2xvck1hcFttZXRob2RdXG4gIHJldHVybiB1c2VDb2xvcnMgJiYgY29sb3JGdW5jdGlvblxuICAgID8gY29sb3JGdW5jdGlvbihtZXRob2QucGFkRW5kKDcpKVxuICAgIDogbWV0aG9kLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGF0aFN0cmluZyhcbiAgcmVxdWVzdEluZm86IFJlcXVlc3RJbmZvXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3RJbmZvLnVybCkucGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBUaW1lc3RhbXBDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG4vLyBjb25zdCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQgPSAneXl5eS1tbS1kZCBISDpNTTpzcydcbmNvbnN0IFNZU19USU1FID0gJ1NZUzpTVEFOREFSRCdcblxuY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuXG5mdW5jdGlvbiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRheSA9IHBhZChkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzZWNvbmRzID0gcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBtcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpXG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30uJHttc31gXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEN1c3RvbVRpbWUoZGF0ZTogRGF0ZSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7XG4gICAgeXl5eTogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIHl5OiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKS5zbGljZSgtMiksXG4gICAgbW06IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSxcbiAgICBkZDogcGFkKGRhdGUuZ2V0RGF0ZSgpKSxcbiAgICBISDogcGFkKGRhdGUuZ2V0SG91cnMoKSksXG4gICAgTU06IHBhZChkYXRlLmdldE1pbnV0ZXMoKSksXG4gICAgc3M6IHBhZChkYXRlLmdldFNlY29uZHMoKSksXG4gICAgU1NTOiBwYWQoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSksXG4gICAgWjogLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwXG4gIH1cblxuICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXl8eXl8bW18ZGR8SEh8TU18c3N8U1NTfFovZywgbWF0Y2ggPT5cbiAgICAodG9rZW5zW21hdGNoXSA/PyAnJykudG9TdHJpbmcoKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lc3RhbXAoZGF0ZTogRGF0ZSwgY29uZmlnPzogVGltZXN0YW1wQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWc/LnRyYW5zbGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBpZiAoY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IHRydWUgfHwgY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IFNZU19USU1FKSB7XG4gICAgcmV0dXJuIGZvcm1hdFN5c3RlbVRpbWUoZGF0ZSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRDdXN0b21UaW1lKGRhdGUsIGNvbmZpZy50cmFuc2xhdGVUaW1lKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dUb1RyYW5zcG9ydHMoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHMgfHwgb3B0aW9ucy5jb25maWcudHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSlcblxuICBjb25zdCBwcm9taXNlcyA9IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubWFwKHRyYW5zcG9ydCA9PlxuICAgIHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIHsgcmVxdWVzdCwgZGF0YSwgc3RvcmUgfSlcbiAgKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBzaG91bGRSb3RhdGVCeVRpbWUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBpdFxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0FuZFJvdGF0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IG9wdGlvbnM/LmNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbkNvbmZpZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG5lZWRzUm90YXRpb24gPSBmYWxzZVxuXG4gIC8vIENoZWNrIHNpemUtYmFzZWQgcm90YXRpb25cbiAgaWYgKHJvdGF0aW9uQ29uZmlnLm1heFNpemUpIHtcbiAgICBuZWVkc1JvdGF0aW9uID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbkNvbmZpZylcbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKCFuZWVkc1JvdGF0aW9uICYmIHJvdGF0aW9uQ29uZmlnLmludGVydmFsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVydmFsTXMgPSBwYXJzZUludGVydmFsKHJvdGF0aW9uQ29uZmlnLmludGVydmFsKVxuICAgICAgbmVlZHNSb3RhdGlvbiA9IGF3YWl0IHNob3VsZFJvdGF0ZUJ5VGltZShmaWxlUGF0aCwgaW50ZXJ2YWxNcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQgaW4gbG9nIHJvdGF0aW9uIGNvbmZpZzonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBQZXJmb3JtIHJvdGF0aW9uIGlmIG5lZWRlZFxuICBpZiAobmVlZHNSb3RhdGlvbikge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb25Db25maWcpXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ1RvRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZGF0YTogTG9nRGF0YSxcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoZmlsZVBhdGgpXG5cbiAgLy8gQ2hlY2sgYW5kIHBlcmZvcm0gcm90YXRpb24gaWYgbmVlZGVkXG4gIGF3YWl0IGNoZWNrQW5kUm90YXRlKGZpbGVQYXRoLCBvcHRpb25zKVxuXG4gIGNvbnN0IGxvZ01lc3NhZ2UgPSBgJHtidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSl9XFxuYFxuICBhd2FpdCBmcy5hcHBlbmRGaWxlKGZpbGVQYXRoLCBsb2dNZXNzYWdlLCB7IGZsYWc6ICdhJyB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCdcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRSZXRlbnRpb24ge1xuICB0eXBlOiAnY291bnQnIHwgJ3RpbWUnXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuLy8gUmVnZXggcGF0dGVybnMgZGVmaW5lZCBhdCB0b3AgbGV2ZWwgZm9yIHBlcmZvcm1hbmNlXG5jb25zdCBTSVpFX1BBVFRFUk4gPSAvXihcXGQrKD86XFwuXFxkKyk/KVxccyooW2ttZ10pP2I/JC9cbmNvbnN0IElOVEVSVkFMX1BBVFRFUk4gPSAvXihcXGQrKVxccyooW2hkd10pJC9cbmNvbnN0IFJFVEVOVElPTl9QQVRURVJOID0gL14oXFxkKylcXHMqZCQvXG5cbi8qKlxuICogUGFyc2Ugc2l6ZSBzdHJpbmcgdG8gYnl0ZXNcbiAqIFN1cHBvcnRzOiAnMTBtJywgJzFnJywgJzEwMGsnLCBvciByYXcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNpemUoc2l6ZTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBzaXplXG4gIH1cblxuICBjb25zdCB1bml0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICBrOiAxMDI0LFxuICAgIG06IDEwMjQgKiAxMDI0LFxuICAgIGc6IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBzaXplLnRvTG93ZXJDYXNlKCkubWF0Y2goU0laRV9QQVRURVJOKVxuICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7c2l6ZX1gKVxuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdID8/ICcnXG5cbiAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUgKiAodW5pdHNbdW5pdF0gPz8gMSkpXG59XG5cbi8qKlxuICogUGFyc2UgaW50ZXJ2YWwgc3RyaW5nIHRvIG1pbGxpc2Vjb25kc1xuICogU3VwcG9ydHM6ICcxaCcsICcxZCcsICcxdydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoaW50ZXJ2YWw6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHVuaXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIGg6IDYwICogNjAgKiAxMDAwLCAvLyBob3VyXG4gICAgZDogMjQgKiA2MCAqIDYwICogMTAwMCwgLy8gZGF5XG4gICAgdzogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAgLy8gd2Vla1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBpbnRlcnZhbC50b0xvd2VyQ2FzZSgpLm1hdGNoKElOVEVSVkFMX1BBVFRFUk4pXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke2ludGVydmFsfWApXG4gIH1cblxuICBjb25zdCB2YWx1ZVN0ciA9IG1hdGNoWzFdXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXSBhcyBzdHJpbmdcblxuICBpZiAoIXZhbHVlU3RyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHtpbnRlcnZhbH1gKVxuICB9XG4gIGlmICghdW5pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7aW50ZXJ2YWx9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlU3RyLCAxMClcbiAgcmV0dXJuIHZhbHVlICogKHVuaXRzW3VuaXRdID8/IDApXG59XG5cbi8qKlxuICogUGFyc2UgcmV0ZW50aW9uIHN0cmluZyBvciBudW1iZXJcbiAqIFJldHVybnMgb2JqZWN0IHdpdGggdHlwZSAoY291bnQgb3IgdGltZSkgYW5kIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldGVudGlvbihyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IFBhcnNlZFJldGVudGlvbiB7XG4gIGlmICh0eXBlb2YgcmV0ZW50aW9uID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlOiByZXRlbnRpb24gfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhIHRpbWUtYmFzZWQgcmV0ZW50aW9uIChlLmcuLCAnN2QnLCAnMzBkJylcbiAgY29uc3QgbWF0Y2ggPSByZXRlbnRpb24udG9Mb3dlckNhc2UoKS5tYXRjaChSRVRFTlRJT05fUEFUVEVSTilcbiAgaWYgKG1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCBkYXlzID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMClcbiAgICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCB9IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmV0ZW50aW9uIGZvcm1hdDogJHtyZXRlbnRpb259YClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIHNob3VsZCBiZSByb3RhdGVkIGJhc2VkIG9uIHNpemVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNob3VsZFJvdGF0ZUJ5U2l6ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZTogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXRzLnNpemUgPj0gbWF4U2l6ZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGZvciBhIGZpbGVcbiAqIFVzZXMgZmlsZSBtb2RpZmljYXRpb24gdGltZSBhcyBhIHByb3h5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldExhc3RSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0cy5tdGltZS5nZXRUaW1lKClcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCB1c2UgY3VycmVudCB0aW1lXG4gICAgcmV0dXJuIERhdGUubm93KClcbiAgfVxufVxuXG4vLyBUcmFjayBsYXN0IHJvdGF0aW9uIHRpbWVzIGluIG1lbW9yeSB0byBhdm9pZCBleGNlc3NpdmUgZmlsZSBjaGVja3NcbmNvbnN0IHJvdGF0aW9uVGltZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4vKipcbiAqIENoZWNrIGlmIGZpbGUgc2hvdWxkIGJlIHJvdGF0ZWQgYmFzZWQgb24gdGltZSBpbnRlcnZhbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvdWxkUm90YXRlQnlUaW1lKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBpbnRlcnZhbDogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gIGNvbnN0IGNhY2hlZFRpbWUgPSByb3RhdGlvblRpbWVDYWNoZS5nZXQoZmlsZVBhdGgpXG4gIGlmIChjYWNoZWRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm93IC0gY2FjaGVkVGltZSA+PSBpbnRlcnZhbFxuICB9XG5cbiAgLy8gR2V0IGxhc3Qgcm90YXRpb24gdGltZSBmcm9tIGZpbGVcbiAgY29uc3QgbGFzdFJvdGF0aW9uID0gYXdhaXQgZ2V0TGFzdFJvdGF0aW9uVGltZShmaWxlUGF0aClcbiAgcm90YXRpb25UaW1lQ2FjaGUuc2V0KGZpbGVQYXRoLCBsYXN0Um90YXRpb24pXG5cbiAgcmV0dXJuIG5vdyAtIGxhc3RSb3RhdGlvbiA+PSBpbnRlcnZhbFxufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICByb3RhdGlvblRpbWVDYWNoZS5zZXQoZmlsZVBhdGgsIERhdGUubm93KCkpXG59XG5cbi8qKlxuICogR2V0IHJvdGF0ZWQgZmlsZXMgZm9yIGEgZ2l2ZW4gbG9nIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgICAvLyBNYXRjaCBmaWxlcyBsaWtlOiBhcHAubG9nLjIwMjUtMTAtMTAsIGFwcC5sb2cuMjAyNS0xMC0xMC5nelxuICAgIGNvbnN0IHJvdGF0ZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgIGBeJHtiYXNlTmFtZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpfVxcXFwuXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn0oLVxcXFxkezJ9LVxcXFxkezJ9LVxcXFxkezJ9KT8oXFxcXC5neik/JGBcbiAgICApXG4gICAgY29uc3Qgcm90YXRlZEZpbGVzID0gZmlsZXNcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiByb3RhdGVkUGF0dGVybi50ZXN0KGZpbGUpKVxuICAgICAgLm1hcChmaWxlID0+IGpvaW4oZGlyLCBmaWxlKSlcblxuICAgIC8vIFNvcnQgYnkgbW9kaWZpY2F0aW9uIHRpbWUgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBmaWxlc1dpdGhTdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGUpXG4gICAgICAgIHJldHVybiB7IGZpbGUsIG10aW1lOiBzdGF0cy5tdGltZS5nZXRUaW1lKCkgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gZmlsZXNXaXRoU3RhdHNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLm10aW1lIC0gYS5tdGltZSlcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLmZpbGUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ25vZGU6c3RyZWFtL3Byb21pc2VzJ1xuaW1wb3J0IHsgY3JlYXRlR3ppcCB9IGZyb20gJ25vZGU6emxpYidcblxuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlSW50ZXJ2YWwsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHVwZGF0ZVJvdGF0aW9uVGltZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJvdGF0ZWQgZmlsZSBuYW1lIHdpdGggdGltZXN0YW1wXG4gKiBFeGFtcGxlOiBhcHAubG9nIC0+IGFwcC5sb2cuMjAyNS0xMC0xMC0xNC0zMC00NVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoOiBzdHJpbmcsIHRpbWVzdGFtcDogRGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHllYXIgPSB0aW1lc3RhbXAuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZGF5ID0gU3RyaW5nKHRpbWVzdGFtcC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgaG91cnMgPSBTdHJpbmcodGltZXN0YW1wLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgbWludXRlcyA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcodGltZXN0YW1wLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKVxuXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtob3Vyc30tJHttaW51dGVzfS0ke3NlY29uZHN9YFxufVxuXG4vKipcbiAqIFJvdGF0ZSBhIGxvZyBmaWxlIGJ5IHJlbmFtaW5nIGl0IHdpdGggYSB0aW1lc3RhbXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGhhcyBjb250ZW50XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0cy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEb24ndCByb3RhdGUgZW1wdHkgZmlsZXNcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJvdGF0ZWRQYXRoID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICAgIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZFBhdGgpXG4gICAgdXBkYXRlUm90YXRpb25UaW1lKGZpbGVQYXRoKVxuXG4gICAgcmV0dXJuIHJvdGF0ZWRQYXRoXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHJvdGF0ZWRcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByb3RhdGUgbG9nIGZpbGUgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbi8qKlxuICogQ29tcHJlc3MgYSBmaWxlIHVzaW5nIGd6aXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXByZXNzRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3NlZFBhdGggPSBgJHtmaWxlUGF0aH0uZ3pgXG4gICAgY29uc3Qgc291cmNlID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aClcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNyZWF0ZVdyaXRlU3RyZWFtKGNvbXByZXNzZWRQYXRoKVxuICAgIGNvbnN0IGd6aXAgPSBjcmVhdGVHemlwKClcblxuICAgIGF3YWl0IHBpcGVsaW5lKHNvdXJjZSwgZ3ppcCwgZGVzdGluYXRpb24pXG5cbiAgICAvLyBEZWxldGUgdGhlIG9yaWdpbmFsIGZpbGUgYWZ0ZXIgc3VjY2Vzc2Z1bCBjb21wcmVzc2lvblxuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIG9sZCByb3RhdGVkIGZpbGVzIGJhc2VkIG9uIHJldGVudGlvbiBwb2xpY3lcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFuT2xkRmlsZXMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy5tYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByb3RhdGVkRmlsZXMgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gICAgaWYgKHJvdGF0ZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcblxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgLy8gS2VlcCBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAgICBjb25zdCBmaWxlc1RvRGVsZXRlID0gcm90YXRlZEZpbGVzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGZpbGVzVG9EZWxldGUubWFwKGZpbGUgPT4gZnMudW5saW5rKGZpbGUpKSlcbiAgICB9IGVsc2UgaWYgKHJldGVudGlvbi50eXBlID09PSAndGltZScpIHtcbiAgICAgIC8vIERlbGV0ZSBmaWxlcyBvbGRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdGltZVxuICAgICAgY29uc3QgY3V0b2ZmVGltZSA9IERhdGUubm93KCkgLSByZXRlbnRpb24udmFsdWVcbiAgICAgIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZSlcbiAgICAgICAgICByZXR1cm4gc3RhdHMubXRpbWUuZ2V0VGltZSgpIDwgY3V0b2ZmVGltZSA/IGZpbGUgOiBudWxsXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1RvRGVsZXRlXG4gICAgICAgICAgLmZpbHRlcigoZmlsZSk6IGZpbGUgaXMgc3RyaW5nID0+IGZpbGUgIT09IG51bGwpXG4gICAgICAgICAgLm1hcChmaWxlID0+IGZzLnVubGluayhmaWxlKSlcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIG9sZCBsb2cgZmlsZXMgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybSBjb21wbGV0ZSByb3RhdGlvbjogcm90YXRlLCBjb21wcmVzcyAoaWYgZW5hYmxlZCksIGFuZCBjbGVhbiBvbGQgZmlsZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Sb3RhdGlvbihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gUm90YXRlIHRoZSBmaWxlXG4gICAgY29uc3Qgcm90YXRlZFBhdGggPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuXG4gICAgaWYgKCFyb3RhdGVkUGF0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29tcHJlc3MgaWYgZW5hYmxlZCAoZGVmYXVsdHMgdG8gZ3ppcClcbiAgICBpZiAoY29uZmlnLmNvbXByZXNzKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZFBhdGgpXG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gb2xkIGZpbGVzXG4gICAgYXdhaXQgY2xlYW5PbGRGaWxlcyhmaWxlUGF0aCwgY29uZmlnKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwZXJmb3JtIHJvdGF0aW9uIGZvciAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG91bGRSb3RhdGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGZpbGUgZXhpc3RlbmNlXG4gICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vIHJvdGF0aW9uIG5lZWRlZFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gQ2hlY2sgc2l6ZS1iYXNlZCByb3RhdGlvblxuICBpZiAoY29uZmlnLm1heFNpemUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF4U2l6ZUJ5dGVzID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgICAgaWYgKHN0YXRzLnNpemUgPj0gbWF4U2l6ZUJ5dGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIHNpemUgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKGNvbmZpZy5pbnRlcnZhbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcnZhbE1zID0gcGFyc2VJbnRlcnZhbChjb25maWcuaW50ZXJ2YWwpXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gc3RhdHMubXRpbWVNc1xuICAgICAgaWYgKGFnZSA+PSBpbnRlcnZhbE1zKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBwYXJzZSBvciBzdGF0IGVycm9ycyBhbmQgdHJlYXQgYXMgbm8tb3BcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIGFnZSBmb3IgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSwgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi9idWlsZC1sb2ctbWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiBIdHRwRXJyb3IsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCA1MDBcbiAgY29uc3QgbG9nRGF0YSA9IHtcbiAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihidWlsZExvZ01lc3NhZ2UoJ0VSUk9SJywgcmVxdWVzdCwgbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgLy8gSGFuZGxlIGZpbGUgbG9nZ2luZ1xuICBpZiAoXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgJiZcbiAgICBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbGVQYXRoICYmXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nXG4gICkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cygnRVJST1InLCByZXF1ZXN0LCBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0VULElBQU0sRUFBZ0IsQ0FBQyxFQUFjLElBQTBCLENBQzdELElBQU0sRUFBZ0IsS0FBSyxJQUFJLEdBQUksRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUNyRCxFQUFVLElBQUksT0FBTyxDQUFhLEVBQ3hDLE1BQU8sR0FBRyxJQUFVLElBQU8sSUFBVSxPQUFPLENBQUssR0FHbkQsU0FBd0IsQ0FBVyxDQUFDLEVBQWdCLEVBQXlCLENBQzNFLElBQU0sRUFBVyxHQUFRLFVBQVksWUFDL0IsRUFBTyxHQUFRLE1BQVEsS0FDdkIsRUFBVyxHQUFRLFVBQVksT0FHckMsR0FGbUIsR0FBUyxRQUFRLHVCQUF5QixTQUU3QyxDQUVkLElBQU0sRUFBVSxxQ0FBMEIsT0FBYyxLQUFZLElBQzlELEVBQVcsS0FBSyxJQUFJLEdBQWMsRUFBUSxNQUFNLEVBQUksRUFDcEQsRUFBUyxJQUFHLE9BQU8sQ0FBUSxFQUMzQixFQUFZLEVBQWMsR0FBSSxDQUFRLEVBRTVDLFFBQVEsSUFBSTtBQUFBLFNBQ1I7QUFBQSxTQUNBO0FBQUEsU0FDQSxFQVRVLHlCQVNXLENBQVE7QUFBQSxTQUM3QjtBQUFBLFNBQ0EsRUFBYyxFQUFTLENBQVE7QUFBQSxTQUMvQjtBQUFBLFNBQ0E7QUFBQSxLQUNILEVBRUQsYUFBUSxJQUFJLHFDQUEwQixPQUFjLEtBQVksR0FBTSxFQy9CMUUscUJBQ0Esb0JBQVMsZUFFRixTQUFTLENBQWEsQ0FBQyxFQUFpQyxDQUM3RCxHQUFJLE9BQU8sSUFBVyxTQUNwQixPQUFPLEVBRVQsT0FBUSxFQUFxQyxJQUFXLElBRzFELFNBQXdCLENBQVksQ0FDbEMsRUFDQSxFQUNRLENBQ1IsSUFBTSxFQUFZLEVBQU8sU0FBUyxFQUNsQyxHQUFJLENBQUMsRUFDSCxPQUFPLEVBR1QsR0FBSSxHQUFVLElBQ1osT0FBTyxFQUFNLElBQUksQ0FBUyxFQUU1QixHQUFJLEdBQVUsSUFDWixPQUFPLEVBQU0sT0FBTyxDQUFTLEVBRS9CLEdBQUksR0FBVSxJQUNaLE9BQU8sRUFBTSxLQUFLLENBQVMsRUFFN0IsR0FBSSxHQUFVLElBQ1osT0FBTyxFQUFNLE1BQU0sQ0FBUyxFQUU5QixPQUFPLEVBQU0sTUFBTSxDQUFTLEVDOUI5QixvQkNEQSxxQkNBQSxxQkFJTyxJQUFNLEVBQTZCLENBQ3hDLEtBQU0sRUFBTSxRQUFRLE1BQ3BCLFFBQVMsRUFBTSxTQUFTLE1BQ3hCLE1BQU8sRUFBTSxNQUFNLEtBQ3JCLEVBRWEsRUFBK0IsQ0FDMUMsSUFBSyxFQUFNLE1BQ1gsS0FBTSxFQUFNLE9BQ1osSUFBSyxFQUFNLEtBQ1gsTUFBTyxFQUFNLGNBQ2IsT0FBUSxFQUFNLElBQ2QsS0FBTSxFQUFNLEtBQ1osUUFBUyxFQUFNLE9BQ2pCLEVDbEJBLHFCQUVBLElBQU0sRUFBWSxDQUNoQixDQUFFLEtBQU0sSUFBSyxVQUFXLElBQUssY0FBZSxDQUFFLEVBQzlDLENBQUUsS0FBTSxLQUFNLFVBQVcsSUFBSyxjQUFlLENBQUUsRUFDL0MsQ0FBRSxLQUFNLEtBQUssVUFBVyxLQUFLLGNBQWUsQ0FBRSxFQUM5QyxDQUFFLEtBQU0sS0FBTSxVQUFXLEVBQUcsY0FBZSxDQUFFLENBQy9DLEVBRUEsU0FBd0IsQ0FBYyxDQUNwQyxFQUNBLEVBQ1EsQ0FDUixJQUFNLEVBQWMsT0FBTyxRQUFRLE9BQU8sT0FBTyxFQUFJLENBQVUsRUFFL0QsUUFBYSxPQUFNLFlBQVcsbUJBQW1CLEVBQy9DLEdBQUksR0FBZSxFQUFXLENBRTVCLElBQU0sRUFBVSxJQURELEVBQWMsR0FBVyxRQUFRLENBQWEsSUFDbEMsSUFBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFDdkQsT0FBTyxFQUFZLEVBQU0sS0FBSyxDQUFPLEVBQUksRUFJN0MsT0FBTyxFQUNILEVBQU0sS0FBSyxNQUFNLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQ3ZDLE1BQU0sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVDdEJqQyxTQUF3QixDQUFTLENBQUMsRUFBaUIsRUFBNEIsQ0FDN0UsSUFBTSxFQUFXLEVBQU0sWUFBWSxFQUNuQyxPQUFPLEVBQ0gsRUFBaUIsS0FBWSxFQUFTLE9BQU8sQ0FBQyxDQUFDLEdBQUssRUFDcEQsRUFBUyxPQUFPLENBQUMsRUNMdkIsU0FBd0IsQ0FBWSxDQUNsQyxFQUNBLEVBQ1EsQ0FDUixJQUFNLEVBQWdCLEVBQW1CLEdBQ3pDLE9BQU8sR0FBYSxFQUNoQixFQUFjLEVBQU8sT0FBTyxDQUFDLENBQUMsRUFDOUIsRUFBTyxPQUFPLENBQUMsRUNQckIsU0FBd0IsQ0FBVSxDQUNoQyxFQUNvQixDQUNwQixHQUFJLENBQ0YsT0FBTyxJQUFJLElBQUksRUFBWSxHQUFHLEVBQUUsU0FDaEMsS0FBTSxDQUNOLFFDSEosSUFBTSxFQUFNLENBQUMsSUFBc0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFFL0QsU0FBUyxDQUFnQixDQUFDLEVBQW9CLENBQzVDLElBQU0sRUFBTyxFQUFLLFlBQVksRUFDeEIsRUFBUSxFQUFJLEVBQUssU0FBUyxFQUFJLENBQUMsRUFDL0IsRUFBTSxFQUFJLEVBQUssUUFBUSxDQUFDLEVBQ3hCLEVBQVEsRUFBSSxFQUFLLFNBQVMsQ0FBQyxFQUMzQixFQUFVLEVBQUksRUFBSyxXQUFXLENBQUMsRUFDL0IsRUFBVSxFQUFJLEVBQUssV0FBVyxDQUFDLEVBQy9CLEVBQUssRUFBSyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFFNUQsTUFBTyxHQUFHLEtBQVEsS0FBUyxLQUFPLEtBQVMsS0FBVyxLQUFXLElBR25FLFNBQVMsRUFBZ0IsQ0FBQyxFQUFZLEVBQXdCLENBQzVELElBQU0sRUFBNkMsQ0FDakQsS0FBTSxFQUFLLFlBQVksRUFDdkIsR0FBSSxFQUFLLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQzFDLEdBQUksRUFBSSxFQUFLLFNBQVMsRUFBSSxDQUFDLEVBQzNCLEdBQUksRUFBSSxFQUFLLFFBQVEsQ0FBQyxFQUN0QixHQUFJLEVBQUksRUFBSyxTQUFTLENBQUMsRUFDdkIsR0FBSSxFQUFJLEVBQUssV0FBVyxDQUFDLEVBQ3pCLEdBQUksRUFBSSxFQUFLLFdBQVcsQ0FBQyxFQUN6QixJQUFLLEVBQUksRUFBSyxnQkFBZ0IsQ0FBQyxFQUMvQixFQUFHLENBQUMsRUFBSyxrQkFBa0IsRUFBSSxFQUNqQyxFQUVBLE9BQU8sRUFBTyxRQUFRLGdDQUFpQyxNQUNwRCxFQUFPLElBQVUsSUFBSSxTQUFTLENBQ2pDLEVBR0ssU0FBUyxDQUFlLENBQUMsRUFBWSxFQUFrQyxDQUM1RSxHQUFJLENBQUMsR0FBUSxjQUNYLE9BQU8sRUFBSyxZQUFZLEVBRzFCLEdBQUksRUFBTyxnQkFBa0IsSUFBUSxFQUFPLGdCQXZDN0IsZUF3Q2IsT0FBTyxFQUFpQixDQUFJLEVBRzlCLE9BQU8sR0FBaUIsRUFBTSxFQUFPLGFBQWEsRU4zQnBELElBQU0sR0FDSiw4RkFFRixTQUFTLEVBQWUsQ0FBQyxFQUFvQixFQUE0QixDQUN2RSxHQUFJLEdBQVMsUUFBUSxZQUFjLE9BQ2pDLE9BQU8sRUFBUSxPQUFPLFdBQWEsUUFBUSxJQUFJLFdBQWEsT0FFOUQsT0FBTyxHQUFhLFFBQVEsSUFBSSxXQUFhLE9BR3hDLFNBQVMsQ0FBZSxDQUM3QixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFBWSxHQUNKLENBQ1IsSUFBTSxFQUFvQixHQUFnQixFQUFXLENBQU8sRUFDdEQsRUFBTSxJQUFJLEtBQ1YsRUFBNEIsQ0FDaEMsSUFBSyxFQUNELEVBQU0sU0FDSixFQUFNLE1BQU0sRUFBZ0IsRUFBSyxHQUFTLFFBQVEsU0FBUyxDQUFDLENBQzlELEVBQ0EsRUFBZ0IsRUFBSyxHQUFTLFFBQVEsU0FBUyxFQUNuRCxNQUFPLEtBQUssTUFBTSxFQUFJLFFBQVEsRUFBSSxJQUFJLEVBQUUsU0FBUyxFQUNqRCxNQUFPLEVBQVUsRUFBTyxDQUFTLEVBQ2pDLFNBQVUsRUFBZSxFQUFNLFdBQVksQ0FBUyxFQUNwRCxPQUFRLEVBQWEsRUFBUSxPQUFRLENBQVMsRUFDOUMsU0FBVSxFQUFXLENBQU8sRUFDNUIsT0FBUSxFQUFhLEVBQUssUUFBVSxJQUFLLENBQVMsRUFDbEQsUUFBUyxFQUFLLFNBQVcsR0FDekIsUUFBUyxFQUFLLFNBQ1QsSUFBTSxDQUNMLEdBQUksQ0FDRixPQUFPLEtBQUssVUFBVSxFQUFLLE9BQU8sRUFDbEMsTUFBTyxFQUFPLENBQ2QsTUFBTywrQkFBK0IsYUFBaUIsTUFBUSxFQUFNLFFBQVUsc0JBRWhGLEVBQ0gsR0FDSixHQUNFLEdBQVMsUUFBUSxJQUFNLEVBQVEsUUFBUSxJQUFJLGlCQUFpQixFQUN4RCxPQUFPLEVBQVEsUUFBUSxJQUFJLGlCQUFpQixJQUM1QyxFQUNSLEVBSUEsT0FGa0IsR0FBUyxRQUFRLGlCQUFtQixJQUVyQyxRQUFRLFdBQVksQ0FBQyxFQUFHLElBQWdCLENBQ3ZELEdBQUksS0FBTyxFQUNULE9BQU8sRUFBVyxJQUErQixHQUVuRCxNQUFPLEdBQ1IsRU9qRUgsZUFBc0IsQ0FBZSxDQUNuQyxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ2UsQ0FDZixHQUFJLENBQUMsR0FBUyxRQUFRLFlBQWMsRUFBUSxPQUFPLFdBQVcsU0FBVyxFQUN2RSxPQUdGLElBQU0sRUFBVSxFQUFnQixFQUFPLEVBQVMsRUFBTSxFQUFPLEVBQVMsRUFBSyxFQUVyRSxFQUFXLEVBQVEsT0FBTyxXQUFXLElBQUksS0FDN0MsRUFBVSxJQUFJLEVBQU8sRUFBUyxDQUFFLFVBQVMsT0FBTSxPQUFNLENBQUMsQ0FDeEQsRUFFQSxNQUFNLFFBQVEsSUFBSSxDQUFRLEVDMUI1QixtQkFBUyxnQkFDVCxrQkFBUyxtQkNEVCxtQkFBUyxnQkFDVCxtQkFBUyxjQUFVLFdBQVMsbUJBUTVCLElBQU0sR0FBZSxpQ0FDZixHQUFtQixvQkFDbkIsR0FBb0IsY0FNbkIsU0FBUyxDQUFTLENBQUMsRUFBK0IsQ0FDdkQsR0FBSSxPQUFPLElBQVMsU0FDbEIsT0FBTyxFQUdULElBQU0sRUFBZ0MsQ0FDcEMsRUFBRyxLQUNILEVBQUcsUUFDSCxFQUFHLFVBQ0wsRUFFTSxFQUFRLEVBQUssWUFBWSxFQUFFLE1BQU0sRUFBWSxFQUNuRCxHQUFJLENBQUMsSUFBUSxHQUNYLE1BQVUsTUFBTSx3QkFBd0IsR0FBTSxFQUdoRCxJQUFNLEVBQVEsT0FBTyxXQUFXLEVBQU0sRUFBRSxFQUNsQyxFQUFPLEVBQU0sSUFBTSxHQUV6QixPQUFPLEtBQUssTUFBTSxHQUFTLEVBQU0sSUFBUyxFQUFFLEVBT3ZDLFNBQVMsQ0FBYSxDQUFDLEVBQTBCLENBQ3RELElBQU0sRUFBZ0MsQ0FDcEMsRUFBRyxRQUNILEVBQUcsU0FDSCxFQUFHLFNBQ0wsRUFFTSxFQUFRLEVBQVMsWUFBWSxFQUFFLE1BQU0sRUFBZ0IsRUFDM0QsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLDRCQUE0QixHQUFVLEVBR3hELElBQU0sRUFBVyxFQUFNLEdBQ2pCLEVBQU8sRUFBTSxHQUVuQixHQUFJLENBQUMsRUFDSCxNQUFVLE1BQU0sNEJBQTRCLEdBQVUsRUFFeEQsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLDRCQUE0QixHQUFVLEVBSXhELE9BRGMsT0FBTyxTQUFTLEVBQVUsRUFBRSxHQUMxQixFQUFNLElBQVMsR0FPMUIsU0FBUyxDQUFjLENBQUMsRUFBNkMsQ0FDMUUsR0FBSSxPQUFPLElBQWMsU0FDdkIsTUFBTyxDQUFFLEtBQU0sUUFBUyxNQUFPLENBQVUsRUFJM0MsSUFBTSxFQUFRLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBaUIsRUFDN0QsR0FBSSxJQUFRLEdBRVYsTUFBTyxDQUFFLEtBQU0sT0FBUSxNQURWLE9BQU8sU0FBUyxFQUFNLEdBQUksRUFBRSxFQUNKLEdBQUssR0FBSyxHQUFLLElBQUssRUFHM0QsTUFBVSxNQUFNLDZCQUE2QixHQUFXLEVBdUIxRCxlQUFlLEVBQW1CLENBQUMsRUFBbUMsQ0FDcEUsR0FBSSxDQUVGLE9BRGMsTUFBTSxFQUFHLEtBQUssQ0FBUSxHQUN2QixNQUFNLFFBQVEsRUFDM0IsS0FBTSxDQUVOLE9BQU8sS0FBSyxJQUFJLEdBS3BCLElBQU0sRUFBb0IsSUFBSSxJQUs5QixlQUFzQixDQUFrQixDQUN0QyxFQUNBLEVBQ2tCLENBQ2xCLElBQU0sRUFBTSxLQUFLLElBQUksRUFHZixFQUFhLEVBQWtCLElBQUksQ0FBUSxFQUNqRCxHQUFJLElBQWUsT0FDakIsT0FBTyxFQUFNLEdBQWMsRUFJN0IsSUFBTSxFQUFlLE1BQU0sR0FBb0IsQ0FBUSxFQUd2RCxPQUZBLEVBQWtCLElBQUksRUFBVSxDQUFZLEVBRXJDLEVBQU0sR0FBZ0IsRUFNeEIsU0FBUyxDQUFrQixDQUFDLEVBQXdCLENBQ3pELEVBQWtCLElBQUksRUFBVSxLQUFLLElBQUksQ0FBQyxFQU01QyxlQUFzQixDQUFlLENBQUMsRUFBcUMsQ0FDekUsSUFBTSxFQUFNLEdBQVEsQ0FBUSxFQUN0QixFQUFXLEdBQVMsQ0FBUSxFQUVsQyxHQUFJLENBQ0YsSUFBTSxFQUFRLE1BQU0sRUFBRyxRQUFRLENBQUcsRUFFNUIsRUFBaUIsSUFBSSxPQUN6QixJQUFJLEVBQVMsUUFBUSxzQkFBdUIsTUFBTSwyREFDcEQsRUFDTSxFQUFlLEVBQ2xCLE9BQU8sS0FBUSxFQUFlLEtBQUssQ0FBSSxDQUFDLEVBQ3hDLElBQUksS0FBUSxHQUFLLEVBQUssQ0FBSSxDQUFDLEVBVTlCLE9BUHVCLE1BQU0sUUFBUSxJQUNuQyxFQUFhLElBQUksTUFBTSxJQUFRLENBQzdCLElBQU0sRUFBUSxNQUFNLEVBQUcsS0FBSyxDQUFJLEVBQ2hDLE1BQU8sQ0FBRSxPQUFNLE1BQU8sRUFBTSxNQUFNLFFBQVEsQ0FBRSxFQUM3QyxDQUNILEdBR0csS0FBSyxDQUFDLEVBQUcsSUFBTSxFQUFFLE1BQVEsRUFBRSxLQUFLLEVBQ2hDLElBQUksS0FBUSxFQUFLLElBQUksRUFDeEIsS0FBTSxDQUNOLE1BQU8sQ0FBQyxHQ25MWiwyQkFBUyx3QkFBa0IsZUFBbUIsZ0JBQzlDLG1CQUFTLDhCQUNULHFCQUFTLG1CQWVGLFNBQVMsRUFBa0IsQ0FBQyxFQUFrQixFQUF5QixDQUM1RSxJQUFNLEVBQU8sRUFBVSxZQUFZLEVBQzdCLEVBQVEsT0FBTyxFQUFVLFNBQVMsRUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDeEQsRUFBTSxPQUFPLEVBQVUsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDakQsRUFBUSxPQUFPLEVBQVUsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDcEQsRUFBVSxPQUFPLEVBQVUsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDeEQsRUFBVSxPQUFPLEVBQVUsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFFOUQsTUFBTyxHQUFHLEtBQVksS0FBUSxLQUFTLEtBQU8sS0FBUyxLQUFXLElBTXBFLGVBQXNCLEVBQVUsQ0FBQyxFQUFtQyxDQUNsRSxHQUFJLENBR0YsSUFEYyxNQUFNLEVBQUcsS0FBSyxDQUFRLEdBQzFCLE9BQVMsRUFFakIsTUFBTyxHQUdULElBQU0sRUFBYyxHQUFtQixFQUFVLElBQUksSUFBTSxFQUkzRCxPQUhBLE1BQU0sRUFBRyxPQUFPLEVBQVUsQ0FBVyxFQUNyQyxFQUFtQixDQUFRLEVBRXBCLEVBQ1AsTUFBTyxFQUFPLENBRWQsR0FBSyxFQUFnQyxPQUFTLFNBQzVDLFFBQVEsTUFBTSw2QkFBNkIsS0FBYSxDQUFLLEVBRS9ELE1BQU8sSUFPWCxlQUFzQixFQUFZLENBQUMsRUFBaUMsQ0FDbEUsR0FBSSxDQUNGLElBQU0sRUFBaUIsR0FBRyxPQUNwQixFQUFTLEdBQWlCLENBQVEsRUFDbEMsRUFBYyxHQUFrQixDQUFjLEVBQzlDLEVBQU8sR0FBVyxFQUV4QixNQUFNLEdBQVMsRUFBUSxFQUFNLENBQVcsRUFHeEMsTUFBTSxFQUFHLE9BQU8sQ0FBUSxFQUN4QixNQUFPLEVBQU8sQ0FDZCxRQUFRLE1BQU0sMkJBQTJCLEtBQWEsQ0FBSyxHQU8vRCxlQUFzQixFQUFhLENBQ2pDLEVBQ0EsRUFDZSxDQUNmLEdBQUksQ0FBQyxFQUFPLFNBQ1YsT0FHRixHQUFJLENBQ0YsSUFBTSxFQUFlLE1BQU0sRUFBZ0IsQ0FBUSxFQUNuRCxHQUFJLEVBQWEsU0FBVyxFQUMxQixPQUdGLElBQU0sRUFBWSxFQUFlLEVBQU8sUUFBUSxFQUVoRCxHQUFJLEVBQVUsT0FBUyxRQUFTLENBRTlCLElBQU0sRUFBZ0IsRUFBYSxNQUFNLEVBQVUsS0FBSyxFQUN4RCxNQUFNLFFBQVEsSUFBSSxFQUFjLElBQUksS0FBUSxFQUFHLE9BQU8sQ0FBSSxDQUFDLENBQUMsRUFDdkQsUUFBSSxFQUFVLE9BQVMsT0FBUSxDQUVwQyxJQUFNLEVBQWEsS0FBSyxJQUFJLEVBQUksRUFBVSxNQUNwQyxFQUFnQixNQUFNLFFBQVEsSUFDbEMsRUFBYSxJQUFJLE1BQU0sSUFBUSxDQUU3QixPQURjLE1BQU0sRUFBRyxLQUFLLENBQUksR0FDbkIsTUFBTSxRQUFRLEVBQUksRUFBYSxFQUFPLEtBQ3BELENBQ0gsRUFFQSxNQUFNLFFBQVEsSUFDWixFQUNHLE9BQU8sQ0FBQyxJQUF5QixJQUFTLElBQUksRUFDOUMsSUFBSSxLQUFRLEVBQUcsT0FBTyxDQUFJLENBQUMsQ0FDaEMsR0FFRixNQUFPLEVBQU8sQ0FDZCxRQUFRLE1BQU0scUNBQXFDLEtBQWEsQ0FBSyxHQU96RSxlQUFzQixDQUFlLENBQ25DLEVBQ0EsRUFDZSxDQUNmLEdBQUksQ0FFRixJQUFNLEVBQWMsTUFBTSxHQUFXLENBQVEsRUFFN0MsR0FBSSxDQUFDLEVBQ0gsT0FJRixHQUFJLEVBQU8sU0FDVCxNQUFNLEdBQWEsQ0FBVyxFQUloQyxNQUFNLEdBQWMsRUFBVSxDQUFNLEVBQ3BDLE1BQU8sRUFBTyxDQUNkLFFBQVEsTUFBTSxrQ0FBa0MsS0FBYSxDQUFLLEdBT3RFLGVBQXNCLENBQVksQ0FDaEMsRUFDQSxFQUNrQixDQUNsQixHQUFJLENBRUYsTUFBTSxFQUFHLE9BQU8sQ0FBUSxFQUN4QixLQUFNLENBRU4sTUFBTyxHQUlULEdBQUksRUFBTyxRQUNULEdBQUksQ0FDRixJQUFNLEVBQWUsRUFBVSxFQUFPLE9BQU8sRUFFN0MsSUFEYyxNQUFNLEVBQUcsS0FBSyxDQUFRLEdBQzFCLE1BQVEsRUFDaEIsTUFBTyxHQUVULE1BQU8sRUFBTyxDQUNkLFFBQVEsTUFBTSxpQ0FBaUMsS0FBYSxDQUFLLEVBS3JFLEdBQUksRUFBTyxTQUNULEdBQUksQ0FDRixJQUFNLEVBQWEsRUFBYyxFQUFPLFFBQVEsRUFDMUMsRUFBUSxNQUFNLEVBQUcsS0FBSyxDQUFRLEVBRXBDLEdBRFksS0FBSyxJQUFJLEVBQUksRUFBTSxTQUNwQixFQUNULE1BQU8sR0FFVCxNQUFPLEVBQU8sQ0FFZCxRQUFRLE1BQU0sZ0NBQWdDLEtBQWEsQ0FBSyxFQUlwRSxNQUFPLEdGN0tULElBQU0sRUFBVyxJQUFJLElBRXJCLGVBQWUsRUFBcUIsQ0FBQyxFQUFpQyxDQUNwRSxJQUFNLEVBQU0sR0FBUSxDQUFRLEVBQzVCLEdBQUksQ0FBQyxFQUFTLElBQUksQ0FBRyxFQUNuQixNQUFNLEVBQUcsTUFBTSxFQUFLLENBQUUsVUFBVyxFQUFLLENBQUMsRUFDdkMsRUFBUyxJQUFJLENBQUcsRUFPcEIsZUFBZSxFQUFjLENBQzNCLEVBQ0EsRUFDZSxDQUNmLElBQU0sRUFBaUIsR0FBUyxRQUFRLFlBQ3hDLEdBQUksQ0FBQyxFQUNILE9BR0YsSUFBSSxFQUFnQixHQUdwQixHQUFJLEVBQWUsUUFDakIsRUFBZ0IsTUFBTSxFQUFhLEVBQVUsQ0FBYyxFQUk3RCxHQUFJLENBQUMsR0FBaUIsRUFBZSxTQUNuQyxHQUFJLENBQ0YsSUFBTSxFQUFhLEVBQWMsRUFBZSxRQUFRLEVBQ3hELEVBQWdCLE1BQU0sRUFBbUIsRUFBVSxDQUFVLEVBQzdELE1BQU8sRUFBTyxDQUNkLFFBQVEsTUFBTSxrREFBbUQsQ0FBSyxFQUsxRSxHQUFJLEVBQ0YsTUFBTSxFQUFnQixFQUFVLENBQWMsRUFJbEQsZUFBc0IsQ0FBUyxDQUM3QixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDZSxDQUNmLE1BQU0sR0FBc0IsQ0FBUSxFQUdwQyxNQUFNLEdBQWUsRUFBVSxDQUFPLEVBRXRDLElBQU0sRUFBYSxHQUFHLEVBQWdCLEVBQU8sRUFBUyxFQUFNLEVBQU8sRUFBUyxFQUFLO0FBQUEsRUFDakYsTUFBTSxFQUFHLFdBQVcsRUFBVSxFQUFZLENBQUUsS0FBTSxHQUFJLENBQUMsRUd2RXpELElBQU0sRUFBYyxDQUFDLEVBQXNCLElBQ3pDLE1BQU0sUUFBUSxDQUFXLEVBQ3JCLEVBQVksU0FBUyxDQUFLLEVBQzFCLElBQWdCLEVBRWYsU0FBUyxDQUFTLENBQ3ZCLEVBQ0EsRUFDQSxFQUNBLEVBQ1MsQ0FDVCxJQUFNLEVBQVMsR0FBUyxRQUFRLFVBQ2hDLEdBQUksQ0FBQyxFQUNILE1BQU8sR0FHVCxPQUNHLENBQUMsRUFBTyxPQUFTLEVBQVksRUFBTyxNQUFPLENBQVEsS0FDbkQsQ0FBQyxFQUFPLFFBQVUsRUFBWSxFQUFPLE9BQVEsQ0FBTSxLQUNuRCxDQUFDLEVBQU8sUUFBVSxFQUFZLEVBQU8sT0FBUSxDQUFNLEdDakJ4RCxlQUFzQixDQUFlLENBQ25DLEVBQ0EsRUFDQSxFQUNBLEVBQ2UsQ0FFZixJQUFNLEVBQVUsQ0FDZCxPQUZpQixFQUFNLFFBQVUsSUFHakMsUUFBUyxFQUFNLFFBQ2YsTUFBTyxFQUFNLEtBQ2YsRUFFTSxFQUE0QixDQUFDLEVBR25DLEdBQ0UsRUFDRSxHQUFTLFFBQVEsbUJBQ2pCLEdBQVMsUUFBUSx1QkFHbkIsUUFBUSxNQUFNLEVBQWdCLFFBQVMsRUFBUyxFQUFTLEVBQU8sQ0FBTyxDQUFDLEVBSTFFLEdBQ0UsQ0FBQyxHQUFTLFFBQVEsbUJBQ2xCLEdBQVMsUUFBUSxhQUNqQixDQUFDLEdBQVMsUUFBUSxtQkFFbEIsRUFBUyxLQUNQLEVBQ0UsRUFBUSxPQUFPLFlBQ2YsUUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNGLENBQ0YsRUFJRixHQUFJLEdBQVMsUUFBUSxZQUFZLE9BQy9CLEVBQVMsS0FBSyxFQUFnQixRQUFTLEVBQVMsRUFBUyxFQUFPLENBQU8sQ0FBQyxFQUcxRSxNQUFNLFFBQVEsSUFBSSxDQUFRLEVicEM1QixTQUFTLEVBQVUsRUFBdUIsQ0FDeEMsSUFBTSxFQUFjLFFBQVEsWUFBWSxFQUFFLFNBQVcsS0FBTyxLQUN0RCxFQUFXLFFBQVEsU0FBUyxFQUVsQyxNQUFPLENBQ0wsY0FDQSxTQUFVLEVBQVMsS0FBTyxHQUM1QixFQUdGLFNBQVMsRUFBZSxDQUFDLEVBQXdCLENBQy9DLE1BQU8sQ0FDTCxNQUFPLEVBQVcsT0FBUyxPQUMzQixVQUFXLEVBQVcsV0FBYSxHQUNuQyxXQUFZLEVBQVcsWUFBYyxNQUNyQyxTQUFVLEVBQVcsVUFBWSxNQUNqQyxLQUFNLEVBQVcsTUFBUSxDQUFFLElBQUssUUFBUSxHQUFJLENBQzlDLEVBR0YsU0FBUyxFQUFxQixDQUFDLEVBQStCLENBQzVELE9BQU8sRUFBSyxVQUFVLENBQ3BCLE9BQVEsY0FDUixRQUFTLENBQ1AsU0FBVSxHQUNWLGNBQWUsYUFDZixPQUFRLGtCQUNKLE9BQU8sSUFBZ0IsU0FBVyxFQUFjLENBQUMsQ0FDdkQsQ0FDRixDQUFDLEVBR0gsU0FBUyxFQUFrQixDQUFDLEVBQStCLENBQ3pELElBQU0sRUFBYSxHQUFTLFFBQVEsTUFBUSxDQUFDLEdBQ3JDLGNBQWEsZUFBYyxHQUFTLEVBQ3RDLEVBQVMsSUFDVixHQUFnQixDQUFVLEtBQzFCLENBQ0wsRUFFQSxHQUFJLEVBQ0YsT0FBTyxFQUFLLEVBQVEsR0FBc0IsQ0FBVyxDQUFDLEVBR3hELEdBQUksRUFBVyxDQUNiLEdBQUksT0FBTyxJQUFjLFVBQVksV0FBWSxFQUMvQyxPQUFPLEVBQ0wsRUFDQSxFQUFLLFVBQ0gsQ0FDRixDQUNGLEVBRUYsUUFBUSxLQUNOLG1FQUNGLEVBR0YsT0FBTyxFQUFLLENBQU0sRUFHcEIsU0FBUyxFQUFpQixDQUFDLEVBQXlCLENBQ2xELE9BQVEsRUFBTSxZQUFZLE9BQ25CLFFBQ0gsTUFBTyxZQUNKLE9BQ0gsTUFBTyxXQUNKLGNBQ0EsT0FDSCxNQUFPLFdBQ0osUUFDSCxNQUFPLGdCQUdQLE9BREEsUUFBUSxLQUFLLHNCQUFzQiwwQkFBOEIsRUFDMUQsUUFJYixTQUFTLEVBQVcsQ0FDbEIsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sSUFBTSxFQUFZLEdBQWtCLENBQUssRUFDbkMsRUFBWSxFQUFXLEdBR3ZCLEVBQXNCLFFBQzFCLEdBQVMsUUFBUSxNQUFNLFdBQWEsR0FBUyxRQUFRLE1BQU0sV0FDN0QsRUFJQSxJQUZFLENBQUMsR0FBUyxRQUFRLG1CQUFxQixJQUVuQixPQUFPLElBQWMsV0FDekMsRUFBVSxLQUFLLEVBQVksRUFBVyxDQUFPLEVBSWpELGVBQWUsRUFBYSxDQUMxQixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDZSxDQUNmLElBQU0sRUFBNEIsQ0FBQyxFQUduQyxHQUNFLEVBQ0UsR0FBUyxRQUFRLG1CQUNqQixHQUFTLFFBQVEsdUJBR25CLFFBQVEsSUFBSSxDQUFVLEVBSXhCLEdBQ0UsQ0FBQyxHQUFTLFFBQVEsbUJBQ2xCLEdBQVMsUUFBUSxhQUNqQixDQUFDLEdBQVMsUUFBUSxtQkFFbEIsRUFBUyxLQUNQLEVBQ0UsRUFBUSxPQUFPLFlBQ2YsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNGLENBQ0YsRUFJRixHQUFJLEdBQVMsUUFBUSxZQUFZLE9BQy9CLEVBQVMsS0FBSyxFQUFnQixFQUFPLEVBQVMsRUFBTSxFQUFPLENBQU8sQ0FBQyxFQUdyRSxNQUFNLFFBQVEsSUFBSSxDQUFRLEVBRzVCLGVBQWUsQ0FBRyxDQUNoQixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDZSxDQUNmLEdBQUksQ0FBQyxFQUFVLEVBQU8sRUFBSyxRQUFVLElBQUssRUFBUSxPQUFRLENBQU8sRUFDL0QsT0FHRixHQUFJLENBQUMsRUFBSyxRQUNSLEVBQUssUUFBVSxHQUFXLEVBRzVCLEdBQUksSUFBVSxTQUFXLENBQUMsRUFBSyxNQUFPLENBQ3BDLElBQU0sRUFBVSxNQUFNLEVBQUssU0FBVyxlQUFlLEVBQ3JELEVBQUssTUFBUSxFQUFJLE1BR25CLElBQU0sRUFBVyxHQUFTLFFBQVEsTUFBTSxVQUFZLE1BQzlDLEVBQ0osSUFBVSxTQUFXLEVBQUssTUFDdEIsQ0FDRSxLQUFNLFFBQ04sUUFBUyxFQUFLLFNBQVcsZ0JBQ3pCLE1BQU8sRUFBSyxLQUNkLEVBQ0EsT0FFQSxFQUFlLEVBQVEsUUFBUSxJQUFJLGlCQUFpQixFQUNwRCxFQUNKLEdBQVMsUUFBUSxJQUFNLEVBQ25CLEVBQWEsTUFBTSxHQUFHLEVBQUUsSUFBSSxLQUFLLEVBQ2pDLE9BRUEsRUFBWSxDQUNoQixPQUFRLEVBQVEsT0FDaEIsSUFBSyxFQUFRLElBQ2IsT0FBUSxFQUFLLE9BQ2IsUUFBUyxFQUFLLFFBQ2QsUUFBUyxFQUFLLFFBQ2QsUUFBUyxFQUFLLFFBQ2QsU0FBVSxPQUFPLFFBQVEsT0FBTyxPQUFPLEVBQUksRUFBTSxVQUFVLEVBQUksSUFDL0QsR0FBSSxHQUNILEdBQVcsQ0FDZCxFQUVBLEdBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFBSyxTQUFXLG9CQUNoQixDQUNGLEVBRUEsSUFBTSxFQUFhLEVBQWdCLEVBQU8sRUFBUyxFQUFNLEVBQU8sRUFBUyxFQUFJLEVBRTdFLE1BQU0sR0FBYyxFQUFPLEVBQVMsRUFBTSxFQUFPLEVBQVMsQ0FBVSxFQUcvRCxTQUFTLENBQVksQ0FBQyxFQUEyQixDQUN0RCxJQUFNLEVBQWEsR0FBbUIsQ0FBTyxFQUV2QyxFQUFpQixDQUNyQixNQUFPLE9BQ1AsS0FBTSxFQUNOLElBQUssQ0FBQyxFQUFPLEVBQVMsRUFBTSxJQUMxQixFQUFJLEVBQVksRUFBTyxFQUFTLEVBQU0sRUFBTyxDQUFPLEVBQ3RELGdCQUFpQixNQUFPLEVBQVMsRUFBTyxJQUN0QyxNQUFNLEVBQWdCLEVBQVMsRUFBTyxFQUFPLENBQU8sRUFDdEQsZ0JBQWlCLEdBQVMsUUFBUSxnQkFDbEMsS0FBTSxDQUFDLEVBQVMsRUFBUyxFQUFTLElBQVUsQ0FDMUMsSUFBTSxFQUFZLEdBQ2hCLEVBQU8sT0FBUyxDQUFFLFdBQVksUUFBUSxPQUFPLE9BQU8sQ0FBRSxFQUV4RCxPQURBLEVBQVUsYUFBZSxHQUNsQixFQUNMLEVBQ0EsT0FDQSxFQUNBLENBQUUsVUFBUyxVQUFTLE9BQVEsR0FBSSxFQUNoQyxFQUNBLENBQ0YsR0FFRixNQUFPLENBQUMsRUFBUyxFQUFTLEVBQVMsSUFBVSxDQUMzQyxJQUFNLEVBQVksR0FDaEIsRUFBTyxPQUFTLENBQUUsV0FBWSxRQUFRLE9BQU8sT0FBTyxDQUFFLEVBRXhELE9BREEsRUFBVSxhQUFlLEdBQ2xCLEVBQ0wsRUFDQSxRQUNBLEVBQ0EsQ0FBRSxVQUFTLFVBQVMsT0FBUSxHQUFJLEVBQ2hDLEVBQ0EsQ0FDRixHQUVGLEtBQU0sQ0FBQyxFQUFTLEVBQVMsRUFBUyxJQUFVLENBQzFDLElBQU0sRUFBWSxHQUNoQixFQUFPLE9BQVMsQ0FBRSxXQUFZLFFBQVEsT0FBTyxPQUFPLENBQUUsRUFFeEQsT0FEQSxFQUFVLGFBQWUsR0FDbEIsRUFDTCxFQUNBLFVBQ0EsRUFDQSxDQUFFLFVBQVMsVUFBUyxPQUFRLEdBQUksRUFDaEMsRUFDQSxDQUNGLEdBRUYsTUFBTyxDQUFDLEVBQVMsRUFBUyxFQUFTLElBQVUsQ0FDM0MsSUFBTSxFQUFZLEdBQ2hCLEVBQU8sT0FBUyxDQUFFLFdBQVksUUFBUSxPQUFPLE9BQU8sQ0FBRSxFQUV4RCxPQURBLEVBQVUsYUFBZSxHQUNsQixFQUNMLEVBQ0EsUUFDQSxFQUNBLENBQUUsVUFBUyxVQUFTLE9BQVEsR0FBSSxFQUNoQyxFQUNBLENBQ0YsRUFFSixFQUNBLE9BQU8sRUh6UlQsU0FBd0IsRUFBVSxDQUFDLEVBQTJCLENBQzVELElBQU0sRUFBTSxFQUFhLENBQU8sRUFFaEMsT0FBTyxJQUFJLEdBQU8sQ0FDaEIsS0FBTSxZQUNSLENBQUMsRUFDRSxRQUFRLEtBQU8sQ0FFZCxHQUQyQixHQUFTLFFBQVEsb0JBQXNCLEdBRWhFLEVBQVksRUFBSSxPQUFrQixDQUFPLEVBRTVDLEVBQ0EsVUFBVSxLQUFPLENBQ2hCLElBQU0sRUFBUSxJQUNULEVBQUksTUFDUCxXQUFZLFFBQVEsT0FBTyxPQUFPLEVBQ2xDLE9BQVEsRUFDUixLQUFNLEVBQUksS0FDVixhQUFjLEVBQ2hCLEVBQ0EsRUFBSSxNQUFRLEVBQ1osRUFBSSxNQUFRLEVBQ2IsRUFDQSxjQUFjLENBQUUsR0FBSSxRQUFTLEVBQUcsRUFBRyxVQUFTLE1BQUssV0FBWSxDQUM1RCxJQUFNLEVBQVksRUFFbEIsR0FBSSxDQUFDLEVBQVUsYUFBYyxDQUMzQixJQUFNLEVBQVMsRUFBYyxFQUFJLFFBQVUsR0FBRyxFQUM5QyxFQUFJLElBQ0YsT0FDQSxFQUNBLENBQ0UsU0FDQSxRQUFTLE9BQU8sRUFBSSxVQUFVLGNBQWdCLEVBQUUsQ0FDbEQsRUFDQSxDQUNGLEdBRUgsRUFDQSxRQUFRLENBQUUsR0FBSSxRQUFTLEVBQUcsT0FBUyxVQUFTLFFBQU8sTUFBSyxXQUFZLENBQ25FLElBQU0sRUFBUyxFQUFjLEVBQUksUUFBVSxHQUFHLEVBQzlDLE1BQU0sRUFBSSxnQkFDUixFQUNBLElBQUssRUFBTyxRQUFPLEVBQ25CLENBQ0YsRUFDRCIsCiAgImRlYnVnSWQiOiAiNjJBODdFNTc4QTMwNEZCQjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logixlysia",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"description": "๐ฆ Logixlysia is a logger for Elysia",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -81,16 +81,18 @@
|
|
|
81
81
|
"middleware"
|
|
82
82
|
],
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"chalk": "^5.
|
|
85
|
-
"elysia": "^1.
|
|
84
|
+
"chalk": "^5.6.2",
|
|
85
|
+
"elysia": "^1.4.10",
|
|
86
|
+
"pino": "^10.0.0",
|
|
87
|
+
"pino-pretty": "^13.1.2"
|
|
86
88
|
},
|
|
87
89
|
"devDependencies": {
|
|
88
90
|
"@biomejs/biome": "2.0.5",
|
|
89
|
-
"bun-types": "^1.
|
|
90
|
-
"bunup": "^0.
|
|
91
|
-
"globals": "^16.
|
|
92
|
-
"husky": "^9.1.
|
|
93
|
-
"ultracite": "
|
|
91
|
+
"bun-types": "^1.2.23",
|
|
92
|
+
"bunup": "^0.14.20",
|
|
93
|
+
"globals": "^16.4.0",
|
|
94
|
+
"husky": "^9.1.7",
|
|
95
|
+
"ultracite": "5.0.10"
|
|
94
96
|
},
|
|
95
97
|
"peerDependencies": {
|
|
96
98
|
"typescript": "^5.2.2"
|