UNPKG

93.1 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Qe=Object.create;var L=Object.defineProperty,Xe=Object.defineProperties,Ye=Object.getOwnPropertyDescriptor,Ze=Object.getOwnPropertyDescriptors,et=Object.getOwnPropertyNames,pe=Object.getOwnPropertySymbols,tt=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty,rt=Object.prototype.propertyIsEnumerable;var de=(e,t,r)=>t in e?L(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,d=(e,t)=>{for(var r in t||(t={}))me.call(t,r)&&de(e,r,t[r]);if(pe)for(var r of pe(t))rt.call(t,r)&&de(e,r,t[r]);return e},P=(e,t)=>Xe(e,Ze(t)),ot=e=>L(e,"__esModule",{value:!0});var st=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of et(t))!me.call(e,o)&&o!=="default"&&L(e,o,{get:()=>t[o],enumerable:!(r=Ye(t,o))||r.enumerable});return e},u=e=>st(ot(L(e!=null?Qe(tt(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Je=u(require("fs-extra")),Ke=u(require("sade"));var it="presta",nt="0.40.7",at="Hyper minimal framework for the modern web.",lt="index.js",ct="index.d.ts",ut={presta:"cli.js"},pt={build:"node scripts/build",cloc:"pnpx cloc lib/*.ts",typecheck:"pnpx tsc --noEmit"},mt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},dt="estrattonbailey",gt="MIT",ft={url:"https://github.com/sure-thing/presta/issues"},ht="https://github.com/sure-thing/presta#readme",bt={"@netlify/functions":"^0.7.2","@types/mime-types":"^2.1.0",chokidar:"^3.4.3",deepmerge:"^4.2.2",esbuild:"^0.12.28","esbuild-register":"^2.6.0",filewatcher:"^3.0.1","fs-extra":"^9.0.1","get-port":"^5.1.1",kleur:"^4.1.4","mime-types":"^2.1.31","module-alias":"^2.2.2",ms:"^2.1.2",picomatch:"^2.3.0","pocket.io":"^0.1.4","query-string":"^6.14.1","raw-body":"^2.4.1",regexparam:"^1.3.0","route-sort":"^1.0.0",sade:"^1.7.3",sirv:"^1.0.7","tiny-glob":"^0.2.9","watch-dependency-graph":"^2.6.1"},yt={"@types/fs-extra":"^9.0.12","@types/picomatch":"^2.2.4","@types/sade":"^1.7.3",proxyquire:"^2.1.3","supertest-fetch":"^1.4.3"},ge={name:it,version:nt,description:at,main:lt,types:ct,bin:ut,scripts:pt,repository:mt,author:dt,license:gt,bugs:ft,homepage:ht,dependencies:bt,devDependencies:yt};var k=u(require("kleur"));var y={PRODUCTION:"production",DEVELOPMENT:"development"};var vt={pid:process.pid,cwd:process.cwd(),env:y.PRODUCTION,debug:!1};function U(e){return global.__presta__=e,e}function F(){return global.__presta__||U(vt),global.__presta__}var w;(function(i){i.Debug="debug",i.Info="info",i.Warn="warn",i.Err="error"})(w||(w={}));var fe=[],xt={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function V(e){if(process.env.TESTING)fe.push(e);else{let t=F().debug,r=F().env===y.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([k.default.gray(r),k.default[xt[e.level||"info"]](e.label),e.message,e.duration?k.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function p(e){V(d({level:w.Debug},e))}function v(e){V(d({level:w.Info},e))}function C(e){V(d({level:w.Warn},e))}function g(e){V(d({level:w.Err},e))}function G(...e){process.env.TESTING?fe.push(e):console.log(...e)}function R(){process.env.TESTING||console.log("")}var be=u(require("fs")),S=u(require("path"));function he(){let e={};function t(n,...a){e[n]&&e[n].map(s=>s(...a))}function r(n,a){return e[n]=e[n]?e[n].concat(a):[a],()=>e[n].splice(e[n].indexOf(a),1)}function o(){e={}}function i(n){return e[n]||[]}return{emit:t,on:r,clear:o,listeners:i}}var ye="presta.config.js";function ve(e,{cwd:t}){return e.files&&(e.files=[].concat(e.files).map(r=>S.default.resolve(t,r))),e.output&&(e.output=S.default.resolve(t,e.output)),e.assets&&(e.assets=S.default.resolve(t,e.assets)),e}function $(e,t=!1){let r=S.default.resolve(e||ye);try{return require(r)}catch(o){return be.default.existsSync(r)&&(g({label:"error",error:o}),t&&process.exit(1)),{}}}async function xe(){return p({label:"debug",message:"config file values cleared"}),U(await O(P(d({},F()),{config:{}})))}async function O({cwd:e=process.cwd(),env:t=F().env,config:r={},cli:o={}}){r=ve(d({},r),{cwd:e}),o=ve(d({},o),{cwd:e});let i={output:S.default.resolve(e,o.output||r.output||"build"),assets:S.default.resolve(o.assets||r.assets||"public"),files:o.files&&o.files.length?o.files:r.files?[].concat(r.files):[]},n=o.port?parseInt(o.port):r.port||4e3,a=F(),s=a.events||he();s.clear();let l=U(P(d(d({},a),i),{env:t,cwd:e,port:n,debug:o.debug||F().debug,configFilepath:S.default.resolve(o.config||ye),staticOutputDir:S.default.join(i.output,"static"),functionsOutputDir:S.default.join(i.output,"functions"),functionsManifest:S.default.join(i.output,"routes.json"),events:s,hooks:{emitPostBuild(c){s.emit("postBuild",c)},onPostBuild(c){return s.on("postBuild",c)},emitBuildFile(c){s.emit("buildFile",c)},onBuildFile(c){return s.on("buildFile",c)},emitBrowserRefresh(){s.emit("browserRefresh")},onBrowserRefresh(c){return s.on("browserRefresh",c)}}}));return r.plugins&&await Promise.all(r.plugins.map(c=>{try{return c(F)}catch(m){g({label:"error",error:m})}})),p({label:"debug",message:`config created ${JSON.stringify(l)}`}),l}var Q=u(require("fs-extra")),$e=u(require("watch-dependency-graph")),Ie=u(require("chokidar")),De=u(require("picomatch"));var q=u(require("fs-extra")),oe=u(require("path")),Se=u(require("route-sort"));function we(e){for(var t=5381,r=e.length;r;)t=t*33^e.charCodeAt(--r);return(t>>>0).toString(36)}function wt(e,t){let{route:r}=require(e),o=oe.default.basename(e).split(".").reverse().slice(1).reverse().join("."),i=oe.default.join(t.functionsOutputDir,t.env===y.PRODUCTION?o+"-"+we(q.default.readFileSync(e,"utf8"))+".js":o+".js");return p({label:"debug",message:`generating ${o} lambda`}),delete require.cache[e],delete require.cache[i],q.default.outputFileSync(i,`import { wrapHandler } from 'presta';
7import * as file from '${e}';
8export const route = file.route
9export const handler = wrapHandler(file)`),[r,i]}function z(e,t){let r=e.map(n=>{try{return wt(n,t)}catch(a){return g({label:"error",error:a}),null}}).filter(Boolean),o=(0,Se.default)(r.map(n=>n[0])),i={};for(let n of o){let a=r.find(s=>s[0]===n);a&&(i[n]=a[1])}return q.default.outputFileSync(t.functionsManifest,JSON.stringify(i)),r}var se=u(require("fs-extra")),Ee=u(require("path")),Pe=u(require("tiny-glob/sync"));function T(e){return/export\s.+\sroute\s+\=/.test(se.default.readFileSync(e,"utf-8"))}function _(e){return/export\s.+\sgetStaticPaths/.test(se.default.readFileSync(e,"utf-8"))}function M(e){try{return[].concat(e.files).map(t=>(0,Pe.default)(t,{cwd:e.cwd})).flat().map(t=>Ee.default.resolve(e.cwd,t))}catch(t){return g({label:"paths",message:"no files found",error:t}),[]}}var Oe=u(require("fs-extra")),ie=u(require("path")),Te=u(require("mime-types"));function E(){let e=process.hrtime();return()=>{let[t,r]=process.hrtime(e),o=r/1e6;return t<1?(o>=1?o.toFixed(0):o.toFixed(2))+"ms":t+"."+o.toFixed(0)+"s"}}var Fe=u(require("regexparam"));function Ce(e,t){let[r]=e.split("?"),o=(0,Fe.default)(t),i=0,n={},a=o.pattern.exec(r)||[];for(;i<o.keys.length;)n[o.keys[i]]=a[++i];return n}function St(e){return typeof e=="object"?JSON.stringify(e):e}function J(e){let{isBase64Encoded:t=!1,statusCode:r=200,headers:o={},multiValueHeaders:i={},body:n="",html:a=void 0,json:s=void 0,xml:l=void 0}=typeof e=="string"?{body:e}:e,c="text/html; charset=utf-8";return s?c="application/json; charset=utf-8":l&&(c="application/xml; charset=utf-8"),{isBase64Encoded:t,statusCode:r,headers:d({"Content-Type":c},o),multiValueHeaders:i,body:St(n||a||s||l||"")}}var j={};var Re=u(require("fs-extra")),ke=u(require("path"));function H(e,t){p({label:"debug",message:`removing old static file ${e}`}),Re.default.remove(ke.default.join(t.staticOutputDir,e))}function K({port:e}){return`
10 <script>
11 (function (global) {
12 try {
13 const socketio = document.createElement('script')
14 socketio.src = 'https://unpkg.com/pocket.io@0.1.4/min.js'
15 socketio.onload = function init () {
16 var disconnected = false
17 var socket = io('http://localhost:${e}', {
18 reconnectionAttempts: 3
19 })
20 socket.on('connect', function() { console.log('presta connected on port ${e}') })
21 socket.on('refresh', function() {
22 global.location.reload()
23 })
24 socket.on('disconnect', function() {
25 disconnected = true
26 })
27 socket.on('reconnect_failed', function(e) {
28 if (disconnected) return
29 console.error("presta - connection to server on :${e} failed")
30 })
31 }
32 document.head.appendChild(socketio)
33 } catch (e) {}
34 })(this);
35 <\/script>
36 `}function Et(e,t="html"){return ie.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}function N(e,t){return new Promise(async(r,o)=>{p({label:"debug",message:`rendering ${JSON.stringify(e)}`});let i=[],n=K({port:t.port});for(let a of e){let s=a.replace(t.cwd,"");try{delete require.cache[a];let l=require(a),c=await l.getStaticPaths(),m=j[a]=j[a]||[],I=[];if(!c||!c.length){C({label:"paths",message:`${s} - no paths to render`}),m.forEach(x=>H(x,t));continue}for(let x of c){let f=E(),ee={path:x,routeParameters:l.route?Ce(x,l.route):{}},b=J(await l.handler(ee,{})),B=b.headers?b.headers["Content-Type"]:"",te=B&&Te.default.extension(B)||"html",D=Et(x,te),re=b.body+(t.env===y.PRODUCTION?"":n);Oe.default.outputFileSync(ie.default.join(t.staticOutputDir,D),re,"utf-8"),i.push(D),I.push(D),v({label:"built",message:x,duration:f()})}for(let x of m)I.includes(x)||H(x,t);j[a]=I}catch(l){t.env==="development"?(g({label:"error",message:"errors detected, pausing...",error:l}),r({allGeneratedFiles:i})):(g({label:"error",error:l}),o(l));break}}r({allGeneratedFiles:i})})}function X(e,t){let r=E();z(e,t),e.length&&v({label:"built",message:"lambdas",duration:r()})}async function je(e){let t=M(e),r=Q.default.existsSync(e.configFilepath);t.length||C({label:"paths",message:"no files configured"}),X(t.filter(T),e);let o=(0,$e.default)({alias:{"@":e.cwd}}),i=Ie.default.watch(e.cwd,{ignoreInitial:!0,ignored:[e.output,e.assets]});async function n(){t=M(e),await N(t.filter(_),e),X(t.filter(T),e)}async function a(s){_(s)&&await N([s],e),T(s)&&X(t.filter(T),e),e.hooks.emitBrowserRefresh()}e.hooks.onBuildFile(({file:s})=>{a(s)}),o.on("remove",async([s])=>{p({label:"watch",message:`fileWatcher - removed ${s}`}),t.splice(t.indexOf(s),1),X(t.filter(T),e),s===e.configFilepath&&(e=await xe(),r=!1,n()),(j[s]||[]).forEach(l=>H(l,e))}),o.on("change",async([s])=>{if(p({label:"watch",message:`fileWatcher - changed ${s}`}),s===e.configFilepath){delete require.cache[e.configFilepath];try{e=await O({config:$(e.configFilepath)}),n()}catch(l){g({label:"error",error:l})}}else a(s)}),o.on("error",s=>{g({label:"error",error:s})}),i.on("all",async(s,l)=>{if(!(!/add|change/.test(s)||!Q.default.existsSync(l)||Q.default.lstatSync(l).isDirectory())&&((0,De.default)(e.files)(l)&&!t.includes(l)&&(p({label:"watch",message:`globalWatcher - add ${l}`}),t.push(l),o.add(l),a(l)),l===e.configFilepath&&!r)){p({label:"watch",message:`globalWatcher - add config file ${l}`}),o.add(e.configFilepath);try{e=await O({config:$(e.configFilepath)}),r=!0,n()}catch(c){g({label:"error",error:c})}}}),o.add(t),r&&o.add(e.configFilepath);try{t.map(require)}catch(s){g({label:"error",error:s})}}var ne=u(require("fs-extra")),Be=u(require("esbuild"));function Pt(e){try{return require(e)}catch(t){return{}}}async function _e(e){let t=E(),r=M(e),o=r.filter(_),i=r.filter(T);if(p({label:"build",message:"starting build"}),!o.length&&!i.length)C({label:"files",message:"no files were found, nothing to build"});else{let n="",a=0,s="",l="",c=await Promise.allSettled([(async()=>{if(o.length){let m=E(),{allGeneratedFiles:I}=await N(o,e);n=m(),a=I.length}})(),(async()=>{if(i.length){let m=E();z(i,e),await(0,Be.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,bundle:!0,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),s=m()}})(),(async()=>{if(ne.default.existsSync(e.assets)){let m=E();ne.default.copySync(e.assets,e.staticOutputDir),l=m()}})()]);if(c.find(m=>m.status==="rejected")){p({label:"build",message:"build partially failed"}),c.forEach(m=>{m.status==="rejected"&&g({label:"error",error:m.reason})}),process.exit(1);return}(n||s)&&R(),n&&v({label:"static",message:`rendered ${a} file(s)`,duration:n}),s&&v({label:"lambda",message:`compiled ${i.length} function(s)`,duration:s}),l&&v({label:"assets",message:`copied in ${l}`}),e.hooks.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:Pt(e.functionsManifest)}),(n||s)&&(R(),v({label:"complete",message:`in ${t()}`}),R())}}var ae=u(require("fs")),Y=u(require("path")),Ue=u(require("http")),Ve=u(require("get-port")),le=u(require("sirv")),Ge=u(require("chokidar")),qe=u(require("mime-types")),ze=u(require("regexparam"));var Me=`<!-- built with presta https://npm.im/presta -->
37<!DOCTYPE html>
38<html>
39 <head>
40 <meta charset="UTF-8" />
41 <meta name="viewport" content="width=device-width,initial-scale=1" />
42 <title>404</title>
43 <link
44 rel="stylesheet"
45 type="text/css"
46 href="https://unpkg.com/svbstrate@4.1.1/dist/svbstrate.css"
47 />
48 </head>
49 <body>
50 <div class="f aic jcc" style="height: 100vh">
51 <h2 class="p1" style="color: blue">404 Not Found</h2>
52 </div>
53 </body>
54</html>`;var He=u(require("url")),Ne=u(require("query-string")),Ae=u(require("raw-body")),We=u(require("mime-types")),Ft=/image|audio|video|application\/pdf|application\/zip|applicaton\/octet-stream/i;function Ct(e){return Boolean(e)&&Ft.test(e)}async function Le(e){var n;let t=String(e.headers["x-forwarded-for"])||e.connection.remoteAddress||"",r=(n=t.split(t.includes(".")?":":",").pop())==null?void 0:n.trim(),o=Ct(e.headers["content-type"]||""),i=e.headers["content-length"]?await(0,Ae.default)(e,{limit:"1mb",encoding:We.default.charset(e.headers["content-type"]||"")||void 0}):void 0;return{path:e.url,httpMethod:e.method,headers:P(d({},e.headers),{"client-ip":r}),multiValueHeaders:Object.keys(e.headers).reduce((a,s)=>e.headers[s]&&!e.headers[s].includes(",")?a:P(d({},a),{[s]:e.headers[s].split(",")}),{}),queryStringParameters:(0,Ne.parse)((0,He.parse)(e.url).query),body:i?new Buffer(i).toString(o?"base64":"utf8"):null,isBase64Encoded:o}}function A(e,t){let r=J(t);for(let o in t.multiValueHeaders)e.setHeader(o,String(t.multiValueHeaders[o]));for(let o in t.headers)e.setHeader(o,String(t.headers[o]));e.statusCode=r.statusCode,e.write(r.body),e.end()}function Rt(e,t){let r=Y.default.join(e,t);if(!Y.default.extname(t))try{return ae.default.readFileSync(Y.default.join(e,t,"index.html"),"utf8")}catch(o){}return ae.default.readFileSync(r,"utf8")}function kt({port:e,config:t}){let r=K({port:e}),o=t.staticOutputDir,i=t.assets;return async function(a,s){let l=E(),c=a.url;p({label:"debug",message:`attempting to serve user static asset ${c}`}),(0,le.default)(i,{dev:!0})(a,s,()=>{p({label:"debug",message:`attempting to serve generated static asset ${c}`}),(0,le.default)(o,{dev:!0})(a,s,async()=>{try{delete require.cache[t.functionsManifest];let m=require(t.functionsManifest),x=Object.keys(m).map(f=>({matcher:(0,ze.default)(f),route:f})).filter(({matcher:f})=>f.pattern.test(c.split("?")[0])).map(({route:f})=>m[f])[0];if(x){p({label:"debug",message:`attempting to render lambda for ${c}`});let{handler:f}=require(x),ee=await Le(a),b=await f(ee,{}),B=b.headers||{},te=b.statusCode>299&&b.statusCode<399,D=B["Content-Type"],re=D?qe.default.extension(D):"html";v({label:"serve",message:`${b.statusCode} ${te?B.Location:c}`,duration:l()}),A(s,{statusCode:b.statusCode,headers:b.headers,multiValueHeaders:b.multiValueHeaders,body:re==="html"?(b.body||"").split("</body>")[0]+r:b.body})}else{p({label:"debug",message:`attempting to render static 404.html page for ${c}`});try{let f=Rt(o,"404")+r;C({label:"serve",message:`404 ${c}`,duration:l()}),A(s,{statusCode:404,body:f})}catch(f){f.message.includes("ENOENT")||console.error(f),p({label:"debug",message:`rendering default 404 HTML page for ${c}`}),C({label:"serve",message:`404 ${c}`,duration:l()}),A(s,{statusCode:404,body:Me+r})}}}catch(m){p({label:"debug",message:`rendering default 500 HTML page for ${c}`}),g({label:"serve",message:`500 ${c}`,error:m,duration:l()}),A(s,{statusCode:500,body:""+r})}})})}}async function ce(e){let t=await(0,Ve.default)({port:e.port}),r=Ue.default.createServer(kt({port:t,config:e})).listen(t),o=require("pocket.io")(r,{serveClient:!1});return e.hooks.onBrowserRefresh(()=>{p({label:"debug",message:"refresh event received"}),o.emit("refresh")}),Ge.default.watch(e.assets,{ignoreInitial:!0}).on("all",()=>{e.hooks.emitBrowserRefresh()}),{port:t}}var W=(0,Ke.default)("presta"),Z="presta.config.js";function ue(e={}){require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}W.version(ge.version).option("--config, -c",`Path to a config file. (default ${Z})`).option("--output, -o","Specify output directory for built files. (default ./build)").option("--assets, -a","Specify static asset directory. (default ./public)").option("--debug, -d","Enable debug mode (prints more logs)").example("dev index.jsx -o dist").example("dev 'pages/*.tsx' -o static").example("'pages/*.tsx'").example("-c site.json").example("serve -p 8080");W.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${Z}`).action(async e=>{ue(),console.clear();let t=await O({env:y.PRODUCTION,config:$(e.config,!0),cli:P(d({},e),{files:e._})});Je.default.emptyDirSync(t.output),G(`${k.default.blue("presta build")}`),R(),await _e(t)});W.command("dev","Start Presta dev server and watch files",{alias:"watch"}).option("--port, -p","Port to run the local server. (default 4000)").option("--no-serve, -n","Do not run local dev server. (default false)").describe("Watch project and build to output directory.").example("dev").example("dev ./files/**/*.js").example("dev ./files/**/*.js -o ./out").example(`dev -c ${Z}`).action(async e=>{ue(),console.clear();let t=await O({env:y.DEVELOPMENT,config:$(e.config),cli:P(d({},e),{files:e._})});if(e.n)v({label:"dev"}),R();else{let r=await ce(t);G(`${k.default.blue("presta dev")} - http://localhost:${r.port}`),R()}je(t)});W.command("serve").option("--port, -p","Port to run the local server. (default 4000)").describe("Serve built files, lambdas, and static assets.").example("serve").example("serve -o ./out -p 8080").example(`serve -c ${Z}`).action(async e=>{ue(),console.clear();let t=await O({env:y.PRODUCTION,config:$(e.config),cli:e}),r=await ce(t);G(`${k.default.blue("presta serve")} - http://localhost:${r.port}`),R()});W.parse(process.argv);
55//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibGliL2NsaS50cyIsICJsaWIvbG9nLnRzIiwgImxpYi9jb25zdGFudHMudHMiLCAibGliL2N1cnJlbnRQcmVzdGFJbnN0YW5jZS50cyIsICJsaWIvY29uZmlnLnRzIiwgImxpYi9jcmVhdGVFbWl0dGVyLnRzIiwgImxpYi93YXRjaC50cyIsICJsaWIvb3V0cHV0TGFtYmRhcy50cyIsICJsaWIvaGFzaENvbnRlbnQudHMiLCAibGliL2dldEZpbGVzLnRzIiwgImxpYi9yZW5kZXJTdGF0aWNFbnRyaWVzLnRzIiwgImxpYi90aW1lci50cyIsICJsaWIvZ2V0Um91dGVQYXJhbXMudHMiLCAibGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgImxpYi9idWlsdFN0YXRpY0ZpbGVzLnRzIiwgImxpYi9yZW1vdmVCdWlsdFN0YXRpY0ZpbGUudHMiLCAibGliL2xpdmVSZWxvYWRTY3JpcHQudHMiLCAibGliL2J1aWxkLnRzIiwgImxpYi9zZXJ2ZS50cyIsICJsaWIvZGVmYXVsdDQwNC50cyIsICJsaWIvcmVxdWVzdFRvRXZlbnQudHMiLCAibGliL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHNhZGUgZnJvbSAnc2FkZSdcblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGNyZWF0ZUNvbmZpZywgZ2V0Q29uZmlnRmlsZSB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuL3dhdGNoJ1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tICcuL2J1aWxkJ1xuaW1wb3J0IHsgc2VydmUgfSBmcm9tICcuL3NlcnZlJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmNvbnN0IHByb2cgPSBzYWRlKCdwcmVzdGEnKVxuY29uc3QgQ09ORklHX0RFRkFVTFQgPSAncHJlc3RhLmNvbmZpZy5qcydcblxuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICByZXF1aXJlKCdtb2R1bGUtYWxpYXMnKS5hZGRBbGlhc2VzKHtcbiAgICAnQCc6IHByb2Nlc3MuY3dkKCksXG4gICAgJ3ByZXN0YTppbnRlcm5hbCc6IF9fZGlybmFtZSwgLy8gd2hlcmV2ZXIgdGhpcyBpcyBydW5uaW5nIGZyb21cbiAgfSlcblxuICByZXF1aXJlKCdlc2J1aWxkLXJlZ2lzdGVyL2Rpc3Qvbm9kZScpLnJlZ2lzdGVyKG9wdGlvbnMpXG59XG5cbnByb2dcbiAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gIC8vIGRvIG5vdCBwcm92aWRlIGRlZmF1bHQgY29uZmlnIGhlcmVcbiAgLm9wdGlvbignLS1jb25maWcsIC1jJywgYFBhdGggdG8gYSBjb25maWcgZmlsZS4gIChkZWZhdWx0ICR7Q09ORklHX0RFRkFVTFR9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dcbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7Q09ORklHX0RFRkFVTFR9YClcbiAgLmFjdGlvbihhc3luYyAob3B0cykgPT4ge1xuICAgIHJlZ2lzdGVyUnVudGltZSgpXG5cbiAgICBjb25zb2xlLmNsZWFyKClcblxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNyZWF0ZUNvbmZpZyh7XG4gICAgICBlbnY6IEVudi5QUk9EVUNUSU9OLFxuICAgICAgY29uZmlnOiBnZXRDb25maWdGaWxlKG9wdHMuY29uZmlnLCB0cnVlKSxcbiAgICAgIGNsaToge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBmaWxlczogb3B0cy5fLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgZnMuZW1wdHlEaXJTeW5jKGNvbmZpZy5vdXRwdXQpXG5cbiAgICBsb2dnZXIucmF3KGAke2xvZ2dlci5jb2xvcnMuYmx1ZSgncHJlc3RhIGJ1aWxkJyl9YClcbiAgICBsb2dnZXIubmV3bGluZSgpXG5cbiAgICBhd2FpdCBidWlsZChjb25maWcpXG4gIH0pXG5cbnByb2dcbiAgLmNvbW1hbmQoJ2RldicsICdTdGFydCBQcmVzdGEgZGV2IHNlcnZlciBhbmQgd2F0Y2ggZmlsZXMnLCB7IGFsaWFzOiAnd2F0Y2gnIH0pXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLm9wdGlvbignLS1uby1zZXJ2ZSwgLW4nLCBgRG8gbm90IHJ1biBsb2NhbCBkZXYgc2VydmVyLiAgKGRlZmF1bHQgZmFsc2UpYClcbiAgLmRlc2NyaWJlKCdXYXRjaCBwcm9qZWN0IGFuZCBidWlsZCB0byBvdXRwdXQgZGlyZWN0b3J5LicpXG4gIC5leGFtcGxlKGBkZXZgKVxuICAuZXhhbXBsZShgZGV2IC4vZmlsZXMvKiovKi5qc2ApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzIC1vIC4vb3V0YClcbiAgLmV4YW1wbGUoYGRldiAtYyAke0NPTkZJR19ERUZBVUxUfWApXG4gIC5hY3Rpb24oYXN5bmMgKG9wdHMpID0+IHtcbiAgICByZWdpc3RlclJ1bnRpbWUoKVxuXG4gICAgY29uc29sZS5jbGVhcigpXG5cbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBjcmVhdGVDb25maWcoe1xuICAgICAgZW52OiBFbnYuREVWRUxPUE1FTlQsXG4gICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUob3B0cy5jb25maWcpLFxuICAgICAgY2xpOiB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZpbGVzOiBvcHRzLl8sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAoIW9wdHMubikge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2VydmUoY29uZmlnKVxuXG4gICAgICBsb2dnZXIucmF3KGAke2xvZ2dlci5jb2xvcnMuYmx1ZSgncHJlc3RhIGRldicpfSAtIGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXIucG9ydH1gKVxuICAgICAgbG9nZ2VyLm5ld2xpbmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnZGV2JyxcbiAgICAgIH0pXG4gICAgICBsb2dnZXIubmV3bGluZSgpXG4gICAgfVxuXG4gICAgd2F0Y2goY29uZmlnKVxuICB9KVxuXG5wcm9nXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtDT05GSUdfREVGQVVMVH1gKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzKSA9PiB7XG4gICAgcmVnaXN0ZXJSdW50aW1lKClcblxuICAgIGNvbnNvbGUuY2xlYXIoKVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY3JlYXRlQ29uZmlnKHtcbiAgICAgIGVudjogRW52LlBST0RVQ1RJT04sXG4gICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUob3B0cy5jb25maWcpLFxuICAgICAgY2xpOiBvcHRzLFxuICAgIH0pXG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2VydmUoY29uZmlnKVxuXG4gICAgbG9nZ2VyLnJhdyhgJHtsb2dnZXIuY29sb3JzLmJsdWUoJ3ByZXN0YSBzZXJ2ZScpfSAtIGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXIucG9ydH1gKVxuICAgIGxvZ2dlci5uZXdsaW5lKClcbiAgfSlcblxucHJvZy5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IGMsIHsgS2xldXIgfSBmcm9tICdrbGV1cidcblxuaW1wb3J0IHsgZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlIH0gZnJvbSAnLi9jdXJyZW50UHJlc3RhSW5zdGFuY2UnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGVudW0gTGV2ZWxzIHtcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJbmZvID0gJ2luZm8nLFxuICBXYXJuID0gJ3dhcm4nLFxuICBFcnIgPSAnZXJyb3InLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBsZXZlbD86IExldmVsc1xuICBsYWJlbDogc3RyaW5nIHwgbnVtYmVyXG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBzdHJpbmcgfCBudW1iZXJcbiAgZXJyb3I/OiBFcnJvclxufVxuXG5sZXQgbG9nczogYW55W10gPSBbXVxuXG5jb25zdCBjb2xvcnMgPSB7XG4gIFtMZXZlbHMuRGVidWddOiAnbWFnZW50YScsXG4gIFtMZXZlbHMuSW5mb106ICdibHVlJyxcbiAgW0xldmVscy5XYXJuXTogJ3llbGxvdycsXG4gIFtMZXZlbHMuRXJyXTogJ3JlZCcsXG59XG5cbmV4cG9ydCB7IGMgYXMgY29sb3JzIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ3MoKSB7XG4gIGlmICghcHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgbWV0aG9kIHdhcyBjYWxsZWQgb3V0c2lkZSB0ZXN0IG1vZGUnKVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVidWcgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKS5kZWJ1Z1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKS5lbnYgPT09IEVudi5QUk9EVUNUSU9OID8gJ3Byb2QnIDogJ2RldidcblxuICAgIGlmICghZGVidWcgJiYgbWVzc2FnZS5sZXZlbCA9PT0gTGV2ZWxzLkRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgW1xuICAgICAgICBjLmdyYXkoY29udGV4dCksXG4gICAgICAgIGNbY29sb3JzW21lc3NhZ2UubGV2ZWwgfHwgJ2luZm8nXSBhcyBrZXlvZiBLbGV1cl0obWVzc2FnZS5sYWJlbCksXG4gICAgICAgIG1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA/IGMuZ3JheSgnKycgKyBtZXNzYWdlLmR1cmF0aW9uKSA6ICcnLFxuICAgICAgICBtZXNzYWdlLmVycm9yID8gYFxcblxcbiR7bWVzc2FnZS5lcnJvci5zdGFjayB8fCBtZXNzYWdlLmVycm9yfVxcblxcbmAgOiAnJyxcbiAgICAgIF1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignICcpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRGVidWcsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZm8obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkluZm8sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLldhcm4sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5FcnIsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhdyguLi5hcmdzOiBhbnlbXSkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIGxvZ3MucHVzaChhcmdzKVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld2xpbmUoKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSByZXR1cm5cbiAgY29uc29sZS5sb2coJycpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVudiA9IHtcbiAgUFJPRFVDVElPTjogJ3Byb2R1Y3Rpb24nLFxuICBERVZFTE9QTUVOVDogJ2RldmVsb3BtZW50Jyxcbn1cbiIsICJpbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIHBpZDogcHJvY2Vzcy5waWQsXG4gIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgZW52OiBFbnYuUFJPRFVDVElPTixcbiAgZGVidWc6IGZhbHNlLFxufSBhcyBQcmVzdGFcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRQcmVzdGFJbnN0YW5jZShjb25maWc6IFByZXN0YSk6IFByZXN0YSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgZ2xvYmFsLl9fcHJlc3RhX18gPSBjb25maWdcbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCk6IFByZXN0YSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaWYgKCFnbG9iYWwuX19wcmVzdGFfXykge1xuICAgIHNldEN1cnJlbnRQcmVzdGFJbnN0YW5jZShkZWZhdWx0Q29uZmlnKVxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gZ2xvYmFsLl9fcHJlc3RhX19cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBjcmVhdGVFbWl0dGVyLCBjcmVhdGVFbWl0SG9vaywgY3JlYXRlT25Ib29rIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgc2V0Q3VycmVudFByZXN0YUluc3RhbmNlLCBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UgfSBmcm9tICcuL2N1cnJlbnRQcmVzdGFJbnN0YW5jZSdcbmltcG9ydCB7IFByZXN0YSwgQ29uZmlnLCBDTEksIENhbGxhYmxlIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnRmlsZXBhdGggPSAncHJlc3RhLmNvbmZpZy5qcydcblxuZnVuY3Rpb24gcmVzb2x2ZUFic29sdXRlUGF0aHMoXG4gIGNvbmZpZzoge1xuICAgIGZpbGVzPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBvdXRwdXQ/OiBzdHJpbmdcbiAgICBhc3NldHM/OiBzdHJpbmdcbiAgfSxcbiAgeyBjd2QgfTogeyBjd2Q6IHN0cmluZyB9XG4pIHtcbiAgaWYgKGNvbmZpZy5maWxlcykgY29uZmlnLmZpbGVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoY29uZmlnLmZpbGVzKS5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShjd2QsIHApKVxuICBpZiAoY29uZmlnLm91dHB1dCkgY29uZmlnLm91dHB1dCA9IHBhdGgucmVzb2x2ZShjd2QsIGNvbmZpZy5vdXRwdXQpXG4gIGlmIChjb25maWcuYXNzZXRzKSBjb25maWcuYXNzZXRzID0gcGF0aC5yZXNvbHZlKGN3ZCwgY29uZmlnLmFzc2V0cylcbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJDdXJyZW50Q29uZmlnKCkge1xuICAvLyBAdHMtaWdub3JlXG4gIGdsb2JhbC5fX3ByZXN0YV9fID0ge1xuICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudjogRW52LlBST0RVQ1RJT04sXG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaCBhIGNvbmZpZyBmaWxlLiBJZiBvbmUgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciwgbGV0IHRoZW0ga25vdyBpZlxuICogYW55dGhpbmcgZ29lcyB3cm9uZy4gT3V0c2lkZSB3YXRjaCBtb2RlLCB0aGlzIHNob3VsZCBleGl0KDEpIGlmIHRoZSB1c2VyXG4gKiBwcm92aWRlZCBhIGNvbmZpZyBhbmQgdGhlcmUgd2FzIGFuIGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdGaWxlKGZpbGVwYXRoPzogc3RyaW5nLCBzaG91bGRFeGl0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgY29uc3QgZnAgPSBwYXRoLnJlc29sdmUoZmlsZXBhdGggfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoZnApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGZwKVxuXG4gICAgLy8gY29uZmlnIGZpbGUgZXhpc3RzLCBzaG91bGQgbG9nIGVycm9yLCBvdGhlcndpc2UgaWdub3JlIG1pc3NpbmcgZmlsZVxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgIH0pXG5cbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiB3YXRjaCBtb2RlLCBleGl0IGJ1aWxkXG4gICAgICBpZiAoc2hvdWxkRXhpdCkgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIF93aXRob3V0XyBhbnkgdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgZmlsZS5cbiAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgdGhlaXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVDb25maWdWYWx1ZXMoKSB7XG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgbWVzc2FnZTogYGNvbmZpZyBmaWxlIHZhbHVlcyBjbGVhcmVkYCxcbiAgfSlcblxuICByZXR1cm4gc2V0Q3VycmVudFByZXN0YUluc3RhbmNlKFxuICAgIGF3YWl0IGNyZWF0ZUNvbmZpZyh7XG4gICAgICAuLi5nZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29uZmlnKHtcbiAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgZW52ID0gZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCkuZW52LFxuICBjb25maWcgPSB7fSxcbiAgY2xpID0ge30sXG59OiB7XG4gIGN3ZD86IHN0cmluZ1xuICBlbnY/OiBzdHJpbmdcbiAgY29uZmlnPzogUGFydGlhbDxDb25maWc+XG4gIGNsaT86IFBhcnRpYWw8Q0xJPlxufSkge1xuICBjb25maWcgPSByZXNvbHZlQWJzb2x1dGVQYXRocyh7IC4uLmNvbmZpZyB9LCB7IGN3ZCB9KSAvLyBjbG9uZSByZWFkLW9ubHkgb2JqXG4gIGNsaSA9IHJlc29sdmVBYnNvbHV0ZVBhdGhzKHsgLi4uY2xpIH0sIHsgY3dkIH0pXG5cbiAgLy8gY29tYmluZWQgY29uZmlnLCBwcmVmZXJlbmNlIHRvIENMSSBhcmdzXG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICBvdXRwdXQ6IHBhdGgucmVzb2x2ZShjd2QsIGNsaS5vdXRwdXQgfHwgY29uZmlnLm91dHB1dCB8fCAnYnVpbGQnKSxcbiAgICBhc3NldHM6IHBhdGgucmVzb2x2ZShjbGkuYXNzZXRzIHx8IGNvbmZpZy5hc3NldHMgfHwgJ3B1YmxpYycpLFxuICAgIGZpbGVzOiBjbGkuZmlsZXMgJiYgY2xpLmZpbGVzLmxlbmd0aCA/IGNsaS5maWxlcyA6IGNvbmZpZy5maWxlcyA/IChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KGNvbmZpZy5maWxlcykgOiBbXSxcbiAgfVxuICBjb25zdCBwb3J0ID0gY2xpLnBvcnQgPyBwYXJzZUludChjbGkucG9ydCkgOiBjb25maWcucG9ydCB8fCA0MDAwXG5cbiAgY29uc3QgcHJldmlvdXMgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKVxuICAvLyBvbmx5IGNyZWF0ZSBvbmNlXG4gIGNvbnN0IGVtaXR0ZXIgPSBwcmV2aW91cy5ldmVudHMgfHwgY3JlYXRlRW1pdHRlcigpXG5cbiAgLy8gZGVyZWdpc3RlciBvbGQgZXZlbnRzXG4gIGVtaXR0ZXIuY2xlYXIoKVxuXG4gIC8vIHNldCBpbnN0YW5jZVxuICBjb25zdCBuZXh0OiBQcmVzdGEgPSBzZXRDdXJyZW50UHJlc3RhSW5zdGFuY2Uoe1xuICAgIC4uLnByZXZpb3VzLFxuICAgIC4uLm1lcmdlZCwgLy8gb3ZlcndyaXRlcyBldmVyeSB0aW1lXG4gICAgZW52LFxuICAgIGN3ZCxcbiAgICBwb3J0LFxuICAgIGRlYnVnOiBjbGkuZGVidWcgfHwgZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCkuZGVidWcsXG4gICAgY29uZmlnRmlsZXBhdGg6IHBhdGgucmVzb2x2ZShjbGkuY29uZmlnIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aCksXG4gICAgc3RhdGljT3V0cHV0RGlyOiBwYXRoLmpvaW4obWVyZ2VkLm91dHB1dCwgJ3N0YXRpYycpLFxuICAgIGZ1bmN0aW9uc091dHB1dERpcjogcGF0aC5qb2luKG1lcmdlZC5vdXRwdXQsICdmdW5jdGlvbnMnKSxcbiAgICBmdW5jdGlvbnNNYW5pZmVzdDogcGF0aC5qb2luKG1lcmdlZC5vdXRwdXQsICdyb3V0ZXMuanNvbicpLFxuICAgIGV2ZW50czogZW1pdHRlcixcbiAgICBob29rczoge1xuICAgICAgZW1pdFBvc3RCdWlsZChwcm9wcykge1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ3Bvc3RCdWlsZCcsIHByb3BzKVxuICAgICAgfSxcbiAgICAgIG9uUG9zdEJ1aWxkKGNiKSB7XG4gICAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdwb3N0QnVpbGQnLCBjYilcbiAgICAgIH0sXG4gICAgICBlbWl0QnVpbGRGaWxlKHByb3BzKSB7XG4gICAgICAgIGVtaXR0ZXIuZW1pdCgnYnVpbGRGaWxlJywgcHJvcHMpXG4gICAgICB9LFxuICAgICAgb25CdWlsZEZpbGUoY2IpIHtcbiAgICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ2J1aWxkRmlsZScsIGNiKVxuICAgICAgfSxcbiAgICAgIGVtaXRCcm93c2VyUmVmcmVzaCgpIHtcbiAgICAgICAgZW1pdHRlci5lbWl0KCdicm93c2VyUmVmcmVzaCcpXG4gICAgICB9LFxuICAgICAgb25Ccm93c2VyUmVmcmVzaChjYikge1xuICAgICAgICByZXR1cm4gZW1pdHRlci5vbignYnJvd3NlclJlZnJlc2gnLCBjYilcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcblxuICBpZiAoY29uZmlnLnBsdWdpbnMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbmZpZy5wbHVnaW5zLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGdldEN1cnJlbnRQcmVzdGFJbnN0YW5jZSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgY29uZmlnIGNyZWF0ZWQgJHtKU09OLnN0cmluZ2lmeShuZXh0KX1gLFxuICB9KVxuXG4gIHJldHVybiBuZXh0XG59XG4iLCAiaW1wb3J0IHsgQ2FsbGFibGUgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtaXRIb29rKG5hbWU6IHN0cmluZywgZW1pdHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRW1pdHRlcj4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhvb2s8VD4ocHJvcHM6IFQpIHtcbiAgICBlbWl0dGVyLmVtaXQobmFtZSwgcHJvcHMpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9uSG9vayhuYW1lOiBzdHJpbmcsIGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KSB7XG4gIHJldHVybiBmdW5jdGlvbiBob29rKGNhbGxiYWNrOiBDYWxsYWJsZSkge1xuICAgIHJldHVybiBlbWl0dGVyLm9uKG5hbWUsIGNhbGxiYWNrKVxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGdyYXBoIGZyb20gJ3dhdGNoLWRlcGVuZGVuY3ktZ3JhcGgnXG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInXG5pbXBvcnQgbWF0Y2ggZnJvbSAncGljb21hdGNoJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgcmVuZGVyU3RhdGljRW50cmllcyB9IGZyb20gJy4vcmVuZGVyU3RhdGljRW50cmllcydcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAnLi90aW1lcidcbmltcG9ydCB7IGNyZWF0ZUNvbmZpZywgcmVtb3ZlQ29uZmlnVmFsdWVzLCBnZXRDb25maWdGaWxlIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBidWlsdFN0YXRpY0ZpbGVzIH0gZnJvbSAnLi9idWlsdFN0YXRpY0ZpbGVzJ1xuaW1wb3J0IHsgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlIH0gZnJvbSAnLi9yZW1vdmVCdWlsdFN0YXRpY0ZpbGUnXG5pbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuXG4vKlxuICogV3JhcHMgb3V0cHV0TGFtYmRhcyBmb3IgbG9nZ2luZ1xuICovXG5mdW5jdGlvbiB1cGRhdGVMYW1iZGFzKGlucHV0czogc3RyaW5nW10sIGNvbmZpZzogUHJlc3RhKSB7XG4gIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgLy8gYWx3YXlzIHdyaXRlIHRoaXMsIGV2ZW4gaWYgaW5wdXRzID0gW11cbiAgb3V0cHV0TGFtYmRhcyhpbnB1dHMsIGNvbmZpZylcblxuICAvLyBpZiB1c2VyIGFjdHVhbGx5IGhhcyByb3V0ZXMgY29uZmlndXJlZCwgZ2l2ZSBmZWVkYmFja1xuICBpZiAoaW5wdXRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgbWVzc2FnZTogYGxhbWJkYXNgLFxuICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXRjaChjb25maWc6IFByZXN0YSkge1xuICAvKlxuICAgKiBHZXQgZmlsZXMgdGhhdCBtYXRjaCBzdGF0aWMvZHluYW1pYyBwYXR0ZXJzIGF0IHN0YXJ0dXBcbiAgICovXG4gIGxldCBmaWxlcyA9IGdldEZpbGVzKGNvbmZpZylcbiAgbGV0IGhhc0NvbmZpZ0ZpbGUgPSBmcy5leGlzdHNTeW5jKGNvbmZpZy5jb25maWdGaWxlcGF0aClcblxuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIGxvZ2dlci53YXJuKHtcbiAgICAgIGxhYmVsOiAncGF0aHMnLFxuICAgICAgbWVzc2FnZTogJ25vIGZpbGVzIGNvbmZpZ3VyZWQnLFxuICAgIH0pXG4gIH1cblxuICAvKlxuICAgKiBDcmVhdGUgaW5pdGlhbCBkeW5hbWljIGVudHJ5IHJlZ2FyZGxlc3Mgb2YgaWYgdGhlIHVzZXIgaGFzIHJvdXRlcywgYmMgd2VcbiAgICogbmVlZCB0aGlzIGZpbGUgdG8gc2VydmUgNDA0IGxvY2FsbHlcbiAgICovXG4gIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcblxuICAvKlxuICAgKiBTZXQgdXAgYWxsIHdhdGNoZXJzXG4gICAqL1xuICBjb25zdCBmaWxlV2F0Y2hlciA9IGdyYXBoKHsgYWxpYXM6IHsgJ0AnOiBjb25maWcuY3dkIH0gfSlcbiAgY29uc3QgZ2xvYmFsV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGNvbmZpZy5jd2QsIHtcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIGlnbm9yZWQ6IFtjb25maWcub3V0cHV0LCBjb25maWcuYXNzZXRzXSxcbiAgfSlcblxuICAvKlxuICAgKiBPbiBhIGNvbmZpZyB1cGRhdGUsIHRoZSB1c2VyIG1heSBoYXZlIHBhc3NlZCBpbiBhIG5ldyBgZmlsZXNgIGFycmF5IG9yXG4gICAqIG90aGVyIGdsb2JhbCBjb25maWcgcmVxdWlyZWQgYnkgYWxsIGZpbGVzLCBzbyB3ZSBuZWVkIHRvIHJlLWZldGNoIGFsbFxuICAgKiBmaWxlcyBhbmQgcmVidWlsZCBldmVyeXRoaW5nLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ29uZmlnVXBkYXRlKCkge1xuICAgIGZpbGVzID0gZ2V0RmlsZXMoY29uZmlnKVxuICAgIGF3YWl0IHJlbmRlclN0YXRpY0VudHJpZXMoZmlsZXMuZmlsdGVyKGlzU3RhdGljKSwgY29uZmlnKVxuICAgIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgfVxuXG4gIC8qXG4gICAqIE9uIGEgY2hhbmdlZCBmaWxlLCB3ZSBjYW4ganVzdCByZW5kZXIgaXRcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZpbGVDaGFuZ2UoZmlsZTogc3RyaW5nKSB7XG4gICAgLy8gcmVuZGVyIGp1c3QgZmlsZSB0aGF0IGNoYW5nZWRcbiAgICBpZiAoaXNTdGF0aWMoZmlsZSkpIHtcbiAgICAgIGF3YWl0IHJlbmRlclN0YXRpY0VudHJpZXMoW2ZpbGVdLCBjb25maWcpXG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGR5bmFtaWMgZW50cnkgd2l0aCBBTEwgZHluYW1pYyBmaWxlc1xuICAgIGlmIChpc0R5bmFtaWMoZmlsZSkpIHtcbiAgICAgIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgICB9XG5cbiAgICBjb25maWcuaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfVxuXG4gIGNvbmZpZy5ob29rcy5vbkJ1aWxkRmlsZSgoeyBmaWxlIH0pID0+IHtcbiAgICBoYW5kbGVGaWxlQ2hhbmdlKGZpbGUpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub24oJ3JlbW92ZScsIGFzeW5jIChbaWRdOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ3dhdGNoJyxcbiAgICAgIG1lc3NhZ2U6IGBmaWxlV2F0Y2hlciAtIHJlbW92ZWQgJHtpZH1gLFxuICAgIH0pXG5cbiAgICAvLyByZW1vdmUgZnJvbSBsb2NhbCBoYXNoXG4gICAgZmlsZXMuc3BsaWNlKGZpbGVzLmluZGV4T2YoaWQpLCAxKVxuXG4gICAgLy8gdXBkYXRlIHRoaXMgcmVnYXJkbGVzcywgbm90IHN1cmUgaWYgW2lkXSB3YXMgZHluYW1pYyBvciBzdGF0aWNcbiAgICB1cGRhdGVMYW1iZGFzKGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpLCBjb25maWcpXG5cbiAgICAvLyBpZiBpdCB3YXMgY29uZmlnLCB3ZSBnb3R0YSBkbyBhIHJlc3RhcnRcbiAgICBpZiAoaWQgPT09IGNvbmZpZy5jb25maWdGaWxlcGF0aCkge1xuICAgICAgLy8gZmlsdGVyIG91dCB2YWx1ZXMgZnJvbSB0aGUgY29uZmlnIGZpbGVcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHJlbW92ZUNvbmZpZ1ZhbHVlcygpXG5cbiAgICAgIC8vIHJlc2V0IHRoaXMhXG4gICAgICBoYXNDb25maWdGaWxlID0gZmFsc2VcblxuICAgICAgaGFuZGxlQ29uZmlnVXBkYXRlKClcbiAgICB9XG5cbiAgICA7KGJ1aWx0U3RhdGljRmlsZXNbaWRdIHx8IFtdKS5mb3JFYWNoKChmaWxlKSA9PiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUoZmlsZSwgY29uZmlnKSlcbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vbignY2hhbmdlJywgYXN5bmMgKFtpZF06IHN0cmluZ1tdKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnd2F0Y2gnLFxuICAgICAgbWVzc2FnZTogYGZpbGVXYXRjaGVyIC0gY2hhbmdlZCAke2lkfWAsXG4gICAgfSlcblxuICAgIGlmIChpZCA9PT0gY29uZmlnLmNvbmZpZ0ZpbGVwYXRoKSB7XG4gICAgICAvLyBjbGVhciBjb25maWcgZmlsZSBmb3IgcmUtcmVxdWlyZVxuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbY29uZmlnLmNvbmZpZ0ZpbGVwYXRoXVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBtZXJnZSBpbiBuZXcgdmFsdWVzIGZyb20gY29uZmlnIGZpbGVcbiAgICAgICAgY29uZmlnID0gYXdhaXQgY3JlYXRlQ29uZmlnKHtcbiAgICAgICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUoY29uZmlnLmNvbmZpZ0ZpbGVwYXRoKSxcbiAgICAgICAgfSlcblxuICAgICAgICBoYW5kbGVDb25maWdVcGRhdGUoKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVGaWxlQ2hhbmdlKGlkKVxuICAgIH1cbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vbignZXJyb3InLCAoZTogRXJyb3IpID0+IHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICBlcnJvcjogZSxcbiAgICB9KVxuICB9KVxuXG4gIC8qXG4gICAqIGdsb2JhbFdhdGNoZXIgd2F0Y2hlcyB0aGUgcmF3IGZpbGUgZ2xvYnMgcGFzc2VkIHRvIHRoZSBDTEkgb3IgYXMgYGZpbGVzYFxuICAgKiBpbiB0aGUgY29uZmlnLiBJZiBjaGVja3Mgb24gYWRkL2NoYW5nZSB0byBzZWUgaWYgYSBmaWxlIHNob3VsZCBiZSB1cGdyYWRlZFxuICAgKiB0byBhIGEgUHJlc3RhIHNvdXJjZSBmaWxlLCBhbmQgYWRkZWQgdG8gdGhlIGZpbGVXYXRjaGVyLiBJdCBhbHNvIHdhdGNoZXNcbiAgICogZm9yIGFkZGl0aW9uIG9mIGEgY29uZmlnIGZpbGUuXG4gICAqL1xuICBnbG9iYWxXYXRjaGVyLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQsIGZpbGUpID0+IHtcbiAgICAvLyBpZ25vcmUgZXZlbnRzIGhhbmRsZWQgYnkgd2RnLCBvciBhbnkgZGlyZWN0b3J5IGV2ZW50c1xuICAgIGlmICghL2FkZHxjaGFuZ2UvLnRlc3QoZXZlbnQpIHx8ICFmcy5leGlzdHNTeW5jKGZpbGUpIHx8IGZzLmxzdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSByZXR1cm5cblxuICAgIC8vIGlmIGEgZmlsZSBjaGFuZ2UgbWF0Y2hlcyBhbnkgcGFnZXMgZ2xvYnNcbiAgICBpZiAobWF0Y2goY29uZmlnLmZpbGVzKShmaWxlKSAmJiAhZmlsZXMuaW5jbHVkZXMoZmlsZSkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgIGxhYmVsOiAnd2F0Y2gnLFxuICAgICAgICBtZXNzYWdlOiBgZ2xvYmFsV2F0Y2hlciAtIGFkZCAke2ZpbGV9YCxcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVzLnB1c2goZmlsZSlcblxuICAgICAgZmlsZVdhdGNoZXIuYWRkKGZpbGUpXG5cbiAgICAgIGhhbmRsZUZpbGVDaGFuZ2UoZmlsZSlcbiAgICB9XG5cbiAgICAvLyBpZiBmaWxlIG1hdGNoZXMgY29uZmlnIGZpbGUgYW5kIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmVcbiAgICBpZiAoZmlsZSA9PT0gY29uZmlnLmNvbmZpZ0ZpbGVwYXRoICYmICFoYXNDb25maWdGaWxlKSB7XG4gICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICBsYWJlbDogJ3dhdGNoJyxcbiAgICAgICAgbWVzc2FnZTogYGdsb2JhbFdhdGNoZXIgLSBhZGQgY29uZmlnIGZpbGUgJHtmaWxlfWAsXG4gICAgICB9KVxuXG4gICAgICBmaWxlV2F0Y2hlci5hZGQoY29uZmlnLmNvbmZpZ0ZpbGVwYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBtZXJnZSBpbiBuZXcgdmFsdWVzIGZyb20gY29uZmlnIGZpbGVcbiAgICAgICAgY29uZmlnID0gYXdhaXQgY3JlYXRlQ29uZmlnKHtcbiAgICAgICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUoY29uZmlnLmNvbmZpZ0ZpbGVwYXRoKSxcbiAgICAgICAgfSlcblxuICAgICAgICBoYXNDb25maWdGaWxlID0gdHJ1ZVxuXG4gICAgICAgIGhhbmRsZUNvbmZpZ1VwZGF0ZSgpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIC8qKlxuICAgKiBJbml0IHdhdGNoaW5nIGFmdGVyIGV2ZW50IHN1YnNjcmlwdGlvbnNcbiAgICovXG4gIGZpbGVXYXRjaGVyLmFkZChmaWxlcylcbiAgaWYgKGhhc0NvbmZpZ0ZpbGUpIGZpbGVXYXRjaGVyLmFkZChjb25maWcuY29uZmlnRmlsZXBhdGgpXG5cbiAgLyoqXG4gICAqIFByaW1lIGZpbGVzIHRvIGNoZWNrIGZvciBlcnJvcnMgb24gc3RhcnR1cCBhbmQgcmVnaXN0ZXIgYW55IHBsdWdpbnNcbiAgICovXG4gIHRyeSB7XG4gICAgZmlsZXMubWFwKHJlcXVpcmUpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICB9KVxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCByc29ydCBmcm9tICdyb3V0ZS1zb3J0J1xuXG5pbXBvcnQgeyBoYXNoQ29udGVudCB9IGZyb20gJy4vaGFzaENvbnRlbnQnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRMYW1iZGEoaW5wdXQ6IHN0cmluZywgY29uZmlnOiBQcmVzdGEpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgeyByb3V0ZSB9ID0gcmVxdWlyZShpbnB1dClcbiAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUoaW5wdXQpLnNwbGl0KCcuJykucmV2ZXJzZSgpLnNsaWNlKDEpLnJldmVyc2UoKS5qb2luKCcuJylcbiAgY29uc3Qgb3V0cHV0ID0gcGF0aC5qb2luKFxuICAgIGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgY29uZmlnLmVudiA9PT0gRW52LlBST0RVQ1RJT04gPyBuYW1lICsgJy0nICsgaGFzaENvbnRlbnQoZnMucmVhZEZpbGVTeW5jKGlucHV0LCAndXRmOCcpKSArICcuanMnIDogbmFtZSArICcuanMnXG4gIClcblxuICBsb2dnZXIuZGVidWcoe1xuICAgIGxhYmVsOiAnZGVidWcnLFxuICAgIG1lc3NhZ2U6IGBnZW5lcmF0aW5nICR7bmFtZX0gbGFtYmRhYCxcbiAgfSlcblxuICAvLyBpbXBvcnRhbnQgZm9yIHdhdGNoIHRhc2tcbiAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbaW5wdXRdXG4gIGRlbGV0ZSByZXF1aXJlLmNhY2hlW291dHB1dF1cblxuICBmcy5vdXRwdXRGaWxlU3luYyhcbiAgICBvdXRwdXQsXG4gICAgYGltcG9ydCB7IHdyYXBIYW5kbGVyIH0gZnJvbSAncHJlc3RhJztcbmltcG9ydCAqIGFzIGZpbGUgZnJvbSAnJHtpbnB1dH0nO1xuZXhwb3J0IGNvbnN0IHJvdXRlID0gZmlsZS5yb3V0ZVxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSB3cmFwSGFuZGxlcihmaWxlKWBcbiAgKVxuXG4gIHJldHVybiBbcm91dGUsIG91dHB1dF1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBQcmVzdGEpIHtcbiAgY29uc3QgbGFtYmRhcyA9IGlucHV0c1xuICAgIC5tYXAoKGlucHV0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3V0cHV0TGFtYmRhKGlucHV0LCBjb25maWcpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ11bXVxuXG4gIGNvbnN0IHNvcnRlZCA9IHJzb3J0KGxhbWJkYXMubWFwKChsKSA9PiBsWzBdKSlcbiAgY29uc3QgbWFuaWZlc3Q6IHsgW3JvdXRlOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxhbWJkYXMuZmluZCgobCkgPT4gbFswXSA9PT0gcm91dGUpXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1hbmlmZXN0W3JvdXRlXSA9IG1hdGNoWzFdXG4gICAgfVxuICB9XG5cbiAgZnMub3V0cHV0RmlsZVN5bmMoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0LCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCkpXG5cbiAgcmV0dXJuIGxhbWJkYXNcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gIHZhciBoID0gNTM4MSxcbiAgICBpID0gY29udGVudC5sZW5ndGhcblxuICB3aGlsZSAoaSkgaCA9IChoICogMzMpIF4gY29udGVudC5jaGFyQ29kZUF0KC0taSlcblxuICByZXR1cm4gKGggPj4+IDApLnRvU3RyaW5nKDM2KVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IFByZXN0YSB9IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNyb3V0ZVxccytcXD0vLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0aWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNnZXRTdGF0aWNQYXRocy8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZXN0YUZpbGUoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiBpc1N0YXRpYyhmaWxlKSB8fCBpc0R5bmFtaWMoZmlsZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzKGNvbmZpZzogUHJlc3RhKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgICAuY29uY2F0KGNvbmZpZy5maWxlcylcbiAgICAgIC5tYXAoKGZpbGUpID0+IGdsb2JTeW5jKGZpbGUsIHsgY3dkOiBjb25maWcuY3dkIH0pKVxuICAgICAgLmZsYXQoKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5jd2QsIGZpbGUpKSAvLyBtYWtlIGFic29sdXRlXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICBtZXNzYWdlOiBgbm8gZmlsZXMgZm91bmRgLFxuICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgfSlcblxuICAgIHJldHVybiBbXVxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAnLi90aW1lcidcbmltcG9ydCB7IGdldFJvdXRlUGFyYW1zIH0gZnJvbSAnLi9nZXRSb3V0ZVBhcmFtcydcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcbmltcG9ydCB7IGJ1aWx0U3RhdGljRmlsZXMgfSBmcm9tICcuL2J1aWx0U3RhdGljRmlsZXMnXG5pbXBvcnQgeyByZW1vdmVCdWlsdFN0YXRpY0ZpbGUgfSBmcm9tICcuL3JlbW92ZUJ1aWx0U3RhdGljRmlsZSdcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL2xpdmVSZWxvYWRTY3JpcHQnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IFByZXN0YSB9IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRobmFtZVRvRmlsZShwYXRobmFtZTogc3RyaW5nLCBleHQgPSAnaHRtbCcpIHtcbiAgcmV0dXJuICEhcGF0aC5leHRuYW1lKHBhdGhuYW1lKVxuICAgID8gcGF0aG5hbWUgLy8gaWYgcGF0aCBoYXMgZXh0ZW5zaW9uLCB1c2UgaXRcbiAgICA6IGV4dCA9PT0gJ2h0bWwnXG4gICAgPyBgJHtwYXRobmFtZX0vaW5kZXguaHRtbGAgLy8gaWYgSFRNTCBpcyBpbmZlcnJlZCwgY3JlYXRlIGluZGV4XG4gICAgOiBgJHtwYXRobmFtZX0uJHtleHR9YCAvLyBhbnl0aGluZyBidXQgSFRNTCB3aWxsIG5lZWQgYW4gZXh0ZW5zaW9uLCBvdGhlcndpc2UgYnJvd3NlcnMgd2lsbCByZW5kZXIgYXMgdGV4dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU3RhdGljRW50cmllcyhlbnRyaWVzOiBzdHJpbmdbXSwgY29uZmlnOiBQcmVzdGEpOiBQcm9taXNlPHsgYWxsR2VuZXJhdGVkRmlsZXM6IHN0cmluZ1tdIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jICh5LCBuKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYHJlbmRlcmluZyAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMpfWAsXG4gICAgfSlcblxuICAgIGNvbnN0IGFsbEdlbmVyYXRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgZGV2Q2xpZW50ID0gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQ6IGNvbmZpZy5wb3J0IH0pXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gZW50cnkucmVwbGFjZShjb25maWcuY3dkLCAnJylcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbZW50cnldXG5cbiAgICAgICAgY29uc3QgZmlsZSA9IHJlcXVpcmUoZW50cnkpXG4gICAgICAgIGNvbnN0IHBhdGhzID0gYXdhaXQgZmlsZS5nZXRTdGF0aWNQYXRocygpXG5cbiAgICAgICAgY29uc3QgcHJldkZpbGVzID0gKGJ1aWx0U3RhdGljRmlsZXNbZW50cnldID0gYnVpbHRTdGF0aWNGaWxlc1tlbnRyeV0gfHwgW10pXG4gICAgICAgIGNvbnN0IG5leHRGaWxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgICAgIGlmICghcGF0aHMgfHwgIXBhdGhzLmxlbmd0aCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKHtcbiAgICAgICAgICAgIGxhYmVsOiAncGF0aHMnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7bG9jYXRpb259IC0gbm8gcGF0aHMgdG8gcmVuZGVyYCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcHJldkZpbGVzLmZvckVhY2goKGZpbGUpID0+IHJlbW92ZUJ1aWx0U3RhdGljRmlsZShmaWxlLCBjb25maWcpKVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdXJsIG9mIHBhdGhzKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHJvdXRlUGFyYW1ldGVyczogZmlsZS5yb3V0ZSA/IGdldFJvdXRlUGFyYW1zKHVybCwgZmlsZS5yb3V0ZSkgOiB7fSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IG5vcm1hbGl6ZVJlc3BvbnNlKGF3YWl0IGZpbGUuaGFuZGxlcihldmVudCwge30pKVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gOiAnJ1xuICAgICAgICAgIGNvbnN0IGV4dCA9IHR5cGUgPyBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnIDogJ2h0bWwnXG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRobmFtZVRvRmlsZSh1cmwsIGV4dClcbiAgICAgICAgICBjb25zdCBodG1sID0gcmVzcG9uc2UuYm9keSArIChjb25maWcuZW52ID09PSBFbnYuUFJPRFVDVElPTiA/ICcnIDogZGV2Q2xpZW50KVxuXG4gICAgICAgICAgZnMub3V0cHV0RmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsIGZpbGVuYW1lKSwgaHRtbCwgJ3V0Zi04JylcblxuICAgICAgICAgIGFsbEdlbmVyYXRlZEZpbGVzLnB1c2goZmlsZW5hbWUpXG4gICAgICAgICAgbmV4dEZpbGVzLnB1c2goZmlsZW5hbWUpXG5cbiAgICAgICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICBsYWJlbDogJ2J1aWx0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHVybCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpZmYgYW5kIHJlbW92ZSBmaWxlc1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgcHJldkZpbGVzKSB7XG4gICAgICAgICAgaWYgKCFuZXh0RmlsZXMuaW5jbHVkZXMoZmlsZSkpIHtcbiAgICAgICAgICAgIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShmaWxlLCBjb25maWcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVpbHRTdGF0aWNGaWxlc1tlbnRyeV0gPSBuZXh0RmlsZXNcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5lbnYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnZXJyb3JzIGRldGVjdGVkLCBwYXVzaW5nLi4uJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB5KHsgYWxsR2VuZXJhdGVkRmlsZXMgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgbihlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXhpdCBsb29wIG9uIGFueSBlcnJvclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNsZWFyIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAgICAvLyBsb2FkQ2FjaGUuY2xlYXJBbGxNZW1vcnkoKSAvLyBUT0RPIHByb2JzIGNhbid0IFx1MjAxNCBlbWl0P1xuXG4gICAgeSh7IGFsbEdlbmVyYXRlZEZpbGVzIH0pXG4gIH0pXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKCkge1xuICBjb25zdCBzdGFydCA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBbcywgbmFub3NdID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnQpXG4gICAgY29uc3QgbXMgPSBuYW5vcyAvIDEwMDAwMDBcblxuICAgIGlmIChzIDwgMSkge1xuICAgICAgcmV0dXJuIChtcyA+PSAxID8gbXMudG9GaXhlZCgwKSA6IG1zLnRvRml4ZWQoMikpICsgJ21zJ1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcyArICcuJyArIG1zLnRvRml4ZWQoMCkgKyAncydcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdG9SZWdFeHAgZnJvbSAncmVnZXhwYXJhbSdcblxuaW1wb3J0IHsgUm91dGVQYXJhbWV0ZXJzIH0gZnJvbSAnLi90eXBlcydcblxuLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL3JlZ2V4cGFyYW0jdXNhZ2VcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZVBhcmFtcyh1cmw6IHN0cmluZywgcm91dGU6IHN0cmluZyk6IFJvdXRlUGFyYW1ldGVycyB7XG4gIGNvbnN0IFtwYXRoXSA9IHVybC5zcGxpdCgnPycpXG4gIGNvbnN0IHJlc3VsdCA9IHRvUmVnRXhwKHJvdXRlKVxuICBsZXQgaSA9IDBcbiAgbGV0IG91dDogUm91dGVQYXJhbWV0ZXJzID0ge31cbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQucGF0dGVybi5leGVjKHBhdGgpIHx8IFtdXG5cbiAgd2hpbGUgKGkgPCByZXN1bHQua2V5cy5sZW5ndGgpIHtcbiAgICBvdXRbcmVzdWx0LmtleXNbaV1dID0gbWF0Y2hlc1srK2ldXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iLCAiaW1wb3J0IHsgQVdTLCBSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnXG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmo6IG9iamVjdCB8IHN0cmluZykge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShvYmopIDogb2JqXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXNwb25zZShyZXNwb25zZTogUGFydGlhbDxSZXNwb25zZT4gfCBzdHJpbmcpOiBBV1NbJ0hhbmRsZXJSZXNwb25zZSddIHtcbiAgY29uc3Qge1xuICAgIGlzQmFzZTY0RW5jb2RlZCA9IGZhbHNlLFxuICAgIHN0YXR1c0NvZGUgPSAyMDAsXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIG11bHRpVmFsdWVIZWFkZXJzID0ge30sXG4gICAgYm9keSA9ICcnLFxuICAgIGh0bWwgPSB1bmRlZmluZWQsXG4gICAganNvbiA9IHVuZGVmaW5lZCxcbiAgICB4bWwgPSB1bmRlZmluZWQsXG4gIH0gPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnXG4gICAgPyB7XG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLFxuICAgICAgfVxuICAgIDogcmVzcG9uc2VcblxuICBsZXQgY29udGVudFR5cGUgPSAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04J1xuXG4gIGlmICghIWpzb24pIHtcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICB9IGVsc2UgaWYgKCEheG1sKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04J1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0Jhc2U2NEVuY29kZWQsXG4gICAgc3RhdHVzQ29kZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgYm9keTogc3RyaW5naWZ5KGJvZHkgfHwgaHRtbCB8fCBqc29uIHx8IHhtbCB8fCAnJyksXG4gIH1cbn1cbiIsICJ0eXBlIEJ1aWx0U3RhdGljRmlsZSA9IHN0cmluZ1xuXG5leHBvcnQgY29uc3QgYnVpbHRTdGF0aWNGaWxlczogeyBbZW50cnlGaWxlOiBzdHJpbmddOiBCdWlsdFN0YXRpY0ZpbGVbXSB9ID0ge31cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKGZpbGU6IHN0cmluZywgY29uZmlnOiBQcmVzdGEpIHtcbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgcmVtb3Zpbmcgb2xkIHN0YXRpYyBmaWxlICR7ZmlsZX1gLFxuICB9KVxuXG4gIGZzLnJlbW92ZShwYXRoLmpvaW4oY29uZmlnLnN0YXRpY091dHB1dERpciwgZmlsZSkpXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0IH06IHsgcG9ydDogbnVtYmVyIH0pIHtcbiAgcmV0dXJuIGBcbiAgICA8c2NyaXB0PlxuICAgICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzb2NrZXRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgICAgICAgc29ja2V0aW8uc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL3BvY2tldC5pb0AwLjEuNC9taW4uanMnXG4gICAgICAgICAgc29ja2V0aW8ub25sb2FkID0gZnVuY3Rpb24gaW5pdCAoKSB7XG4gICAgICAgICAgICB2YXIgZGlzY29ubmVjdGVkID0gZmFsc2VcbiAgICAgICAgICAgIHZhciBzb2NrZXQgPSBpbygnaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9Jywge1xuICAgICAgICAgICAgICByZWNvbm5lY3Rpb25BdHRlbXB0czogM1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNvY2tldC5vbignY29ubmVjdCcsIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygncHJlc3RhIGNvbm5lY3RlZCBvbiBwb3J0ICR7cG9ydH0nKSB9KVxuICAgICAgICAgICAgc29ja2V0Lm9uKCdyZWZyZXNoJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNvY2tldC5vbignZGlzY29ubmVjdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc29ja2V0Lm9uKCdyZWNvbm5lY3RfZmFpbGVkJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZGlzY29ubmVjdGVkKSByZXR1cm5cbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcInByZXN0YSAtIGNvbm5lY3Rpb24gdG8gc2VydmVyIG9uIDoke3BvcnR9IGZhaWxlZFwiKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzb2NrZXRpbylcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH0pKHRoaXMpO1xuICAgIDwvc2NyaXB0PlxuICBgXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgYnVpbGQgYXMgZXNidWlsZCB9IGZyb20gJ2VzYnVpbGQnXG5cbmltcG9ydCB7IG91dHB1dExhbWJkYXMgfSBmcm9tICcuL291dHB1dExhbWJkYXMnXG5pbXBvcnQgeyBnZXRGaWxlcywgaXNTdGF0aWMsIGlzRHluYW1pYyB9IGZyb20gJy4vZ2V0RmlsZXMnXG5pbXBvcnQgeyByZW5kZXJTdGF0aWNFbnRyaWVzIH0gZnJvbSAnLi9yZW5kZXJTdGF0aWNFbnRyaWVzJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgUHJlc3RhIH0gZnJvbSAnLi90eXBlcydcblxuZnVuY3Rpb24gZ2V0Um91dGVzTWFuaWZlc3RTYWZlbHkobWFuaWZlc3RGaWxlcGF0aDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUobWFuaWZlc3RGaWxlcGF0aClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7fVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IFByZXN0YSkge1xuICBjb25zdCB0b3RhbFRpbWUgPSB0aW1lcigpXG4gIGNvbnN0IGZpbGVzID0gZ2V0RmlsZXMoY29uZmlnKVxuICBjb25zdCBzdGF0aWNJZHMgPSBmaWxlcy5maWx0ZXIoaXNTdGF0aWMpXG4gIGNvbnN0IGR5bmFtaWNJZHMgPSBmaWxlcy5maWx0ZXIoaXNEeW5hbWljKVxuXG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdidWlsZCcsXG4gICAgbWVzc2FnZTogJ3N0YXJ0aW5nIGJ1aWxkJyxcbiAgfSlcblxuICBpZiAoIXN0YXRpY0lkcy5sZW5ndGggJiYgIWR5bmFtaWNJZHMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oe1xuICAgICAgbGFiZWw6ICdmaWxlcycsXG4gICAgICBtZXNzYWdlOiAnbm8gZmlsZXMgd2VyZSBmb3VuZCwgbm90aGluZyB0byBidWlsZCcsXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3RhdGljVGltZSA9ICcnXG4gICAgbGV0IHN0YXRpY0ZpbGVBbW91bnQgPSAwXG4gICAgbGV0IGR5bmFtaWNUaW1lID0gJydcbiAgICBsZXQgY29weVRpbWUgPSAnJ1xuXG4gICAgY29uc3QgdGFza3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHN0YXRpY0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgICAgICAgY29uc3QgeyBhbGxHZW5lcmF0ZWRGaWxlcyB9ID0gYXdhaXQgcmVuZGVyU3RhdGljRW50cmllcyhzdGF0aWNJZHMsIGNvbmZpZylcblxuICAgICAgICAgIHN0YXRpY1RpbWUgPSB0aW1lKClcbiAgICAgICAgICBzdGF0aWNGaWxlQW1vdW50ID0gYWxsR2VuZXJhdGVkRmlsZXMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgICAgICAgb3V0cHV0TGFtYmRhcyhkeW5hbWljSWRzLCBjb25maWcpXG5cbiAgICAgICAgICBhd2FpdCBlc2J1aWxkKHtcbiAgICAgICAgICAgIGVudHJ5UG9pbnRzOiBPYmplY3QudmFsdWVzKHJlcXVpcmUoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KSksXG4gICAgICAgICAgICBvdXRkaXI6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICAgICAgdGFyZ2V0OiBbJ25vZGUxMiddLFxuICAgICAgICAgICAgbWluaWZ5OiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dPdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICBkZWZpbmU6IHtcbiAgICAgICAgICAgICAgJ3Byb2Nlc3MuZW52LlBSRVNUQV9TRVJWRVJMRVNTX1JVTlRJTUUnOiAndHJ1ZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBkeW5hbWljVGltZSA9IHRpbWUoKVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnLmFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgICAgICAgZnMuY29weVN5bmMoY29uZmlnLmFzc2V0cywgY29uZmlnLnN0YXRpY091dHB1dERpcilcblxuICAgICAgICAgIGNvcHlUaW1lID0gdGltZSgpXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgXSlcblxuICAgIC8vIHNpbmNlIHdlJ3JlIGJ1aWxkaW5nIChub3Qgd2F0Y2gpIGlmIGFueSB0YXNrIGZhaWxzLCBleGl0IHdpdGggZXJyb3JcbiAgICBpZiAodGFza3MuZmluZCgodGFzaykgPT4gdGFzay5zdGF0dXMgPT09ICdyZWplY3RlZCcpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICAgICAgbWVzc2FnZTogJ2J1aWxkIHBhcnRpYWxseSBmYWlsZWQnLFxuICAgICAgfSlcblxuICAgICAgLy8gbG9nIG91dCBlcnJvcnNcbiAgICAgIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICAgICAgaWYgKHRhc2suc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IHRhc2sucmVhc29uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5uZXdsaW5lKClcbiAgICB9XG5cbiAgICBpZiAoc3RhdGljVGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ3N0YXRpYycsXG4gICAgICAgIG1lc3NhZ2U6IGByZW5kZXJlZCAke3N0YXRpY0ZpbGVBbW91bnR9IGZpbGUocylgLFxuICAgICAgICBkdXJhdGlvbjogc3RhdGljVGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGR5bmFtaWNUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnbGFtYmRhJyxcbiAgICAgICAgbWVzc2FnZTogYGNvbXBpbGVkICR7ZHluYW1pY0lkcy5sZW5ndGh9IGZ1bmN0aW9uKHMpYCxcbiAgICAgICAgZHVyYXRpb246IGR5bmFtaWNUaW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY29weVRpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdhc3NldHMnLFxuICAgICAgICBtZXNzYWdlOiBgY29waWVkIGluICR7Y29weVRpbWV9YCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uZmlnLmhvb2tzLmVtaXRQb3N0QnVpbGQoe1xuICAgICAgb3V0cHV0OiBjb25maWcub3V0cHV0LFxuICAgICAgc3RhdGljT3V0cHV0OiBjb25maWcuc3RhdGljT3V0cHV0RGlyLFxuICAgICAgZnVuY3Rpb25zT3V0cHV0OiBjb25maWcuZnVuY3Rpb25zT3V0cHV0RGlyLFxuICAgICAgZnVuY3Rpb25zTWFuaWZlc3Q6IGdldFJvdXRlc01hbmlmZXN0U2FmZWx5KGNvbmZpZy5mdW5jdGlvbnNNYW5pZmVzdCksXG4gICAgfSlcblxuICAgIGlmIChzdGF0aWNUaW1lIHx8IGR5bmFtaWNUaW1lKSB7XG4gICAgICBsb2dnZXIubmV3bGluZSgpXG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnY29tcGxldGUnLFxuICAgICAgICBtZXNzYWdlOiBgaW4gJHt0b3RhbFRpbWUoKX1gLFxuICAgICAgfSlcbiAgICAgIGxvZ2dlci5uZXdsaW5lKClcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0J1xuaW1wb3J0IHNpcnYgZnJvbSAnc2lydidcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgdG9SZWdFeHAgZnJvbSAncmVnZXhwYXJhbSdcblxuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgZGVmYXVsdDQwNCB9IGZyb20gJy4vZGVmYXVsdDQwNCdcbmltcG9ydCB7IHJlcXVlc3RUb0V2ZW50IH0gZnJvbSAnLi9yZXF1ZXN0VG9FdmVudCdcbmltcG9ydCB7IHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UgfSBmcm9tICcuL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UnXG5pbXBvcnQgeyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0IH0gZnJvbSAnLi9saXZlUmVsb2FkU2NyaXB0J1xuaW1wb3J0IHsgQVdTLCBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuXG5mdW5jdGlvbiByZXNvbHZlSFRNTChkaXI6IHN0cmluZywgdXJsOiBzdHJpbmcpIHtcbiAgbGV0IGZpbGUgPSBwYXRoLmpvaW4oZGlyLCB1cmwpXG5cbiAgLy8gaWYgbm8gZXh0ZW5zaW9uLCBpdCdzIHByb2JhYmx5IGludGVuZGVkIHRvIGJlIGFuIEhUTUwgZmlsZVxuICBpZiAoIXBhdGguZXh0bmFtZSh1cmwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpciwgdXJsLCAnaW5kZXguaHRtbCcpLCAndXRmOCcpXG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0ZjgnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBQcmVzdGEgfSkge1xuICBjb25zdCBkZXZDbGllbnQgPSBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydCB9KVxuICBjb25zdCBzdGF0aWNEaXIgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGFzc2V0RGlyID0gY29uZmlnLmFzc2V0c1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzZXJ2ZUhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCB1cmwgPSByZXEudXJsIGFzIHN0cmluZ1xuXG4gICAgLypcbiAgICAgKiBJZiB0aGlzIGlzIGFuIGFzc2V0IG90aGVyIHRoYW4gSFRNTCBmaWxlcywganVzdCBzZXJ2ZSBpdFxuICAgICAqL1xuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBhdHRlbXB0aW5nIHRvIHNlcnZlIHVzZXIgc3RhdGljIGFzc2V0ICR7dXJsfWAsXG4gICAgfSlcblxuICAgIC8qXG4gICAgICogZmlyc3QgY2hlY2sgdGhlIHZjcy10cmFja2VkIHN0YXRpYyBmb2xkZXIsXG4gICAgICogdGhlbiBjaGVjayB0aGUgcHJlc3RhLWJ1aWx0IHN0YXRpYyBmb2xkZXJcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1cmUtdGhpbmcvcHJlc3RhL2lzc3Vlcy8zMFxuICAgICAqL1xuICAgIHNpcnYoYXNzZXREaXIsIHsgZGV2OiB0cnVlIH0pKHJlcSwgcmVzLCAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgICAgbWVzc2FnZTogYGF0dGVtcHRpbmcgdG8gc2VydmUgZ2VuZXJhdGVkIHN0YXRpYyBhc3NldCAke3VybH1gLFxuICAgICAgfSlcblxuICAgICAgc2lydihzdGF0aWNEaXIsIHsgZGV2OiB0cnVlIH0pKHJlcSwgcmVzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBObyBhc3NldCBmaWxlLCBubyBzdGF0aWMgZmlsZSwgdHJ5IGR5bmFtaWNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtjb25maWcuZnVuY3Rpb25zTWFuaWZlc3RdXG4gICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSByZXF1aXJlKGNvbmZpZy5mdW5jdGlvbnNNYW5pZmVzdClcbiAgICAgICAgICBjb25zdCByb3V0ZXMgPSBPYmplY3Qua2V5cyhtYW5pZmVzdClcbiAgICAgICAgICBjb25zdCBsYW1iZGFGaWxlcGF0aCA9IHJvdXRlc1xuICAgICAgICAgICAgLm1hcCgocm91dGUpID0+ICh7XG4gICAgICAgICAgICAgIG1hdGNoZXI6IHRvUmVnRXhwKHJvdXRlKSxcbiAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbWF0Y2hlciB9KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLnBhdHRlcm4udGVzdCh1cmwuc3BsaXQoJz8nKVswXSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWFwKCh7IHJvdXRlIH0pID0+IG1hbmlmZXN0W3JvdXRlXSlbMF1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIElmIHdlIGhhdmUgYSBzZXJ2ZXJsZXNzIGZ1bmN0aW9uLCBkZWxlZ2F0ZSB0byBpdCwgb3RoZXJ3aXNlIDQwNFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChsYW1iZGFGaWxlcGF0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBhdHRlbXB0aW5nIHRvIHJlbmRlciBsYW1iZGEgZm9yICR7dXJsfWAsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjb25zdCB7IGhhbmRsZXIgfTogeyBoYW5kbGVyOiBBV1NbJ0hhbmRsZXInXSB9ID0gcmVxdWlyZShsYW1iZGFGaWxlcGF0aClcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVxdWVzdFRvRXZlbnQocmVxKVxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCB7fSlcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzIHx8IHt9XG4gICAgICAgICAgICBjb25zdCByZWRpciA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPiAyOTkgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDM5OVxuXG4gICAgICAgICAgICAvLyBnZXQgbWltZSB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaGVhZGVyc1snQ29udGVudC1UeXBlJ10gYXMgc3RyaW5nXG4gICAgICAgICAgICBjb25zdCBleHQgPSB0eXBlID8gbWltZS5leHRlbnNpb24odHlwZSkgOiAnaHRtbCdcblxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYCR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0gJHtyZWRpciA/IGhlYWRlcnMuTG9jYXRpb24gOiB1cmx9YCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UocmVzLCB7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgIG11bHRpVmFsdWVIZWFkZXJzOiByZXNwb25zZS5tdWx0aVZhbHVlSGVhZGVycyxcbiAgICAgICAgICAgICAgLy8gb25seSBodG1sIGNhbiBiZSBsaXZlLXJlbG9hZGVkLCBkdWhcbiAgICAgICAgICAgICAgYm9keTogZXh0ID09PSAnaHRtbCcgPyAocmVzcG9uc2UuYm9keSB8fCAnJykuc3BsaXQoJzwvYm9keT4nKVswXSArIGRldkNsaWVudCA6IHJlc3BvbnNlLmJvZHksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICAgICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYGF0dGVtcHRpbmcgdG8gcmVuZGVyIHN0YXRpYyA0MDQuaHRtbCBwYWdlIGZvciAke3VybH1gLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIFRyeSB0byBmYWxsIGJhY2sgdG8gYSBzdGF0aWMgNDA0IHBhZ2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHJlc29sdmVIVE1MKHN0YXRpY0RpciwgJzQwNCcpICsgZGV2Q2xpZW50XG5cbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnc2VydmUnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGA0MDQgJHt1cmx9YCxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UocmVzLCB7XG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNDA0LFxuICAgICAgICAgICAgICAgIGJvZHk6IGZpbGUsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmICghKGUgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT0VOVCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgcmVuZGVyaW5nIGRlZmF1bHQgNDA0IEhUTUwgcGFnZSBmb3IgJHt1cmx9YCxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBsb2dnZXIud2Fybih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYDQwNCAke3VybH1gLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgc2VuZFNlcnZlcmxlc3NSZXNwb25zZShyZXMsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgICAgICAgICAgYm9keTogZGVmYXVsdDQwNCArIGRldkNsaWVudCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgICBtZXNzYWdlOiBgcmVuZGVyaW5nIGRlZmF1bHQgNTAwIEhUTUwgcGFnZSBmb3IgJHt1cmx9YCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc2VydmUnLFxuICAgICAgICAgICAgbWVzc2FnZTogYDUwMCAke3VybH1gLFxuICAgICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzZW5kU2VydmVybGVzc1Jlc3BvbnNlKHJlcywge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgYm9keTogJycgKyBkZXZDbGllbnQsIC8vIFRPRE8gZGVmYXVsdCA1MDAgc2NyZWVuXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJ2ZShjb25maWc6IFByZXN0YSkge1xuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0UG9ydCh7IHBvcnQ6IGNvbmZpZy5wb3J0IH0pXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfSkpLmxpc3Rlbihwb3J0KVxuICBjb25zdCBzb2NrZXQgPSByZXF1aXJlKCdwb2NrZXQuaW8nKShzZXJ2ZXIsIHsgc2VydmVDbGllbnQ6IGZhbHNlIH0pXG5cbiAgY29uZmlnLmhvb2tzLm9uQnJvd3NlclJlZnJlc2goKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGByZWZyZXNoIGV2ZW50IHJlY2VpdmVkYCxcbiAgICB9KVxuXG4gICAgc29ja2V0LmVtaXQoJ3JlZnJlc2gnKVxuICB9KVxuXG4gIGNob2tpZGFyLndhdGNoKGNvbmZpZy5hc3NldHMsIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSB9KS5vbignYWxsJywgKCkgPT4ge1xuICAgIGNvbmZpZy5ob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIHJldHVybiB7IHBvcnQgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0NDA0ID0gYDwhLS0gYnVpbHQgd2l0aCBwcmVzdGEgaHR0cHM6Ly9ucG0uaW0vcHJlc3RhIC0tPlxuPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCIgLz5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MVwiIC8+XG4gICAgPHRpdGxlPjQwNDwvdGl0bGU+XG4gICAgPGxpbmtcbiAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgdHlwZT1cInRleHQvY3NzXCJcbiAgICAgIGhyZWY9XCJodHRwczovL3VucGtnLmNvbS9zdmJzdHJhdGVANC4xLjEvZGlzdC9zdmJzdHJhdGUuY3NzXCJcbiAgICAvPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxkaXYgY2xhc3M9XCJmIGFpYyBqY2NcIiBzdHlsZT1cImhlaWdodDogMTAwdmhcIj5cbiAgICAgIDxoMiBjbGFzcz1cInAxXCIgc3R5bGU9XCJjb2xvcjogYmx1ZVwiPjQwNCBOb3QgRm91bmQ8L2gyPlxuICAgIDwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+YFxuIiwgImltcG9ydCBodHRwIGZyb20gJ2h0dHAnXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVVybCB9IGZyb20gJ3VybCdcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUXVlcnkgfSBmcm9tICdxdWVyeS1zdHJpbmcnXG5pbXBvcnQgcmF3Qm9keSBmcm9tICdyYXctYm9keSdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgeyBBV1MgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXRsaWZ5L2NsaS9ibG9iLzI3YmI3YjliMzBkNDY1YWJlODZmODdmNDI3NGRkN2E3MWIxYjAwM2Ivc3JjL3V0aWxzL3NlcnZlLWZ1bmN0aW9ucy5qcyNMMTY3XG5jb25zdCBCQVNFXzY0X01JTUVfUkVHRVhQID0gL2ltYWdlfGF1ZGlvfHZpZGVvfGFwcGxpY2F0aW9uXFwvcGRmfGFwcGxpY2F0aW9uXFwvemlwfGFwcGxpY2F0b25cXC9vY3RldC1zdHJlYW0vaVxuZnVuY3Rpb24gc2hvdWxkQmFzZTY0RW5jb2RlKGNvbnRlbnRUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJvb2xlYW4oY29udGVudFR5cGUpICYmIEJBU0VfNjRfTUlNRV9SRUdFWFAudGVzdChjb250ZW50VHlwZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RUb0V2ZW50KHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UpOiBQcm9taXNlPEFXU1snSGFuZGxlckV2ZW50J10+IHtcbiAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmV0bGlmeS9jbGkvYmxvYi8yN2JiN2I5YjMwZDQ2NWFiZTg2Zjg3ZjQyNzRkZDdhNzFiMWIwMDNiL3NyYy91dGlscy9zZXJ2ZS1mdW5jdGlvbnMuanMjTDIwOFxuICBjb25zdCByZW1vdGVBZGRyZXNzID0gU3RyaW5nKHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXSkgfHwgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyB8fCAnJ1xuICBjb25zdCBpcCA9IHJlbW90ZUFkZHJlc3NcbiAgICAuc3BsaXQocmVtb3RlQWRkcmVzcy5pbmNsdWRlcygnLicpID8gJzonIDogJywnKVxuICAgIC5wb3AoKVxuICAgID8udHJpbSgpXG4gIGNvbnN0IGlzQmFzZTY0RW5jb2RlZCA9IHNob3VsZEJhc2U2NEVuY29kZShyZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJycpXG4gIGNvbnN0IGJvZHkgPSByZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuICAgID8gYXdhaXQgcmF3Qm9keShyZXEsIHtcbiAgICAgICAgbGltaXQ6ICcxbWInLFxuICAgICAgICBlbmNvZGluZzogbWltZS5jaGFyc2V0KHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCAnJykgfHwgdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcmVxLnVybCBhcyBzdHJpbmcsXG4gICAgaHR0cE1ldGhvZDogcmVxLm1ldGhvZCBhcyBzdHJpbmcsXG4gICAgLy8gQHRzLWlnbm9yZSBUT0RPIHRlc3Qgc2V0LWNvb2tpZSBjb21pbmcgaW4gYXMgYXJyYXlcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi5yZXEuaGVhZGVycyxcbiAgICAgICdjbGllbnQtaXAnOiBpcCxcbiAgICB9LFxuICAgIC8vIFRPRE8gc2hvdWxkIHRoZXNlIGhlYWRlcnMgYmUgZXhjbHVzaXZlbHkgc2luZ2xlIHZhbHVlIHZzIG11bHRpP1xuICAgIG11bHRpVmFsdWVIZWFkZXJzOiBPYmplY3Qua2V5cyhyZXEuaGVhZGVycykucmVkdWNlKChoZWFkZXJzLCBrZXkpID0+IHtcbiAgICAgIGlmIChyZXEuaGVhZGVyc1trZXldICYmICEocmVxLmhlYWRlcnNba2V5XSBhcyBzdHJpbmcpLmluY2x1ZGVzKCcsJykpIHJldHVybiBoZWFkZXJzIC8vIG9ubHkgaW5jbHVkZSBtdWx0aS12YWx1ZSBoZWFkZXJzIGhlcmVcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaGVhZGVycyxcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBUT0RPIGFnYWluLCBhcnJheSBoZWFkZXJzXG4gICAgICAgIFtrZXldOiByZXEuaGVhZGVyc1trZXldLnNwbGl0KCcsJyksXG4gICAgICB9XG4gICAgfSwge30pLFxuICAgIC8vIEB0cy1pZ25vcmUgVE9ETyBkbyBJIG5lZWQgdG8ga2VlcCB0aGVzZSBzZXBhcmF0ZT9cbiAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHBhcnNlUXVlcnkocGFyc2VVcmwocmVxLnVybCkucXVlcnkpLFxuICAgIGJvZHk6IGJvZHkgPyBuZXcgQnVmZmVyKGJvZHkpLnRvU3RyaW5nKGlzQmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKSA6IG51bGwsXG4gICAgaXNCYXNlNjRFbmNvZGVkLFxuICB9XG59XG4iLCAiaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcblxuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgQVdTIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UocmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLCByOiBQYXJ0aWFsPEFXU1snSGFuZGxlclJlc3BvbnNlJ10+KSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2UocilcblxuICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXRsaWZ5L2NsaS9ibG9iLzI3YmI3YjliMzBkNDY1YWJlODZmODdmNDI3NGRkN2E3MWIxYjAwM2Ivc3JjL3V0aWxzL3NlcnZlLWZ1bmN0aW9ucy5qcyNMNzNcbiAgZm9yIChjb25zdCBrZXkgaW4gci5tdWx0aVZhbHVlSGVhZGVycykge1xuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcoci5tdWx0aVZhbHVlSGVhZGVyc1trZXldKSlcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IGluIHIuaGVhZGVycykge1xuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcoci5oZWFkZXJzW2tleV0pKVxuICB9XG5cbiAgcmVzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlXG4gIHJlcy53cml0ZShyZXNwb25zZS5ib2R5KVxuICByZXMuZW5kKClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7azRCQUVBLE9BQWUsdUJBQ2YsR0FBaUIsMHNDQ0hqQixNQUF5QixvQkNBbEIsR0FBTSxHQUFNLENBQ2pCLFdBQVksYUFDWixZQUFhLGVDQ2YsR0FBTSxJQUFnQixDQUNwQixJQUFLLFFBQVEsSUFDYixJQUFLLFFBQVEsTUFDYixJQUFLLEVBQUksV0FDVCxNQUFPLElBR0YsV0FBa0MsRUFBd0IsQ0FFL0QsY0FBTyxXQUFhLEVBQ2IsRUFHRixZQUE0QyxDQUVqRCxNQUFLLFFBQU8sWUFDVixFQUF5QixJQUlwQixPQUFPLFdGbEJULEdBQUssR0FBTCxVQUFLLEVBQUwsQ0FDTCxRQUFRLFFBQ1IsT0FBTyxPQUNQLE9BQU8sT0FDUCxNQUFNLFVBSkksV0FlWixHQUFJLElBQWMsR0FFWixHQUFTLEVBQ1osRUFBTyxPQUFRLFdBQ2YsRUFBTyxNQUFPLFFBQ2QsRUFBTyxNQUFPLFVBQ2QsRUFBTyxLQUFNLE9BYVQsV0FBZ0IsRUFBa0IsQ0FDdkMsR0FBSSxRQUFRLElBQUksUUFDZCxHQUFLLEtBQUssT0FDTCxDQUNMLEdBQU0sR0FBUSxJQUEyQixNQUNuQyxFQUFVLElBQTJCLE1BQVEsRUFBSSxXQUFhLE9BQVMsTUFFN0UsR0FBSSxDQUFDLEdBQVMsRUFBUSxRQUFVLEVBQU8sTUFBTyxPQUU5QyxRQUFRLElBQ04sQ0FDRSxVQUFFLEtBQUssR0FDUCxVQUFFLEdBQU8sRUFBUSxPQUFTLFNBQXdCLEVBQVEsT0FDMUQsRUFBUSxRQUNSLEVBQVEsU0FBVyxVQUFFLEtBQUssSUFBTSxFQUFRLFVBQVksR0FDcEQsRUFBUSxNQUFRO0FBQUE7QUFBQSxFQUFPLEVBQVEsTUFBTSxPQUFTLEVBQVE7QUFBQTtBQUFBLEVBQWMs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