/*! For license information please see testutils.cjs.LICENSE.txt */ (()=>{"use strict";var e,s,t={55:(e,s,t)=>{t.r(s),t.d(s,{TestRunner:()=>n.O,TestTracker:()=>a.b,argv:()=>o.D,colors:()=>l.O9,figures:()=>l.iI,isNumeric:()=>c.kE,pluralize:()=>c._6,sleep:()=>c._v,withColor:()=>l.I$,writeErrorsAreOk:()=>c.pT,writeInfo:()=>c.yZ});var o=t(887),i=t(654),r={};for(const e in i)["default","TestRunner","TestTracker","argv"].indexOf(e)<0&&(r[e]=()=>i[e]);t.d(s,r);var c=t(488),l=t(381),n=t(837),a=t(901)},227:()=>{},208:()=>{},654:(e,s,t)=>{t.r(s);var o=t(227),i={};for(const e in o)"default"!==e&&(i[e]=()=>o[e]);t.d(s,i);var r=t(208);i={};for(const e in r)"default"!==e&&(i[e]=()=>r[e]);t.d(s,i);var c=t(885);i={};for(const e in c)"default"!==e&&(i[e]=()=>c[e]);t.d(s,i);var l=t(446);i={};for(const e in l)"default"!==e&&(i[e]=()=>l[e]);t.d(s,i)},885:()=>{},446:()=>{},837:(e,s,t)=>{t.d(s,{O:()=>b});const o=require("nyc");var i=t.n(o);const r=require("resolve-from");var c=t.n(r);const l=require("fs"),n=require("path"),a=async e=>{const s=Object.assign({},u(e),e.coverage.config),o=new(i())(s);o.wrap();const r=new RegExp(`${e.moduleName}[\\/\\\\]${e.moduleBuildDir}[\\/\\\\]`),l=r.test.bind(r);if(Object.keys(t.c).filter(l).length>5&&console.warn("NYC initialized after modules were loaded",Object.keys(t.c).filter(l)),e.coverage.clean)try{await o.reset()}catch{await o.createTempDirectory()}else await o.createTempDirectory();const a={NYC_CONFIG:JSON.stringify(s),NYC_CWD:s.cwd};if(!1===s.babelCache&&(a.BABEL_DISABLE_CACHE=process.env.BABEL_DISABLE_CACHE="1"),!s.useSpawnWrap){const e=[require.resolve("nyc/lib/register-env"),...o.require.map((e=>c().silent(o.cwd,e)||e))];t(523).push(...e,require.resolve("nyc/lib/wrap")),Object.assign(process.env,a),e.forEach((e=>{require(e)}))}if(s.all&&await o.addAllFiles(),s.useSpawnWrap){const e=t(272);(0,n.relative)(__dirname,(0,n.resolve)(o.cwd,"node_modules","nyc","bin")).replace(/\\/g,"/"),e.runMain(),a.SPAWN_WRAP_SHIM_ROOT=process.env.SPAWN_WRAP_SHIM_ROOT||process.env.XDG_CACHE_HOME||t(37).homedir(),e([require.resolve("nyc/bin/wrap.js")],a)}return o},u=e=>{let s=(0,n.join)(e.projectRoot,".nycrc.json");if((0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}if(s=(0,n.join)(e.projectRoot,".nycrc"),(0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}if(s=(0,n.join)(e.projectRoot,"nycrc.json"),(0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}return{extends:"@istanbuljs/nyc-config-typescript",cwd:e.projectRoot,hookRequire:!0,hookRunInContext:!0,hookRunInThisContext:!0,instrument:!0,reportDir:"./.coverage",silent:!1,reporter:["text-summary","html"],include:["dist/**/*.js"],exclude:["dist/**/test/**","node_modules/**"]}},h=require("glob"),g=require("mocha");var p=t.n(g);const m=e=>{const s=Object.assign({},d(e),e.framework.config),t=new(p())(s),o=e.framework.suite;let i="**/*.{spec,test}.js";o&&o.length>0&&(i=o.length>1?"{":"",o.forEach((e=>{i.length>1&&(i+=","),i+=`**/${e}.{spec,test}.js`})),i+=o.length>1?"}":"");const r=e.framework.root,c=e.framework.sortGroup,l=h.sync(i,{cwd:e.framework.root});return c?l.sort(((e,s)=>(c.includes((0,n.relative)(r,e))?(0,n.relative)(r,e):(0,n.basename)(e))<(c.includes((0,n.relative)(r,s))?(0,n.relative)(r,s):(0,n.basename)(s))?-1:1)):l.sort(((e,s)=>(0,n.basename)(e)<(0,n.basename)(s)?-1:1)),l.forEach((e=>t.addFile((0,n.resolve)(r,e)))),t},d=e=>{let s=(0,n.join)(e.projectRoot,".mocharc.json");if((0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}if(s=(0,n.join)(e.projectRoot,".mocharc"),(0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}if(s=(0,n.join)(e.projectRoot,"mocharc.json"),(0,l.existsSync)(s))try{return JSON.parse((0,l.readFileSync)(s,"utf8"))}catch{}return{ui:"tdd",color:!0,timeout:3e4,retries:0,slow:250}};var w=t(488);const _=e=>new Promise((s=>setTimeout(s,e))),T=async e=>{let s=process.stdout.write,t="";process.stdout.write=e=>(t+=e,!0);try{await e()}catch(e){S(e)}finally{process.stdout.write=s}return t},S=async e=>{if("EPIPE"!==e.code)throw e},y=async()=>{if("linux"===process.platform){const e=t(224);e.getWindowSize||(e.getWindowSize=()=>[80,75])}};var I=t(887),f=Object.defineProperty,$=(e,s,t)=>(((e,s,t)=>{s in e?f(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t})(e,"symbol"!=typeof s?s+"":s,t),t);class b{constructor(e){$(this,"_options"),$(this,"run",(()=>(async e=>{const s=await(async e=>{const s=!JSON.parse(process.env.xArgs||"[]").includes("--no-coverage");if(s&&((e.isTypescript||e.register.tsNode)&&t(58),e.register.sourceMapSupport&&t(501)),e.coverage.config&&(e.coverage.config.cwd=e.coverage.config.cwd||__dirname,!(0,l.existsSync)((0,n.join)(e.projectRoot,"package.json"))||!(0,l.existsSync)((0,n.join)(e.coverage.config.cwd,"package.json")))){let s=__dirname;for(;s.length>3&&!(0,l.existsSync)((0,n.join)(s,"package.json"));)s=(0,n.resolve)(s,"..");e.projectRoot=s,e.coverage.config.cwd=s}return{nyc:s?await a(e):void 0,mocha:m(e)}})(e),o=e.coverage.htmlReportDark&&"nyc"===e.coverage.tool&&e.coverage.config?.reporter?.includes("html");if(y(),o)try{const s=(0,n.resolve)(e.projectRoot,"node_modules","istanbul-reports","lib"),t=(0,n.resolve)(s,"html","assets"),o=(0,n.join)(t,"base.css");(0,l.copyFileSync)(o,(0,n.join)(t,"_base.css")),(0,l.copyFileSync)((0,n.resolve)(__dirname,"..","..","res","runner","istanbul","html","base.css"),t)}catch{}let i,r=0;try{r=await new Promise((e=>s.mocha.run(e)))}catch(e){i=e}if(s.nyc)try{await _(5*s.mocha.files.length),s.nyc.writeCoverageFile(),await _(20*s.mocha.files.length),await s.nyc.writeProcessIndex(),s.nyc.maybePurgeSourceMapCache(),console.log(await T(s.nyc.report.bind(s.nyc)))}catch(e){console.log("!!!"),console.log("!!! Error writing coverage file:"),console.log("!!! "+e),console.log("!!!");try{await s.nyc.showProcessTree()}catch{}}if(o)try{const s=(0,n.resolve)(e.projectRoot,"node_modules","istanbul-reports","lib","html","assets");(0,l.copyFileSync)((0,n.join)(s,"_base.css"),(0,n.join)(s,"base.css")),(0,l.copyFileSync)((0,n.resolve)(__dirname,"..","..","res","runner","istanbul","html","base.css"),s)}catch{}if(r>0||i){let e=i?i.message:`${r} ${(0,w._6)("test",r)} failed.`;throw process.env.TEST_UTILS_FAILURE_EXCEPTION&&(e=`${e}\n${process.env.TEST_UTILS_FAILURE_EXCEPTION}`),new Error(e)}})(Object.assign(this._options,(0,I.D)())))),this._options={coverage:{clean:!1,config:{},htmlReportDark:!1,tool:void 0},isTypescript:!1,moduleBuildDir:"dist",moduleName:"",projectRoot:"",register:{sourceMapSupport:!0,tsNode:!1},framework:{config:{},root:"",suite:void 0,type:void 0},verbose:!1},e&&(this._options=Object.assign(this._options,e))}}},901:(e,s,t)=>{t.d(s,{b:()=>d});var o=t(887),i=t(488),r=Object.defineProperty,c=(e,s,t)=>(((e,s,t)=>{s in e?r(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t})(e,"symbol"!=typeof s?s+"":s,t),t);class l{constructor(e){c(this,"_testTimer",0),c(this,"_inst"),c(this,"_results"),c(this,"_options"),c(this,"getSuccessCount",(e=>{const s=(e.test||e.currentTest).parent,t=this.getSuiteKey(s.title);return this._results.suiteResults[t].successCount})),c(this,"endRollingCount",((e,s)=>{const t=(s?e.currentTest:e.test).parent,o=this.getSuiteKey(t.title),r=this._results.suiteResults[o];++r.successCount,r.runTime=Date.now()-this._testTimer,r.runTimeFmt=`${Math.floor(r.runTime/1e3)} s, ${r.runTime%1e3} ms`,this._options.printSuiteRuntimes&&this._testTimer>0&&(0,i.yZ)(`suite runtime : ${r.runTimeFmt}`),this._testTimer=0})),c(this,"exitRollingCount",((e,s,t)=>{const o=s||t?e.currentTest:e.test,i=o.parent,r=this.getSuiteKey(i.title);this._results.suiteResults[r]||(this._results.suiteResults[r]={timeStarted:Date.now(),numTests:i.tests.length,success:!1,successCount:-1,suiteName:this.getSuiteFriendlyName(i.title),timeFinished:0,numTestsFailed:0},i.parent&&(this._options.isSingleSuiteTest=i.parent.suites.length<=2));const c=this._results.suiteResults[r],l=s||t?s?-1:i.tests.length:i.tests.findIndex((e=>e.title===o.title&&!e.isFailed()&&!e.isPassed()));try{if(c.successCount!==l)throw new Error(`Expected success count to be ${c.successCount}, got ${l}`)}catch(e){this._inst.setFailed(e,i,Object.assign({index:l},o))}return this._testTimer=Date.now(),this._inst.isRollingCountError})),c(this,"getSuiteKey",((e,s="")=>s?s+this.properCase(e.replace(" Tests","")).replace(/[ \W]/g,""):this.lowerCaseFirstChar(this.properCase(e.replace(" Tests","")),!0).replace(/\W/g,""))),c(this,"getSuiteFriendlyName",(e=>e.replace(" Tests",""))),c(this,"properCase",((e,s)=>e?e.replace(/(?:^\w|[A-Z]|\b\w)/g,(e=>e.toUpperCase())).replace(/[ ]+/g,s?"":" "):"")),c(this,"lowerCaseFirstChar",((e,s)=>{let t="";return e&&(t=e[0].toString().toLowerCase(),e.length>1&&(t+=e.substring(1)),s&&(t=t.replace(/ /g,""))),t})),c(this,"sleep",(async e=>new Promise((s=>setTimeout(s,e))))),c(this,"suiteFinished",(e=>{const s=e.currentTest?.parent;if(s){const e=s.tests.filter((e=>e.isFailed())).length,t=this.getSuiteKey(s.title),o=this._results.suiteResults[t];this._results.numTestsFail+=e,this._results.numTestsSuccess+=s.tests.filter((e=>e.isPassed())).length,this._results.numSuites++,this._results.numTests+=s.tests.length,e>0?this._results.numSuitesFail++:this._results.numSuitesSuccess++,this._results.suiteResults[t]=Object.assign(o,{success:0===e,timeFinished:Date.now(),numTestsFailed:e})}})),this._inst=e,this._options=e.options,this._results=e.results}get writeConsole(){return i.yZ}}var n=t(381);const a=require("readline");let u,h;const g=async(e,s)=>{s.meta?s.name:s.ctrl&&"c"===s.name&&h()};var p=Object.defineProperty,m=(e,s,t)=>(((e,s,t)=>{s in e?p(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t})(e,"symbol"!=typeof s?s+"":s,t),t);class d{constructor(e){var s;m(this,"_symbols"),m(this,"_timeStarted",0),m(this,"_caughtControlC",!1),m(this,"_hasRollingCountError"),m(this,"_results"),m(this,"_utils"),m(this,"_options"),m(this,"_timeSep","----------------------------------------------------------------------------------------------------"),m(this,"suiteResults",(e=>this._results.suiteResults[e])),m(this,"clearProcessTimeStorage",(async(e,s)=>{const t=async()=>{await this._options.store.updateStoreValue(e,void 0),await this._options.store.updateStoreValue(e+"Fmt",void 0),await this._options.store.updateStoreValue(e+"NumTests",void 0),await this._options.store.updateStoreValue(e+"Slow",void 0),await this._options.store.updateStoreValue(e+"SlowFmt",void 0),await this._options.store.updateStoreValue(e+"SlowNumTests",void 0)};(this._options.clearBestTime||this._options.clearAllBestTimes||this._options.clearBestTimesOnTestCountChange&&await this._options.store.getStoreValue(e+"NumTests",0)e+(this._options.isMultiRootWorkspace?"MWS":""))),m(this,"getTimeElapsedFmt",(e=>`${Math.floor(e/1e3/60)} minutes, ${Math.floor(e/1e3%60)} seconds, ${Math.round(e%1e3)} milliseconds`)),m(this,"logBestTime",(async(e,s,t)=>{let o,i=this._options.isMultiRootWorkspace?"multi-root":"single-root";const r=` The previous fastest time recorded for a ${i} workspace was ${await this._options.store.getStoreValue(s+"Fmt","")}`,c=` The slowest time recorded for a ${i} workspace was ${await this._options.store.getStoreValue(s+"SlowFmt","")}`,l=` ${n.iI.color.info} ${n.iI.withColor("!!!",n.iI.colors.cyan)}`;i=this._options.isMultiRootWorkspace?"Multi-Root":"Single-Root",o=e?e.includes("Logging")?` New Fastest Time with ${e} (${i} workspace) ${n.iI.withColor(t,n.iI.colors.cyan)}`:this._results.numSuites>1?` New Fastest Time for Suite '${e}' (${i} workspace) ${n.iI.withColor(t,n.iI.colors.cyan)}`:` New Fastest Time for Suite '${e}' (Single Test)(${i} workspace) ${n.iI.withColor(t,n.iI.colors.cyan)}`:` New Fastest Time for 'All Tests' (${i} workspace) ${n.iI.withColor(t,n.iI.colors.cyan)}`,console.log(l+n.iI.withColor(o,n.iI.colors.grey)),console.log(l+n.iI.withColor(r,n.iI.colors.grey)),console.log(l+n.iI.withColor(c,n.iI.colors.grey))})),m(this,"logSlowestTime",(async(e,s,t)=>{let o,i=this._options.isMultiRootWorkspace?"multi-root":"single-root";const r=await this._options.store.getStoreValue(s+"Fmt",""),c=` The previous slowest time recorded for a ${i} workspace was ${await this._options.store.getStoreValue(s+"SlowFmt","")}`,l=` The fastest time recorded for a ${i} workspace was ${r}`,a=` ${n.iI.color.info} ${n.iI.withColor("!!!",n.iI.colors.red)}`;i=this._options.isMultiRootWorkspace?"Multi-Root":"Single-Root",o=e?e.includes("Logging")?` New Slowest Time with ${e} (${i} workspace) ${n.iI.withColor(t,n.iI.colors.red)}`:this._results.numSuites>1?` New Slowest Time for Suite '${e}' (${i} workspace) ${n.iI.withColor(t,n.iI.colors.red)}`:` New Slowest Time for Suite '${e}' (Single Test)(${i} workspace) ${n.iI.withColor(t,n.iI.colors.red)}`:` New Slowest Time for 'All Tests' (${i} workspace) ${n.iI.withColor(t,n.iI.colors.cyan)}`,console.log(a+n.iI.withColor(o,n.iI.colors.grey)),console.log(a+n.iI.withColor(c,n.iI.colors.grey)),console.log(a+n.iI.withColor(l,n.iI.colors.grey))})),m(this,"processBestTime",(async(e,s,t,o)=>{const i=!e||e.includes("Logging")?"All Tests "+e:e,r=n.iI.withColor("-- ",n.iI.colors.magenta)+n.iI.withColor(i.toUpperCase(),n.iI.colors.white)+n.iI.withColor(` ${this._timeSep.substring(0,this._timeSep.length-i.length-4)}`,n.iI.colors.magenta);console.log(` ${n.iI.color.info} ${r}`),await this.clearProcessTimeStorage(s,o);let c=await this._options.store.getStoreValue(s,0);0===c&&(c=t+1);const l=await this._options.store.getStoreValue(`${s}Slow`,0);let a=l;0===a&&(a=t+1);const u=this.getTimeElapsedFmt(t);if(t>0&&t0&&(t>a||0===l))await this.logSlowestTime(e,s,u),await this.saveProcessTimeToStorage(`${s}Slow`,t,u,o);else{let e=await this._options.store.getStoreValue(s+"Fmt",""),i=await this._options.store.getStoreValue(s+"SlowFmt","");const r=this._options.isMultiRootWorkspace?"multi-root":"single-root",c=`The time elapsed was ${u}`,l=t>0?`The fastest time recorded for a ${r} workspace is ${e}`:"Fastest time tracking not available for tests running at 0 ms";if(e||(await this.saveProcessTimeToStorage(s,t,u,o),e=u),i||(await this.saveProcessTimeToStorage(`${s}Slow`,t,u,o),i=u),console.log(` ${n.iI.color.info} ${n.iI.withColor(c,n.iI.colors.grey)}`),console.log(` ${n.iI.color.info} ${n.iI.withColor(l,n.iI.colors.grey)}`),t>0){const e=`The slowest time recorded for a ${r} workspace is ${i}`;console.log(` ${n.iI.color.info} ${n.iI.withColor(e,n.iI.colors.grey)}`)}}})),m(this,"processSuiteTimes",(async()=>{const e=Object.values(this._results.suiteResults).filter((e=>"Deactivate Extension"!==e.suiteName));for(const s of e){const e=1===this._results.numSuites?"Single":"",t=this._utils.getSuiteKey(s.suiteName,this.getStorageKey("bestTimeElapsedSuite"+e));if(this._options.clearAllBestTimes&&(await this.clearProcessTimeStorage(t,this._results.numTests),await this.clearProcessTimeStorage(`${t}Slow`,this._results.numTests)),s.timeFinished&&s.timeStarted){const e=s.timeFinished-s.timeStarted;await this.processBestTime(s.suiteName,t,e,this._results.numTests)}}})),m(this,"processTimesWithLogEnabled",(async e=>{this._options.clearAllBestTimes&&(await this.clearProcessTimeStorage(this.getStorageKey("bestTimeElapsedWithLogging"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("bestTimeElapsedWithLoggingFile"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("bestTimeElapsedWithLoggingOutput"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("bestTimeElapsedWithLoggingConsole"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("slowTimeElapsedWithLogging"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("slowTimeElapsedWithLoggingFile"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("slowTimeElapsedWithLoggingOutput"),this._results.numTests),await this.clearProcessTimeStorage(this.getStorageKey("slowTimeElapsedWithLoggingConsole"),this._results.numTests)),this._options.isLogEnabled&&(await this.processBestTime("Logging Enabled",this.getStorageKey("bestTimeElapsedWithLogging"),e,this._results.numTests),await this.processBestTime("Logging Enabled",this.getStorageKey("slowTimeElapsedWithLogging"),e,this._results.numTests),this._options.isFileLogEnabled&&(await this.processBestTime("File Logging Enabled",this.getStorageKey("bestTimeElapsedWithLoggingFile"),e,this._results.numTests),await this.processBestTime("File Logging Enabled",this.getStorageKey("slowTimeElapsedWithLoggingFile"),e,this._results.numTests)),this._options.isOutputWindowLogEnabled&&(await this.processBestTime("Output Window Logging Enabled",this.getStorageKey("bestTimeElapsedWithLoggingOutput"),e,this._results.numTests),await this.processBestTime("Output Window Logging Enabled",this.getStorageKey("slowTimeElapsedWithLoggingOutput"),e,this._results.numTests)),this._options.isConsoleLogEnabled&&(await this.processBestTime("Console Logging Enabled",this.getStorageKey("bestTimeElapsedWithLoggingConsole"),e,this._results.numTests),await this.processBestTime("Console Logging Enabled",this.getStorageKey("slowTimeElapsedWithLoggingConsole"),e,this._results.numTests)))})),m(this,"processTimes",(async()=>{const e=Date.now()-this._timeStarted,s=6e4*(new Date).getTimezoneOffset(),t=new Date(Date.now()-s).toISOString().slice(0,-1).replace("T"," ").replace(/[\-]/g,"/");if(this._hasRollingCountError&&this._symbols&&(this._symbols.ok=n.iI.color.success),this._caughtControlC&&console.log(` ${n.iI.color.info} ${n.iI.withColor("User cancelled (caught CTRL+C)",n.O9.grey)}`),u&&(process.stdin.off("keypress",g),u.close(),u=void 0),console.log(` ${n.iI.color.info} ${n.iI.withColor("Time Finished: "+t,n.iI.colors.grey)}`),console.log(` ${n.iI.color.info} ${n.iI.withColor("Time Elapsed: "+this.getTimeElapsedFmt(e),n.iI.colors.grey)}`),0!==this._results.numTestsFail||this._hasRollingCountError){const e=this._results.numTestsFail>0?`There were ${this._results.numTestsFail} failed tests, best time processing skipped`:"There was a rolling count failure, best time processing skipped";console.log(` ${n.iI.color.info} ${n.iI.withColor(e,n.iI.colors.grey)}`)}else this._results.numSuites>3&&(await this.processBestTime("",this.getStorageKey("bestTimeElapsed"),e,this._results.numTests),await this.processTimesWithLogEnabled(e)),await this.processSuiteTimes();console.log(` ${n.iI.color.info} ${n.iI.withColor(this._timeSep,n.iI.colors.magenta)}`)})),m(this,"saveProcessTimeToStorage",(async(e,s,t,o)=>{await this._options.store.updateStoreValue(e,s),await this._options.store.updateStoreValue(e+"Fmt",t),await this._options.store.updateStoreValue(e+"NumTests",o)})),m(this,"setFailed",((e,s,o)=>{if(!this._hasRollingCountError){const r=e instanceof Error;if(this._caughtControlC="boolean"==typeof e,this._hasRollingCountError={suite:s.title,test:o.title,testIdx:o.index},"mocha"===this._options.framework){const{symbols:e}=t(899);this._symbols=e,e.ok=n.iI.withColor(n.iI.pointer,n.O9.blue)+n.iI.withColor(" [Skipped]",n.O9.grey)}if(!o)throw new Error("Caught CTRL-C");if((0,i.yZ)(`rolling success count failure @ test ${o.index+1}, skipping remaining tests`),0===s?.tests.filter((e=>e.isFailed())).length)throw process.env.TEST_UTILS_FAILURE_EXCEPTION=r?e.message:"",new Error("Rolling count error: "+process.env.TEST_UTILS_FAILURE_EXCEPTION)}})),this._results={numSuites:0,numSuitesFail:0,numSuitesSuccess:0,numTests:0,numTestsFail:0,numTestsSuccess:0,suiteResults:{}},this._options={clearAllBestTimes:!1,clearBestTime:!1,clearBestTimesOnTestCountChange:!1,framework:"mocha",isConsoleLogEnabled:!1,isFileLogEnabled:!1,isLogEnabled:!1,isMultiRootWorkspace:!1,isOutputWindowLogEnabled:!1,isSingleSuiteTest:!1,printSuiteRuntimes:!1,store:{async updateStoreValue(...e){},getStoreValue:async(...e)=>0}},Object.assign(this._options,e||{},(0,o.D)()),s=()=>{this.setFailed(!0)},!u&&process.stdin.isTTY&&(h=s,u=a.createInterface({input:process.stdin,escapeCodeTimeout:50}),process.stdin.setRawMode(!0),a.emitKeypressEvents(process.stdin,u),process.stdin.on("keypress",g)),this._timeStarted=Date.now(),this._utils=new l(this)}get isRollingCountError(){return!!this._hasRollingCountError}get options(){return this._options}set options(e){this._timeStarted=Date.now(),Object.assign(this._options,e)}get results(){return this._results}get utils(){return this._utils}}},887:(e,s,t)=>{t.d(s,{D:()=>i});var o=t(488);const i=()=>{const e={};return process.argv.forEach(((s,t,i)=>{s.startsWith("--tu-")&&(i[t+1]&&!i[t+1].startsWith("--")?(e[r(s)]=i[t+1],(0,o.kE)(e[s])&&(e[s]=parseInt(i[t+1],10))):e[s]=!0)}),void 0),e},r=e=>e.replace(/(?:^\w|[A-Z]|\b\w)/g,((e,s)=>0!==s?e.toLowerCase():e.toUpperCase())).replace(/[\s\-]+/g,"")},381:(e,s,t)=>{t.d(s,{I$:()=>c,O9:()=>r,iI:()=>l});var o=Object.defineProperty,i=(e,s,t)=>(((e,s,t)=>{s in e?o(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t})(e,"symbol"!=typeof s?s+"":s,t),t);const r=new class{constructor(){i(this,"bold",[1,22]),i(this,"italic",[3,23]),i(this,"underline",[4,24]),i(this,"inverse",[7,27]),i(this,"white",[37,39]),i(this,"grey",[90,39]),i(this,"black",[30,39]),i(this,"blue",[34,39]),i(this,"cyan",[36,39]),i(this,"green",[32,39]),i(this,"magenta",[35,39]),i(this,"red",[31,39]),i(this,"yellow",[33,39])}},c=(e,s)=>"["+s[0]+"m"+e+"["+s[1]+"m",l={colors:r,withColor:c,success:"✔",info:"ℹ",warning:"⚠",error:"✘",pointer:"❯",start:"▶",end:"◀",nodejs:"⬢",star:"★",checkboxOn:"☒",checkboxOff:"☐",pointerSmall:"›",bullet:"●",up:"△",color:{success:c("✔",r.green),successBlue:c("✔",r.blue),info:c("ℹ",r.magenta),infoTask:c("ℹ",r.blue),warning:c("⚠",r.yellow),warningTests:c("⚠",r.blue),error:c("✘",r.red),errorTests:c("✘",r.blue),start:c("▶",r.green),end:c("◀",r.green),pointer:c("❯",r.grey),up:c("△",r.green)}}},488:(e,s,t)=>{t.d(s,{_6:()=>r,_v:()=>c,kE:()=>i,pT:()=>n,yZ:()=>l});var o=t(381);const i=e=>!isNaN(parseFloat(e))&&isFinite(e),r=(e,s)=>1!==s?e+"s":e,c=async e=>new Promise((s=>setTimeout(s,e))),l=(e,s,t="")=>console.log(` ${t}${s||o.iI.color.info}${e?" "+o.iI.withColor(e,o.iI.colors.grey):""}`),n=()=>{console.log(` ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success}`),console.log(` ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.up} ${o.iI.withColor(" THESE ERRORS WERE SUPPOSED TO HAPPEN!!! ",o.iI.colors.green)} ${o.iI.color.up} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success}`),console.log(` ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success} ${o.iI.color.success}`)}},899:e=>{e.exports=require("mocha/lib/reporters/base")},523:e=>{e.exports=require("node-preload")},501:e=>{e.exports=require("source-map-support/register")},272:e=>{e.exports=require("spawn-wrap")},58:e=>{e.exports=require("ts-node/register")},37:e=>{e.exports=require("os")},224:e=>{e.exports=require("tty")}},o={};function i(e){var s=o[e];if(void 0!==s)return s.exports;var r=o[e]={id:e,loaded:!1,exports:{}};return t[e](r,r.exports,i),r.loaded=!0,r.exports}i.m=t,i.c=o,i.n=e=>{var s=e&&e.__esModule?()=>e.default:()=>e;return i.d(s,{a:s}),s},i.d=(e,s)=>{for(var t in s)i.o(s,t)&&!i.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:s[t]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((s,t)=>(i.f[t](e,s),s)),[])),i.u=e=>{},i.o=(e,s)=>Object.prototype.hasOwnProperty.call(e,s),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.X=(e,s,t)=>{var o=s;t||(s=e,t=()=>i(i.s=o)),s.map(i.e,i);var r=t();return void 0===r?e:r},e={924:1},s=s=>{var t=s.modules,o=s.ids,r=s.runtime;for(var c in t)i.o(t,c)&&(i.m[c]=t[c]);r&&r(i);for(var l=0;l{e[t]||s(require("./"+i.u(t)))},module.exports=i,i.C=s;var r=i(55);module.exports=r})(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFlBQWErTyxJQUFOd0IsRUFBa0JLLEVBQVNMLENBQUMsRWpDRmhDdlcsRUFBa0IsQ0FDckIsSUFBSyxHQUtGQyxFQUFnQjZXLElBQ25CLElBQUlDLEVBQWNELEVBQU1FLFFBQVNILEVBQVdDLEVBQU1HLElBQUtDLEVBQVVKLEVBQU1JLFFBQ3ZFLElBQUksSUFBSXJDLEtBQVlrQyxFQUNoQm5DLEVBQW9CYyxFQUFFcUIsRUFBYWxDLEtBQ3JDRCxFQUFvQk8sRUFBRU4sR0FBWWtDLEVBQVlsQyxJQUc3Q3FDLEdBQVNBLEVBQVF0QyxHQUNwQixJQUFJLElBQUl1QyxFQUFJLEVBQUdBLEVBQUlOLEVBQVN4VixPQUFROFYsSUFDbkNuWCxFQUFnQjZXLEVBQVNNLElBQU0sQ0FBQyxFQUtsQ3ZDLEVBQW9CelAsRUFBRWpGLFFBQVUsQ0FBQzRWLEVBQVNFLEtBRXJDaFcsRUFBZ0I4VixJQUVsQjdWLEVBQWFDLFFBQVEsS0FBTzBVLEVBQW9CcUIsRUFBRUgsSUFFcEQsRUFHRHJCLE9BQU9DLFFBQVVFLEVBQ2pCQSxFQUFvQndDLEVBQUluWCxFa0MvQnhCLElBQUlvWCxFQUFzQnpDLEVBQW9CIiwic291cmNlcyI6WyJ3ZWJwYWNrL3J1bnRpbWUvcmVxdWlyZV9jaHVua19sb2FkaW5nIiwiZXh0ZXJuYWxfY29tbW9uanNfbnljIiwiZXh0ZXJuYWxfY29tbW9uanNfcmVzb2x2ZS1mcm9tIiwiZXh0ZXJuYWxfbm9kZS1jb21tb25qc19mcyIsImV4dGVybmFsX25vZGUtY29tbW9uanNfcGF0aCIsIkM6XFxQcm9qZWN0c1xcQHNwbWVlc3NlbWFuXFx0ZXN0LXV0aWxzXFxzcmNcXHJ1bm5lclxcbnljLnRzIiwiZXh0ZXJuYWxfY29tbW9uanNfZ2xvYiIsImV4dGVybmFsX2NvbW1vbmpzX21vY2hhIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xccnVubmVyXFxtb2NoYS50cyIsIkM6XFxQcm9qZWN0c1xcQHNwbWVlc3NlbWFuXFx0ZXN0LXV0aWxzXFxzcmNcXHJ1bm5lclxccnVuLnRzIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xccnVubmVyXFxpbmRleC50cyIsIkM6XFxQcm9qZWN0c1xcQHNwbWVlc3NlbWFuXFx0ZXN0LXV0aWxzXFxzcmNcXHJ1bm5lclxcY29uZmlnLnRzIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xcdHJhY2tlclxcdXRpbHMudHMiLCJleHRlcm5hbF9ub2RlLWNvbW1vbmpzX3JlYWRsaW5lIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xcdXRpbHNcXGlucHV0LnRzIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xcdHJhY2tlclxcaW5kZXgudHMiLCJDOlxcUHJvamVjdHNcXEBzcG1lZXNzZW1hblxcdGVzdC11dGlsc1xcc3JjXFx1dGlsc1xcYXJndi50cyIsIkM6XFxQcm9qZWN0c1xcQHNwbWVlc3NlbWFuXFx0ZXN0LXV0aWxzXFxzcmNcXHV0aWxzXFxmaWd1cmVzLnRzIiwiQzpcXFByb2plY3RzXFxAc3BtZWVzc2VtYW5cXHRlc3QtdXRpbHNcXHNyY1xcdXRpbHNcXHV0aWxzLnRzIiwiZXh0ZXJuYWxfY29tbW9uanNfbW9jaGEvbGliL3JlcG9ydGVycy9iYXNlIiwiZXh0ZXJuYWxfY29tbW9uanNfbm9kZS1wcmVsb2FkIiwiZXh0ZXJuYWxfY29tbW9uanNfc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyIiwiZXh0ZXJuYWxfY29tbW9uanNfc3Bhd24td3JhcCIsImV4dGVybmFsX2NvbW1vbmpzX3RzLW5vZGUvcmVnaXN0ZXIiLCJleHRlcm5hbF9ub2RlLWNvbW1vbmpzX29zIiwiZXh0ZXJuYWxfbm9kZS1jb21tb25qc190dHkiLCJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2svcnVudGltZS9jb21wYXRfZ2V0X2RlZmF1bHRfZXhwb3J0Iiwid2VicGFjay9ydW50aW1lL2RlZmluZV9wcm9wZXJ0eV9nZXR0ZXJzIiwid2VicGFjay9ydW50aW1lL2Vuc3VyZV9jaHVuayIsIndlYnBhY2svcnVudGltZS9nZXRfamF2YXNjcmlwdF9jaHVua19maWxlbmFtZSIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eV9zaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZV9uYW1lc3BhY2Vfb2JqZWN0Iiwid2VicGFjay9ydW50aW1lL3N0YXJ0dXBfZW50cnlwb2ludCIsIndlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImxvYWRlZFwiLCBvdGhlcndpc2Ugbm90IGxvYWRlZCB5ZXRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDkyNDogMVxufTtcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG52YXIgaW5zdGFsbENodW5rID0gKGNodW5rKSA9PiB7XG5cdHZhciBtb3JlTW9kdWxlcyA9IGNodW5rLm1vZHVsZXMsIGNodW5rSWRzID0gY2h1bmsuaWRzLCBydW50aW1lID0gY2h1bmsucnVudGltZTtcblx0Zm9yKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspXG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRzW2ldXSA9IDE7XG5cbn07XG5cbi8vIHJlcXVpcmUoKSBjaHVuayBsb2FkaW5nIGZvciBqYXZhc2NyaXB0XG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYucmVxdWlyZSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHQvLyBcIjFcIiBpcyB0aGUgc2lnbmFsIGZvciBcImFscmVhZHkgbG9hZGVkXCJcblx0aWYoIWluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdGlmKHRydWUpIHsgLy8gYWxsIGNodW5rcyBoYXZlIEpTXG5cdFx0XHRpbnN0YWxsQ2h1bmsocmVxdWlyZShcIi4vXCIgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCkpKTtcblx0XHR9IGVsc2UgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMTtcblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5DID0gaW5zdGFsbENodW5rO1xuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJueWNcIik7IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJyZXNvbHZlLWZyb21cIik7IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcInBhdGhcIik7IiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGUgdGVzdHV0aWxzLnJ1bm5lci5ueWNcclxuICovXHJcblxyXG5pbXBvcnQgTllDIGZyb20gXCJueWNcIjtcclxuaW1wb3J0IHJlc29sdmVGcm9tIGZyb20gXCJyZXNvbHZlLWZyb21cIjtcclxuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7IGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHsgSVRlc3RDb3ZlcmFnZVRvb2xDb25maWcsIElUZXN0UnVuT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuXHJcbmNvbnN0IG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsc3RyaW5nIHwgbnVsbD4gPSB7fTtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyhvcHRpb25zOiBJVGVzdFJ1bk9wdGlvbnMpID0+XHJcbntcclxuICAgIGNvbnN0IG55Y0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcob3B0aW9ucyksIG9wdGlvbnMuY292ZXJhZ2UuY29uZmlnKTtcclxuXHQvL1xyXG5cdC8vIEluc3RhbnRpYXRlIGFuIE5ZQyBpbnN0YW5jZSBhbmQgd3JhcCB0aGUgY3VycmVudCBydW5uaW5nIGV4dGVuc2lvbiBob3N0IHByb2Nlc3MuIFRoaXNcclxuXHQvLyBkaWZmZXJzIGEgYml0IGZyb20gdGhlIHdheSBueWMgaXMgbm9ybWFsbHkgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWFmYiZJd21iYjooXHJcblx0Ly9cclxuXHRjb25zdCBueWMgPSBuZXcgTllDKG55Y0NvbmZpZyk7XHJcblx0bnljLndyYXAoKTtcclxuXHQvL1xyXG5cdC8vIENoZWNrIHRoZSBtb2R1bGVzIGFscmVhZHkgbG9hZGVkIGFuZCB3YXJuIGluIGNhc2Ugb2YgcmFjZSBjb25kaXRpb25cclxuXHQvLyAoaWRlYWxseSwgYXQgdGhpcyBwb2ludCB0aGUgcmVxdWlyZSBjYWNoZSBzaG91bGQgb25seSBjb250YWluIG9uZSBmaWxlIC0gdGhpcyBtb2R1bGUgKCYgaGVscGVyIGltcG9ydHMpXHJcblx0Ly9cclxuXHRjb25zdCBteUZpbGVzUmVnZXggPSBuZXcgUmVnRXhwKGAke29wdGlvbnMubW9kdWxlTmFtZX1bXFxcXC9cXFxcXFxcXF0ke29wdGlvbnMubW9kdWxlQnVpbGREaXJ9W1xcXFwvXFxcXFxcXFxdYCksXHJcblx0XHQgIGZpbHRlckZuID0gbXlGaWxlc1JlZ2V4LnRlc3QuYmluZChteUZpbGVzUmVnZXgpLFxyXG5cdFx0ICBtb2R1bGVDb3VudFNob3VsZEJlID0gNTtcclxuXHRpZiAoT2JqZWN0LmtleXMocmVxdWlyZS5jYWNoZSkuZmlsdGVyKGZpbHRlckZuKS5sZW5ndGggPiBtb2R1bGVDb3VudFNob3VsZEJlKVxyXG5cdHtcclxuXHRcdGNvbnNvbGUud2FybihcIk5ZQyBpbml0aWFsaXplZCBhZnRlciBtb2R1bGVzIHdlcmUgbG9hZGVkXCIsIE9iamVjdC5rZXlzKHJlcXVpcmUuY2FjaGUpLmZpbHRlcihmaWx0ZXJGbikpO1xyXG5cdH1cclxuXHQvL1xyXG5cdC8vIERlYnVnIHdoaWNoIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQvZXhjbHVkZWRcclxuXHQvLyBjb25zb2xlLmxvZygnR2xvYiB2ZXJpZmljYXRpb24nLCBhd2FpdCBueWMuZXhjbHVkZS5nbG9iKG55Yy5jd2QpKTtcclxuXHQvL1xyXG5cdGlmICghb3B0aW9ucy5jb3ZlcmFnZS5jbGVhbilcclxuXHR7XHJcblx0XHRhd2FpdCBueWMuY3JlYXRlVGVtcERpcmVjdG9yeSgpO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IG55Yy5yZXNldCgpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2gge1xyXG5cdFx0XHRhd2FpdCBueWMuY3JlYXRlVGVtcERpcmVjdG9yeSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvL1xyXG5cdC8vIFByZXBhcmUgZW52aXJvbm1lbnQgZm9yIHNwYXduZWQgcHJvY2Vzc2VzXHJcblx0Ly9cclxuXHRjb25zdCBlbnY6IGFueSA9IHtcclxuXHRcdE5ZQ19DT05GSUc6IEpTT04uc3RyaW5naWZ5KG55Y0NvbmZpZyksXHJcblx0XHROWUNfQ1dEOiBueWNDb25maWcuY3dkXHJcblx0fTtcclxuICAgXHQvL1xyXG5cdC8vIEJhYmVsJ3MgY2FjaGUgaW50ZXJmZXJlcyB3aXRoIHNvbWUgY29uZmlndXJhdGlvbnMsIHNvIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGl0XHJcblx0Ly8gY2FuIGJlIHJlLWVuYWJsZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBiYWJlbENhY2hlPWBmYWxzZWAuICBJYWZiJkl3bWJiOihcclxuXHQvL1xyXG5cdGlmIChueWNDb25maWcuYmFiZWxDYWNoZSA9PT0gZmFsc2UpXHJcblx0e1xyXG5cdFx0ZW52LkJBQkVMX0RJU0FCTEVfQ0FDSEUgPSBwcm9jZXNzLmVudi5CQUJFTF9ESVNBQkxFX0NBQ0hFID0gXCIxXCI7XHJcblx0fVxyXG5cdC8vXHJcblx0Ly8gSW5pdGlhbGl6ZSBueWMgZW52aXJvbm1lbnQgdmFycyBhbmQgcHJvY2VzcyB3cmFwIGlmIG5vdCB1c2luZyB0aGUgc3Bhd24td3JhcCBvcHRpb25cclxuXHQvL1xyXG5cdGlmICghbnljQ29uZmlnLnVzZVNwYXduV3JhcClcclxuXHR7XHJcblx0XHQvLyBjb25zdCBueWNMaWJQYXRoID0gam9pbihueWMuY3dkLCBcIm5vZGVfbW9kdWxlc1wiLCBcIm55Y1wiLCBcImxpYlwiKTtcclxuXHRcdC8vIGNvbnN0IG55Y0xpYlBhdGggPSByZWxhdGl2ZShfX2Rpcm5hbWUsIHJlc29sdmUob3B0aW9ucy5wcm9qZWN0Um9vdCwgXCJub2RlX21vZHVsZXNcIiwgXCJueWNcIiwgXCJsaWJcIikpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xyXG5cdFx0Ly8gY29uc3QgbnljTGliUGF0aCA9IGpvaW4ob3B0aW9ucy5wcm9qZWN0Um9vdCwgXCJub2RlX21vZHVsZXNcIiwgXCJueWNcIiwgXCJsaWJcIik7XHJcblx0XHRjb25zdCByZXF1aXJlTW9kdWxlcyA9IFtcclxuXHRcdFx0Ly8gam9pbihueWNMaWJQYXRoLCBcInJlZ2lzdGVyLWVudi5qc1wiKSxcclxuXHRcdFx0Ly8gcmVxdWlyZS5yZXNvbHZlKGAke255Y0xpYlBhdGh9L3JlZ2lzdGVyLWVudi5qc2ApXHJcblx0XHRcdF9fX19yZXF1aXJlLnJlc29sdmVfX19fKFwibnljL2xpYi9yZWdpc3Rlci1lbnZcIiksXHJcblx0XHRcdC4uLm55Yy5yZXF1aXJlLm1hcCgobW9kOiBzdHJpbmcpID0+IHJlc29sdmVGcm9tLnNpbGVudChueWMuY3dkLCBtb2QpIHx8IG1vZClcclxuXHRcdF07XHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXHJcblx0XHRjb25zdCBwcmVsb2FkTGlzdCA9IHJlcXVpcmUoXCJub2RlLXByZWxvYWRcIik7XHJcblx0XHRwcmVsb2FkTGlzdC5wdXNoKFxyXG5cdFx0XHQuLi5yZXF1aXJlTW9kdWxlcyxcclxuXHRcdFx0Ly8gam9pbihueWNMaWJQYXRoLCBcIndyYXAuanNcIilcclxuXHRcdFx0Ly8gcmVxdWlyZS5yZXNvbHZlKGAke255Y0xpYlBhdGh9L3dyYXAuanNgKVxyXG5cdFx0XHRfX19fcmVxdWlyZS5yZXNvbHZlX19fXyhcIm55Yy9saWIvd3JhcFwiKVxyXG5cdFx0KTtcclxuXHRcdE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudik7XHJcblx0XHRyZXF1aXJlTW9kdWxlcy5mb3JFYWNoKG1vZCA9PiB7IF9fX19yZXF1aXJlX19fXyhtb2QpOyB9KTtcclxuXHR9XHJcblx0Ly9cclxuXHQvLyBDYWxsIGFkZEFsbEZpbGVzKCkgQUZURVIgaW1wb3J0aW5nIHJlZ2lzdGVyLWVudiBtb2R1bGUgKGlmICghbnljQ29uZmlnLnVzZVNwYXduV3JhcCkpXHJcblx0Ly9cclxuXHRpZiAobnljQ29uZmlnLmFsbClcclxuXHR7XHJcblx0XHRhd2FpdCBueWMuYWRkQWxsRmlsZXMoKTtcclxuXHR9XHJcblx0Ly9cclxuXHQvLyBJbml0aWFsaXplIHNwYXduLXdyYXAgbW9kdWxlIGlmIHJlcXVpcmVkXHJcblx0Ly9cclxuXHRpZiAobnljQ29uZmlnLnVzZVNwYXduV3JhcClcclxuXHR7ICAgLy9cclxuXHRcdC8vIFRoaXMgaXMgd2hlcmUgd2UgYXJlIGZhaWxpbmcgbm93IGluIG91ciBlZmZvcnRzIHRvIHdyYXAgdGhlIHNlcnZlciBzcGF3biBmb3IgY292ZXJhZ2UuXHJcblx0XHQvLyBUaGUgdnNjb2RlLWxhbmd1YWdlY2xpZW50IG1vZHVsZSBmaWxlcyB0byBsYXVuY2ggdGhlIHNlcnZlciB3aGVuIHRoZXNlIGZpbmFsIGxpbmVzIGFyZVxyXG5cdFx0Ly8gZW5hYmxlZC4gIEZvciBub3csIHdlIGp1c3QgdXNlIHRoZSBueWMud3JhcCgpIGxpa2Ugd2UgYWx3YXlzIGhhdmUsIHNvIHRoYXQgYXQgbGVhc3QgdGhlXHJcblx0XHQvLyBjbGllbnQgcHJvY2VzcyBpcyB3cmFwcGVkIHdoZW4gdGhlIGJvb3RzdHJhcC1mb3JrIHN0YXJ0cyBpdCdzIHRoaW5nIGluIHRoZSBWU0NvZGUgZW5naW5lLlxyXG5cdFx0Ly9cclxuXHRcdC8vIFRPRE8gLSBeXl4gTmV4dCB0cnkgaXMgdG8gYnVpbGQgYSBtb2NoYSBjb21tYW5kIGxpbmUgaW5zdGVhZCBvZiBpbnN0YW50aXN0aW5nIGFuIGluc3RhbmNlXHJcblx0XHQvLyAgICAgICAgcHJvZ3JhbWF0aWNhbGx5LCBhbmQgdXNlIGZvcmVncm91bmQoKSBpbiBpbmRleHQudHMgdG8gbGF1bmNoIGl0LiAgVEhpcyB3b3VsZCBwcmV0dHlcclxuXHRcdC8vICAgICAgICBtdWNoIHJlcGxpY2F0ZSBob3cgbnljL2Jpbi9ueWMuanMgd29ya3MuXHJcblx0XHQvL1xyXG5cdFx0Ly8gVVBEQVRFIDYvMjIvMjMgLSBIYXZlIGxhbmd1YWdlIGNsaWVudCBhbmQgIHNlcnZlciBGSU5BTExZIGNvdmVyZWQgYnkgc2FtZSB0ZXN0IHN1aXRlcyxcclxuXHRcdC8vICAgICAgICAgICAgICAgICAgXCJ3aXRob3V0XCIgdXNpbmcgdXNlU3Bhd25XcmFwLiAgS2V5IHdhcyB0byB1c2UgYSBub2RlIHJ1bnRpbWUgdG8gZGlyZWN0bHlcclxuXHRcdC8vICAgICAgICAgICAgICAgICAgc3Bhd24gdGhlIHNlcnZlciwgYXMgb3Bwb3NlZCB0byB0aGUgZGVmYXVsdCBmb3JrLiAgT25seSB0b29rIDMgeWVhcnMgdG9cclxuXHRcdC8vICAgICAgICAgICAgICAgICAgZmlndXJlIHRoYXQgb3V0LiBPciA0IHllYXJzPyAgSWFmYiZJd21iYjooXHJcblx0XHQvLyAgICAgICAgICAgICAgICAgID4gU2VlOiBmaWxlOi8vL2M6L1Byb2plY3RzL3ZzY29kZS1leHRqcy9jbGllbnQvc3JjL2xpYi9sYW5ndWFnZS9jbGllbnQudHNcclxuXHRcdC8vXHJcblx0XHRjb25zdCBzdyA9IHJlcXVpcmUoXCJzcGF3bi13cmFwXCIpLFxyXG5cdFx0XHQgIG55Y0JpblBhdGggPSByZWxhdGl2ZShfX2Rpcm5hbWUsIHJlc29sdmUobnljLmN3ZCwgXCJub2RlX21vZHVsZXNcIiwgXCJueWNcIiwgXCJiaW5cIikpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xyXG5cdFx0c3cucnVuTWFpbigpO1xyXG5cdFx0ZW52LlNQQVdOX1dSQVBfU0hJTV9ST09UID0gcHJvY2Vzcy5lbnYuU1BBV05fV1JBUF9TSElNX1JPT1QgfHwgcHJvY2Vzcy5lbnYuWERHX0NBQ0hFX0hPTUUgfHwgcmVxdWlyZShcIm9zXCIpLmhvbWVkaXIoKTtcclxuXHRcdHN3KFsgX19fX3JlcXVpcmUucmVzb2x2ZV9fX18oXCJueWMvYmluL3dyYXAuanNcIikgXSwgZW52KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBueWM7XHJcbn07XHJcblxyXG5cclxuLy8gY29uc3QgbnljTGliUmVxdWlyZSA9IChtb2R1bGVOYW1lOiBzdHJpbmcpID0+XHJcbi8vIHtcclxuLy8gICAgIGlmIChtb2R1bGVzW21vZHVsZU5hbWVdID09PSB1bmRlZmluZWQpXHJcbi8vIFx0eztcclxuLy8gICAgICAgICB0cnkge1xyXG4vLyAgICAgICAgICAgICByZXF1aXJlKFwiLi4vLi4vbm9kZV9tb2R1bGVzL255Yy9saWIvXCIgKyBtb2R1bGVOYW1lKTtcclxuLy8gICAgICAgICB9XHJcbi8vIFx0XHRjYXRjaCB7IG1vZHVsZXNbbW9kdWxlTmFtZV0gPSBudWxsOyB9XHJcbi8vICAgICB9XHJcbi8vICAgICByZXR1cm4gbW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuLy8gfVxyXG5cclxuXHJcbmNvbnN0IGRlZmF1bHRDb25maWcgPSAob3B0aW9uczogSVRlc3RSdW5PcHRpb25zKTogUGFydGlhbDxJVGVzdENvdmVyYWdlVG9vbENvbmZpZz4gPT5cclxue1xyXG5cdGxldCBjZmdGaWxlID0gam9pbihvcHRpb25zLnByb2plY3RSb290LCBcIi5ueWNyYy5qc29uXCIpO1xyXG5cdGlmIChleGlzdHNTeW5jKGNmZ0ZpbGUpKSB7XHJcblx0XHR0cnkgeyByZXR1cm4gPElUZXN0Q292ZXJhZ2VUb29sQ29uZmlnPkpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGNmZ0ZpbGUsIFwidXRmOFwiKSk7IH0gY2F0Y2gge31cclxuXHR9XHJcblxyXG5cdGNmZ0ZpbGUgPSBqb2luKG9wdGlvbnMucHJvamVjdFJvb3QsIFwiLm55Y3JjXCIpO1xyXG5cdGlmIChleGlzdHNTeW5jKGNmZ0ZpbGUpKSB7XHJcblx0XHR0cnkgeyByZXR1cm4gPElUZXN0Q292ZXJhZ2VUb29sQ29uZmlnPkpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGNmZ0ZpbGUsIFwidXRmOFwiKSk7IH0gY2F0Y2gge31cclxuXHR9XHJcblxyXG5cdGNmZ0ZpbGUgPSBqb2luKG9wdGlvbnMucHJvamVjdFJvb3QsIFwibnljcmMuanNvblwiKTtcclxuXHRpZiAoZXhpc3RzU3luYyhjZmdGaWxlKSkge1xyXG5cdFx0dHJ5IHsgcmV0dXJuIDxJVGVzdENvdmVyYWdlVG9vbENvbmZpZz5KU09OLnBhcnNlKHJlYWRGaWxlU3luYyhjZmdGaWxlLCBcInV0ZjhcIikpOyB9IGNhdGNoIHt9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0ZXh0ZW5kczogXCJAaXN0YW5idWxqcy9ueWMtY29uZmlnLXR5cGVzY3JpcHRcIixcclxuXHRcdGN3ZDogb3B0aW9ucy5wcm9qZWN0Um9vdCxcclxuXHRcdGhvb2tSZXF1aXJlOiB0cnVlLFxyXG5cdFx0aG9va1J1bkluQ29udGV4dDogdHJ1ZSxcclxuXHRcdGhvb2tSdW5JblRoaXNDb250ZXh0OiB0cnVlLFxyXG5cdFx0aW5zdHJ1bWVudDogdHJ1ZSxcclxuXHRcdHJlcG9ydERpcjogXCIuLy5jb3ZlcmFnZVwiLFxyXG5cdFx0c2lsZW50OiBmYWxzZSxcclxuXHRcdHJlcG9ydGVyOiBbIFwidGV4dC1zdW1tYXJ5XCIsIFwiaHRtbFwiIF0sXHJcblx0XHRpbmNsdWRlOiBbIFwiZGlzdC8qKi8qLmpzXCIgXSxcclxuXHRcdGV4Y2x1ZGU6IFsgXCJkaXN0LyoqL3Rlc3QvKipcIiwgXCJub2RlX21vZHVsZXMvKipcIiBdXHJcblx0fTtcclxufTtcclxuXHJcbiIsImNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSByZXF1aXJlKFwiZ2xvYlwiKTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcIm1vY2hhXCIpOyIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xyXG5cclxuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xyXG5pbXBvcnQgTW9jaGEsIHsgTW9jaGFPcHRpb25zIH0gZnJvbSBcIm1vY2hhXCI7XHJcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBJVGVzdFJ1bk9wdGlvbnMsIElUZXN0VG9vbENvbmZpZyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHRlc3R1dGlscy5ydW5uZXIubW9jaGFcclxuICovXHJcblxyXG5leHBvcnQgZGVmYXVsdCAob3B0aW9uczogSVRlc3RSdW5PcHRpb25zKSA9PlxyXG57XHJcblx0Y29uc3QgY29uZmlnOiBNb2NoYU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnKG9wdGlvbnMpLCA8UmVhZG9ubHk8TW9jaGFPcHRpb25zPj5vcHRpb25zLmZyYW1ld29yay5jb25maWcpLFxyXG5cdFx0ICBtb2NoYSA9IG5ldyBNb2NoYShjb25maWcpLFxyXG5cdFx0ICBzdWl0ZSA9IG9wdGlvbnMuZnJhbWV3b3JrLnN1aXRlO1xyXG5cclxuXHRsZXQgZmlsZXNUb1Rlc3QgPSBcIioqLyoue3NwZWMsdGVzdH0uanNcIjtcclxuXHRpZiAoc3VpdGUgJiYgc3VpdGUubGVuZ3RoID4gMClcclxuXHR7XHJcblx0XHRmaWxlc1RvVGVzdCA9IChzdWl0ZS5sZW5ndGggPiAxID8gXCJ7XCIgOiBcIlwiKTtcclxuXHRcdHN1aXRlLmZvckVhY2goKGE6IHN0cmluZykgPT5cclxuXHRcdHtcclxuXHRcdFx0aWYgKGZpbGVzVG9UZXN0Lmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0XHRmaWxlc1RvVGVzdCArPSBcIixcIjtcclxuXHRcdFx0fVxyXG5cdFx0XHRmaWxlc1RvVGVzdCArPSBgKiovJHthfS57c3BlYyx0ZXN0fS5qc2A7XHJcblx0XHR9KTtcclxuXHRcdGZpbGVzVG9UZXN0ICs9IChzdWl0ZS5sZW5ndGggPiAxID8gXCJ9XCIgOiBcIlwiKTtcclxuXHR9XHJcblxyXG5cdC8vXHJcblx0Ly8gQWRkIGFsbCBmaWxlcyB0byB0aGUgdGVzdCBzdWl0ZVxyXG5cdC8vXHJcblx0Y29uc3Qgcm9vdCA9IDxzdHJpbmc+b3B0aW9ucy5mcmFtZXdvcmsucm9vdCxcclxuXHRcdCAgc29ydEdyb3VwID0gb3B0aW9ucy5mcmFtZXdvcmsuc29ydEdyb3VwLFxyXG5cdFx0ICBmaWxlcyA9IGdsb2Iuc3luYyhmaWxlc1RvVGVzdCwgeyBjd2Q6IG9wdGlvbnMuZnJhbWV3b3JrLnJvb3QgfSk7XHJcblx0aWYgKCFzb3J0R3JvdXApXHJcblx0e1xyXG5cdFx0ZmlsZXMuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IGJhc2VuYW1lKGEpIDwgYmFzZW5hbWUoYikgPyAtMSA6IDEpO1xyXG5cdH1cclxuXHRlbHNlXHJcblx0e1xyXG5cdFx0ZmlsZXMuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+XHJcblx0XHR7XHJcblx0XHRcdGNvbnN0IHBBID0gc29ydEdyb3VwLmluY2x1ZGVzKHJlbGF0aXZlKHJvb3QsIGEpKSA/IHJlbGF0aXZlKHJvb3QsIGEpIDogYmFzZW5hbWUoYSksXHJcblx0XHRcdFx0ICBwQiA9IHNvcnRHcm91cC5pbmNsdWRlcyhyZWxhdGl2ZShyb290LCBiKSkgPyByZWxhdGl2ZShyb290LCBiKSA6IGJhc2VuYW1lKGIpO1xyXG5cdFx0XHRyZXR1cm4gcEEgPCBwQiA/IC0xIDogMTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRmaWxlcy5mb3JFYWNoKGYgPT4gbW9jaGEuYWRkRmlsZShyZXNvbHZlKHJvb3QsIGYpKSk7XHJcblxyXG5cdHJldHVybiBtb2NoYTtcclxufTtcclxuXHJcblxyXG5jb25zdCBkZWZhdWx0Q29uZmlnID0gKG9wdGlvbnM6IElUZXN0UnVuT3B0aW9ucyk6IFBhcnRpYWw8SVRlc3RUb29sQ29uZmlnPiA9PlxyXG57XHJcblx0bGV0IGNmZ0ZpbGUgPSBqb2luKG9wdGlvbnMucHJvamVjdFJvb3QsIFwiLm1vY2hhcmMuanNvblwiKTtcclxuXHRpZiAoZXhpc3RzU3luYyhjZmdGaWxlKSkge1xyXG5cdFx0dHJ5IHsgcmV0dXJuIDxJVGVzdFRvb2xDb25maWc+SlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoY2ZnRmlsZSwgXCJ1dGY4XCIpKTsgfSBjYXRjaCB7fVxyXG5cdH1cclxuXHJcblx0Y2ZnRmlsZSA9IGpvaW4ob3B0aW9ucy5wcm9qZWN0Um9vdCwgXCIubW9jaGFyY1wiKTtcclxuXHRpZiAoZXhpc3RzU3luYyhjZmdGaWxlKSkge1xyXG5cdFx0dHJ5IHsgcmV0dXJuIDxJVGVzdFRvb2xDb25maWc+SlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoY2ZnRmlsZSwgXCJ1dGY4XCIpKTsgfSBjYXRjaCB7fVxyXG5cdH1cclxuXHJcblx0Y2ZnRmlsZSA9IGpvaW4ob3B0aW9ucy5wcm9qZWN0Um9vdCwgXCJtb2NoYXJjLmpzb25cIik7XHJcblx0aWYgKGV4aXN0c1N5bmMoY2ZnRmlsZSkpIHtcclxuXHRcdHRyeSB7cmV0dXJuIDxJVGVzdFRvb2xDb25maWc+SlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoY2ZnRmlsZSwgXCJ1dGY4XCIpKTsgfSBjYXRjaCB7fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdHVpOiBcInRkZFwiLCAgICAgIC8vIHRoZSBUREQgVUlcclxuXHRcdGNvbG9yOiB0cnVlLCAgICAvLyBjb2xvcmVkIG91dHB1dCBmcm9tIHRlc3QgcmVzdWx0cyxcclxuXHRcdHRpbWVvdXQ6IDMwMDAwLCAvLyBkZWZhdWx0IHRpbWVvdXQ6IDEwIHNlY29uZHNcclxuXHRcdHJldHJpZXM6IDAsXHJcblx0XHRzbG93OiAyNTBcclxuXHRcdC8vIHJlcXVpcmU6IFtcclxuXHRcdC8vICAgICBcInRzLW5vZGUvcmVnaXN0ZXJcIixcclxuXHRcdC8vICAgICBcInNvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3RlclwiXHJcblx0XHQvLyBdXHJcblx0XHQvLyByZXBvcnRlcjogXCJtb2NoYS1tdWx0aS1yZXBvcnRlcnNcIixcclxuXHRcdC8vIHJlcG9ydGVyT3B0aW9uczoge1xyXG5cdFx0Ly8gICAgIHJlcG9ydGVyRW5hYmxlZDogXCJzcGVjLCBtb2NoYS1qdW5pdC1yZXBvcnRlclwiLFxyXG5cdFx0Ly8gICAgIG1vY2hhSnVuaXRSZXBvcnRlclJlcG9ydGVyT3B0aW9uczoge1xyXG5cdFx0Ly8gICAgICAgICBtb2NoYUZpbGU6IF9fZGlybmFtZSArIFwiLy4uLy4uL2NvdmVyYWdlL2p1bml0L2V4dGVuc2lvbl90ZXN0cy54bWxcIixcclxuXHRcdC8vICAgICAgICAgc3VpdGVUaXRsZVNlcGFyYXRlZEJ5OiBcIjogXCJcclxuXHRcdC8vICAgICB9XHJcblx0XHQvLyB9XHJcblx0fTtcclxufTtcclxuIiwiXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHRlc3R1dGlscy5ydW5uZXIucnVuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHJ1bkNvbmZpZyBmcm9tIFwiLi9jb25maWcuanNcIjtcclxuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XHJcbmltcG9ydCB7IElUZXN0UnVuT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuaW1wb3J0IHsgY29weUZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBydW4gPSBhc3luYyAob3B0aW9uczogSVRlc3RSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PlxyXG57XHJcbiAgICBjb25zdCBydW5DZmcgPSBhd2FpdCBydW5Db25maWcob3B0aW9ucyksIC8vIEpTT04ucGFyc2UocHJvY2Vzcy5lbnYudGVzdFV0aWxPcHRpb25zIHx8IFwie31cIikpO1xyXG4gICAgICAgICAgaHRtbFJlcG9ydERhcmsgPSBvcHRpb25zLmNvdmVyYWdlLmh0bWxSZXBvcnREYXJrICYmIG9wdGlvbnMuY292ZXJhZ2UudG9vbCA9PT0gXCJueWNcIiAmJiBvcHRpb25zLmNvdmVyYWdlLmNvbmZpZz8ucmVwb3J0ZXI/LmluY2x1ZGVzKFwiaHRtbFwiKTtcclxuXHJcbiAgICBwcmVwYXJlUGxhdGZvcm0oKTtcclxuXHJcbiAgICBpZiAoaHRtbFJlcG9ydERhcmspXHJcbiAgICB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaXN0YW5idWxSZXBvcnRQYXRoID0gcmVzb2x2ZShvcHRpb25zLnByb2plY3RSb290LCBcIm5vZGVfbW9kdWxlc1wiLCBcImlzdGFuYnVsLXJlcG9ydHNcIiwgXCJsaWJcIiksXHJcbiAgICAgICAgICAgICAgICAgIGlzdGFuYnVsSHRtbFJlcG9ydFBhdGggPSByZXNvbHZlKGlzdGFuYnVsUmVwb3J0UGF0aCwgXCJodG1sXCIsIFwiYXNzZXRzXCIpLFxyXG4gICAgICAgICAgICAgICAgICBpc3RhbmJ1bEh0bWxSZXBvcnRDc3NGaWxlID0gam9pbihpc3RhbmJ1bEh0bWxSZXBvcnRQYXRoLCBcImJhc2UuY3NzXCIpO1xyXG4gICAgICAgICAgICBjb3B5RmlsZVN5bmMoaXN0YW5idWxIdG1sUmVwb3J0Q3NzRmlsZSwgam9pbihpc3RhbmJ1bEh0bWxSZXBvcnRQYXRoLCBcIl9iYXNlLmNzc1wiKSk7XHJcbiAgICAgICAgICAgIGNvcHlGaWxlU3luYyhyZXNvbHZlKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwicmVzXCIsIFwicnVubmVyXCIsIFwiaXN0YW5idWxcIiwgXCJodG1sXCIsIFwiYmFzZS5jc3NcIiksIGlzdGFuYnVsSHRtbFJlcG9ydFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7fVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtb2NoYUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZCxcclxuICAgICAgICBmYWlsdXJlcyA9IDA7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIGZhaWx1cmVzID0gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUgPT4gZm9yZWdyb3VuZChjaGlsZEFyZ3MsIHJlc29sdmUpKTtcclxuICAgICAgICBmYWlsdXJlcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcnVuQ2ZnLm1vY2hhLnJ1bihyZXNvbHZlKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkgeyBtb2NoYUVycm9yID0gZTsgfVxyXG5cclxuICAgIGlmIChydW5DZmcubnljKVxyXG4gICAge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKHJ1bkNmZy5tb2NoYS5maWxlcy5sZW5ndGggKiA1KTtcclxuICAgICAgICAgICAgcnVuQ2ZnLm55Yy53cml0ZUNvdmVyYWdlRmlsZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbGVlcChydW5DZmcubW9jaGEuZmlsZXMubGVuZ3RoICogMjApO1xyXG4gICAgICAgICAgICBhd2FpdCBydW5DZmcubnljLndyaXRlUHJvY2Vzc0luZGV4KCk7XHJcbiAgICAgICAgICAgIHJ1bkNmZy5ueWMubWF5YmVQdXJnZVNvdXJjZU1hcENhY2hlKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGF3YWl0IGNhcHR1cmVTdGRvdXQocnVuQ2ZnLm55Yy5yZXBvcnQuYmluZChydW5DZmcubnljKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiEhIVwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIhISEgRXJyb3Igd3JpdGluZyBjb3ZlcmFnZSBmaWxlOlwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIhISEgICAgXCIgKyBlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIhISFcIik7XHJcbiAgICAgICAgICAgIHRyeSB7IGF3YWl0IHJ1bkNmZy5ueWMuc2hvd1Byb2Nlc3NUcmVlKCk7IH0gY2F0Y2gge31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGh0bWxSZXBvcnREYXJrKVxyXG4gICAge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzdGFuYnVsSHRtbFJlcG9ydFBhdGggPSByZXNvbHZlKG9wdGlvbnMucHJvamVjdFJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiaXN0YW5idWwtcmVwb3J0c1wiLCBcImxpYlwiLCBcImh0bWxcIiwgXCJhc3NldHNcIik7XHJcbiAgICAgICAgICAgIGNvcHlGaWxlU3luYyhqb2luKGlzdGFuYnVsSHRtbFJlcG9ydFBhdGgsIFwiX2Jhc2UuY3NzXCIpLCBqb2luKGlzdGFuYnVsSHRtbFJlcG9ydFBhdGgsIFwiYmFzZS5jc3NcIikpO1xyXG4gICAgICAgICAgICBjb3B5RmlsZVN5bmMocmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInJlc1wiLCBcInJ1bm5lclwiLCBcImlzdGFuYnVsXCIsIFwiaHRtbFwiLCBcImJhc2UuY3NzXCIpLCBpc3RhbmJ1bEh0bWxSZXBvcnRQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge31cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmFpbHVyZXMgPiAwIHx8IG1vY2hhRXJyb3IpXHJcbiAgICB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSAhbW9jaGFFcnJvciA/IGAke2ZhaWx1cmVzfSAke3BsdXJhbGl6ZShcInRlc3RcIiwgZmFpbHVyZXMpfSBmYWlsZWQuYCA6IG1vY2hhRXJyb3IubWVzc2FnZTtcclxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9VVElMU19GQUlMVVJFX0VYQ0VQVElPTikge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gYCR7bWVzc2FnZX1cXG4ke3Byb2Nlc3MuZW52LlRFU1RfVVRJTFNfRkFJTFVSRV9FWENFUFRJT059YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuXHJcbmNvbnN0IGNhcHR1cmVTdGRvdXQgPSBhc3luYyAoZm46IGFueSkgPT5cclxue1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxyXG4gICAgbGV0IHcgPSBwcm9jZXNzLnN0ZG91dC53cml0ZSwgYnVmZmVyID0gXCJcIjtcclxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gKHM6IHN0cmluZykgPT4geyBidWZmZXIgPSBidWZmZXIgKyBzOyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgZm4oKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgc3VwcHJlc3NFUElQRShlKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gdztcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbn07XHJcblxyXG5cclxuY29uc3Qgc3VwcHJlc3NFUElQRSA9IGFzeW5jIChlcnJvcjogYW55KSA9PlxyXG57ICAgLy9cclxuICAgIC8vIFByZXZlbnQgZHVtcGluZyBlcnJvciB3aGVuIGBueWMgbnBtIHR8aGVhZGAgY2F1c2VzIHN0ZG91dCB0byBiZSBjbG9zZWQgd2hlbiByZXBvcnRpbmcgcnVuc1xyXG4gICAgLy9cclxuICAgIGlmIChlcnJvci5jb2RlICE9PSBcIkVQSVBFXCIpIHsgdGhyb3cgZXJyb3I7IH1cclxufTtcclxuXHJcblxyXG5jb25zdCBwcmVwYXJlUGxhdGZvcm0gPSBhc3luYyAoKSA9PlxyXG57ICAgLy9cclxuICAgIC8vIExpbnV4OiBwcmV2ZW50IGEgd2VpcmQgTlBFIHdoZW4gbW9jaGEgb24gTGludXggcmVxdWlyZXMgdGhlIHdpbmRvdyBzaXplIGZyb20gdGhlIFRUWVxyXG4gICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBydW5uaW5nIGluIGEgdHR5IGVudmlyb25tZW50LCB3ZSBqdXN0IGltcGxlbWVudCBoZSBtZXRob2Qgc3RhdGljYWxseVxyXG4gICAgLy9cclxuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImxpbnV4XCIpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc3QgdHR5ID0gcmVxdWlyZShcInR0eVwiKTtcclxuICAgICAgICBpZiAoIXR0eS5nZXRXaW5kb3dTaXplKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHR5LmdldFdpbmRvd1NpemUgPSAoKTogbnVtYmVyW10gPT4gWyA4MCwgNzUgXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbiIsIlxyXG4vKipcclxuICogQG1vZHVsZSB0ZXN0dXRpbHMucnVubmVyLnRlc3RydW5uZXJcclxuICovXHJcblxyXG5pbXBvcnQgeyBydW4gfSBmcm9tIFwiLi9ydW4uanNcIjtcclxuaW1wb3J0IHsgYXJndiB9IGZyb20gXCIuLi91dGlscy9hcmd2LmpzXCI7XHJcbmltcG9ydCB7IElUZXN0UnVuT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVGVzdFJ1bm5lclxyXG57XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBJVGVzdFJ1bk9wdGlvbnM7XHJcblxyXG4gICAgcnVuID0gKCkgPT4gcnVuKE9iamVjdC5hc3NpZ24odGhpcy5fb3B0aW9ucywgYXJndigpKSk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUGFydGlhbDxJVGVzdFJ1bk9wdGlvbnM+KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGNvdmVyYWdlOiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb25maWc6IHt9LFxyXG4gICAgICAgICAgICAgICAgaHRtbFJlcG9ydERhcms6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdG9vbDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGlzVHlwZXNjcmlwdDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1vZHVsZUJ1aWxkRGlyOiBcImRpc3RcIixcclxuICAgICAgICAgICAgbW9kdWxlTmFtZTogXCJcIixcclxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IFwiXCIsXHJcbiAgICAgICAgICAgIHJlZ2lzdGVyOiB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VNYXBTdXBwb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdHNOb2RlOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmcmFtZXdvcms6IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZzoge30sXHJcbiAgICAgICAgICAgICAgICByb290OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3VpdGU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB2ZXJib3NlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXHJcblxyXG4vKipcclxuICogQG1vZHVsZSB0ZXN0dXRpbHMucnVubmVyLmNvbmZpZ1xyXG4gKi9cclxuXHJcbmltcG9ydCBOeWMgZnJvbSBcIi4vbnljLmpzXCI7XHJcbmltcG9ydCBNb2NoYSBmcm9tIFwiLi9tb2NoYS5qc1wiO1xyXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBJVGVzdFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlL2luZGV4LmpzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyhvcHRpb25zOiBJVGVzdFJ1bk9wdGlvbnMpID0+XHJcbntcclxuICAgIGNvbnN0IHhBcmdzID0gSlNPTi5wYXJzZShwcm9jZXNzLmVudi54QXJncyB8fCBcIltdXCIpLFxyXG4gICAgICAgICAgY292ZXIgPSAheEFyZ3MuaW5jbHVkZXMoXCItLW5vLWNvdmVyYWdlXCIpO1xyXG5cclxuICAgIGlmIChjb3ZlcilcclxuICAgIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5pc1R5cGVzY3JpcHQgfHwgb3B0aW9ucy5yZWdpc3Rlci50c05vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXF1aXJlKFwidHMtbm9kZS9yZWdpc3RlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucmVnaXN0ZXIuc291cmNlTWFwU3VwcG9ydClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlcXVpcmUoXCJzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLmNvdmVyYWdlLmNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBvcHRpb25zLmNvdmVyYWdlLmNvbmZpZy5jd2QgPSBvcHRpb25zLmNvdmVyYWdlLmNvbmZpZy5jd2QgfHwgX19kaXJuYW1lO1xyXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhqb2luKG9wdGlvbnMucHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSB8fCAhZXhpc3RzU3luYyhqb2luKG9wdGlvbnMuY292ZXJhZ2UuY29uZmlnLmN3ZCwgXCJwYWNrYWdlLmpzb25cIikpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IHByb2plY3REaXIgPSBfX2Rpcm5hbWU7XHJcbiAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0RGlyLmxlbmd0aCA+IDMgJiYgIWV4aXN0c1N5bmMoam9pbihwcm9qZWN0RGlyLCBcInBhY2thZ2UuanNvblwiKSkpIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3REaXIgPSByZXNvbHZlKHByb2plY3REaXIsIFwiLi5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3B0aW9ucy5wcm9qZWN0Um9vdCA9IHByb2plY3REaXI7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuY292ZXJhZ2UuY29uZmlnLmN3ZCA9IHByb2plY3REaXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbnljOiBjb3ZlciA/IGF3YWl0IE55YyhvcHRpb25zKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBtb2NoYTogTW9jaGEob3B0aW9ucylcclxuICAgIH07XHJcbn07XHJcbiIsIlxyXG4vKipcclxuICogQG1vZHVsZSB0ZXN0dXRpbHMudHJhY2tlci51dGlsc1xyXG4gKi9cclxuXHJcbmltcG9ydCB7IHdyaXRlSW5mbyB9IGZyb20gXCIuLi91dGlscy91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBUZXN0VHJhY2tlciB9IGZyb20gXCIuLi90cmFja2VyL2luZGV4LmpzXCI7XHJcbmltcG9ydCB7IElUZXN0VHJhY2tlck9wdGlvbnMsIElUZXN0UmVzdWx0cyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVGVzdFV0aWxzVXRpbGl0aWVzXHJcbntcclxuICAgIHByaXZhdGUgX3Rlc3RUaW1lciA9IDA7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbnN0OiBUZXN0VHJhY2tlcjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3VsdHM6IElUZXN0UmVzdWx0cztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElUZXN0VHJhY2tlck9wdGlvbnM7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGJlc3RUaW1lc0luc3Q6IFRlc3RUcmFja2VyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2luc3QgPSBiZXN0VGltZXNJbnN0O1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBiZXN0VGltZXNJbnN0Lm9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IGJlc3RUaW1lc0luc3QucmVzdWx0cztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0IHdyaXRlQ29uc29sZSgpIHsgcmV0dXJuIHdyaXRlSW5mbzsgfVxyXG5cclxuXHJcbiAgICBnZXRTdWNjZXNzQ291bnQgPSAoaW5zdGFuY2U6IE1vY2hhLkNvbnRleHQpID0+XHJcbiAgICB7XHJcbiAgICAgICAgY29uc3QgbVRlc3QgPSBpbnN0YW5jZS50ZXN0IHx8IGluc3RhbmNlLmN1cnJlbnRUZXN0IGFzIE1vY2hhLlJ1bm5hYmxlLFxyXG4gICAgICAgICAgICAgIHN1aXRlID0gbVRlc3QucGFyZW50IGFzIE1vY2hhLlN1aXRlLFxyXG4gICAgICAgICAgICAgIHN1aXRlS2V5ID0gdGhpcy5nZXRTdWl0ZUtleShzdWl0ZS50aXRsZSksXHJcbiAgICAgICAgICAgICAgc3VpdGVSZXN1bHRzID0gdGhpcy5fcmVzdWx0cy5zdWl0ZVJlc3VsdHNbc3VpdGVLZXldO1xyXG4gICAgICAgIHJldHVybiBzdWl0ZVJlc3VsdHMuc3VjY2Vzc0NvdW50O1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgZW5kUm9sbGluZ0NvdW50ID0gKGluc3RhbmNlOiBNb2NoYS5Db250ZXh0LCBpc1NldHVwPzogYm9vbGVhbikgPT5cclxuICAgIHtcclxuXHJcbiAgICAgICAgY29uc3QgbVRlc3QgPSAoIWlzU2V0dXAgPyBpbnN0YW5jZS50ZXN0IDogaW5zdGFuY2UuY3VycmVudFRlc3QpIGFzIE1vY2hhLlJ1bm5hYmxlLFxyXG4gICAgICAgICAgICBzdWl0ZSA9IG1UZXN0LnBhcmVudCBhcyBNb2NoYS5TdWl0ZSxcclxuICAgICAgICAgICAgc3VpdGVLZXkgPSB0aGlzLmdldFN1aXRlS2V5KHN1aXRlLnRpdGxlKSxcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHRzID0gdGhpcy5fcmVzdWx0cy5zdWl0ZVJlc3VsdHNbc3VpdGVLZXldO1xyXG4gICAgICAgICsrc3VpdGVSZXN1bHRzLnN1Y2Nlc3NDb3VudDtcclxuICAgICAgICBzdWl0ZVJlc3VsdHMucnVuVGltZSA9IERhdGUubm93KCkgLSB0aGlzLl90ZXN0VGltZXI7XHJcbiAgICAgICAgc3VpdGVSZXN1bHRzLnJ1blRpbWVGbXQgPSBgJHtNYXRoLmZsb29yKHN1aXRlUmVzdWx0cy5ydW5UaW1lIC8gMTAwMCl9IHMsICR7c3VpdGVSZXN1bHRzLnJ1blRpbWUgJSAxMDAwfSBtc2A7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucHJpbnRTdWl0ZVJ1bnRpbWVzICYmIHRoaXMuX3Rlc3RUaW1lciA+IDApIHtcclxuICAgICAgICAgICAgd3JpdGVJbmZvKGBzdWl0ZSBydW50aW1lICA6ICR7c3VpdGVSZXN1bHRzLnJ1blRpbWVGbXR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Rlc3RUaW1lciA9IDA7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBleGl0Um9sbGluZ0NvdW50ID0gKGluc3RhbmNlOiBNb2NoYS5Db250ZXh0LCBpc1NldHVwPzogYm9vbGVhbiwgaXNUZWFyZG93bj86IGJvb2xlYW4pID0+XHJcbiAgICB7XHJcbiAgICAgICAgY29uc3QgbVRlc3QgPSAoIWlzU2V0dXAgJiYgIWlzVGVhcmRvd24gPyBpbnN0YW5jZS50ZXN0IDogaW5zdGFuY2UuY3VycmVudFRlc3QpIGFzIE1vY2hhLlJ1bm5hYmxlLFxyXG4gICAgICAgICAgICAgIHN1aXRlID0gbVRlc3QucGFyZW50IGFzIE1vY2hhLlN1aXRlLFxyXG4gICAgICAgICAgICAgIHN1aXRlS2V5ID0gdGhpcy5nZXRTdWl0ZUtleShzdWl0ZS50aXRsZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcmVzdWx0cy5zdWl0ZVJlc3VsdHNbc3VpdGVLZXldKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzdWx0cy5zdWl0ZVJlc3VsdHNbc3VpdGVLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgdGltZVN0YXJ0ZWQ6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICBudW1UZXN0czogc3VpdGUudGVzdHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ291bnQ6IC0xLFxyXG4gICAgICAgICAgICAgICAgc3VpdGVOYW1lOiB0aGlzLmdldFN1aXRlRnJpZW5kbHlOYW1lKHN1aXRlLnRpdGxlKSxcclxuICAgICAgICAgICAgICAgIHRpbWVGaW5pc2hlZDogMCxcclxuICAgICAgICAgICAgICAgIG51bVRlc3RzRmFpbGVkOiAwXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuaXNTaW5nbGVTdWl0ZVRlc3QgPSBzdWl0ZS5wYXJlbnQuc3VpdGVzLmxlbmd0aCA8PSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdHMgPSB0aGlzLl9yZXN1bHRzLnN1aXRlUmVzdWx0c1tzdWl0ZUtleV0sXHJcbiAgICAgICAgICAgICAgdGVzdElkeCA9ICFpc1NldHVwICYmICFpc1RlYXJkb3duID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGUudGVzdHMuZmluZEluZGV4KHQgPT4gdC50aXRsZSA9PT0gbVRlc3QudGl0bGUgJiYgIXQuaXNGYWlsZWQoKSAmJiAhdC5pc1Bhc3NlZCgpKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1NldHVwID8gLTEgOiBzdWl0ZS50ZXN0cy5sZW5ndGgpO1xyXG4gICAgICAgIHRyeVxyXG4gICAgICAgIHsgICBpZiAoc3VpdGVSZXN1bHRzLnN1Y2Nlc3NDb3VudCAhPT0gdGVzdElkeCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzdWNjZXNzIGNvdW50IHRvIGJlICR7c3VpdGVSZXN1bHRzLnN1Y2Nlc3NDb3VudH0sIGdvdCAke3Rlc3RJZHh9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdC5zZXRGYWlsZWQoZSwgc3VpdGUsIE9iamVjdC5hc3NpZ24oeyBpbmRleDogdGVzdElkeCB9LCBtVGVzdCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGVzdFRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdC5pc1JvbGxpbmdDb3VudEVycm9yO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgZ2V0U3VpdGVLZXkgPSAoc3VpdGVOYW1lOiBzdHJpbmcsIHByZUtleSA9IFwiXCIpID0+XHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHByZUtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJlS2V5ICsgdGhpcy5wcm9wZXJDYXNlKHN1aXRlTmFtZS5yZXBsYWNlKFwiIFRlc3RzXCIsIFwiXCIpKS5yZXBsYWNlKC9bIFxcV10vZywgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvd2VyQ2FzZUZpcnN0Q2hhcih0aGlzLnByb3BlckNhc2Uoc3VpdGVOYW1lLnJlcGxhY2UoXCIgVGVzdHNcIiwgXCJcIikpLCB0cnVlKS5yZXBsYWNlKC9cXFcvZywgXCJcIik7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBnZXRTdWl0ZUZyaWVuZGx5TmFtZSA9IChzdWl0ZU5hbWU6IHN0cmluZykgPT4gc3VpdGVOYW1lLnJlcGxhY2UoXCIgVGVzdHNcIiwgXCJcIik7XHJcblxyXG5cclxuICAgIHByaXZhdGUgcHJvcGVyQ2FzZSA9IChuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlbW92ZVNwYWNlcz86IGJvb2xlYW4pID0+XHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcdykvZywgKGx0cikgPT4gbHRyLnRvVXBwZXJDYXNlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvWyBdKy9nLCAhcmVtb3ZlU3BhY2VzID8gXCIgXCIgOiBcIlwiKTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgbG93ZXJDYXNlRmlyc3RDaGFyID0gKHM6IHN0cmluZywgcmVtb3ZlU3BhY2VzOiBib29sZWFuKSA9PlxyXG4gICAge1xyXG4gICAgICAgIGxldCBmcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmcyA9IHNbMF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAocy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBmcyArPSBzLnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVtb3ZlU3BhY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBmcyA9IGZzLnJlcGxhY2UoLyAvZywgXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZzO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgc2xlZXAgPSBhc3luYyAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG5cclxuICAgIHN1aXRlRmluaXNoZWQgPSAoaW5zdGFuY2U6IE1vY2hhLkNvbnRleHQpID0+XHJcbiAgICB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGUgPSBpbnN0YW5jZS5jdXJyZW50VGVzdD8ucGFyZW50O1xyXG4gICAgICAgIGlmIChzdWl0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bVRlc3RzRmFpbGVkVGhpc1N1aXRlID0gc3VpdGUudGVzdHMuZmlsdGVyKHQgPT4gdC5pc0ZhaWxlZCgpKS5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgIHN1aXRlS2V5ID0gdGhpcy5nZXRTdWl0ZUtleShzdWl0ZS50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0cyA9IHRoaXMuX3Jlc3VsdHMuc3VpdGVSZXN1bHRzW3N1aXRlS2V5XTtcclxuICAgICAgICAgICAgdGhpcy5fcmVzdWx0cy5udW1UZXN0c0ZhaWwgKz0gbnVtVGVzdHNGYWlsZWRUaGlzU3VpdGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHNTdWNjZXNzICs9IHN1aXRlLnRlc3RzLmZpbHRlcih0ID0+IHQuaXNQYXNzZWQoKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRzLm51bVN1aXRlcysrO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRzLm51bVRlc3RzICs9IHN1aXRlLnRlc3RzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKG51bVRlc3RzRmFpbGVkVGhpc1N1aXRlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzdWx0cy5udW1TdWl0ZXNGYWlsKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bHRzLm51bVN1aXRlc1N1Y2Nlc3MrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRzLnN1aXRlUmVzdWx0c1tzdWl0ZUtleV0gPSBPYmplY3QuYXNzaWduKHN1aXRlUmVzdWx0cyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogbnVtVGVzdHNGYWlsZWRUaGlzU3VpdGUgPT09IDAsXHJcbiAgICAgICAgICAgICAgICB0aW1lRmluaXNoZWQ6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICBudW1UZXN0c0ZhaWxlZDogbnVtVGVzdHNGYWlsZWRUaGlzU3VpdGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbn1cclxuIiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJcclxuLyoqXHJcbiAqIEBtb2R1bGUgdGVzdHV0aWxzLnV0aWxzLmlucHV0XHJcbiAqL1xyXG5cclxuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSBcInJlYWRsaW5lXCI7XHJcblxyXG5sZXQgc3RkaW5JbnRlcmZhY2U6IHJlYWRsaW5lLkludGVyZmFjZSB8IHVuZGVmaW5lZDtcclxubGV0IHNldEZhaWxlZDogKCkgPT4gdm9pZDtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgY3RybEMgPSBhc3luYyhjb2RlOiBudW1iZXJ8dW5kZWZpbmVkKSA9PiBvbktleShcIlwiLCB7IG5hbWU6IFwiY1wiLCBjdHJsOiB0cnVlLCBjb2RlIH0pO1xyXG5cclxuXHJcbmNvbnN0IG9uS2V5ID0gYXN5bmMoc3RyOiBzdHJpbmcsIGtleTogYW55KSA9PlxyXG57XHJcbiAgICBpZiAoa2V5Lm1ldGEpIC8vIGFsdFxyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IGsgPSBrZXkubmFtZTtcclxuICAgICAgICBpZiAoayA9PT0gXCIwXCIgfHwgayA9PT0gXCIxXCIgfHwgayA9PT0gXCIyXCIgfHwgayA9PT0gXCIzXCIgfHwgayA9PT0gXCI0XCIgfHwgayA9PT0gXCI1XCIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBjb25zdCBsdmwgPSBwYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIC8vIGxvZy5zZXRMb2dMZXZlbChsdmwpO1xyXG4gICAgICAgICAgICAvLyBsb2cuaW5mbyhgTG9nZ2luZyBsZXZlbCBzZXQgdG8gbGV2ZWwgJyR7a30nYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoa2V5LmN0cmwpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleS5uYW1lID09PSBcImNcIilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNldEZhaWxlZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc3RhcnRJbnB1dCA9IChzZXRGYWlsZWRGbjogKCkgPT4gdm9pZCkgPT5cclxue1xyXG4gICAgaWYgKCFzdGRpbkludGVyZmFjZSAmJiBwcm9jZXNzLnN0ZGluLmlzVFRZKVxyXG4gICAge1xyXG4gICAgICAgIHNldEZhaWxlZCA9IHNldEZhaWxlZEZuO1xyXG4gICAgICAgIHN0ZGluSW50ZXJmYWNlID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sIGVzY2FwZUNvZGVUaW1lb3V0OiA1MCB9KTtcclxuICAgICAgICBwcm9jZXNzLnN0ZGluLnNldFJhd01vZGUodHJ1ZSk7XHJcbiAgICAgICAgcmVhZGxpbmUuZW1pdEtleXByZXNzRXZlbnRzKHByb2Nlc3Muc3RkaW4sIHN0ZGluSW50ZXJmYWNlKTtcclxuICAgICAgICBwcm9jZXNzLnN0ZGluLm9uKFwia2V5cHJlc3NcIiwgb25LZXkpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBzdG9wSW5wdXQgPSAoKSA9PlxyXG57XHJcbiAgICBpZiAoc3RkaW5JbnRlcmZhY2UpXHJcbiAgICB7XHJcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5vZmYoXCJrZXlwcmVzc1wiLCBvbktleSk7XHJcbiAgICAgICAgc3RkaW5JbnRlcmZhY2UuY2xvc2UoKTtcclxuICAgICAgICBzdGRpbkludGVyZmFjZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxufTtcclxuIiwiXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHRlc3R1dGlscy50cmFja2VyLnRlc3R0cmFja2VyXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgYXJndiB9IGZyb20gXCIuLi91dGlscy9hcmd2LmpzXCI7XHJcbmltcG9ydCB7IHdyaXRlSW5mbyB9IGZyb20gXCIuLi91dGlscy91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBUZXN0VXRpbHNVdGlsaXRpZXMgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBmaWd1cmVzLCBjb2xvcnMgfSBmcm9tIFwiLi4vdXRpbHMvZmlndXJlcy5qc1wiO1xyXG5pbXBvcnQgeyBzdGFydElucHV0LCBzdG9wSW5wdXQgfSBmcm9tIFwiLi4vdXRpbHMvaW5wdXQuanNcIjtcclxuaW1wb3J0IHsgSVRlc3RUcmFja2VyT3B0aW9ucywgSVRlc3RSZXN1bHRzLCBJVGVzdFN1aXRlUmVzdWx0cywgSVRlc3RUb29sUnVudGltZVN1aXRlLCBJVGVzdFRvb2xSdW50aW1lVGVzdCB9IGZyb20gXCIuLi9pbnRlcmZhY2UvaW5kZXguanNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVGVzdFRyYWNrZXJcclxue1xyXG4gICAgcHJpdmF0ZSBfc3ltYm9sczogYW55O1xyXG4gICAgcHJpdmF0ZSBfdGltZVN0YXJ0ZWQgPSAwO1xyXG4gICAgcHJpdmF0ZSBfY2F1Z2h0Q29udHJvbEMgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2hhc1JvbGxpbmdDb3VudEVycm9yOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3VsdHM6IElUZXN0UmVzdWx0cztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3V0aWxzOiBUZXN0VXRpbHNVdGlsaXRpZXM7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBJVGVzdFRyYWNrZXJPcHRpb25zO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGltZVNlcCA9IFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxJVGVzdFRyYWNrZXJPcHRpb25zPilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9yZXN1bHRzID0ge1xyXG4gICAgICAgICAgICBudW1TdWl0ZXM6IDAsXHJcbiAgICAgICAgICAgIG51bVN1aXRlc0ZhaWw6IDAsXHJcbiAgICAgICAgICAgIG51bVN1aXRlc1N1Y2Nlc3M6IDAsXHJcbiAgICAgICAgICAgIG51bVRlc3RzOiAwLFxyXG4gICAgICAgICAgICBudW1UZXN0c0ZhaWw6IDAsXHJcbiAgICAgICAgICAgIG51bVRlc3RzU3VjY2VzczogMCxcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHRzOiB7fVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGNsZWFyQWxsQmVzdFRpbWVzOiBmYWxzZSxcclxuICAgICAgICAgICAgY2xlYXJCZXN0VGltZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsZWFyQmVzdFRpbWVzT25UZXN0Q291bnRDaGFuZ2U6IGZhbHNlLFxyXG4gICAgICAgICAgICBmcmFtZXdvcms6IFwibW9jaGFcIixcclxuICAgICAgICAgICAgaXNDb25zb2xlTG9nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRmlsZUxvZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0xvZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc011bHRpUm9vdFdvcmtzcGFjZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzT3V0cHV0V2luZG93TG9nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzU2luZ2xlU3VpdGVUZXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgcHJpbnRTdWl0ZVJ1bnRpbWVzOiBmYWxzZSxcclxuICAgICAgICAgICAgc3RvcmU6IHtcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItYXJyb3cvcHJlZmVyLWFycm93LWZ1bmN0aW9uc1xyXG4gICAgICAgICAgICAgICAgYXN5bmMgdXBkYXRlU3RvcmVWYWx1ZSguLi5fYXJnczogYW55W10pIHt9LFxyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zXHJcbiAgICAgICAgICAgICAgICBhc3luYyBnZXRTdG9yZVZhbHVlPFQ+KC4uLl9hcmdzOiBhbnlbXSkgeyByZXR1cm4gMCBhcyBUOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIG9wdGlvbnMgfHwge30sIGFyZ3YoKSk7XHJcblxyXG4gICAgICAgIHN0YXJ0SW5wdXQoKCkgPT4geyB0aGlzLnNldEZhaWxlZCh0cnVlKTsgfSk7IC8vIENhdGNoIENUUkwrQ1xyXG5cclxuICAgICAgICB0aGlzLl90aW1lU3RhcnRlZCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgdGhpcy5fdXRpbHMgPSBuZXcgVGVzdFV0aWxzVXRpbGl0aWVzKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXQgaXNSb2xsaW5nQ291bnRFcnJvcigpIHsgcmV0dXJuICEhdGhpcy5faGFzUm9sbGluZ0NvdW50RXJyb3I7IH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpOiBJVGVzdFRyYWNrZXJPcHRpb25zIHsgcmV0dXJuIHRoaXMuX29wdGlvbnM7IH1cclxuXHJcbiAgICBzZXQgb3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPElUZXN0VHJhY2tlck9wdGlvbnM+KSB7IHRoaXMuX3RpbWVTdGFydGVkID0gRGF0ZS5ub3coKTsgT2JqZWN0LmFzc2lnbih0aGlzLl9vcHRpb25zLCBvcHRpb25zKTsgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCk6IElUZXN0UmVzdWx0cyB7IHJldHVybiB0aGlzLl9yZXN1bHRzOyB9XHJcblxyXG4gICAgZ2V0IHV0aWxzKCk6IFRlc3RVdGlsc1V0aWxpdGllcyB7IHJldHVybiB0aGlzLl91dGlsczsgfVxyXG5cclxuXHJcbiAgICBzdWl0ZVJlc3VsdHMgPSAoc3VpdGVOYW1lOiBzdHJpbmcpOiBJVGVzdFN1aXRlUmVzdWx0cyA9PiB0aGlzLl9yZXN1bHRzLnN1aXRlUmVzdWx0c1tzdWl0ZU5hbWVdO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIGNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlID0gYXN5bmMgKHN0b3JhZ2VLZXk6IHN0cmluZywgbnVtVGVzdHM6IG51bWJlcikgPT5cclxuICAgIHtcclxuICAgICAgICBjb25zdCBfY2xyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9vcHRpb25zLnN0b3JlLnVwZGF0ZVN0b3JlVmFsdWUoc3RvcmFnZUtleSwgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS51cGRhdGVTdG9yZVZhbHVlKHN0b3JhZ2VLZXkgKyBcIkZtdFwiLCB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9vcHRpb25zLnN0b3JlLnVwZGF0ZVN0b3JlVmFsdWUoc3RvcmFnZUtleSArIFwiTnVtVGVzdHNcIiwgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS51cGRhdGVTdG9yZVZhbHVlKHN0b3JhZ2VLZXkgKyBcIlNsb3dcIiwgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS51cGRhdGVTdG9yZVZhbHVlKHN0b3JhZ2VLZXkgKyBcIlNsb3dGbXRcIiwgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS51cGRhdGVTdG9yZVZhbHVlKHN0b3JhZ2VLZXkgKyBcIlNsb3dOdW1UZXN0c1wiLCB1bmRlZmluZWQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY2xlYXJCZXN0VGltZSB8fCB0aGlzLl9vcHRpb25zLmNsZWFyQWxsQmVzdFRpbWVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXdhaXQgX2NscigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9vcHRpb25zLmNsZWFyQmVzdFRpbWVzT25UZXN0Q291bnRDaGFuZ2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2TnVtVGVzdHMgPSBhd2FpdCB0aGlzLl9vcHRpb25zLnN0b3JlLmdldFN0b3JlVmFsdWU8bnVtYmVyPihzdG9yYWdlS2V5ICsgXCJOdW1UZXN0c1wiLCAwKTtcclxuICAgICAgICAgICAgaWYgKHByZXZOdW1UZXN0cyA8IG51bVRlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBfY2xyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIGdldFN0b3JhZ2VLZXkgPSAoYmFzZUtleTogc3RyaW5nKSA9PiBiYXNlS2V5ICsgKHRoaXMuX29wdGlvbnMuaXNNdWx0aVJvb3RXb3Jrc3BhY2UgPyBcIk1XU1wiIDogXCJcIik7XHJcblxyXG5cclxuICAgIHByaXZhdGUgZ2V0VGltZUVsYXBzZWRGbXQgPSAodGltZUVsYXBzZWQ6IG51bWJlcikgPT5cclxuICAgIHtcclxuICAgICAgICBjb25zdCBtID0gTWF0aC5mbG9vcih0aW1lRWxhcHNlZCAvIDEwMDAgLyA2MCksXHJcbiAgICAgICAgICAgIHMgPSBNYXRoLmZsb29yKHRpbWVFbGFwc2VkIC8gMTAwMCAlIDYwKSxcclxuICAgICAgICAgICAgbXMgPSBNYXRoLnJvdW5kKHRpbWVFbGFwc2VkICUgMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIGAke219IG1pbnV0ZXMsICR7c30gc2Vjb25kcywgJHttc30gbWlsbGlzZWNvbmRzYDtcclxuICAgIH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgbG9nQmVzdFRpbWUgPSBhc3luYyAodGl0bGU6IHN0cmluZywgc3RvcmFnZUtleTogc3RyaW5nLCB0aW1lRWxhcHNlZEZtdDogc3RyaW5nKSA9PlxyXG4gICAge1xyXG4gICAgICAgIGxldCBtc2c6IHN0cmluZztcclxuICAgICAgICBsZXQgd3NUeXBlTXNnID0gdGhpcy5fb3B0aW9ucy5pc011bHRpUm9vdFdvcmtzcGFjZSA/IFwibXVsdGktcm9vdFwiIDogXCJzaW5nbGUtcm9vdFwiO1xyXG4gICAgICAgIGNvbnN0IHByZXZCZXN0VGltZUVsYXBzZWRGbXQgPSBhd2FpdCB0aGlzLl9vcHRpb25zLnN0b3JlLmdldFN0b3JlVmFsdWU8c3RyaW5nPihzdG9yYWdlS2V5ICsgXCJGbXRcIiwgXCJcIiksXHJcbiAgICAgICAgICAgIHNsb3dlc3RUSW1lRm10ID0gYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS5nZXRTdG9yZVZhbHVlPHN0cmluZz4oc3RvcmFnZUtleSArIFwiU2xvd0ZtdFwiLCBcIlwiKSxcclxuICAgICAgICAgICAgcHJldk1zZyA9IGAgVGhlIHByZXZpb3VzIGZhc3Rlc3QgdGltZSByZWNvcmRlZCBmb3IgYSAke3dzVHlwZU1zZ30gd29ya3NwYWNlIHdhcyAke3ByZXZCZXN0VGltZUVsYXBzZWRGbXR9YCxcclxuICAgICAgICAgICAgc2xvd01zZyA9IGAgVGhlIHNsb3dlc3QgdGltZSByZWNvcmRlZCBmb3IgYSAke3dzVHlwZU1zZ30gd29ya3NwYWNlIHdhcyAke3Nsb3dlc3RUSW1lRm10fWAsXHJcbiAgICAgICAgICAgIHByZU1zZyA9IGAgICAgJHtmaWd1cmVzLmNvbG9yLmluZm99ICR7ZmlndXJlcy53aXRoQ29sb3IoXCIhISFcIiwgZmlndXJlcy5jb2xvcnMuY3lhbil9YDtcclxuICAgICAgICB3c1R5cGVNc2cgPSB0aGlzLl9vcHRpb25zLmlzTXVsdGlSb290V29ya3NwYWNlID8gXCJNdWx0aS1Sb290XCIgOiBcIlNpbmdsZS1Sb290XCI7XHJcbiAgICAgICAgaWYgKHRpdGxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRpdGxlLmluY2x1ZGVzKFwiTG9nZ2luZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgbXNnID0gYCBOZXcgRmFzdGVzdCBUaW1lIHdpdGggJHt0aXRsZX0gKCR7d3NUeXBlTXNnfSB3b3Jrc3BhY2UpICR7ZmlndXJlcy53aXRoQ29sb3IodGltZUVsYXBzZWRGbXQsIGZpZ3VyZXMuY29sb3JzLmN5YW4pfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVzdWx0cy5udW1TdWl0ZXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gYCBOZXcgRmFzdGVzdCBUaW1lIGZvciBTdWl0ZSAnJHt0aXRsZX0nICgke3dzVHlwZU1zZ30gd29ya3NwYWNlKSAke2ZpZ3VyZXMud2l0aENvbG9yKHRpbWVFbGFwc2VkRm10LCBmaWd1cmVzLmNvbG9ycy5jeWFuKX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gYCBOZXcgRmFzdGVzdCBUaW1lIGZvciBTdWl0ZSAnJHt0aXRsZX0nIChTaW5nbGUgVGVzdCkoJHt3c1R5cGVNc2d9IHdvcmtzcGFjZSkgJHtmaWd1cmVzLndpdGhDb2xvcih0aW1lRWxhcHNlZEZtdCwgZmlndXJlcy5jb2xvcnMuY3lhbil9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbXNnID0gYCBOZXcgRmFzdGVzdCBUaW1lIGZvciAnQWxsIFRlc3RzJyAoJHt3c1R5cGVNc2d9IHdvcmtzcGFjZSkgJHtmaWd1cmVzLndpdGhDb2xvcih0aW1lRWxhcHNlZEZtdCwgZmlndXJlcy5jb2xvcnMuY3lhbil9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocHJlTXNnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhwcmVNc2cgKyBmaWd1cmVzLndpdGhDb2xvcihtc2csIGZpZ3VyZXMuY29sb3JzLmdyZXkpKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhwcmVNc2cgKyBmaWd1cmVzLndpdGhDb2xvcihwcmV2TXNnLCBmaWd1cmVzLmNvbG9ycy5ncmV5KSk7XHJcbiAgICAgICAgY29uc29sZS5sb2cocHJlTXNnICsgZmlndXJlcy53aXRoQ29sb3Ioc2xvd01zZywgZmlndXJlcy5jb2xvcnMuZ3JleSkpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHByZU1zZyk7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIGxvZ1Nsb3dlc3RUaW1lID0gYXN5bmMgKHRpdGxlOiBzdHJpbmcsIHN0b3JhZ2VLZXk6IHN0cmluZywgdGltZUVsYXBzZWRGbXQ6IHN0cmluZykgPT5cclxuICAgIHtcclxuICAgICAgICBsZXQgbXNnOiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IHdzVHlwZU1zZyA9IHRoaXMuX29wdGlvbnMuaXNNdWx0aVJvb3RXb3Jrc3BhY2UgPyBcIm11bHRpLXJvb3RcIiA6IFwic2luZ2xlLXJvb3RcIjtcclxuICAgICAgICBjb25zdCBwcmV2QmVzdFRpbWVFbGFwc2VkRm10ID0gYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS5nZXRTdG9yZVZhbHVlPHN0cmluZz4oc3RvcmFnZUtleSArIFwiRm10XCIsIFwiXCIpLFxyXG4gICAgICAgICAgICBzbG93ZXN0VGltZUZtdCA9IGF3YWl0IHRoaXMuX29wdGlvbnMuc3RvcmUuZ2V0U3RvcmVWYWx1ZTxzdHJpbmc+KHN0b3JhZ2VLZXkgKyBcIlNsb3dGbXRcIiwgXCJcIiksXHJcbiAgICAgICAgICAgIHByZXZNc2cgPSBgIFRoZSBwcmV2aW91cyBzbG93ZXN0IHRpbWUgcmVjb3JkZWQgZm9yIGEgJHt3c1R5cGVNc2d9IHdvcmtzcGFjZSB3YXMgJHtzbG93ZXN0VGltZUZtdH1gLFxyXG4gICAgICAgICAgICBmYXN0TXNnID0gYCBUaGUgZmFzdGVzdCB0aW1lIHJlY29yZGVkIGZvciBhICR7d3NUeXBlTXNnfSB3b3Jrc3BhY2Ugd2FzICR7cHJldkJlc3RUaW1lRWxhcHNlZEZtdH1gLFxyXG4gICAgICAgICAgICBwcmVNc2cgPSBgICAgICR7ZmlndXJlcy5jb2xvci5pbmZvfSAke2ZpZ3VyZXMud2l0aENvbG9yKFwiISEhXCIsIGZpZ3VyZXMuY29sb3JzLnJlZCl9YDtcclxuICAgICAgICB3c1R5cGVNc2cgPSB0aGlzLl9vcHRpb25zLmlzTXVsdGlSb290V29ya3NwYWNlID8gXCJNdWx0aS1Sb290XCIgOiBcIlNpbmdsZS1Sb290XCI7XHJcbiAgICAgICAgaWYgKHRpdGxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRpdGxlLmluY2x1ZGVzKFwiTG9nZ2luZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgbXNnID0gYCBOZXcgU2xvd2VzdCBUaW1lIHdpdGggJHt0aXRsZX0gKCR7d3NUeXBlTXNnfSB3b3Jrc3BhY2UpICR7ZmlndXJlcy53aXRoQ29sb3IodGltZUVsYXBzZWRGbXQsIGZpZ3VyZXMuY29sb3JzLnJlZCl9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRzLm51bVN1aXRlcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBgIE5ldyBTbG93ZXN0IFRpbWUgZm9yIFN1aXRlICcke3RpdGxlfScgKCR7d3NUeXBlTXNnfSB3b3Jrc3BhY2UpICR7ZmlndXJlcy53aXRoQ29sb3IodGltZUVsYXBzZWRGbXQsIGZpZ3VyZXMuY29sb3JzLnJlZCl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1zZyA9IGAgTmV3IFNsb3dlc3QgVGltZSBmb3IgU3VpdGUgJyR7dGl0bGV9JyAoU2luZ2xlIFRlc3QpKCR7d3NUeXBlTXNnfSB3b3Jrc3BhY2UpICR7ZmlndXJlcy53aXRoQ29sb3IodGltZUVsYXBzZWRGbXQsIGZpZ3VyZXMuY29sb3JzLnJlZCl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbXNnID0gYCBOZXcgU2xvd2VzdCBUaW1lIGZvciAnQWxsIFRlc3RzJyAoJHt3c1R5cGVNc2d9IHdvcmtzcGFjZSkgJHtmaWd1cmVzLndpdGhDb2xvcih0aW1lRWxhcHNlZEZtdCwgZmlndXJlcy5jb2xvcnMuY3lhbil9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocHJlTXNnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhwcmVNc2cgKyBmaWd1cmVzLndpdGhDb2xvcihtc2csIGZpZ3VyZXMuY29sb3JzLmdyZXkpKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhwcmVNc2cgKyBmaWd1cmVzLndpdGhDb2xvcihwcmV2TXNnLCBmaWd1cmVzLmNvbG9ycy5ncmV5KSk7XHJcbiAgICAgICAgY29uc29sZS5sb2cocHJlTXNnICsgZmlndXJlcy53aXRoQ29sb3IoZmFzdE1zZywgZmlndXJlcy5jb2xvcnMuZ3JleSkpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHByZU1zZyk7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NCZXN0VGltZSA9IGFzeW5jIChsb2dUaXRsZTogc3RyaW5nLCBzdG9yYWdlS2V5OiBzdHJpbmcsIHRpbWVFbGFwc2VkOiBudW1iZXIsIG51bVRlc3RzOiBudW1iZXIpID0+XHJcbiAgICB7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSAhbG9nVGl0bGUgfHwgbG9nVGl0bGUuaW5jbHVkZXMoXCJMb2dnaW5nXCIpID8gXCJBbGwgVGVzdHMgXCIgKyBsb2dUaXRsZSA6IGxvZ1RpdGxlLFxyXG4gICAgICAgICAgICBtc2cgPSAoZmlndXJlcy53aXRoQ29sb3IoXCItLSBcIiwgZmlndXJlcy5jb2xvcnMubWFnZW50YSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZ3VyZXMud2l0aENvbG9yKHRpdGxlLnRvVXBwZXJDYXNlKCksIGZpZ3VyZXMuY29sb3JzLndoaXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgZmlndXJlcy53aXRoQ29sb3IoYCAke3RoaXMuX3RpbWVTZXAuc3Vic3RyaW5nKDAsIHRoaXMuX3RpbWVTZXAubGVuZ3RoIC0gdGl0bGUubGVuZ3RoIC0gNCl9YCwgZmlndXJlcy5jb2xvcnMubWFnZW50YSkpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLmluZm99ICR7bXNnfWApO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKHN0b3JhZ2VLZXksIG51bVRlc3RzKTtcclxuXHJcbiAgICAgICAgbGV0IGJlc3RUaW1lRWxhcHNlZCA9IGF3YWl0IHRoaXMuX29wdGlvbnMuc3RvcmUuZ2V0U3RvcmVWYWx1ZTxudW1iZXI+KHN0b3JhZ2VLZXksIDApO1xyXG4gICAgICAgIGlmIChiZXN0VGltZUVsYXBzZWQgPT09IDApIHtcclxuICAgICAgICAgICAgYmVzdFRpbWVFbGFwc2VkID0gdGltZUVsYXBzZWQgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3b3JzdFRpbWVFbGFwc2VkU3RvcmVkID0gYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS5nZXRTdG9yZVZhbHVlPG51bWJlcj4oYCR7c3RvcmFnZUtleX1TbG93YCwgMCk7XHJcbiAgICAgICAgbGV0IHdvcnN0VGltZUVsYXBzZWQgPSB3b3JzdFRpbWVFbGFwc2VkU3RvcmVkO1xyXG4gICAgICAgIGlmICh3b3JzdFRpbWVFbGFwc2VkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHdvcnN0VGltZUVsYXBzZWQgPSB0aW1lRWxhcHNlZCArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0aW1lRWxhcHNlZEZtdCA9IHRoaXMuZ2V0VGltZUVsYXBzZWRGbXQodGltZUVsYXBzZWQpO1xyXG4gICAgICAgIGlmICh0aW1lRWxhcHNlZCA+IDAgJiYgdGltZUVsYXBzZWQgPCBiZXN0VGltZUVsYXBzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0Jlc3RUaW1lKGxvZ1RpdGxlLCBzdG9yYWdlS2V5LCB0aW1lRWxhcHNlZEZtdCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVByb2Nlc3NUaW1lVG9TdG9yYWdlKHN0b3JhZ2VLZXksIHRpbWVFbGFwc2VkLCB0aW1lRWxhcHNlZEZtdCwgbnVtVGVzdHMpO1xyXG4gICAgICAgICAgICBpZiAod29yc3RUaW1lRWxhcHNlZFN0b3JlZCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlUHJvY2Vzc1RpbWVUb1N0b3JhZ2UoYCR7c3RvcmFnZUtleX1TbG93YCwgdGltZUVsYXBzZWQsIHRpbWVFbGFwc2VkRm10LCBudW1UZXN0cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGltZUVsYXBzZWQgPiAwICYmICh0aW1lRWxhcHNlZCA+IHdvcnN0VGltZUVsYXBzZWQgfHwgd29yc3RUaW1lRWxhcHNlZFN0b3JlZCA9PT0gMCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvZ1Nsb3dlc3RUaW1lKGxvZ1RpdGxlLCBzdG9yYWdlS2V5LCB0aW1lRWxhcHNlZEZtdCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVByb2Nlc3NUaW1lVG9TdG9yYWdlKGAke3N0b3JhZ2VLZXl9U2xvd2AsIHRpbWVFbGFwc2VkLCB0aW1lRWxhcHNlZEZtdCwgbnVtVGVzdHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgYmVzdFRpbWVFbGFwc2VkRm10ID0gYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS5nZXRTdG9yZVZhbHVlPHN0cmluZz4oc3RvcmFnZUtleSArIFwiRm10XCIsIFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgd29yc3RUaW1lRWxhcHNlZEZtdCA9IGF3YWl0IHRoaXMuX29wdGlvbnMuc3RvcmUuZ2V0U3RvcmVWYWx1ZTxzdHJpbmc+KHN0b3JhZ2VLZXkgKyBcIlNsb3dGbXRcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHdzVHlwZU1zZyA9IHRoaXMuX29wdGlvbnMuaXNNdWx0aVJvb3RXb3Jrc3BhY2UgPyBcIm11bHRpLXJvb3RcIiA6IFwic2luZ2xlLXJvb3RcIixcclxuICAgICAgICAgICAgICAgIG1zZzEgPSBgVGhlIHRpbWUgZWxhcHNlZCB3YXMgJHt0aW1lRWxhcHNlZEZtdH1gLFxyXG4gICAgICAgICAgICAgICAgbXNnMiA9IHRpbWVFbGFwc2VkID4gMCA/IGBUaGUgZmFzdGVzdCB0aW1lIHJlY29yZGVkIGZvciBhICR7d3NUeXBlTXNnfSB3b3Jrc3BhY2UgaXMgJHtiZXN0VGltZUVsYXBzZWRGbXR9YCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZhc3Rlc3QgdGltZSB0cmFja2luZyBub3QgYXZhaWxhYmxlIGZvciB0ZXN0cyBydW5uaW5nIGF0IDAgbXNcIjtcclxuICAgICAgICAgICAgaWYgKCFiZXN0VGltZUVsYXBzZWRGbXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVByb2Nlc3NUaW1lVG9TdG9yYWdlKHN0b3JhZ2VLZXksIHRpbWVFbGFwc2VkLCB0aW1lRWxhcHNlZEZtdCwgbnVtVGVzdHMpO1xyXG4gICAgICAgICAgICAgICAgYmVzdFRpbWVFbGFwc2VkRm10ID0gdGltZUVsYXBzZWRGbXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF3b3JzdFRpbWVFbGFwc2VkRm10KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVQcm9jZXNzVGltZVRvU3RvcmFnZShgJHtzdG9yYWdlS2V5fVNsb3dgLCB0aW1lRWxhcHNlZCwgdGltZUVsYXBzZWRGbXQsIG51bVRlc3RzKTtcclxuICAgICAgICAgICAgICAgIHdvcnN0VGltZUVsYXBzZWRGbXQgPSB0aW1lRWxhcHNlZEZtdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7ZmlndXJlcy5jb2xvci5pbmZvfSAke2ZpZ3VyZXMud2l0aENvbG9yKG1zZzEsIGZpZ3VyZXMuY29sb3JzLmdyZXkpfWApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7ZmlndXJlcy5jb2xvci5pbmZvfSAke2ZpZ3VyZXMud2l0aENvbG9yKG1zZzIsIGZpZ3VyZXMuY29sb3JzLmdyZXkpfWApO1xyXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWQgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtc2czID0gYFRoZSBzbG93ZXN0IHRpbWUgcmVjb3JkZWQgZm9yIGEgJHt3c1R5cGVNc2d9IHdvcmtzcGFjZSBpcyAke3dvcnN0VGltZUVsYXBzZWRGbXR9YDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLmluZm99ICR7ZmlndXJlcy53aXRoQ29sb3IobXNnMywgZmlndXJlcy5jb2xvcnMuZ3JleSl9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NTdWl0ZVRpbWVzID0gYXN5bmMgKCkgPT5cclxuICAgIHtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdHMgPSBPYmplY3QudmFsdWVzKHRoaXMuX3Jlc3VsdHMuc3VpdGVSZXN1bHRzKS5maWx0ZXIodiA9PiB2LnN1aXRlTmFtZSAhPT0gXCJEZWFjdGl2YXRlIEV4dGVuc2lvblwiKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHN1aXRlUmVzdWx0IG9mIHN1aXRlUmVzdWx0cylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVLZXkgPSB0aGlzLl9yZXN1bHRzLm51bVN1aXRlcyA9PT0gMSA/IFwiU2luZ2xlXCIgOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3RvcmFnZUtleSA9IHRoaXMuX3V0aWxzLmdldFN1aXRlS2V5KHN1aXRlUmVzdWx0LnN1aXRlTmFtZSwgdGhpcy5nZXRTdG9yYWdlS2V5KFwiYmVzdFRpbWVFbGFwc2VkU3VpdGVcIiArIHR5cGVLZXkpKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY2xlYXJBbGxCZXN0VGltZXMpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm9jZXNzVGltZVN0b3JhZ2Uoc3RvcmFnZUtleSwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKGAke3N0b3JhZ2VLZXl9U2xvd2AsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC50aW1lRmluaXNoZWQgJiYgc3VpdGVSZXN1bHQudGltZVN0YXJ0ZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVFbGFwc2VkID0gc3VpdGVSZXN1bHQudGltZUZpbmlzaGVkIC0gc3VpdGVSZXN1bHQudGltZVN0YXJ0ZWQ7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NCZXN0VGltZShzdWl0ZVJlc3VsdC5zdWl0ZU5hbWUsIHN0b3JhZ2VLZXksIHRpbWVFbGFwc2VkLCB0aGlzLl9yZXN1bHRzLm51bVRlc3RzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RpbWVzV2l0aExvZ0VuYWJsZWQgPSBhc3luYyAodGltZUVsYXBzZWQ6IG51bWJlcikgPT5cclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jbGVhckFsbEJlc3RUaW1lcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm9jZXNzVGltZVN0b3JhZ2UodGhpcy5nZXRTdG9yYWdlS2V5KFwiYmVzdFRpbWVFbGFwc2VkV2l0aExvZ2dpbmdcIiksIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKHRoaXMuZ2V0U3RvcmFnZUtleShcImJlc3RUaW1lRWxhcHNlZFdpdGhMb2dnaW5nRmlsZVwiKSwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm9jZXNzVGltZVN0b3JhZ2UodGhpcy5nZXRTdG9yYWdlS2V5KFwiYmVzdFRpbWVFbGFwc2VkV2l0aExvZ2dpbmdPdXRwdXRcIiksIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKHRoaXMuZ2V0U3RvcmFnZUtleShcImJlc3RUaW1lRWxhcHNlZFdpdGhMb2dnaW5nQ29uc29sZVwiKSwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm9jZXNzVGltZVN0b3JhZ2UodGhpcy5nZXRTdG9yYWdlS2V5KFwic2xvd1RpbWVFbGFwc2VkV2l0aExvZ2dpbmdcIiksIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKHRoaXMuZ2V0U3RvcmFnZUtleShcInNsb3dUaW1lRWxhcHNlZFdpdGhMb2dnaW5nRmlsZVwiKSwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm9jZXNzVGltZVN0b3JhZ2UodGhpcy5nZXRTdG9yYWdlS2V5KFwic2xvd1RpbWVFbGFwc2VkV2l0aExvZ2dpbmdPdXRwdXRcIiksIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlKHRoaXMuZ2V0U3RvcmFnZUtleShcInNsb3dUaW1lRWxhcHNlZFdpdGhMb2dnaW5nQ29uc29sZVwiKSwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzTG9nRW5hYmxlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jlc3RUaW1lKFwiTG9nZ2luZyBFbmFibGVkXCIsIHRoaXMuZ2V0U3RvcmFnZUtleShcImJlc3RUaW1lRWxhcHNlZFdpdGhMb2dnaW5nXCIpLCB0aW1lRWxhcHNlZCwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jlc3RUaW1lKFwiTG9nZ2luZyBFbmFibGVkXCIsIHRoaXMuZ2V0U3RvcmFnZUtleShcInNsb3dUaW1lRWxhcHNlZFdpdGhMb2dnaW5nXCIpLCB0aW1lRWxhcHNlZCwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzRmlsZUxvZ0VuYWJsZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jlc3RUaW1lKFwiRmlsZSBMb2dnaW5nIEVuYWJsZWRcIiwgdGhpcy5nZXRTdG9yYWdlS2V5KFwiYmVzdFRpbWVFbGFwc2VkV2l0aExvZ2dpbmdGaWxlXCIpLCB0aW1lRWxhcHNlZCwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NCZXN0VGltZShcIkZpbGUgTG9nZ2luZyBFbmFibGVkXCIsIHRoaXMuZ2V0U3RvcmFnZUtleShcInNsb3dUaW1lRWxhcHNlZFdpdGhMb2dnaW5nRmlsZVwiKSwgdGltZUVsYXBzZWQsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzT3V0cHV0V2luZG93TG9nRW5hYmxlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzQmVzdFRpbWUoXCJPdXRwdXQgV2luZG93IExvZ2dpbmcgRW5hYmxlZFwiLCB0aGlzLmdldFN0b3JhZ2VLZXkoXCJiZXN0VGltZUVsYXBzZWRXaXRoTG9nZ2luZ091dHB1dFwiKSwgdGltZUVsYXBzZWQsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzQmVzdFRpbWUoXCJPdXRwdXQgV2luZG93IExvZ2dpbmcgRW5hYmxlZFwiLCB0aGlzLmdldFN0b3JhZ2VLZXkoXCJzbG93VGltZUVsYXBzZWRXaXRoTG9nZ2luZ091dHB1dFwiKSwgdGltZUVsYXBzZWQsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQ29uc29sZUxvZ0VuYWJsZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jlc3RUaW1lKFwiQ29uc29sZSBMb2dnaW5nIEVuYWJsZWRcIiwgdGhpcy5nZXRTdG9yYWdlS2V5KFwiYmVzdFRpbWVFbGFwc2VkV2l0aExvZ2dpbmdDb25zb2xlXCIpLCB0aW1lRWxhcHNlZCwgdGhpcy5fcmVzdWx0cy5udW1UZXN0cyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NCZXN0VGltZShcIkNvbnNvbGUgTG9nZ2luZyBFbmFibGVkXCIsIHRoaXMuZ2V0U3RvcmFnZUtleShcInNsb3dUaW1lRWxhcHNlZFdpdGhMb2dnaW5nQ29uc29sZVwiKSwgdGltZUVsYXBzZWQsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgcHJvY2Vzc1RpbWVzID0gYXN5bmMgKCkgPT5cclxuICAgIHtcclxuICAgICAgICBjb25zdCB0aW1lRmluaXNoZWQgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgIHRpbWVFbGFwc2VkID0gdGltZUZpbmlzaGVkIC0gdGhpcy5fdGltZVN0YXJ0ZWQsXHJcbiAgICAgICAgICAgICAgdHpPZmZzZXQgPSAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwLFxyXG4gICAgICAgICAgICAgIHRpbWVGaW5pc2hlZEZtdCA9IChuZXcgRGF0ZShEYXRlLm5vdygpIC0gdHpPZmZzZXQpKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIC0xKS5yZXBsYWNlKFwiVFwiLCBcIiBcIikucmVwbGFjZSgvW1xcLV0vZywgXCIvXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gSWYgY3RybCtjIG9yIHJvbGxpbmcgY291bnQgZXJyb3IgaXMgc2V0LCByZXNldCB0aGUgbW9jaGEgc3VjY2VzcyBpY29uIGZvciBcImNsZWFudXBcIiBmaW5hbCB0ZXN0L3N0ZXBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGlmICh0aGlzLl9oYXNSb2xsaW5nQ291bnRFcnJvciAmJiB0aGlzLl9zeW1ib2xzKSB7IHRoaXMuX3N5bWJvbHMub2sgPSBmaWd1cmVzLmNvbG9yLnN1Y2Nlc3M7IH1cclxuICAgICAgICBpZiAodGhpcy5fY2F1Z2h0Q29udHJvbEMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2ZpZ3VyZXMuY29sb3IuaW5mb30gJHtmaWd1cmVzLndpdGhDb2xvcihcIlVzZXIgY2FuY2VsbGVkIChjYXVnaHQgQ1RSTCtDKVwiLCBjb2xvcnMuZ3JleSl9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0b3BJbnB1dCgpO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7ZmlndXJlcy5jb2xvci5pbmZvfSAke2ZpZ3VyZXMud2l0aENvbG9yKFwiVGltZSBGaW5pc2hlZDogXCIgKyB0aW1lRmluaXNoZWRGbXQsIGZpZ3VyZXMuY29sb3JzLmdyZXkpfWApO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLmluZm99ICR7ZmlndXJlcy53aXRoQ29sb3IoXCJUaW1lIEVsYXBzZWQ6IFwiICsgdGhpcy5nZXRUaW1lRWxhcHNlZEZtdCh0aW1lRWxhcHNlZCksIGZpZ3VyZXMuY29sb3JzLmdyZXkpfWApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVzdWx0cy5udW1UZXN0c0ZhaWwgPT09IDAgJiYgIXRoaXMuX2hhc1JvbGxpbmdDb3VudEVycm9yKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdHMubnVtU3VpdGVzID4gMykgIHsgLy8gPiAzLCBzb21ldGltZXMgaSBzdHJpbmcgdGhlIHNpbmdsZSB0ZXN0IHRvZ2V0aGVyIHdpdGggYSBmZXcgb3RoZXJzIHRlbXBcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jlc3RUaW1lKFwiXCIsIHRoaXMuZ2V0U3RvcmFnZUtleShcImJlc3RUaW1lRWxhcHNlZFwiKSwgdGltZUVsYXBzZWQsIHRoaXMuX3Jlc3VsdHMubnVtVGVzdHMpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzVGltZXNXaXRoTG9nRW5hYmxlZCh0aW1lRWxhcHNlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3VpdGVUaW1lcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2tpcE1zZyA9IHRoaXMuX3Jlc3VsdHMubnVtVGVzdHNGYWlsID4gMCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZXJlIHdlcmUgJHt0aGlzLl9yZXN1bHRzLm51bVRlc3RzRmFpbH0gZmFpbGVkIHRlc3RzLCBiZXN0IHRpbWUgcHJvY2Vzc2luZyBza2lwcGVkYCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGVyZSB3YXMgYSByb2xsaW5nIGNvdW50IGZhaWx1cmUsIGJlc3QgdGltZSBwcm9jZXNzaW5nIHNraXBwZWRcIjtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2ZpZ3VyZXMuY29sb3IuaW5mb30gJHtmaWd1cmVzLndpdGhDb2xvcihza2lwTXNnLCBmaWd1cmVzLmNvbG9ycy5ncmV5KX1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLmluZm99ICR7ZmlndXJlcy53aXRoQ29sb3IodGhpcy5fdGltZVNlcCwgZmlndXJlcy5jb2xvcnMubWFnZW50YSl9YCk7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIHNhdmVQcm9jZXNzVGltZVRvU3RvcmFnZSA9IGFzeW5jIChrZXk6IHN0cmluZywgdGltZUVsYXBzZWQ6IG51bWJlciwgdGltZUVsYXBzZUZtdDogc3RyaW5nLCBudW1UZXN0czogbnVtYmVyKSA9PlxyXG4gICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX29wdGlvbnMuc3RvcmUudXBkYXRlU3RvcmVWYWx1ZShrZXksIHRpbWVFbGFwc2VkKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9vcHRpb25zLnN0b3JlLnVwZGF0ZVN0b3JlVmFsdWUoa2V5ICsgXCJGbXRcIiwgdGltZUVsYXBzZUZtdCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3B0aW9ucy5zdG9yZS51cGRhdGVTdG9yZVZhbHVlKGtleSArIFwiTnVtVGVzdHNcIiwgbnVtVGVzdHMpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgc2V0RmFpbGVkID0gKGVPYmo6IGJvb2xlYW4gfCBFcnJvciwgc3VpdGU/OiBJVGVzdFRvb2xSdW50aW1lU3VpdGUsIHRlc3Q/OiBJVGVzdFRvb2xSdW50aW1lVGVzdCkgPT5cclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hhc1JvbGxpbmdDb3VudEVycm9yKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc3QgaXNFcnJvciA9IGVPYmogaW5zdGFuY2VvZiBFcnJvcjtcclxuICAgICAgICAgICAgdGhpcy5fY2F1Z2h0Q29udHJvbEMgPSB0eXBlb2YgZU9iaiA9PT0gXCJib29sZWFuXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhc1JvbGxpbmdDb3VudEVycm9yID0geyBzdWl0ZTogc3VpdGUhLnRpdGxlLCB0ZXN0OiB0ZXN0IS50aXRsZSwgdGVzdElkeDogdGVzdCEuaW5kZXggfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZnJhbWV3b3JrID09PSBcIm1vY2hhXCIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3ltYm9scyB9ID0gcmVxdWlyZShcIm1vY2hhL2xpYi9yZXBvcnRlcnMvYmFzZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N5bWJvbHMgPSBzeW1ib2xzO1xyXG4gICAgICAgICAgICAgICAgc3ltYm9scy5vayA9IGZpZ3VyZXMud2l0aENvbG9yKGZpZ3VyZXMucG9pbnRlciwgY29sb3JzLmJsdWUpICsgIGZpZ3VyZXMud2l0aENvbG9yKFwiIFtTa2lwcGVkXVwiLCBjb2xvcnMuZ3JleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRlc3QpIHtcclxuICAgICAgICAgICAgICAgIHdyaXRlSW5mbyhgcm9sbGluZyBzdWNjZXNzIGNvdW50IGZhaWx1cmUgQCB0ZXN0ICR7dGVzdC5pbmRleCArIDF9LCBza2lwcGluZyByZW1haW5pbmcgdGVzdHNgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhdWdodCBDVFJMLUNcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1aXRlPy50ZXN0cy5maWx0ZXIodCA9PiB0LmlzRmFpbGVkKCkpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuVEVTVF9VVElMU19GQUlMVVJFX0VYQ0VQVElPTiA9IChpc0Vycm9yID8gZU9iai5tZXNzYWdlIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSb2xsaW5nIGNvdW50IGVycm9yOiBcIiArIHByb2Nlc3MuZW52LlRFU1RfVVRJTFNfRkFJTFVSRV9FWENFUFRJT04pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKGlzRXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gICAgIFRPRE8gLSBobW1tLCBob3cgdG8gZ2V0IG1vY2hhIHJ1bnRpbWUgZXhjZXB0aW9uXHJcbiAgICAgICAgICAgIC8vICAgICBwcm9jZXNzLmVudi5URVNUX1VUSUxTX0ZBSUxVUkVfRVhDRVBUSU9OID0gYCR7ZU9iai5tZXNzYWdlfVxcbiR7ZU9iai5zdGFja31gO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbn1cclxuIiwiLyoqXHJcbiAqIEBtb2R1bGUgdGVzdHV0aWxzLnV0aWxzLmFyZ3ZcclxuICovXHJcblxyXG5pbXBvcnQgeyBpc051bWVyaWMgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBJVGVzdFJ1bkFyZ3VtZW50cyB9IGZyb20gXCIuLi9pbnRlcmZhY2UvYXJndi5qc1wiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBhcmd2ID0gKCk6IFBhcnRpYWw8SVRlc3RSdW5Bcmd1bWVudHM+ID0+XHJcbntcclxuICAgIGNvbnN0IGFyZ3MgOiBQYXJ0aWFsPElUZXN0UnVuQXJndW1lbnRzPiA9IHt9O1xyXG4gICAgcHJvY2Vzcy5hcmd2LmZvckVhY2goKGFyZywgaWR4LCBhcnIpID0+XHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS10dS1cIikpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYXJyW2lkeCArIDFdICYmICFhcnJbaWR4ICsgMV0uc3RhcnRzV2l0aChcIi0tXCIpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcmdzW3RvQ2FtZWxQcm9wZXJ0eShhcmcpXSA9IGFycltpZHggKyAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc051bWVyaWMoYXJnc1thcmddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnXSA9IHBhcnNlSW50KGFycltpZHggKyAxXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJnc1thcmddID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sIHRoaXMpO1xyXG4gICAgcmV0dXJuIGFyZ3M7XHJcbn07XHJcblxyXG5cclxuY29uc3QgdG9DYW1lbFByb3BlcnR5ID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PlxyXG57XHJcbiAgICByZXR1cm4gbmFtZVxyXG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAobGV0dGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBpbmRleCAhPT0gMCA/IGxldHRlci50b0xvd2VyQ2FzZSgpIDogbGV0dGVyLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9KVxyXG4gICAgLnJlcGxhY2UoL1tcXHNcXC1dKy9nLCBcIlwiKTtcclxufTtcclxuIiwiXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHRlc3R1dGlscy51dGlscy5maWd1cmVzXHJcbiAqL1xyXG5cclxuZXhwb3J0IHR5cGUgTG9nQ29sb3IgPSBbIG51bWJlciwgbnVtYmVyIF07XHJcbmV4cG9ydCB0eXBlIExvZ1N0eWxlID0gWyBudW1iZXIsIG51bWJlciBdO1xyXG5cclxuaW50ZXJmYWNlIElMb2dDb2xvcnNcclxue1xyXG4gICAgYm9sZDogTG9nQ29sb3I7XHJcbiAgICBpdGFsaWM6IExvZ0NvbG9yO1xyXG4gICAgdW5kZXJsaW5lOiBMb2dDb2xvcjtcclxuICAgIGludmVyc2U6IExvZ0NvbG9yO1xyXG4gICAgd2hpdGU6IExvZ0NvbG9yO1xyXG4gICAgZ3JleTogTG9nQ29sb3I7XHJcbiAgICBibGFjazogTG9nQ29sb3I7XHJcbiAgICBibHVlOiBMb2dDb2xvcjtcclxuICAgIGN5YW46IExvZ0NvbG9yO1xyXG4gICAgZ3JlZW46IExvZ0NvbG9yO1xyXG4gICAgbWFnZW50YTogTG9nQ29sb3I7XHJcbiAgICByZWQ6IExvZ0NvbG9yO1xyXG4gICAgeWVsbG93OiBMb2dDb2xvcjtcclxufTtcclxuXHJcbmNsYXNzIExvZ0NvbG9ycyBpbXBsZW1lbnRzIElMb2dDb2xvcnNcclxue1xyXG4gICAgYm9sZDogTG9nU3R5bGUgPSBbIDEsIDIyIF07XHJcbiAgICBpdGFsaWM6IExvZ1N0eWxlID0gWyAzLCAyMyBdO1xyXG4gICAgdW5kZXJsaW5lOiBMb2dTdHlsZSA9IFsgNCwgMjQgXTtcclxuICAgIGludmVyc2U6IExvZ1N0eWxlID0gWyA3LCAyNyBdO1xyXG4gICAgd2hpdGU6IExvZ0NvbG9yID0gWyAzNywgMzkgXTtcclxuICAgIGdyZXk6IExvZ0NvbG9yID0gWyA5MCwgMzkgXTtcclxuICAgIGJsYWNrOiBMb2dDb2xvciA9IFsgMzAsIDM5IF07XHJcbiAgICBibHVlOiBMb2dDb2xvciA9IFsgMzQsIDM5IF07XHJcbiAgICBjeWFuOiBMb2dDb2xvciA9IFsgMzYsIDM5IF07XHJcbiAgICBncmVlbjogTG9nQ29sb3IgPSBbIDMyLCAzOSBdO1xyXG4gICAgbWFnZW50YTogTG9nQ29sb3IgPSBbIDM1LCAzOSBdO1xyXG4gICAgcmVkOiBMb2dDb2xvciA9IFsgMzEsIDM5IF07XHJcbiAgICB5ZWxsb3c6IExvZ0NvbG9yID0gWyAzMywgMzkgXTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb2xvcnMgPSBuZXcgTG9nQ29sb3JzKCk7XHJcblxyXG5leHBvcnQgY29uc3Qgd2l0aENvbG9yID0gKG1zZzogc3RyaW5nLCBjb2xvcjogTG9nQ29sb3IpID0+IFwiXFx4MUJbXCIgKyBjb2xvclswXSArIFwibVwiICsgbXNnICsgXCJcXHgxQltcIiArIGNvbG9yWzFdICsgXCJtXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZmlndXJlcyA9IHtcclxuICAgIGNvbG9ycyxcclxuICAgIHdpdGhDb2xvcixcclxuICAgIHN1Y2Nlc3M6IFwi4pyUXCIsXHJcbiAgICBpbmZvOiBcIuKEuVwiLFxyXG5cdHdhcm5pbmc6IFwi4pqgXCIsXHJcblx0ZXJyb3I6IFwi4pyYXCIsXHJcblx0cG9pbnRlcjogXCLina9cIixcclxuXHRzdGFydDogXCLilrZcIixcclxuXHRlbmQ6IFwi4peAXCIsXHJcblx0bm9kZWpzOiBcIuKsolwiLFxyXG5cdHN0YXI6IFwi4piFXCIsXHJcblx0Y2hlY2tib3hPbjogXCLimJJcIixcclxuXHRjaGVja2JveE9mZjogXCLimJBcIixcclxuXHRwb2ludGVyU21hbGw6IFwi4oC6XCIsXHJcblx0YnVsbGV0OiBcIuKXj1wiLFxyXG4gICAgdXA6IFwi4pazXCIsXHJcbiAgICBjb2xvcjpcclxuICAgIHtcclxuICAgICAgICBzdWNjZXNzOiB3aXRoQ29sb3IoXCLinJRcIiwgY29sb3JzLmdyZWVuKSxcclxuICAgICAgICBzdWNjZXNzQmx1ZTogd2l0aENvbG9yKFwi4pyUXCIsIGNvbG9ycy5ibHVlKSxcclxuICAgICAgICBpbmZvOiB3aXRoQ29sb3IoXCLihLlcIiwgY29sb3JzLm1hZ2VudGEpLFxyXG4gICAgICAgIGluZm9UYXNrOiB3aXRoQ29sb3IoXCLihLlcIiwgY29sb3JzLmJsdWUpLFxyXG4gICAgICAgIHdhcm5pbmc6IHdpdGhDb2xvcihcIuKaoFwiLCBjb2xvcnMueWVsbG93KSxcclxuICAgICAgICB3YXJuaW5nVGVzdHM6IHdpdGhDb2xvcihcIuKaoFwiLCBjb2xvcnMuYmx1ZSksXHJcbiAgICAgICAgZXJyb3I6IHdpdGhDb2xvcihcIuKcmFwiLCBjb2xvcnMucmVkKSxcclxuICAgICAgICBlcnJvclRlc3RzOiB3aXRoQ29sb3IoXCLinJhcIiwgY29sb3JzLmJsdWUpLFxyXG4gICAgICAgIHN0YXJ0OiB3aXRoQ29sb3IoXCLilrZcIiwgY29sb3JzLmdyZWVuKSxcclxuICAgICAgICBlbmQ6IHdpdGhDb2xvcihcIuKXgFwiLCBjb2xvcnMuZ3JlZW4pLFxyXG4gICAgICAgIHBvaW50ZXI6IHdpdGhDb2xvcihcIuKdr1wiLCBjb2xvcnMuZ3JleSksXHJcbiAgICAgICAgdXA6IHdpdGhDb2xvcihcIuKWs1wiLCBjb2xvcnMuZ3JlZW4pLFxyXG4gICAgfVxyXG5cclxufTtcclxuIiwiXHJcbi8qKlxyXG4gKiBAbW9kdWxlIHRlc3R1dGlscy51dGlscy51dGlsc1xyXG4gKi9cclxuXHJcbmltcG9ydCB7IGZpZ3VyZXMgfSBmcm9tIFwiLi9maWd1cmVzLmpzXCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGlzTnVtZXJpYyA9ICh2OiBhbnkpID0+ICFpc05hTihwYXJzZUZsb2F0KHYpKSAmJiBpc0Zpbml0ZSh2KTtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgcGx1cmFsaXplID0gKHM6IHN0cmluZywgaXRlbUxlbmd0aDogbnVtYmVyKSA9PiB7IGlmIChpdGVtTGVuZ3RoIT09IDEgKSByZXR1cm4gcyArIFwic1wiOyByZXR1cm4gczsgfVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBzbGVlcCA9IGFzeW5jIChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgd3JpdGVJbmZvID0gKG1zZz86IHN0cmluZywgaWNvbj86IHN0cmluZywgcGFkID0gXCJcIikgPT5cclxuICAgIGNvbnNvbGUubG9nKGAgICAgJHtwYWR9JHtpY29uIHx8IGZpZ3VyZXMuY29sb3IuaW5mb30ke21zZyA/IFwiIFwiICsgZmlndXJlcy53aXRoQ29sb3IobXNnLCBmaWd1cmVzLmNvbG9ycy5ncmV5KSA6IFwiXCJ9YCk7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHdyaXRlRXJyb3JzQXJlT2sgPSAoKSA9PlxyXG57XHJcblxyXG4gICAgY29uc29sZS5sb2coYCAgICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgYCArXHJcbiAgICAgICAgICAgICAgICBgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gIGAgK1xyXG4gICAgICAgICAgICAgICAgYCR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICBgICtcclxuICAgICAgICAgICAgICAgIGAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgYCArXHJcbiAgICAgICAgICAgICAgICBgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc31gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICBgICtcclxuICAgICAgICAgICAgICAgIGAke2ZpZ3VyZXMuY29sb3IudXB9ICAke2ZpZ3VyZXMud2l0aENvbG9yKFwiICBUSEVTRSBFUlJPUlMgV0VSRSBTVVBQT1NFRCBUTyBIQVBQRU4hISEgIFwiLCBmaWd1cmVzLmNvbG9ycy5ncmVlbil9ICBgICtcclxuICAgICAgICAgICAgICAgIGAke2ZpZ3VyZXMuY29sb3IudXB9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc31gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgICAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gIGAgK1xyXG4gICAgICAgICAgICAgICAgYCR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICBgICtcclxuICAgICAgICAgICAgICAgIGAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgYCArXHJcbiAgICAgICAgICAgICAgICBgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gIGAgK1xyXG4gICAgICAgICAgICAgICAgYCR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9ICAke2ZpZ3VyZXMuY29sb3Iuc3VjY2Vzc30gICR7ZmlndXJlcy5jb2xvci5zdWNjZXNzfSAgJHtmaWd1cmVzLmNvbG9yLnN1Y2Nlc3N9YCk7XHJcblxyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2NoYS9saWIvcmVwb3J0ZXJzL2Jhc2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1wcmVsb2FkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3RlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzcGF3bi13cmFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInRzLW5vZGUvcmVnaXN0ZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwib3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidHR5XCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4vLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3MgYW5kIHNpYmxpbmcgY2h1bmtzIGZvciB0aGUgZW50cnlwb2ludFxuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiB1bmRlZmluZWQ7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLlggPSAocmVzdWx0LCBjaHVua0lkcywgZm4pID0+IHtcblx0Ly8gYXJndW1lbnRzOiBjaHVua0lkcywgbW9kdWxlSWQgYXJlIGRlcHJlY2F0ZWRcblx0dmFyIG1vZHVsZUlkID0gY2h1bmtJZHM7XG5cdGlmKCFmbikgY2h1bmtJZHMgPSByZXN1bHQsIGZuID0gKCkgPT4gKF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gbW9kdWxlSWQpKTtcblx0Y2h1bmtJZHMubWFwKF9fd2VicGFja19yZXF1aXJlX18uZSwgX193ZWJwYWNrX3JlcXVpcmVfXylcblx0dmFyIHIgPSBmbigpO1xuXHRyZXR1cm4gciA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogcjtcbn0iLCIvLyBtb2R1bGUgY2FjaGUgYXJlIHVzZWQgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KTtcbiJdLCJuYW1lcyI6WyJpbnN0YWxsZWRDaHVua3MiLCJpbnN0YWxsQ2h1bmsiLCJyZXF1aXJlIiwib3B0aW9ucyIsIm55Y0NvbmZpZyIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRDb25maWciLCJjb3ZlcmFnZSIsImNvbmZpZyIsIm55YyIsIndyYXAiLCJteUZpbGVzUmVnZXgiLCJSZWdFeHAiLCJtb2R1bGVOYW1lIiwibW9kdWxlQnVpbGREaXIiLCJmaWx0ZXJGbiIsInRlc3QiLCJiaW5kIiwia2V5cyIsImZpbHRlciIsImxlbmd0aCIsImNvbnNvbGUiLCJ3YXJuIiwiY2xlYW4iLCJyZXNldCIsImNyZWF0ZVRlbXBEaXJlY3RvcnkiLCJlbnYiLCJOWUNfQ09ORklHIiwiSlNPTiIsInN0cmluZ2lmeSIsIk5ZQ19DV0QiLCJjd2QiLCJiYWJlbENhY2hlIiwiQkFCRUxfRElTQUJMRV9DQUNIRSIsInByb2Nlc3MiLCJ1c2VTcGF3bldyYXAiLCJyZXF1aXJlTW9kdWxlcyIsIl9fX19yZXF1aXJlIiwicmVzb2x2ZV9fX18iLCJtYXAiLCJtb2QiLCJwdXNoIiwiZm9yRWFjaCIsIl9fX19yZXF1aXJlX19fXyIsImFsbCIsImFkZEFsbEZpbGVzIiwic3ciLCJyZWxhdGl2ZSIsIl9fZGlybmFtZSIsInJlc29sdmUiLCJyZXBsYWNlIiwicnVuTWFpbiIsIlNQQVdOX1dSQVBfU0hJTV9ST09UIiwiWERHX0NBQ0hFX0hPTUUiLCJjZmdGaWxlIiwiam9pbiIsInByb2plY3RSb290IiwiZXhpc3RzU3luYyIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiZXh0ZW5kcyIsImhvb2tSZXF1aXJlIiwiaG9va1J1bkluQ29udGV4dCIsImhvb2tSdW5JblRoaXNDb250ZXh0IiwiaW5zdHJ1bWVudCIsInJlcG9ydERpciIsInNpbGVudCIsInJlcG9ydGVyIiwiaW5jbHVkZSIsImV4Y2x1ZGUiLCJmcmFtZXdvcmsiLCJtb2NoYSIsInN1aXRlIiwiZmlsZXNUb1Rlc3QiLCJhIiwicm9vdCIsInNvcnRHcm91cCIsImZpbGVzIiwic29ydCIsImIiLCJpbmNsdWRlcyIsImJhc2VuYW1lIiwiZiIsImFkZEZpbGUiLCJ1aSIsImNvbG9yIiwidGltZW91dCIsInJldHJpZXMiLCJzbG93Iiwic2xlZXAiLCJtcyIsIlByb21pc2UiLCJzZXRUaW1lb3V0IiwiY2FwdHVyZVN0ZG91dCIsImFzeW5jIiwiZm4iLCJ3Iiwic3Rkb3V0Iiwid3JpdGUiLCJidWZmZXIiLCJzIiwiZSIsInN1cHByZXNzRVBJUEUiLCJlcnJvciIsImNvZGUiLCJwcmVwYXJlUGxhdGZvcm0iLCJwbGF0Zm9ybSIsInR0eSIsImdldFdpbmRvd1NpemUiLCJUZXN0UnVubmVyIiwiY29uc3RydWN0b3IiLCJydW5DZmciLCJjb3ZlciIsInhBcmdzIiwiaXNUeXBlc2NyaXB0IiwicmVnaXN0ZXIiLCJ0c05vZGUiLCJzb3VyY2VNYXBTdXBwb3J0IiwicHJvamVjdERpciIsImh0bWxSZXBvcnREYXJrIiwidG9vbCIsImlzdGFuYnVsUmVwb3J0UGF0aCIsImlzdGFuYnVsSHRtbFJlcG9ydFBhdGgiLCJpc3RhbmJ1bEh0bWxSZXBvcnRDc3NGaWxlIiwiY29weUZpbGVTeW5jIiwibW9jaGFFcnJvciIsImZhaWx1cmVzIiwicnVuIiwid3JpdGVDb3ZlcmFnZUZpbGUiLCJ3cml0ZVByb2Nlc3NJbmRleCIsIm1heWJlUHVyZ2VTb3VyY2VNYXBDYWNoZSIsImxvZyIsInJlcG9ydCIsInNob3dQcm9jZXNzVHJlZSIsIm1lc3NhZ2UiLCJURVNUX1VUSUxTX0ZBSUxVUkVfRVhDRVBUSU9OIiwiRXJyb3IiLCJ0aGlzIiwiX29wdGlvbnMiLCJhcmd2IiwidHlwZSIsInZlcmJvc2UiLCJUZXN0VXRpbHNVdGlsaXRpZXMiLCJiZXN0VGltZXNJbnN0IiwiaW5zdGFuY2UiLCJjdXJyZW50VGVzdCIsInBhcmVudCIsInN1aXRlS2V5IiwiZ2V0U3VpdGVLZXkiLCJ0aXRsZSIsIl9yZXN1bHRzIiwic3VpdGVSZXN1bHRzIiwic3VjY2Vzc0NvdW50IiwiaXNTZXR1cCIsInJ1blRpbWUiLCJEYXRlIiwibm93IiwiX3Rlc3RUaW1lciIsInJ1blRpbWVGbXQiLCJNYXRoIiwiZmxvb3IiLCJwcmludFN1aXRlUnVudGltZXMiLCJpc1RlYXJkb3duIiwibVRlc3QiLCJ0aW1lU3RhcnRlZCIsIm51bVRlc3RzIiwidGVzdHMiLCJzdWNjZXNzIiwic3VpdGVOYW1lIiwiZ2V0U3VpdGVGcmllbmRseU5hbWUiLCJ0aW1lRmluaXNoZWQiLCJudW1UZXN0c0ZhaWxlZCIsImlzU2luZ2xlU3VpdGVUZXN0Iiwic3VpdGVzIiwidGVzdElkeCIsImZpbmRJbmRleCIsInQiLCJpc0ZhaWxlZCIsImlzUGFzc2VkIiwiX2luc3QiLCJzZXRGYWlsZWQiLCJpbmRleCIsImlzUm9sbGluZ0NvdW50RXJyb3IiLCJwcmVLZXkiLCJwcm9wZXJDYXNlIiwibG93ZXJDYXNlRmlyc3RDaGFyIiwibmFtZSIsInJlbW92ZVNwYWNlcyIsImx0ciIsInRvVXBwZXJDYXNlIiwiZnMiLCJ0b1N0cmluZyIsInRvTG93ZXJDYXNlIiwic3Vic3RyaW5nIiwibnVtVGVzdHNGYWlsZWRUaGlzU3VpdGUiLCJudW1UZXN0c0ZhaWwiLCJudW1UZXN0c1N1Y2Nlc3MiLCJudW1TdWl0ZXMiLCJudW1TdWl0ZXNGYWlsIiwibnVtU3VpdGVzU3VjY2VzcyIsInJlc3VsdHMiLCJ3cml0ZUNvbnNvbGUiLCJzdGRpbkludGVyZmFjZSIsIm9uS2V5Iiwic3RyIiwia2V5IiwibWV0YSIsImN0cmwiLCJUZXN0VHJhY2tlciIsInNldEZhaWxlZEZuIiwic3RvcmFnZUtleSIsIl9jbHIiLCJzdG9yZSIsInVwZGF0ZVN0b3JlVmFsdWUiLCJjbGVhckJlc3RUaW1lIiwiY2xlYXJBbGxCZXN0VGltZXMiLCJjbGVhckJlc3RUaW1lc09uVGVzdENvdW50Q2hhbmdlIiwiZ2V0U3RvcmVWYWx1ZSIsImJhc2VLZXkiLCJpc011bHRpUm9vdFdvcmtzcGFjZSIsInRpbWVFbGFwc2VkIiwicm91bmQiLCJ0aW1lRWxhcHNlZEZtdCIsIm1zZyIsIndzVHlwZU1zZyIsInByZXZNc2ciLCJzbG93TXNnIiwicHJlTXNnIiwiZmlndXJlcyIsImluZm8iLCJ3aXRoQ29sb3IiLCJjb2xvcnMiLCJjeWFuIiwiZ3JleSIsInByZXZCZXN0VGltZUVsYXBzZWRGbXQiLCJmYXN0TXNnIiwicmVkIiwibG9nVGl0bGUiLCJtYWdlbnRhIiwid2hpdGUiLCJfdGltZVNlcCIsImNsZWFyUHJvY2Vzc1RpbWVTdG9yYWdlIiwiYmVzdFRpbWVFbGFwc2VkIiwid29yc3RUaW1lRWxhcHNlZFN0b3JlZCIsIndvcnN0VGltZUVsYXBzZWQiLCJnZXRUaW1lRWxhcHNlZEZtdCIsImxvZ0Jlc3RUaW1lIiwic2F2ZVByb2Nlc3NUaW1lVG9TdG9yYWdlIiwibG9nU2xvd2VzdFRpbWUiLCJiZXN0VGltZUVsYXBzZWRGbXQiLCJ3b3JzdFRpbWVFbGFwc2VkRm10IiwibXNnMSIsIm1zZzIiLCJtc2czIiwidmFsdWVzIiwidiIsInN1aXRlUmVzdWx0IiwidHlwZUtleSIsIl91dGlscyIsImdldFN0b3JhZ2VLZXkiLCJwcm9jZXNzQmVzdFRpbWUiLCJpc0xvZ0VuYWJsZWQiLCJpc0ZpbGVMb2dFbmFibGVkIiwiaXNPdXRwdXRXaW5kb3dMb2dFbmFibGVkIiwiaXNDb25zb2xlTG9nRW5hYmxlZCIsIl90aW1lU3RhcnRlZCIsInR6T2Zmc2V0IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJ0aW1lRmluaXNoZWRGbXQiLCJ0b0lTT1N0cmluZyIsInNsaWNlIiwiX2hhc1JvbGxpbmdDb3VudEVycm9yIiwiX3N5bWJvbHMiLCJvayIsIl9jYXVnaHRDb250cm9sQyIsInN0ZGluIiwib2ZmIiwiY2xvc2UiLCJza2lwTXNnIiwicHJvY2Vzc1RpbWVzV2l0aExvZ0VuYWJsZWQiLCJwcm9jZXNzU3VpdGVUaW1lcyIsInRpbWVFbGFwc2VGbXQiLCJlT2JqIiwiaXNFcnJvciIsInN5bWJvbHMiLCJwb2ludGVyIiwiYmx1ZSIsIl9hcmdzIiwiaXNUVFkiLCJpbnB1dCIsImVzY2FwZUNvZGVUaW1lb3V0Iiwic2V0UmF3TW9kZSIsIm9uIiwidXRpbHMiLCJhcmdzIiwiYXJnIiwiaWR4IiwiYXJyIiwic3RhcnRzV2l0aCIsInRvQ2FtZWxQcm9wZXJ0eSIsInBhcnNlSW50IiwibGV0dGVyIiwid2FybmluZyIsInN0YXJ0IiwiZW5kIiwibm9kZWpzIiwic3RhciIsImNoZWNrYm94T24iLCJjaGVja2JveE9mZiIsInBvaW50ZXJTbWFsbCIsImJ1bGxldCIsInVwIiwiZ3JlZW4iLCJzdWNjZXNzQmx1ZSIsImluZm9UYXNrIiwieWVsbG93Iiwid2FybmluZ1Rlc3RzIiwiZXJyb3JUZXN0cyIsImlzTnVtZXJpYyIsImlzTmFOIiwicGFyc2VGbG9hdCIsImlzRmluaXRlIiwicGx1cmFsaXplIiwiaXRlbUxlbmd0aCIsIndyaXRlSW5mbyIsImljb24iLCJwYWQiLCJ3cml0ZUVycm9yc0FyZU9rIiwibW9kdWxlIiwiZXhwb3J0cyIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsImlkIiwibG9hZGVkIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm0iLCJjIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJjaHVua0lkIiwicmVkdWNlIiwicHJvbWlzZXMiLCJ1Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwiWCIsInJlc3VsdCIsImNodW5rSWRzIiwiY2h1bmsiLCJtb3JlTW9kdWxlcyIsIm1vZHVsZXMiLCJpZHMiLCJydW50aW1lIiwiaSIsIkMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIl0sInNvdXJjZVJvb3QiOiIifQ==