hotstaq 0.5.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +17 -0
- package/.eslintrc.js +11 -0
- package/.vscode/launch.json +199 -0
- package/.vscode/settings.json +2 -0
- package/.vscode/tasks.json +78 -0
- package/CONTRIBUTING.md +157 -0
- package/README.md +126 -0
- package/bin/hotstaq +3 -0
- package/bin/hotstaq.cmd +1 -0
- package/build/src/Hot.d.ts +167 -0
- package/build/src/Hot.d.ts.map +1 -0
- package/build/src/Hot.js +365 -0
- package/build/src/Hot.js.map +1 -0
- package/build/src/HotAPI.d.ts +130 -0
- package/build/src/HotAPI.d.ts.map +1 -0
- package/build/src/HotAPI.js +353 -0
- package/build/src/HotAPI.js.map +1 -0
- package/build/src/HotAgentAPI.d.ts +22 -0
- package/build/src/HotAgentAPI.d.ts.map +1 -0
- package/build/src/HotAgentAPI.js +85 -0
- package/build/src/HotAgentAPI.js.map +1 -0
- package/build/src/HotAgentRoute.d.ts +17 -0
- package/build/src/HotAgentRoute.d.ts.map +1 -0
- package/build/src/HotAgentRoute.js +109 -0
- package/build/src/HotAgentRoute.js.map +1 -0
- package/build/src/HotBuilder.d.ts +52 -0
- package/build/src/HotBuilder.d.ts.map +1 -0
- package/build/src/HotBuilder.js +239 -0
- package/build/src/HotBuilder.js.map +1 -0
- package/build/src/HotClient.d.ts +31 -0
- package/build/src/HotClient.d.ts.map +1 -0
- package/build/src/HotClient.js +19 -0
- package/build/src/HotClient.js.map +1 -0
- package/build/src/HotComponent.d.ts +118 -0
- package/build/src/HotComponent.d.ts.map +1 -0
- package/build/src/HotComponent.js +89 -0
- package/build/src/HotComponent.js.map +1 -0
- package/build/src/HotCreator.d.ts +92 -0
- package/build/src/HotCreator.d.ts.map +1 -0
- package/build/src/HotCreator.js +465 -0
- package/build/src/HotCreator.js.map +1 -0
- package/build/src/HotDB.d.ts +69 -0
- package/build/src/HotDB.d.ts.map +1 -0
- package/build/src/HotDB.js +29 -0
- package/build/src/HotDB.js.map +1 -0
- package/build/src/HotDBConnectionInterface.d.ts +40 -0
- package/build/src/HotDBConnectionInterface.d.ts.map +1 -0
- package/build/src/HotDBConnectionInterface.js +3 -0
- package/build/src/HotDBConnectionInterface.js.map +1 -0
- package/build/src/HotFile.d.ts +134 -0
- package/build/src/HotFile.d.ts.map +1 -0
- package/build/src/HotFile.js +454 -0
- package/build/src/HotFile.js.map +1 -0
- package/build/src/HotHTTPServer.d.ts +162 -0
- package/build/src/HotHTTPServer.d.ts.map +1 -0
- package/build/src/HotHTTPServer.js +863 -0
- package/build/src/HotHTTPServer.js.map +1 -0
- package/build/src/HotIO.d.ts +39 -0
- package/build/src/HotIO.d.ts.map +1 -0
- package/build/src/HotIO.js +195 -0
- package/build/src/HotIO.js.map +1 -0
- package/build/src/HotLog.d.ts +60 -0
- package/build/src/HotLog.d.ts.map +1 -0
- package/build/src/HotLog.js +126 -0
- package/build/src/HotLog.js.map +1 -0
- package/build/src/HotPage.d.ts +125 -0
- package/build/src/HotPage.d.ts.map +1 -0
- package/build/src/HotPage.js +178 -0
- package/build/src/HotPage.js.map +1 -0
- package/build/src/HotRoute.d.ts +82 -0
- package/build/src/HotRoute.d.ts.map +1 -0
- package/build/src/HotRoute.js +83 -0
- package/build/src/HotRoute.js.map +1 -0
- package/build/src/HotRouteMethod.d.ts +129 -0
- package/build/src/HotRouteMethod.d.ts.map +1 -0
- package/build/src/HotRouteMethod.js +84 -0
- package/build/src/HotRouteMethod.js.map +1 -0
- package/build/src/HotServer.d.ts +152 -0
- package/build/src/HotServer.d.ts.map +1 -0
- package/build/src/HotServer.js +109 -0
- package/build/src/HotServer.js.map +1 -0
- package/build/src/HotSetAsWeb.d.ts +2 -0
- package/build/src/HotSetAsWeb.d.ts.map +1 -0
- package/build/src/HotSetAsWeb.js +5 -0
- package/build/src/HotSetAsWeb.js.map +1 -0
- package/build/src/HotStaq.d.ts +601 -0
- package/build/src/HotStaq.d.ts.map +1 -0
- package/build/src/HotStaq.js +1258 -0
- package/build/src/HotStaq.js.map +1 -0
- package/build/src/HotStaqWeb.d.ts +18 -0
- package/build/src/HotStaqWeb.d.ts.map +1 -0
- package/build/src/HotStaqWeb.js +44 -0
- package/build/src/HotStaqWeb.js.map +1 -0
- package/build/src/HotTestDriver.d.ts +63 -0
- package/build/src/HotTestDriver.d.ts.map +1 -0
- package/build/src/HotTestDriver.js +187 -0
- package/build/src/HotTestDriver.js.map +1 -0
- package/build/src/HotTestElement.d.ts +71 -0
- package/build/src/HotTestElement.d.ts.map +1 -0
- package/build/src/HotTestElement.js +37 -0
- package/build/src/HotTestElement.js.map +1 -0
- package/build/src/HotTestMap.d.ts +83 -0
- package/build/src/HotTestMap.d.ts.map +1 -0
- package/build/src/HotTestMap.js +58 -0
- package/build/src/HotTestMap.js.map +1 -0
- package/build/src/HotTestSeleniumDriver.d.ts +82 -0
- package/build/src/HotTestSeleniumDriver.d.ts.map +1 -0
- package/build/src/HotTestSeleniumDriver.js +398 -0
- package/build/src/HotTestSeleniumDriver.js.map +1 -0
- package/build/src/HotTester.d.ts +188 -0
- package/build/src/HotTester.d.ts.map +1 -0
- package/build/src/HotTester.js +623 -0
- package/build/src/HotTester.js.map +1 -0
- package/build/src/HotTesterAPI.d.ts +15 -0
- package/build/src/HotTesterAPI.d.ts.map +1 -0
- package/build/src/HotTesterAPI.js +161 -0
- package/build/src/HotTesterAPI.js.map +1 -0
- package/build/src/HotTesterMocha.d.ts +50 -0
- package/build/src/HotTesterMocha.d.ts.map +1 -0
- package/build/src/HotTesterMocha.js +205 -0
- package/build/src/HotTesterMocha.js.map +1 -0
- package/build/src/HotTesterMochaSelenium.d.ts +70 -0
- package/build/src/HotTesterMochaSelenium.d.ts.map +1 -0
- package/build/src/HotTesterMochaSelenium.js +257 -0
- package/build/src/HotTesterMochaSelenium.js.map +1 -0
- package/build/src/HotTesterServer.d.ts +114 -0
- package/build/src/HotTesterServer.d.ts.map +1 -0
- package/build/src/HotTesterServer.js +575 -0
- package/build/src/HotTesterServer.js.map +1 -0
- package/build/src/api.d.ts +33 -0
- package/build/src/api.d.ts.map +1 -0
- package/build/src/api.js +78 -0
- package/build/src/api.js.map +1 -0
- package/build/src/cli.d.ts +2 -0
- package/build/src/cli.d.ts.map +1 -0
- package/build/src/cli.js +935 -0
- package/build/src/cli.js.map +1 -0
- package/build/src/schemas/HotDBInflux.d.ts +63 -0
- package/build/src/schemas/HotDBInflux.d.ts.map +1 -0
- package/build/src/schemas/HotDBInflux.js +239 -0
- package/build/src/schemas/HotDBInflux.js.map +1 -0
- package/build/src/schemas/HotDBMigration.d.ts +19 -0
- package/build/src/schemas/HotDBMigration.d.ts.map +1 -0
- package/build/src/schemas/HotDBMigration.js +15 -0
- package/build/src/schemas/HotDBMigration.js.map +1 -0
- package/build/src/schemas/HotDBMySQL.d.ts +65 -0
- package/build/src/schemas/HotDBMySQL.d.ts.map +1 -0
- package/build/src/schemas/HotDBMySQL.js +387 -0
- package/build/src/schemas/HotDBMySQL.js.map +1 -0
- package/build/src/schemas/HotDBSchema.d.ts +15 -0
- package/build/src/schemas/HotDBSchema.d.ts.map +1 -0
- package/build/src/schemas/HotDBSchema.js +19 -0
- package/build/src/schemas/HotDBSchema.js.map +1 -0
- package/build/src/schemas/influx/InfluxSchema.d.ts +14 -0
- package/build/src/schemas/influx/InfluxSchema.d.ts.map +1 -0
- package/build/src/schemas/influx/InfluxSchema.js +33 -0
- package/build/src/schemas/influx/InfluxSchema.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchema.d.ts +39 -0
- package/build/src/schemas/mysql/MySQLSchema.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchema.js +151 -0
- package/build/src/schemas/mysql/MySQLSchema.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaField.d.ts +168 -0
- package/build/src/schemas/mysql/MySQLSchemaField.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaField.js +260 -0
- package/build/src/schemas/mysql/MySQLSchemaField.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.d.ts +49 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.js +310 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.js.map +1 -0
- package/build-web/HotStaq.js +2 -0
- package/build-web/HotStaq.min.js +125 -0
- package/builder/docker/Dockerfile.linux.gen +42 -0
- package/builder/docker/README.md +36 -0
- package/builder/docker/app/start.sh +8 -0
- package/builder/docker/dockerignore +3 -0
- package/builder/docker/scripts/build.bat +11 -0
- package/builder/docker/scripts/build.sh +11 -0
- package/builder/docker/scripts/start-app.bat +7 -0
- package/builder/docker/scripts/start-app.sh +7 -0
- package/builder/docker/scripts/stop-app.bat +5 -0
- package/builder/docker/scripts/stop-app.sh +5 -0
- package/builder/docker-compose/docker-compose.gen.yaml +41 -0
- package/builder/docker-compose/env-skeleton +4 -0
- package/creator/project/.vscode/launch.json +59 -0
- package/creator/project/README.md +20 -0
- package/creator/project/gitignore +118 -0
- package/creator/project/npmignore +118 -0
- package/creator/public/api-test.hott +28 -0
- package/creator/public/index.hott +12 -0
- package/creator/ts/src/AppAPI.ts +30 -0
- package/creator/ts/src/HelloWorld.ts +39 -0
- package/creator/ts/src/WebExport.ts +7 -0
- package/creator/ts/tsconfig-web.json +73 -0
- package/creator/ts/tsconfig.json +73 -0
- package/creator/ts/webpack-api.config.js +57 -0
- package/dbstart.sh +19 -0
- package/dbstop.sh +4 -0
- package/docs/.nojekyll +1 -0
- package/docs/README.md +128 -0
- package/docs/classes/Hot.md +477 -0
- package/docs/classes/HotAPI.md +369 -0
- package/docs/classes/HotClient.md +95 -0
- package/docs/classes/HotComponent.md +279 -0
- package/docs/classes/HotDB.md +247 -0
- package/docs/classes/HotDBInflux.md +404 -0
- package/docs/classes/HotDBMigration.md +80 -0
- package/docs/classes/HotDBMySQL.md +310 -0
- package/docs/classes/HotDBSchema.md +51 -0
- package/docs/classes/HotFile.md +353 -0
- package/docs/classes/HotHTTPServer.md +700 -0
- package/docs/classes/HotLog.md +162 -0
- package/docs/classes/HotPage.md +357 -0
- package/docs/classes/HotRoute.md +312 -0
- package/docs/classes/HotRouteMethod.md +271 -0
- package/docs/classes/HotServer.md +311 -0
- package/docs/classes/HotStaq.md +1153 -0
- package/docs/classes/HotTestDestination.md +58 -0
- package/docs/classes/HotTestDriver.md +332 -0
- package/docs/classes/HotTestElement.md +88 -0
- package/docs/classes/HotTestElementOptions.md +71 -0
- package/docs/classes/HotTestMap.md +92 -0
- package/docs/classes/HotTestSeleniumDriver.md +529 -0
- package/docs/classes/HotTester.md +653 -0
- package/docs/classes/HotTesterAPI.md +493 -0
- package/docs/classes/HotTesterMocha.md +843 -0
- package/docs/classes/HotTesterMochaSelenium.md +896 -0
- package/docs/classes/HotTesterServer.md +633 -0
- package/docs/classes/InfluxSchema.md +74 -0
- package/docs/classes/MySQLSchema.md +199 -0
- package/docs/classes/MySQLSchemaField.md +330 -0
- package/docs/classes/MySQLSchemaTable.md +176 -0
- package/docs/enums/ConnectionStatus.md +43 -0
- package/docs/enums/DeveloperMode.md +38 -0
- package/docs/enums/EventExecutionType.md +43 -0
- package/docs/enums/HTTPMethod.md +32 -0
- package/docs/enums/HotDBGenerationType.md +30 -0
- package/docs/enums/HotLogLevel.md +88 -0
- package/docs/interfaces/HotDBConnectionInterface.md +116 -0
- package/docs/interfaces/HotDestination.md +62 -0
- package/docs/interfaces/HotSite.md +187 -0
- package/docs/interfaces/HotSiteMapPath.md +37 -0
- package/docs/interfaces/HotSiteRoute.md +79 -0
- package/docs/interfaces/HotStartOptions.md +115 -0
- package/docs/interfaces/HotTestPage.md +44 -0
- package/docs/interfaces/HotTestStop.md +62 -0
- package/docs/interfaces/IHotComponent.md +135 -0
- package/docs/interfaces/IHotStaq.md +118 -0
- package/docs/interfaces/IHotTestElement.md +54 -0
- package/docs/interfaces/IHotTestElementOptions.md +43 -0
- package/docs/interfaces/MySQLResults.md +43 -0
- package/docs/interfaces/MySQLSchemaFieldResult.md +75 -0
- package/docs/modules.md +162 -0
- package/package.json +65 -0
- package/selenium-start.sh +7 -0
- package/selenium-stop.sh +3 -0
- package/src/Hot.ts +319 -0
- package/src/HotAPI.ts +378 -0
- package/src/HotAgentAPI.ts +43 -0
- package/src/HotAgentRoute.ts +44 -0
- package/src/HotBuilder.ts +221 -0
- package/src/HotClient.ts +40 -0
- package/src/HotComponent.ts +158 -0
- package/src/HotCreator.ts +482 -0
- package/src/HotDB.ts +79 -0
- package/src/HotDBConnectionInterface.ts +40 -0
- package/src/HotFile.ts +617 -0
- package/src/HotHTTPServer.ts +954 -0
- package/src/HotIO.ts +128 -0
- package/src/HotLog.ts +158 -0
- package/src/HotPage.ts +206 -0
- package/src/HotRoute.ts +137 -0
- package/src/HotRouteMethod.ts +216 -0
- package/src/HotServer.ts +211 -0
- package/src/HotSetAsWeb.ts +3 -0
- package/src/HotStaq.ts +1877 -0
- package/src/HotStaqWeb.ts +59 -0
- package/src/HotTestDriver.ts +172 -0
- package/src/HotTestElement.ts +97 -0
- package/src/HotTestMap.ts +130 -0
- package/src/HotTestSeleniumDriver.ts +374 -0
- package/src/HotTester.ts +697 -0
- package/src/HotTesterAPI.ts +126 -0
- package/src/HotTesterMocha.ts +133 -0
- package/src/HotTesterMochaSelenium.ts +189 -0
- package/src/HotTesterServer.ts +551 -0
- package/src/api.ts +102 -0
- package/src/cli.ts +1147 -0
- package/src/schemas/HotDBInflux.ts +211 -0
- package/src/schemas/HotDBMigration.ts +24 -0
- package/src/schemas/HotDBMySQL.ts +312 -0
- package/src/schemas/HotDBSchema.ts +21 -0
- package/src/schemas/influx/InfluxSchema.ts +19 -0
- package/src/schemas/mysql/MySQLSchema.ts +90 -0
- package/src/schemas/mysql/MySQLSchemaField.ts +408 -0
- package/src/schemas/mysql/MySQLSchemaTable.ts +353 -0
- package/tsconfig-web.json +74 -0
- package/tsconfig.json +73 -0
- package/webpack.config.js +51 -0
- package/webpack.config.tests.js +56 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.HotStaqWeb=e():t.HotStaqWeb=e()}(window,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=16)}([function(module,exports,__webpack_require__){"use strict";(function(process){var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const fs=__importStar(__webpack_require__(4)),ppath=__importStar(__webpack_require__(4)),cross_fetch_1=__importDefault(__webpack_require__(2)),validate_npm_package_name_1=__importDefault(__webpack_require__(17)),HotPage_1=__webpack_require__(10),HotFile_1=__webpack_require__(5),HotLog_1=__webpack_require__(11),Hot_1=__webpack_require__(1),HotClient_1=__webpack_require__(12),HotTesterAPI_1=__webpack_require__(13),HotTestMap_1=__webpack_require__(15);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\tnewHotClient.api = newapi;\n\t\t\tprocessor.api = newapi;",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tfunction hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\twindow.HotStaq = HotStaqWeb.HotStaq;\n\t\t\twindow.HotClient = HotStaqWeb.HotClient;\n\t\t\twindow.Hot = HotStaqWeb.Hot;\n\n\t\t\t%load_hot_site%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.None),this.publicSecrets={},this.testers={}}static parseBoolean(t){if("true"===(t=t.toLowerCase()))return!0;if("false"===t)return!1;if("yes"===t)return!0;if("no"===t)return!1;if("yep"===t)return!0;if("nah"===t)return!1;try{if(0!=parseInt(t))return!0}catch(t){}return!1}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise((e,n)=>{setTimeout(()=>{e()},t)})}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t){if(null==this.files[t])throw new Error("Unable to find file "+t);return this.files[t]}addComponent(t){this.components[t.name]=t,this.registerComponent(t)}registerComponent(t){customElements.define(t.tag,class extends HTMLElement{constructor(){super(),(()=>{__awaiter(this,void 0,void 0,(function*(){this.onclick=t.click.bind(t);for(let e in t.events){let n=t.events[e];this.addEventListener(n.type,n.func,n.options)}if(t.htmlElement=yield t.onCreated(this),null!=t.handleAttributes)yield t.handleAttributes(this.attributes);else for(let e=0;e<this.attributes.length;e++){let n=this.attributes[e],r=n.name.toLowerCase(),o=n.value;"id"===r&&(t.name=o),"name"===r&&(t.name=o),"value"===r&&(t.value=o)}let e=yield t.output(),n=(new DOMParser).parseFromString(e,"text/html"),r=this.attachShadow({mode:"open"});for(let t=0;t<n.body.children.length;t++){let e=n.body.children[t];r.appendChild(e)}}))})()}},t.elementOptions)}getComponent(t){return this.components[t]}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=(new DOMParser).parseFromString(e,"text/html"),r=[];for(let e=0;e<t.body.children.length;e++){let o=t.body.children[e];r.push(n.appendChild(o))}return r}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t);return null!=n.errors&&n.errors.length>0&&(()=>{if(!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`)})(),!0}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";if(!0===HotStaq.isWeb){this.logger.info("Retrieving HotSite "+path);let t=yield(0,cross_fetch_1.default)(path);this.logger.info("Retrieved site "+path),jsonStr=t.text()}else path=ppath.normalize(path),this.logger.info("Retrieving HotSite "+path),jsonStr=yield new Promise((t,e)=>{fs.readFile(path,(e,n)=>{if(null!=e)throw e;let r=n.toString();this.logger.info("Retrieved site "+path),t(r)})});this.hotSite=JSON.parse(jsonStr),HotStaq.checkHotSiteName(this.hotSite.name,!0),this.hotSite.hotsitePath=path;let routes=this.hotSite.routes,testerUrl="http://127.0.0.1:8182",tester=null,driver=null;if(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development&&null!=this.hotSite.testing){let t=t=>{let e=!0;null!=t.createNewTester&&(e=t.createNewTester);let n="Tester";null!=t.tester&&(n=t.tester),null!=t.testerName&&(n=t.testerName),!0===e?(HotTesterMocha=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTesterMocha'");throw t.code="MODULE_NOT_FOUND",t}()).HotTesterMocha,HotTesterMochaSelenium=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTesterMochaSelenium'");throw t.code="MODULE_NOT_FOUND",t}()).HotTesterMochaSelenium,HotTestSeleniumDriver=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTestSeleniumDriver'");throw t.code="MODULE_NOT_FOUND",t}()).HotTestSeleniumDriver,""===t.testerAPIUrl&&(testerUrl=t.testerAPIUrl),"HotTestSeleniumDriver"===t.driver&&(driver=new HotTestSeleniumDriver),"HotTesterMocha"===t.tester&&(tester=new HotTesterMocha(this,n,testerUrl,driver)),"HotTesterMochaSelenium"===t.tester&&(tester=new HotTesterMochaSelenium(this,n,testerUrl))):tester=this.testers[n]};null!=this.hotSite.testing.web&&t(this.hotSite.testing.web),null!=this.hotSite.testing.api&&t(this.hotSite.testing.api)}if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestMap_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestMap_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development)){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestMap_1.HotTestDestination(n))}if(null==tester)throw new Error("A tester was not created first! You must specify one in the CLI or in HotSite.json.");tester.testMaps[n]=r}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,cross_fetch_1.default)(componentUrl),newComponent=eval(res);this.addComponent(newComponent)}null==this.hotSite.routes&&(this.hotSite.routes={}),yield this.loadHotFiles(this.hotSite.files),null!=tester&&this.addTester(tester)}))}loadHotFiles(t,e=!1){return __awaiter(this,void 0,void 0,(function*(){for(let n in t){let r=t[n],o=null;o=(HotStaq.isWeb,new HotFile_1.HotFile({name:n})),null!=r.url&&(o.url=r.url),!1===HotStaq.isWeb&&null!=r.localFile&&(o.localFile=r.localFile);let i=!0;null!=r.content&&(o.content=r.content,i=!1),!0===e&&(i=!0),!0===i&&(yield o.load()),this.addFile(o)}}))}generateContent(t,e="",n="./",r="./js/HotStaq.js",o=!0,i=null){let s="",a="",l="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){s+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),a+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error("Unable to find API "+e.api);let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;s+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),a+=r}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicSecrets)for(let t in this.hotSite.publicSecrets){let e=this.hotSite.publicSecrets[t],n=void 0;if("string"==typeof e)n=JSON.stringify(e);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=e.passSecretFromAPI&&(n=JSON.stringify(r.secrets[t]))}if(null!=e.env){const t=e.env;n=JSON.stringify(process.env[t])}}l+=`processor.publicSecrets["${t}"] = ${n};\n`}}let u=this.pageContent;return u=(u=>{let c="",h="";this.mode===Hot_1.DeveloperMode.Development&&(c="tempMode = HotStaqWeb.DeveloperMode.Development;",h=this.testerApiContent,null!=this.hotSite&&null!=this.hotSite.testing&&(null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),h=h.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=`"${e.url}"`,r="";if(""!==e.content){let t=JSON.stringify(e.content);t=t.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),t=t.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=', "content": '+t}p+=`\t\t\tfiles["${t}"] = { "url": ${n}${r} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===o&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=i&&(u=u.replace(/\%args\%/g,JSON.stringify(i)));let d=t,f="",m="",g="Tester";if(null!=this.hotSite&&(null!=this.hotSite.testing&&(null!=this.hotSite.testing.web.tester&&(g=this.hotSite.testing.web.tester),null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])){d=this.hotSite.routes[t].name}return u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,c)).replace(/\%tester\_api\%/g,h)).replace(/\%apis\_to\_load\%/g,s)).replace(/\%load\_hot\_site\%/g,"")).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,a)).replace(/\%public\_secrets\%/g,l)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})(u),u}createExpressRoutes(t,e="./js/HotStaq.js"){for(let n in this.pages){let r=this.pages[n];const o=this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,(t,e)=>{e.send(o)})}}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes){if(this.hotSite.routes[n].name===t){e=n;break}}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let i=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(i),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t,e,n,r=null){return __awaiter(this,void 0,void 0,(function*(){let o=new HotFile_1.HotFile({content:e});yield o.load();let i=new HotPage_1.HotPage({processor:t,name:n,files:[o]});return t.addPage(i),yield t.process(n,r)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){document.open(),document.write(t),document.close()}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise((o,i)=>{HotStaq.onReady(()=>__awaiter(this,void 0,void 0,(function*(){let i={url:""};if(i.name=null==e?"string"==typeof t?t:t.name:e,""===i.name&&(i.name="string"==typeof t?t:t.name),"string"==typeof t?i.url=t:(i.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(i.testerMap=t.testerMap),null!=t.testerName&&(i.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(i.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),n.mode===Hot_1.DeveloperMode.Development&&null==n.testerAPI){null==i.testerAPIBaseUrl&&(i.testerAPIBaseUrl=""),""===i.testerAPIBaseUrl&&(i.testerAPIBaseUrl="http://127.0.0.1:8182");let t=new HotClient_1.HotClient(n),e=new HotTesterAPI_1.HotTesterAPI(i.testerAPIBaseUrl,t);e.connection.api=e,n.testerAPI=e}i.processor=n,i.args=r;let s=yield HotStaq.processUrl(i);n.mode===Hot_1.DeveloperMode.Development&&(s+='<script type = "text/javascript">\n\tfunction hotstaq_isDocumentReady ()\n\t{\n\t\tif (window["Hot"] != null)\n\t\t{\n\t\t\tif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n\t\t\t{\n\t\t\t\tlet func = function ()\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Hot.TesterAPI != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet testPaths = {};\n\t\t\t\t\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\t\t\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\t\t\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\t\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\t\t\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t\t\t\t\t}).then (function (resp)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\tif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\t\t\t\t\tfunc ();\n\t\t\t\telse\n\t\t\t\t\tdocument.addEventListener ("DOMContentLoaded", func);\n\t\t\t}\n\t\t}\n\t}\n\n\thotstaq_isDocumentReady ();\n<\/script>'),HotStaq.useOutput(s),o(n)})))})}))}static displayContent(t,e,n=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise((r,o)=>{HotStaq.onReady(()=>__awaiter(this,void 0,void 0,(function*(){null==n&&(n=new HotStaq);let o=yield HotStaq.processContent(n,t,e);HotStaq.useOutput(o),r(n)})))})}))}}exports.HotStaq=HotStaq,HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null}).call(this,__webpack_require__(9))},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const i=n(5),s=n(0),a=n(6),l=o(n(19)),u=o(n(2));var c;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(c=e.DeveloperMode||(e.DeveloperMode={}));class h{static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===s.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hpserve=nahfam")}h.echo(yield h.getFile(t,e))}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=h.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);h.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;return"string"==typeof t?(n=new i.HotFile,!0===s.HotStaq.isWeb?n.url=t:n.localFile=t):n=t,yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n="POST"){return r(this,void 0,void 0,(function*(){let r=null;if(null==h.CurrentPage)throw new Error("Current page is null!");if(null==h.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==h.CurrentPage.processor.api)throw new Error("Current page's processor api is null!");return null!=h.CurrentPage.processor.api&&(r=yield h.CurrentPage.processor.api.call(t,e,n)),r}))}static jsonRequest(t,e=null,n="POST"){return r(this,void 0,void 0,(function*(){try{let r=yield(0,u.default)(t,{method:n,headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(e)});if(!1===r.ok)throw new Error(`${r.status}: ${r.statusText}`);return yield r.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return r(this,void 0,void 0,(function*(){return yield(0,u.default)(t,e)}))}static echo(t){h.Output+=t}static displayCSS(){for(let t=0;t<h.CSS.length;t++){let e=h.CSS[t],n=h.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),h.echo(n)}}static displayJSFiles(){for(let t=0;t<h.JSFiles.length;t++){let e=h.JSFiles[t],n=h.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),h.echo(n)}}static displayJSScripts(){for(let t=0;t<h.JSScripts.length;t++){let e=h.JSScripts[t],n=h.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),h.echo(n)}}}e.Hot=h,h.CurrentPage=null,h.Arguments=null,h.DeveloperMode=c,h.HotTestElement=a.HotTestElement,h.Mode=c.Production,h.API=null,h.TesterAPI=null,h.Output="",h.Data={},h.Cookies=l.default,h.PublicSecrets={},h.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',h.CSS=[],h.JSFiles=[],h.JSScripts=[],h.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',h.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},function(t,e){var n="undefined"!=typeof self?self:this,r=function(){function t(){this.fetch=!1,this.DOMException=n.DOMException}return t.prototype=n,new t}();!function(t){!function(e){var n="URLSearchParams"in t,r="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,s="ArrayBuffer"in t;if(s)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],l=ArrayBuffer.isView||function(t){return t&&a.indexOf(Object.prototype.toString.call(t))>-1};function u(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function c(t){return"string"!=typeof t&&(t=String(t)),t}function h(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function d(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function f(t){return new Promise((function(e,n){t.onload=function(){e(t.result)},t.onerror=function(){n(t.error)}}))}function m(t){var e=new FileReader,n=f(e);return e.readAsArrayBuffer(t),n}function g(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function y(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:n&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():s&&o&&((e=t)&&DataView.prototype.isPrototypeOf(e))?(this._bodyArrayBuffer=g(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):s&&(ArrayBuffer.prototype.isPrototypeOf(t)||l(t))?this._bodyArrayBuffer=g(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=d(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?d(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var t,e,n,r=d(this);if(r)return r;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,n=f(e),e.readAsText(t),n;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),n=new Array(e.length),r=0;r<e.length;r++)n[r]=String.fromCharCode(e[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}p.prototype.append=function(t,e){t=u(t),e=c(e);var n=this.map[t];this.map[t]=n?n+", "+e:e},p.prototype.delete=function(t){delete this.map[u(t)]},p.prototype.get=function(t){return t=u(t),this.has(t)?this.map[t]:null},p.prototype.has=function(t){return this.map.hasOwnProperty(u(t))},p.prototype.set=function(t,e){this.map[u(t)]=c(e)},p.prototype.forEach=function(t,e){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(e,this.map[n],n,this)},p.prototype.keys=function(){var t=[];return this.forEach((function(e,n){t.push(n)})),h(t)},p.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),h(t)},p.prototype.entries=function(){var t=[];return this.forEach((function(e,n){t.push([n,e])})),h(t)},r&&(p.prototype[Symbol.iterator]=p.prototype.entries);var v=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function b(t,e){var n,r,o=(e=e||{}).body;if(t instanceof b){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new p(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,o||null==t._bodyInit||(o=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new p(e.headers)),this.method=(n=e.method||this.method||"GET",r=n.toUpperCase(),v.indexOf(r)>-1?r:n),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function w(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var n=t.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");e.append(decodeURIComponent(r),decodeURIComponent(o))}})),e}function _(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}b.prototype.clone=function(){return new b(this,{body:this._bodyInit})},y.call(b.prototype),y.call(_.prototype),_.prototype.clone=function(){return new _(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},_.error=function(){var t=new _(null,{status:0,statusText:""});return t.type="error",t};var H=[301,302,303,307,308];_.redirect=function(t,e){if(-1===H.indexOf(e))throw new RangeError("Invalid status code");return new _(null,{status:e,headers:{location:t}})},e.DOMException=t.DOMException;try{new e.DOMException}catch(t){e.DOMException=function(t,e){this.message=t,this.name=e;var n=Error(t);this.stack=n.stack},e.DOMException.prototype=Object.create(Error.prototype),e.DOMException.prototype.constructor=e.DOMException}function P(t,n){return new Promise((function(r,i){var s=new b(t,n);if(s.signal&&s.signal.aborted)return i(new e.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function l(){a.abort()}a.onload=function(){var t,e,n={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var n=t.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();e.append(r,o)}})),e)};n.url="responseURL"in a?a.responseURL:n.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;r(new _(o,n))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.onabort=function(){i(new e.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),s.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),s.signal&&(s.signal.addEventListener("abort",l),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",l)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}P.polyfill=!0,t.fetch||(t.fetch=P,t.Headers=p,t.Request=b,t.Response=_),e.Headers=p,e.Request=b,e.Response=_,e.fetch=P,Object.defineProperty(e,"__esModule",{value:!0})}({})}(r),r.fetch.ponyfill=!0,delete r.fetch.polyfill;var o=r;(e=o.fetch).default=o.fetch,e.fetch=o.fetch,e.Headers=o.Headers,e.Request=o.Request,e.Response=o.Response,t.exports=e},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(0);var i;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets"}(i=e.HotServerType||(e.HotServerType={}));e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:80,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=i.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:80,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||i.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},function(t,e){},function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},s=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const l=i(n(4)),u=a(n(2)),c=n(1);class h{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return s(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return s(this,void 0,void 0,(function*(){return this.content=yield h.httpGet(this.url),this.content}))}loadLocalFile(){return s(this,void 0,void 0,(function*(){return new Promise((t,e)=>{l.readFile(this.localFile,(e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)})})}))}load(){return s(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,i=2){let s=e.exec(t),a=0,l="";for(;null!=s;){let u=s.index-o,c=e.lastIndex+i,h=t.substr(a,u-a);a=c,l+=r(h),l+=n(s[0]),s=e.exec(t)}return l+=r(t.substr(a)),l}static processNestedContent(t,e,n,r,o,i,s=2,a=1){let l=t.indexOf(e),u=0,c=t.indexOf(r,l),h="";for(;l>-1;){let p=t.indexOf(n,l),d=0;if(""!==r){let e=t.lastIndexOf(r,p-a);for(;e>-1&&e!==c;)e=t.lastIndexOf(r,e-a),d++}if(d>0){let r=t.indexOf(n,p+a),o=r;for(;r>-1&&d>0&&!(o<0);){if(t.lastIndexOf(e,o-a)>r)break;r=o,o=t.indexOf(n,r+a),d--}p=r}h+=i(t.substr(u,l-u)),h+=o(t.substr(l+s,p-(l+s))),l=t.indexOf(e,p+a),c=t.indexOf(r,l),u=p+a}return h+=i(t.substr(u)),h}process(t=null){return s(this,void 0,void 0,(function*(){let e="",n=this.content;c.Hot.Mode=this.page.processor.mode,c.Hot.Arguments=t,c.Hot.CurrentPage=this.page,c.Hot.PublicSecrets=this.page.processor.publicSecrets,c.Hot.API=this.page.getAPI(),c.Hot.TesterAPI=this.page.getTesterAPI(),e=h.processContent(n,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),t=>""+(t=t.substr(2)),t=>{if(""===t)return"";let e=h.processNestedContent(t,"!{","}","{",t=>`*&&%*%@#@!${t}*&!#%@!@*!`,t=>t),n=h.processNestedContent(e,"STR{","}","{",t=>`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${this.throwAllErrors});*&!#%@!@*!`,t=>t,4,1),r=h.processNestedContent(n,"${","}","{",t=>{let e=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo ("");}*&!#%@!@*!`;return!0===this.throwAllErrors&&(e=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`),e},t=>t),o="";c.Hot.Mode===c.DeveloperMode.Production&&(o=h.processNestedContent(r,"?(",")","(",t=>"",t=>t)),c.Hot.Mode===c.DeveloperMode.Development&&(o=h.processNestedContent(r,"?(",")","(",t=>{let e="";try{JSON.parse(t),e=JSON.stringify(t)}catch(n){e=""+t}return`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`},t=>t));let i=h.processNestedContent(o,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",t=>t,t=>`echoOutput (${JSON.stringify(t)}, ${this.throwAllErrors});\n`,"*&&%*%@#@!".length,"*&!#%@!@*!".length);return i=i.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),i=i.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),i},0);let r=null;try{let n="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let e in t){let r="",o=t[e];r=`var ${e} = ${JSON.stringify(o)};\n`,n+=r}let o=this.name;""===o&&(o=this.localFile),""===o&&(o=this.url),n+='\n\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',n+=e,n+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let i=new Function(n);r=yield i.apply(this,[c.Hot,this])}catch(t){throw SyntaxError,t}c.Hot.Data=r.hot.Data;let o=r.output;return c.Hot.Output="",o}))}}e.HotFile=h},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0;e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}};e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(8);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:o.createError("Not authorized.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=r.HTTPMethod.POST,o=null){"string"==typeof t&&(t=new r.HotRouteMethod(this,t,e,n,null,null,null,o)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.HTTPMethod=void 0;const r=n(1),o=n(3);var i;!function(t){t.GET="get",t.POST="post"}(i=e.HTTPMethod||(e.HTTPMethod={}));e.HotRouteMethod=class{constructor(t,e,n=null,s=i.POST,a=null,l=null,u=null,c=null){if(this.parentRoute=t,this.name=e,this.type=s,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=u,this.onServerAuthorize=a,this.onRegister=l,this.testCases={},this.parentRoute.connection.processor.mode===r.DeveloperMode.Development&&null!=c)for(let t=0;t<c.length;t++){let e=c[t];if("string"==typeof e){const n=e,r=c[t+1];this.addTestCase(n,r),t++}else this.addTestCase(e)}this.parentRoute.connection instanceof o.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.parentRoute.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}}},function(t,e){var n,r,o=t.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(n===setTimeout)return setTimeout(t,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(t){n=i}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(t){r=s}}();var l,u=[],c=!1,h=-1;function p(){c&&l&&(c=!1,l.length?u=l.concat(u):h=-1,u.length&&d())}function d(){if(!c){var t=a(p);c=!0;for(var e=u.length;e;){for(l=u,u=[];++h<e;)l&&l[h].run();h=-1,e=u.length}l=null,c=!1,function(t){if(r===clearTimeout)return clearTimeout(t);if((r===s||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(t);try{r(t)}catch(e){try{return r.call(null,t)}catch(e){return r.call(this,t)}}}(t)}}function f(t,e){this.fun=t,this.array=e}function m(){}o.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];u.push(new f(t,e)),1!==u.length||c||a(d)},f.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=m,o.addListener=m,o.once=m,o.off=m,o.removeListener=m,o.removeAllListeners=m,o.emit=m,o.prependListener=m,o.prependOnceListener=m,o.listeners=function(t){return[]},o.binding=function(t){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(t){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(1),i=n(0);e.HotPage=class{constructor(t){t instanceof i.HotStaq?(this.processor=t,this.name="",this.testerName="",this.testerMap="",this.route="",this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"",this.testerMap=t.testerMap||"",this.route=t.route||"",this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},function(t,e,n){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(r=e.HotLogLevel||(e.HotLogLevel={}));e.HotLog=class{constructor(t=r.All){this.logLevel=t}log(t,e){this.logLevel===r.Verbose&&(t===r.Error&&this.error(e),t===r.Warning&&this.warning(e),t!==r.Info&&t!==r.Verbose||this.info(e)),this.logLevel===r.All&&(t===r.Error&&this.error(e),t===r.Warning&&this.warning(e),t===r.Info&&this.info(e)),this.logLevel===r.Error&&t===r.Error&&this.error(e),this.logLevel===r.Warning&&t===r.Warning&&this.warning(e),this.logLevel===r.Info&&t===r.Info&&this.info(e)}verbose(t){this.logLevel===r.Verbose&&console.info(t)}info(t){this.logLevel!==r.All&&this.logLevel!==r.Verbose&&this.logLevel!==r.Info||console.info(t)}warning(t){this.logLevel!==r.All&&this.logLevel!==r.Verbose&&this.logLevel!==r.Warning||console.warn(t)}error(t){if(this.logLevel===r.All||this.logLevel===r.Verbose||this.logLevel===r.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(3);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(14),HotRoute_1=__webpack_require__(7);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod("pageLoaded",this.pageLoaded),r.addMethod("executeTests",this.executeTests),this.addRoute(r)}pageLoaded(req,res,authorizedValue,jsonObj,queryObj){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:jsonObj.testerName,testerMap:jsonObj.testerMap,pageName:jsonObj.pageName,testElements:jsonObj.testElements,testPathsStrs:jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerMap} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t,e,n,r,o){return __awaiter(this,void 0,void 0,(function*(){let t=r.testerName,e=r.testerMap;if(null==t||null==e)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===t||""===e)throw new Error("TesterAPI: Not all required json objects were passed.");let n=this.connection;return null!=n.executeTests&&(yield n.executeTests(t,e)),!0}))}}exports.HotTesterAPI=HotTesterAPI},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const i=o(n(2)),s=n(3),a=n(7),l=n(8);var u;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(u=e.EventExecutionType||(e.EventExecutionType={}));e.HotAPI=class{constructor(t,e=null,n=null){this.connection=e,this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=u.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";if(t instanceof a.HotRoute?(r=t.route,this.routes[t.route]=t):(r=t,null==this.routes[r]&&(this.routes[r]=new a.HotRoute(this.connection,r)),e instanceof l.HotRouteMethod?this.routes[r].addMethod(e):this.routes[r].addMethod(new l.HotRouteMethod(this.routes[r],e,n))),this.routes[r].connection=this.connection,!0===this.createFunctions){let t=this[r];null==t&&(t={});for(let e=0;e<this.routes[r].methods.length;e++){let n=this.routes[r],o=this.routes[r].methods[e];t[o.name]=t=>{let e=o.type,r="";""!==n.version&&(r+="/"+n.version),""!==n.route&&(r+="/"+n.route),""!==o.name&&(r+="/"+o.name);let i=null;if(null!=this.authCredentials&&(i=this.authCredentials),null!=o.authCredentials?i=o.authCredentials:null!=o.parentRoute.authCredentials&&(i=o.parentRoute.authCredentials),null==i&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(i=Hot.API[n.route].authCredentials),null!=i)for(let e in i){let n=i[e];null==t[e]&&(t[e]=n)}let s=[r,t,e];return this.call.apply(this,s)}}this[r]=t}}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof s.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}call(t,e,n="POST"){return r(this,void 0,void 0,(function*(){let r=this.baseUrl;"/"===r[r.length-1]&&(r=r.substr(0,r.length-1)),"/"!==t[0]&&(r+="/"),r+=t;let o={method:n=n.toUpperCase(),headers:{Accept:"application/json","Content-Type":"application/json"}};"GET"!==n&&"HEAD"!==n&&(o.body=JSON.stringify(e));let s=null;try{s=yield(0,i.default)(r,o)}catch(t){throw t}return yield s.json()}))}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=e.HotTestDestination=void 0;class r{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof r?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=r;e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r(n)}}this.destinationOrder=n,this.pages=e}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=e.IHotTestElementOptions=e.HotTestElementOptions=e.IHotTestElement=e.HotTestElement=e.HotTestPage=e.HotTestPath=e.HotTestDestination=e.HotTestMap=e.HotTesterAPI=e.HotTester=e.HotClient=e.HotServer=e.ServerExecutionFunction=e.ServerAuthorizationFunction=e.HTTPMethod=e.HotRouteMethod=e.HotRoute=e.HotPage=e.HotLog=e.HotFile=e.EventExecutionType=e.HotAPI=e.IHotComponent=e.HotComponent=e.DeveloperMode=e.Hot=e.HotSiteMapPath=e.HotSiteRoute=e.HotSite=e.IHotStaq=e.HotStartOptions=e.HotStaq=void 0;const r=n(0);Object.defineProperty(e,"HotStaq",{enumerable:!0,get:function(){return r.HotStaq}}),Object.defineProperty(e,"IHotStaq",{enumerable:!0,get:function(){return r.IHotStaq}}),Object.defineProperty(e,"HotStartOptions",{enumerable:!0,get:function(){return r.HotStartOptions}}),Object.defineProperty(e,"HotSite",{enumerable:!0,get:function(){return r.HotSite}}),Object.defineProperty(e,"HotSiteRoute",{enumerable:!0,get:function(){return r.HotSiteRoute}}),Object.defineProperty(e,"HotSiteMapPath",{enumerable:!0,get:function(){return r.HotSiteMapPath}});const o=n(1);Object.defineProperty(e,"Hot",{enumerable:!0,get:function(){return o.Hot}}),Object.defineProperty(e,"DeveloperMode",{enumerable:!0,get:function(){return o.DeveloperMode}});const i=n(20);Object.defineProperty(e,"HotComponent",{enumerable:!0,get:function(){return i.HotComponent}}),Object.defineProperty(e,"IHotComponent",{enumerable:!0,get:function(){return i.IHotComponent}});const s=n(5);Object.defineProperty(e,"HotFile",{enumerable:!0,get:function(){return s.HotFile}});const a=n(11);Object.defineProperty(e,"HotLog",{enumerable:!0,get:function(){return a.HotLog}});const l=n(10);Object.defineProperty(e,"HotPage",{enumerable:!0,get:function(){return l.HotPage}});const u=n(7);Object.defineProperty(e,"HotRoute",{enumerable:!0,get:function(){return u.HotRoute}});const c=n(14);Object.defineProperty(e,"HotAPI",{enumerable:!0,get:function(){return c.HotAPI}}),Object.defineProperty(e,"EventExecutionType",{enumerable:!0,get:function(){return c.EventExecutionType}});const h=n(8);Object.defineProperty(e,"HotRouteMethod",{enumerable:!0,get:function(){return h.HotRouteMethod}}),Object.defineProperty(e,"HTTPMethod",{enumerable:!0,get:function(){return h.HTTPMethod}}),Object.defineProperty(e,"ServerAuthorizationFunction",{enumerable:!0,get:function(){return h.ServerAuthorizationFunction}}),Object.defineProperty(e,"ServerExecutionFunction",{enumerable:!0,get:function(){return h.ServerExecutionFunction}});const p=n(3);Object.defineProperty(e,"HotServer",{enumerable:!0,get:function(){return p.HotServer}});const d=n(12);Object.defineProperty(e,"HotClient",{enumerable:!0,get:function(){return d.HotClient}});const f=n(21);Object.defineProperty(e,"HotTester",{enumerable:!0,get:function(){return f.HotTester}});const m=n(13);Object.defineProperty(e,"HotTesterAPI",{enumerable:!0,get:function(){return m.HotTesterAPI}});const g=n(15);Object.defineProperty(e,"HotTestMap",{enumerable:!0,get:function(){return g.HotTestMap}}),Object.defineProperty(e,"HotTestDestination",{enumerable:!0,get:function(){return g.HotTestDestination}}),Object.defineProperty(e,"HotTestPath",{enumerable:!0,get:function(){return g.HotTestPath}}),Object.defineProperty(e,"HotTestPage",{enumerable:!0,get:function(){return g.HotTestPage}});const y=n(6);Object.defineProperty(e,"IHotTestElement",{enumerable:!0,get:function(){return y.IHotTestElement}}),Object.defineProperty(e,"HotTestElement",{enumerable:!0,get:function(){return y.HotTestElement}}),Object.defineProperty(e,"HotTestElementOptions",{enumerable:!0,get:function(){return y.HotTestElementOptions}}),Object.defineProperty(e,"IHotTestElementOptions",{enumerable:!0,get:function(){return y.IHotTestElementOptions}});const v=n(22);Object.defineProperty(e,"HotTestDriver",{enumerable:!0,get:function(){return v.HotTestDriver}}),r.HotStaq.isWeb=!0},function(t,e,n){"use strict";var r=new RegExp("^(?:@([^/]+?)[/])?([^/]+?)$"),o=n(18),i=["node_modules","favicon.ico"];(t.exports=function(t){var e=[],n=[];if(null===t)return n.push("name cannot be null"),s(e,n);if(void 0===t)return n.push("name cannot be undefined"),s(e,n);if("string"!=typeof t)return n.push("name must be a string"),s(e,n);if(t.length||n.push("name length must be greater than zero"),t.match(/^\./)&&n.push("name cannot start with a period"),t.match(/^_/)&&n.push("name cannot start with an underscore"),t.trim()!==t&&n.push("name cannot contain leading or trailing spaces"),i.forEach((function(e){t.toLowerCase()===e&&n.push(e+" is a blacklisted name")})),o.forEach((function(n){t.toLowerCase()===n&&e.push(n+" is a core module name")})),t.length>214&&e.push("name can no longer contain more than 214 characters"),t.toLowerCase()!==t&&e.push("name can no longer contain capital letters"),/[~'!()*]/.test(t.split("/").slice(-1)[0])&&e.push('name can no longer contain special characters ("~\'!()*")'),encodeURIComponent(t)!==t){var a=t.match(r);if(a){var l=a[1],u=a[2];if(encodeURIComponent(l)===l&&encodeURIComponent(u)===u)return s(e,n)}n.push("name can only contain URL-friendly characters")}return s(e,n)}).scopedPackagePattern=r;var s=function(t,e){var n={validForNewPackages:0===e.length&&0===t.length,validForOldPackages:0===e.length,warnings:t,errors:e};return n.warnings.length||delete n.warnings,n.errors.length||delete n.errors,n}},function(t){t.exports=JSON.parse('["assert","buffer","child_process","cluster","console","constants","crypto","dgram","dns","domain","events","fs","http","https","module","net","os","path","process","punycode","querystring","readline","repl","stream","string_decoder","timers","tls","tty","url","util","v8","vm","zlib"]')},function(t,e,n){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,i){if("undefined"!=typeof document){"number"==typeof(i=t({},r,i)).expires&&(i.expires=new Date(Date.now()+864e5*i.expires)),i.expires&&(i.expires=i.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var s="";for(var a in i)i[a]&&(s+="; "+a,!0!==i[a]&&(s+="="+i[a].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+s}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var i=e[o].split("="),s=i.slice(1).join("=");try{var a=decodeURIComponent(i[0]);if(r[a]=n.read(s,a),t===a)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const o=n(0);e.HotComponent=class{constructor(t,e=null){t instanceof o.HotStaq?(this.processor=t,this.htmlElement=null,this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.type="",this.value=null,this.events={}):(this.processor=t.processor,this.htmlElement=t.htmlElement||null,this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.type=t.type||"",this.value=t.value||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return r(this,void 0,void 0,(function*(){return t}))}}},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(0);class i{constructor(t,e,n,r,o={}){this.processor=t,this.name=e,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0],i=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.page=i(o,"page:"),n.api=i(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=i(e,"dest:"),o.cmd=i(e,"cmd:"),o.path=i(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,i=!1){return r(this,void 0,void 0,(function*(){let r=!0;!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,i));let s=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);s=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,s,i)),s}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,i=n.getMethod(o),s=t.paths[r+1].path,a=yield this.executeTestAPIPath(t,i,s);e.push(a)}return e}))}executeTestPagePath(t,e,n=!1,o=!1){return r(this,void 0,void 0,(function*(){let r=!0,i=this.testMaps[t.mapName];if(null==i)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);let s=i.pages[t.page];if(null==s)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=s;let a=e.path,l=s.testPaths[a];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,s,e,o));let u=null;if(!0===r){if(null==l)throw new Error(`HotTester: Test path ${a} does not have a function!`);u=yield l(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,l,u,o)),u}))}executeCommand(t,e,n,i){return r(this,void 0,void 0,(function*(){let s=(t,e,r)=>{let o=!1;n.cmd===e&&(o=!0);const i=n.cmd.indexOf("(");if(i>-1){n.cmd.substr(0,i)===e&&(o=!0)}return o},a=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},l=null,u=[];if(!0===s(n.cmd,"waitForTesterAPIData")&&(l=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===s(n.cmd,"wait")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===s(n.cmd,"url")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.navigateToUrl(e)}))),!0===s(n.cmd,"print")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===s(n.cmd,"println")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===s(n.cmd,"waitForTestObject")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield this.driver.waitForTestElement(e)}))),null==l)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,i,u,l)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let s=t.paths[o],a=null,l=r.pages[t.page];if(null==l)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==s.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[s.dest],n=i.interpretDestination(t.mapName,e);a=yield this.executeTestPagePaths(n)}""!==s.cmd&&(yield this.executeCommand(t,l,s,s.cmd)),""!==s.path&&(a=yield this.executeTestPagePath(t,s,!1,e)),n.push(a)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);let n=this.processor.getRouteKeyFromName(t),o="";""!==n&&(o=`${this.baseUrl}${n}`);let s=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1===e.autoStart)return;let r=i.interpretDestination(t,e),s=!1,a=!0;""!==r.page&&(s=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(s,o,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(a=yield this.onTestStart(r,o,n)),!0===a&&(""!==r.page&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield s(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let r=e.destinationOrder[n],o=e.destinations[r];if(null==o)throw new Error(`HotTester: Destination ${r} does not exist!`);t.push(r),yield s(o,r)}for(let n in e.destinations){let r=!0;for(let e=0;e<t.length;e++){if(t[e]===n){r=!1;break}}if(!0===r){let t=e.destinations[n];yield s(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield s(n,t)}}))}}e.HotTester=i},function(t,e,n){"use strict";(function(t){var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0;const o=n(6);e.HotTestDriver=class{constructor(t=null){this.page=t}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let r=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(r=t=t.replace(/\>/,"")),r}wait(t){return r(this,void 0,void 0,(function*(){return yield new Promise((e,n)=>{setTimeout(()=>{e()},t)})}))}print(e){return r(this,void 0,void 0,(function*(){t.stdout.write(e)}))}println(t){return r(this,void 0,void 0,(function*(){yield this.print(t+"\n")}))}assert(t,e=""){return r(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}run(t){return r(this,void 0,void 0,(function*(){let e=[];for(let n=0;n<t.length;n++){let r=t[n],i=null,s="",a="";if("string"==typeof r){if(i=this.page.testElements[r],null==i)throw new Error("HotTestDriver: Unable to find test element "+r);s=i.func,a=i.value}if(r instanceof Array){let t=r[0];i=this.page.testElements[t],null==i?(i=new o.HotTestElement(t),s=r[1],a=r[2]):(s=i.func,a=i.value,r.length>1&&(s=r[1]),r.length>2&&(a=r[2]))}i.func=s,i.value=a,e.push(yield this.runCommand(i))}return e}))}}}).call(this,n(9))}])}));
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2Nyb3NzLWZldGNoL2Rpc3QvYnJvd3Nlci1wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFNlcnZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEZpbGUudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RWxlbWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Um91dGVNZXRob2QudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RQYWdlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TG9nLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q2xpZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdGVyQVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdE1hcC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXFXZWIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy92YWxpZGF0ZS1ucG0tcGFja2FnZS1uYW1lL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdGVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERyaXZlci50cyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJ3aW5kb3ciLCJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiSG90VGVzdGVyTW9jaGEiLCJIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtIiwiSG90VGVzdFNlbGVuaXVtRHJpdmVyIiwiSG90U3RhcSIsImNvcHkiLCJ0aGlzIiwiYXBpIiwidGVzdGVyQVBJIiwiRGV2ZWxvcGVyTW9kZSIsIlByb2R1Y3Rpb24iLCJwYWdlcyIsImNvbXBvbmVudHMiLCJmaWxlcyIsImhvdFNpdGUiLCJhcGlDb250ZW50IiwidGVzdGVyQXBpQ29udGVudCIsInBhZ2VDb250ZW50IiwibG9nZ2VyIiwiSG90TG9nIiwiSG90TG9nTGV2ZWwiLCJOb25lIiwicHVibGljU2VjcmV0cyIsInRlc3RlcnMiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlSW50IiwiZXgiLCJvYmpXaXRoUGFyYW0iLCJyZXF1aXJlZCIsInRocm93RXhjZXB0aW9uIiwiRXJyb3IiLCJkZWZhdWx0VmFsdWUiLCJudW1NaWxsaXNlY29uZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwYWdlIiwicGFnZU5hbWUiLCJmaWxlIiwibG9jYWxGaWxlIiwidXJsIiwiY29tcG9uZW50IiwicmVnaXN0ZXJDb21wb25lbnQiLCJjdXN0b21FbGVtZW50cyIsInRhZyIsIkhUTUxFbGVtZW50Iiwic3VwZXIiLCJvbmNsaWNrIiwiY2xpY2siLCJldmVudHMiLCJldmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0eXBlIiwiZnVuYyIsIm9wdGlvbnMiLCJodG1sRWxlbWVudCIsIm9uQ3JlYXRlZCIsImhhbmRsZUF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwiaUlkeCIsImxlbmd0aCIsImF0dHIiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsInN0ciIsIm91dHB1dCIsIm5ld0RPTSIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInNoYWRvdyIsImF0dGFjaFNoYWRvdyIsImJvZHkiLCJjaGlsZHJlbiIsImNoaWxkIiwiYXBwZW5kQ2hpbGQiLCJlbGVtZW50T3B0aW9ucyIsInBhcmVudCIsImh0bWwiLCJmb3VuZFBhcmVudCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsInJlc3VsdCIsInJlc3VsdHMiLCJwdXNoIiwiaG90c2l0ZU5hbWUiLCJlcnJvcnMiLCJ0aHJvd1RoZUV4Y2VwdGlvbiIsInJlcGxhY2UiLCJSZWdFeHAiLCJob3RzaXRlIiwicGFyYW1zIiwicHJldlZhbHVlIiwicGFyYW0iLCJwYXRoIiwianNvblN0ciIsImlzV2ViIiwiaW5mbyIsInJlcyIsInRleHQiLCJwcGF0aCIsIm5vcm1hbGl6ZSIsImZzIiwicmVhZEZpbGUiLCJlcnIiLCJkYXRhIiwiY29udGVudCIsInRvU3RyaW5nIiwiSlNPTiIsInBhcnNlIiwiY2hlY2tIb3RTaXRlTmFtZSIsImhvdHNpdGVQYXRoIiwicm91dGVzIiwidGVzdGVyVXJsIiwidGVzdGVyIiwiZHJpdmVyIiwiRGV2ZWxvcG1lbnQiLCJ0ZXN0aW5nIiwic2V0dXBUZXN0ZXIiLCJwYXJlbnRPYmoiLCJjcmVhdGVOZXdUZXN0ZXIiLCJ0ZXN0ZXJOYW1lIiwidGVzdGVyQVBJVXJsIiwid2ViIiwicm91dGUiLCJIb3RGaWxlIiwiSG90UGFnZSIsInByb2Nlc3NvciIsIm1hcE5hbWUiLCJ0ZXN0TWFwIiwibWFwIiwidGVzdE1hcHMiLCJIb3RUZXN0TWFwIiwiZGVzdGluYXRpb25zIiwiQXJyYXkiLCJkZXN0IiwiSG90VGVzdERlc3RpbmF0aW9uIiwia2V5MiIsImRlc3RpbmF0aW9uT3JkZXIiLCJhZGRQYWdlIiwiYXBpcyIsImNvbXBvbmVudFVybCIsIm5ld0NvbXBvbmVudCIsImV2YWwiLCJhZGRDb21wb25lbnQiLCJsb2FkSG90RmlsZXMiLCJhZGRUZXN0ZXIiLCJmb3JjZUNvbnRlbnRMb2FkaW5nIiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwibG9hZCIsImFkZEZpbGUiLCJyb3V0ZUtleSIsImpzU3JjUGF0aCIsInBhc3NBcmdzIiwiYXJncyIsImFwaVNjcmlwdHMiLCJhcGlDb2RlIiwic2VydmVyIiwiZ2xvYmFsQXBpIiwid2FybmluZyIsInNlbmRKU0NvbnRlbnQiLCJqc2FwaSIsImxpYnJhcnlOYW1lIiwiYXBpTmFtZSIsImJhc2VVcmwiLCJ0ZW1wQVBJQ29udGVudCIsImpzYXBpcGF0aCIsInNlY3JldCIsInVuZGVmaW5lZCIsInN0cmluZ2lmeSIsImNvbm5lY3Rpb24iLCJzZXJ2ZXJDb25uIiwicGFzc1NlY3JldEZyb21BUEkiLCJzZWNyZXRzIiwiZW52IiwiZW52S2V5IiwicHJvY2VzcyIsInRlbXBDb250ZW50IiwiZGV2ZWxvcGVyTW9kZVN0ciIsInRlc3RlckFQSVN0ciIsImxvYWRGaWxlcyIsImtleXMiLCJmaWxlVXJsIiwiZmlsZUNvbnRlbnQiLCJlc2NhcGVkQ29udGVudCIsInRlc3Rlck1hcCIsInRlc3RlckxhdW5jaHBhZFVybCIsImxhdW5jaHBhZFVybCIsImZpeENvbnRlbnQiLCJleHByZXNzQXBwIiwiZ2VuZXJhdGVDb250ZW50IiwicmVxIiwic2VuZCIsIm1hcHMiLCJmb3VuZEtleSIsImZvdW5kUm91dGUiLCJnZXRSb3V0ZUtleUZyb21OYW1lIiwiZXhlY3V0ZSIsImdldFdlYlRlc3RpbmdNYXBzIiwiZXhlY3V0ZVRlc3RzIiwiZ2V0QVBJVGVzdGluZ01hcHMiLCJnZXRQYWdlIiwibG9jYWxGaWxlcGF0aCIsInJlYWR5RnVuYyIsInJlYWR5U3RhdGUiLCJvcGVuIiwid3JpdGUiLCJjbG9zZSIsImlzUmVhZHlGb3JUZXN0aW5nIiwid2FpdCIsIm9uUmVhZHlGb3JUZXN0aW5nIiwib25SZWFkeSIsInRlc3RlckFQSUJhc2VVcmwiLCJjbGllbnQiLCJIb3RDbGllbnQiLCJIb3RUZXN0ZXJBUEkiLCJwcm9jZXNzVXJsIiwidXNlT3V0cHV0IiwicHJvY2Vzc0NvbnRlbnQiLCJIb3QiLCJsb3dlckZpbGUiLCJpbmRleE9mIiwiZWNobyIsImdldEZpbGUiLCJmaWxlTmFtZSIsInRlbXBGaWxlIiwiQ3VycmVudFBhZ2UiLCJodHRwTWV0aG9kIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsIm1lc3NhZ2UiLCJyZXF1ZXN0SW5pdCIsIk91dHB1dCIsIkNTUyIsImNzc0ZpbGUiLCJjc3NPdXQiLCJjc3NTdHIiLCJKU0ZpbGVzIiwianNGaWxlIiwianNGaWxlT3V0IiwianNGaWxlU3RyIiwiSlNTY3JpcHRzIiwianNTY3JpcHQiLCJqc1NjcmlwdE91dCIsImpzU2NyaXB0c1N0ciIsIkFyZ3VtZW50cyIsIkhvdFRlc3RFbGVtZW50IiwiTW9kZSIsIkFQSSIsIlRlc3RlckFQSSIsIkRhdGEiLCJDb29raWVzIiwiUHVibGljU2VjcmV0cyIsImdsb2JhbCIsInNlbGYiLCJfX3NlbGZfXyIsIkYiLCJmZXRjaCIsIkRPTUV4Y2VwdGlvbiIsInN1cHBvcnQiLCJCbG9iIiwiZSIsInZpZXdDbGFzc2VzIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIm9iaiIsIm5vcm1hbGl6ZU5hbWUiLCJTdHJpbmciLCJ0ZXN0IiwiVHlwZUVycm9yIiwibm9ybWFsaXplVmFsdWUiLCJpdGVyYXRvckZvciIsIml0ZW1zIiwiaXRlcmF0b3IiLCJuZXh0Iiwic2hpZnQiLCJkb25lIiwiSGVhZGVycyIsImhlYWRlcnMiLCJmb3JFYWNoIiwiYXBwZW5kIiwiaXNBcnJheSIsImhlYWRlciIsImdldE93blByb3BlcnR5TmFtZXMiLCJjb25zdW1lZCIsImJvZHlVc2VkIiwiZmlsZVJlYWRlclJlYWR5IiwicmVhZGVyIiwib25sb2FkIiwib25lcnJvciIsImVycm9yIiwicmVhZEJsb2JBc0FycmF5QnVmZmVyIiwiYmxvYiIsIkZpbGVSZWFkZXIiLCJwcm9taXNlIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJidWZmZXJDbG9uZSIsImJ1ZiIsInNsaWNlIiwidmlldyIsIlVpbnQ4QXJyYXkiLCJieXRlTGVuZ3RoIiwic2V0IiwiYnVmZmVyIiwiQm9keSIsIl9pbml0Qm9keSIsIl9ib2R5SW5pdCIsIl9ib2R5VGV4dCIsImlzUHJvdG90eXBlT2YiLCJfYm9keUJsb2IiLCJGb3JtRGF0YSIsIl9ib2R5Rm9ybURhdGEiLCJVUkxTZWFyY2hQYXJhbXMiLCJEYXRhVmlldyIsIl9ib2R5QXJyYXlCdWZmZXIiLCJyZWplY3RlZCIsImFycmF5QnVmZmVyIiwidGhlbiIsInJlYWRBc1RleHQiLCJjaGFycyIsImZyb21DaGFyQ29kZSIsImpvaW4iLCJyZWFkQXJyYXlCdWZmZXJBc1RleHQiLCJmb3JtRGF0YSIsImRlY29kZSIsIm9sZFZhbHVlIiwiaGFzIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwidmFsdWVzIiwiZW50cmllcyIsIm1ldGhvZHMiLCJSZXF1ZXN0IiwiaW5wdXQiLCJtZXRob2QiLCJ1cGNhc2VkIiwiY3JlZGVudGlhbHMiLCJzaWduYWwiLCJ0b1VwcGVyQ2FzZSIsInJlZmVycmVyIiwiZm9ybSIsInRyaW0iLCJzcGxpdCIsImJ5dGVzIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUmVzcG9uc2UiLCJib2R5SW5pdCIsImNsb25lIiwicmVzcG9uc2UiLCJyZWRpcmVjdFN0YXR1c2VzIiwicmVkaXJlY3QiLCJSYW5nZUVycm9yIiwibG9jYXRpb24iLCJzdGFjayIsImNvbnN0cnVjdG9yIiwiaW5pdCIsInJlcXVlc3QiLCJhYm9ydGVkIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJhYm9ydFhociIsImFib3J0IiwicmF3SGVhZGVycyIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsImxpbmUiLCJwYXJ0cyIsInJlc3BvbnNlVVJMIiwicmVzcG9uc2VUZXh0Iiwib250aW1lb3V0Iiwib25hYm9ydCIsIndpdGhDcmVkZW50aWFscyIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicG9seWZpbGwiLCJwb255ZmlsbCIsImN0eCIsImRlZmF1bHQiLCJIb3RTZXJ2ZXJUeXBlIiwic2VydmVyVHlwZSIsImxpc3RlbkFkZHJlc3MiLCJwb3J0cyIsImh0dHAiLCJodHRwcyIsInNzbCIsImNlcnQiLCJjYSIsInJlZGlyZWN0SFRUUHRvSFRUUFMiLCJIVFRQIiwidGhyb3dBbGxFcnJvcnMiLCJodHRwR2V0IiwibG9hZFVybCIsImxvYWRMb2NhbEZpbGUiLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwiZXhlYyIsInByZXZpb3VzSW5kZXgiLCJzdGFydCIsImluZGV4IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJzdWJzdHIiLCJzdGFydENoYXJzIiwiZW5kQ2hhcnMiLCJ0cmlnZ2VyQ2hhciIsInBvcyIsInN0YXJ0VHJpZ2dlclBvcyIsIm5lc3RlZENvdW50ZXIiLCJycG9zIiwibGFzdEluZGV4T2YiLCJlcG9zIiwidGVtcGVwb3MiLCJ0aGlzQ29udGVudCIsImdldEFQSSIsImdldFRlc3RlckFQSSIsInJlZ2V4Rm91bmQiLCJvZmZDb250ZW50IiwidGVtcE91dHB1dCIsInByb2Nlc3NOZXN0ZWRDb250ZW50IiwicmVnZXhGb3VuZDIiLCJvZmZDb250ZW50MyIsInRlbXBPdXRwdXQyIiwidGVtcE91dHB1dDMiLCJvdXQiLCJ0ZW1wT3V0cHV0NCIsImZvdW5kU3RyIiwidGVtcE91dHB1dDUiLCJyZXR1cm5lZE91dHB1dCIsImV4ZWN1dGlvbkNvbnRlbnQiLCJuZXdWYXIiLCJuZXdWYXJWYWx1ZSIsImNvbnRlbnROYW1lIiwiRnVuY3Rpb24iLCJhcHBseSIsIlN5bnRheEVycm9yIiwiaG90IiwiZmluYWxPdXRwdXQiLCJtdXN0QmVWaXNpYmxlIiwiaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciIsIkhvdFJvdXRlIiwib25QcmVSZWdpc3RlciIsIm9uUmVnaXN0ZXIiLCJvblBvc3RSZWdpc3RlciIsIm9uQXV0aG9yaXplVXNlciIsInZlcnNpb24iLCJwcmVmaXgiLCJhdXRoQ3JlZGVudGlhbHMiLCJjcmVhdGVFcnJvciIsImV4ZWN1dGVGdW5jdGlvbiIsIkhUVFBNZXRob2QiLCJQT1NUIiwidGVzdENhc2VzIiwiSG90Um91dGVNZXRob2QiLCJmb3VuZE1ldGhvZCIsIm9uRXhlY3V0ZSIsIm9uU2VydmVyQXV0aG9yaXplIiwicGFyZW50Um91dGUiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJhZGRUZXN0Q2FzZSIsIkhvdFNlcnZlciIsIm9uU2VydmVyRXhlY3V0ZSIsIm5ld1Rlc3RDYXNlIiwidGVzdENhc2VGdW5jdGlvbiIsInRlc3RDYXNlSWQiLCJ0ZXN0Q2FzZSIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImNvbmNhdCIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwibGVuIiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsImFycmF5Iiwibm9vcCIsIm5leHRUaWNrIiwiYXJndW1lbnRzIiwidGl0bGUiLCJicm93c2VyIiwiYXJndiIsInZlcnNpb25zIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJ0ZXN0RWxlbWVudHMiLCJ0ZXN0UGF0aHMiLCJlbG0iLCJwYXRoTmFtZSIsImRyaXZlckZ1bmMiLCJsb2dMZXZlbCIsIkFsbCIsImxldmVsIiwiVmVyYm9zZSIsIldhcm5pbmciLCJJbmZvIiwiY29uc29sZSIsIndhcm4iLCJtc2ciLCJIb3RBUEkiLCJkYiIsImV4ZWN1dGVFdmVudHNVc2luZyIsIkV2ZW50RXhlY3V0aW9uVHlwZSIsImFkZE1ldGhvZCIsInBhZ2VMb2FkZWQiLCJhZGRSb3V0ZSIsImF1dGhvcml6ZWRWYWx1ZSIsImpzb25PYmoiLCJxdWVyeU9iaiIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsInRlc3RQYXRoIiwiZmluaXNoZWRMb2FkaW5nIiwib25GaW5pc2hlZExvYWRpbmciLCJjcmVhdGVGdW5jdGlvbnMiLCJ1c2VyQXV0aCIsInNjaGVtYSIsInJvdXRlTWV0aG9kIiwicm91dGVOYW1lIiwibmV3Um91dGUiLCJjdXJyZW50Um91dGUiLCJuZXdSb3V0ZU1ldGhvZCIsInJvdXRlU3RyIiwiYXV0aENyZWRlbnRpYWwiLCJyZWdpc3RlclJvdXRlIiwiZmV0Y2hPYmoiLCJkZXN0aW5hdGlvbiIsImF1dG9TdGFydCIsIklIb3RTdGFxIiwiSG90U3RhcnRPcHRpb25zIiwiSG90U2l0ZSIsIkhvdFNpdGVSb3V0ZSIsIkhvdFNpdGVNYXBQYXRoIiwiSG90Q29tcG9uZW50IiwiSUhvdENvbXBvbmVudCIsIlNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiIsIlNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIiwiSG90VGVzdGVyIiwiSG90VGVzdFBhdGgiLCJIb3RUZXN0UGFnZSIsIklIb3RUZXN0RWxlbWVudCIsIkhvdFRlc3RFbGVtZW50T3B0aW9ucyIsIklIb3RUZXN0RWxlbWVudE9wdGlvbnMiLCJIb3RUZXN0RHJpdmVyIiwic2NvcGVkUGFja2FnZVBhdHRlcm4iLCJidWlsdGlucyIsImJsYWNrbGlzdCIsIndhcm5pbmdzIiwibWF0Y2giLCJibGFja2xpc3RlZE5hbWUiLCJidWlsdGluIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibmFtZU1hdGNoIiwidXNlciIsInBrZyIsInZhbGlkRm9yTmV3UGFja2FnZXMiLCJ2YWxpZEZvck9sZFBhY2thZ2VzIiwiYXNzaWduIiwidGFyZ2V0Iiwic291cmNlIiwiY29udmVydGVyIiwiZGVmYXVsdEF0dHJpYnV0ZXMiLCJleHBpcmVzIiwiRGF0ZSIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZXNjYXBlIiwic3RyaW5naWZpZWRBdHRyaWJ1dGVzIiwiYXR0cmlidXRlTmFtZSIsImNvb2tpZSIsImNvb2tpZXMiLCJqYXIiLCJyZWFkIiwicmVtb3ZlIiwid2l0aEF0dHJpYnV0ZXMiLCJ3aXRoQ29udmVydGVyIiwiZnJlZXplIiwiZWxlbWVudCIsImhhc0JlZW5TZXR1cCIsImhhc0JlZW5EZXN0cm95ZWQiLCJ0ZXN0RGVzdCIsIm5ld0Rlc3RpbmF0aW9uIiwicGF0aHMiLCJzdHJzIiwiZ2V0VHlwZSIsInR5cGVTdHIiLCJ0eXBlRGVsaW1pdGVyIiwidHlwZVZhbHVlIiwibmV3UGF0aFN0ciIsIm5ld1BhdGgiLCJjbWQiLCJ0ZXN0TmFtZSIsInNraXBFdmVudENhbGxzIiwiY29udGludWVXaGVuVGVzdElzQ29tcGxldGUiLCJydW5UZXN0UGF0aCIsIm9uVGVzdEFQSVBhdGhTdGFydCIsInRlc3RDYXNlT2JqZWN0Iiwib25UZXN0QVBJUGF0aEVuZCIsImdldE1ldGhvZCIsImV4ZWN1dGVUZXN0QVBJUGF0aCIsInN0b3AiLCJ0ZXN0UGF0aE5hbWUiLCJvblRlc3RQYWdlUGF0aFN0YXJ0Iiwib25UZXN0UGFnZVBhdGhFbmQiLCJoYXNDbWQiLCJoYXNBcmd1bWVudHMiLCJnZXRDbWRBcmdzIiwibWF0Y2hlcyIsInRlbXBNYXRjaCIsImNtZEZ1bmMiLCJjbWRBcmdzIiwid2FpdEZvckRhdGEiLCJuYXZpZ2F0ZVRvVXJsIiwicHJpbnQiLCJwcmludGxuIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsIm9uQ29tbWFuZCIsImludGVycHJldERlc3RpbmF0aW9uIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aHMiLCJleGVjdXRlQ29tbWFuZCIsImV4ZWN1dGVUZXN0UGFnZVBhdGgiLCJleGVjdXRlRGVzdGluYXRpb24iLCJkZXN0aW5hdGlvbktleSIsImlzV2ViUm91dGUiLCJydW5UZXN0UGF0aHMiLCJzZXR1cCIsIm9uVGVzdFN0YXJ0IiwiZXhlY3V0ZVRlc3RBUElQYXRocyIsIm9uVGVzdEVuZCIsImRlc3Ryb3kiLCJoYXNFeGVjdXRlZEtleXMiLCJvcmRlcktleSIsImV4ZWN1dGVEZXN0Iiwid2lsZGNhcmQiLCJzZWxlY3RvciIsInN0ZG91dCIsImVycm9yTWVzc2FnZSIsImV4ZWN1dGlvbnMiLCJleGVjdXRpb24iLCJ0ZXN0RWxtIiwicnVuQ29tbWFuZCJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBMkNBLEVBQU1DLEdBQzFCLGlCQUFaQyxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxHQUFJSCxHQUNlLGlCQUFaQyxRQUNkQSxRQUFvQixXQUFJRCxJQUV4QkQsRUFBaUIsV0FB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QUFVN3BCLEtBQUsrQixLQUFLaWUsYUFBYTloQixHQUdsQixNQUFYMnJCLEdBRUhBLEVBQVUsSUFBSSxFQUFBMWEsZUFBZ0JqUixHQUM5QjhFLEVBQU80bUIsRUFBVSxHQUNqQmhyQixFQUFRZ3JCLEVBQVUsS0FJbEI1bUIsRUFBTzZtQixFQUFRN21CLEtBQ2ZwRSxFQUFRaXJCLEVBQVFqckIsTUFFWmdyQixFQUFVcm1CLE9BQVMsSUFDdEJQLEVBQU80bUIsRUFBVSxJQUVkQSxFQUFVcm1CLE9BQVMsSUFDdEIzRSxFQUFRZ3JCLEVBQVUsS0FJckJDLEVBQVE3bUIsS0FBT0EsRUFDZjZtQixFQUFRanJCLE1BQVFBLEVBRWhCaUcsRUFBUUMsV0FBWTlFLEtBQUs4cEIsV0FBWUQsSUFHdEMsT0FBTyxTIiwiZmlsZSI6IkhvdFN0YXEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJIb3RTdGFxV2ViXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkhvdFN0YXFXZWJcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNik7XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBmZXRjaCBmcm9tIFwiY3Jvc3MtZmV0Y2hcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZHVsZU5hbWUgZnJvbSBcInZhbGlkYXRlLW5wbS1wYWNrYWdlLW5hbWVcIjtcblxuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5cbmltcG9ydCB7IEhvdENvbXBvbmVudCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG90TG9nLCBIb3RMb2dMZXZlbCB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG5pbXBvcnQgeyBIb3RUZXN0ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RlckFQSSB9IGZyb20gXCIuL0hvdFRlc3RlckFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiwgSG90VGVzdE1hcCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcblxudmFyIEhvdFRlc3Rlck1vY2hhOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3Rlck1vY2hhU2VsZW5pdW06IGFueSA9IG51bGw7XG52YXIgSG90VGVzdFNlbGVuaXVtRHJpdmVyOiBhbnkgPSBudWxsO1xuXG4vKipcbiAqIEEgbWFwIHBhdGggZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U2l0ZU1hcFBhdGhcbntcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSB3aGVuIHRlc3RzIHN0YXJ0LlxuXHQgKiBUaGUgZGVmYXVsdCBpcyB0cnVlLlxuXHQgKi9cblx0YXV0b1N0YXJ0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBcblx0ICovXG5cdHBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByb3V0ZSB1c2VkIGluIGEgSG90U2l0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTaXRlUm91dGVcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSByb3V0ZS4gV2lsbCBhcHBlYXIgaW4gdGhlIHRpdGxlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgZmlsZSB0byBsb2FkLlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgQVBJIHRvIGludGVyZmFjZSB3aXRoLlxuXHQgKi9cblx0YXBpPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI/OiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSBIb3RUZXN0ZXJNYXAgdG8gdXNlLiBUaGlzIGNhbiBiZSB0aGUgbmFtZSBvZiBhbiBcblx0ICogZXhpc3Rpbmcgb25lIGF0dGFjaGVkIHRvIHRoZSBzZWxlY3RlZCB0ZXN0ZXIsIG9yIFxuXHQgKiBjYW4gYmUgYW4gYXJyYXkgb2YgZGVzdGluYXRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIFxuXHQgKiBjcmVhdGUgYSBuZXcgbWFwLlxuXHQgKi9cblx0bWFwPzogc3RyaW5nIHwgc3RyaW5nW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RTaXRlTWFwUGF0aDsgfSB8IEhvdFNpdGVNYXBQYXRoW107XG59XG5cbi8qKlxuICogQSBIb3RTaXRlIHRvIGxvYWQuIFRoaXMgU0hPVUxEIE5PVCBjb250YWluIGFueSBwcml2YXRlIHNlY3JldCBrZXlzLCBwYXNzd29yZHMsIFxuICogb3IgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBzZXJ2ZXIuIEFzIHN1Y2gsIGZ1dHVyZSBcbiAqIHZlcnNpb25zIG9mIHRoZSBIb3RTaXRlIGludGVyZmFjZSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGRhdGFiYXNlIHJlbGF0ZWQgXG4gKiBjb25uZWN0aW9uIGluZm8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U2l0ZVxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhpcyBIb3RTaXRlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgSG90U2l0ZS4gVGhpcyBpcyBmaWxsZWQgaW4gZHVyaW5nIHBhcnNpbmcuXG5cdCAqL1xuXHRob3RzaXRlUGF0aD86IHN0cmluZztcblx0LyoqXG5cdCAqIEFkZGl0aW9uYWwgd2ViIHNlcnZlciBjb25maWd1cmF0aW9uLlxuXHQgKi9cblx0c2VydmVyPzoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgZGVmYXVsdCBuYW1lIGZvciBhIHNlcnZlZCBIb3R0IGZpbGUuXG5cdFx0XHQgKi9cblx0XHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFNlcnZlIGhvdHQgZmlsZXMgd2hlbiByZXF1ZXN0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdHNlcnZlSG90dEZpbGVzPzogYm9vbGVhbjtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIEFQSSB0byBpbnRlcmZhY2Ugd2l0aCBhY3Jvc3MgYWxsIHBhZ2VzLlxuXHRcdFx0ICovXG5cdFx0XHRnbG9iYWxBcGk/OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHNlcnZlci5cblx0XHRcdCAqL1xuXHRcdFx0dXJsPzogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSmF2YVNjcmlwdCBzb3VyY2UgcGF0aC5cblx0XHRcdCAqL1xuXHRcdFx0anNTcmNQYXRoPzogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRwb3J0cz86IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgSFRUUCBwb3J0IHRvIHNlcnZlIG9uLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGh0dHA/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIEhUVFBTIHBvcnQgdG8gc2VydmUgb24uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0aHR0cHM/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCByZWRpcmVjdCBmcm9tIEhUVFAgdG8gSFRUUFMuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cmVkaXJlY3RIVFRQdG9IVFRQUz86IGJvb2xlYW47XG5cdFx0XHRcdH07XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBsaXN0IG9mIGRpcmVjdG9yeSB0byBzZXJ2ZSB0byB0aGUgY2xpZW50IGZyb20gdGhlIHNlcnZlci5cblx0XHRcdCAqL1xuXHRcdFx0c2VydmVEaXJlY3Rvcmllcz86IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgd2ViIHJvdXRlIHRvIHRha2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cm91dGU6IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgbG9jYWwgZmlsZXN5c3RlbSBwYXRoIHRvIHNlcnZlIHBhZ2VzIGZyb20uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bG9jYWxQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdH1bXTtcblx0XHR9O1xuXHQvKipcblx0ICogVGVzdGluZyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG5cdCAqL1xuXHR0ZXN0aW5nPzoge1xuXHRcdFx0d2ViPzoge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHRlc3RlciBjbGFzcyB0byB1c2UuIEVYOiBIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXI/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIHRvIHVzZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3Rlck5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB0ZXN0ZXIuXG5cdFx0XHRcdCAqIERlZmF1bHQgVmFsdWU6IHRydWVcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNyZWF0ZU5ld1Rlc3Rlcj86IGJvb2xlYW47XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdXJsIHRoYXQgY29ubmVjdHMgdG8gdGhlIHRlc3RlciBhcGkgc2VydmVyLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyQVBJVXJsPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgZHJpdmVyIHRvIHVzZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGRyaXZlcj86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB1cmwgdG8gdGhlIGh0bWwgdGhhdCBsb2FkcyB0aGUgaG90dCBmaWxlcy5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGxhdW5jaHBhZFVybD86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBtYXBzIHRvIHRlc3QgaW4gb3JkZXIuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRtYXBzPzogc3RyaW5nW107XG5cdFx0XHR9LFxuXHRcdFx0YXBpPzoge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHRlc3RlciBjbGFzcyB0byB1c2UuIEVYOiBIb3RUZXN0ZXJNb2NoYVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdGVzdGVyLlxuXHRcdFx0XHQgKiBEZWZhdWx0IFZhbHVlOiB0cnVlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRjcmVhdGVOZXdUZXN0ZXI/OiBib29sZWFuO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0aGF0IGNvbm5lY3RzIHRvIHRoZSB0ZXN0ZXIgYXBpIHNlcnZlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3RlckFQSVVybD86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGRyaXZlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRkcml2ZXI/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZXMuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRsYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbWFwcyB0byB0ZXN0IGluIG9yZGVyLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bWFwcz86IHN0cmluZ1tdO1xuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgcm91dGVzIHRvIGxvYWQuXG5cdCAqL1xuXHRyb3V0ZXM/OiB7XG5cdFx0XHRbcm91dGVOYW1lOiBzdHJpbmddOiBIb3RTaXRlUm91dGU7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBhdmFpbGFibGUgQVBJcyBvbiB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG11c3QgYWxyZWFkeSBoYXZlIHRoZXNlIFxuXHQgKiBsb2FkZWQuXG5cdCAqL1xuXHRhcGlzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgSlMgQVBJIGZpbGUgdG8gbG9hZC5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRqc2FwaT86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgZXhwb3J0ZWQgSlMgbGlicmFyeSBuYW1lIHRvIHVzZS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRsaWJyYXJ5TmFtZT86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgYXBpIHRvIHVzZS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRhcGlOYW1lPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBwb3J0IHRvIHVzZS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRwb3J0PzogbnVtYmVyO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBwdWJsaWMgYmFzZSB1cmwgZm9yIHRoZSBhcGkuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dXJsPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBzZXJ2ZXItc2lkZSBmaWxlcGF0aCBmb3IgdGhlIGFwaS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRmaWxlcGF0aD86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgbWFwcyB0byB0ZXN0IGluIG9yZGVyLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdG1hcD86IHN0cmluZ1tdO1xuXHRcdFx0XHR9O1xuXHRcdH07XG5cdC8qKlxuXHQgKiBTZWNyZXRzIHRoYXQgY2FuIGJlIHB1YmxpY2x5IGVtYmVkZGVkIGludG8gdGhlIHBhZ2UuXG5cdCAqL1xuXHRwdWJsaWNTZWNyZXRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHN0cmluZyB8IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUga2V5IG9mIGFuIEFQSSBzZWNyZXQgdG8gcGFzcyB0byB0aGUgc2l0ZSB0byBcblx0XHRcdFx0XHQgKiBiZSB1c2VkIHB1YmxpY2x5LlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHBhc3NTZWNyZXRGcm9tQVBJPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEdldCB0aGUgcHVibGljIHNlY3JldCBmcm9tIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGVudj86IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdG8gbG9hZCBhbmQgcmVnaXN0ZXIuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBjb21wb25lbnQgdG8gbG9hZCBhbmQgcmVnaXN0ZXIuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dXJsOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0byBsb2FkIGFuZCBzYXZlIGluIG1lbW9yeS5cblx0ICovXG5cdGZpbGVzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGxvYWQuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dXJsOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0fTtcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBzdGFydGluZyBhIHBhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U3RhcnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBUaGUgSG90dCBzaXRlIHRvIGxvYWQuXG5cdCAqL1xuXHR1cmw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlIHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UgdG8gbG9hZCB0aGUgcGFnZS5cblx0ICovXG5cdHByb2Nlc3Nvcj86IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBBbnkgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG5ldyBwYWdlLlxuXHQgKi9cblx0YXJncz86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgbWFwIHRvIHVzZS5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHRlc3RlciBhcGkuXG5cdCAqL1xuXHR0ZXN0ZXJBUElCYXNlVXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGUgdGhhdCdzIFxuXHQgKiBwb2ludGVkIGF0IHRoZSB1cmwgYWJvdmUuXG5cdCAqL1xuXHR0ZXN0ZXJMYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdGNvbXBvbmVudHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RDb21wb25lbnQgfTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0aGF0IGNhbiBiZSBzdG9yZWQgZm9yIGxhdGVyIHVzZS5cblx0ICovXG5cdGZpbGVzPzogeyBbbmFtZTogc3RyaW5nXTogSG90RmlsZSB9O1xuXHQvKipcblx0ICogVGhlIGxvYWRlZCBob3RzaXRlLlxuXHQgKi9cblx0aG90U2l0ZT86IEhvdFNpdGU7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgY2xhc3MgSG90U3RhcSBpbXBsZW1lbnRzIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIHdlYiBidWlsZC5cblx0ICovXG5cdHN0YXRpYyBpc1dlYjogYm9vbGVhbiA9IGZhbHNlO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqL1xuXHRzdGF0aWMgaXNSZWFkeUZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoaXMgZXZlbnQgd2hlbiB0aGlzIHBhZ2UgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqL1xuXHRzdGF0aWMgb25SZWFkeUZvclRlc3Rpbmc6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU6IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHR0ZXN0ZXJBUEk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBwYWdlcyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdHBhZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdGNvbXBvbmVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdENvbXBvbmVudCB9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU6IEhvdFNpdGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0YXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHR0ZXN0ZXJBcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHBhZ2VDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBUaGUgc2VjcmV0cyB0aGF0IGNhbiBiZSBleHBvc2VkIHB1YmxpY2x5LlxuXHQgKi9cblx0cHVibGljU2VjcmV0czogYW55O1xuXHQvKipcblx0ICogVGhlIHNlY3JldHMgdGhhdCBjYW4gYmUgZXhwb3NlZCBwdWJsaWNseS5cblx0ICovXG5cdHRlc3RlcnM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RlciB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90U3RhcSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5hcGkgPSBjb3B5LmFwaSB8fCBudWxsO1xuXHRcdHRoaXMudGVzdGVyQVBJID0gY29weS50ZXN0ZXJBUEkgfHwgbnVsbDtcblx0XHR0aGlzLm1vZGUgPSBjb3B5Lm1vZGUgfHwgRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uO1xuXHRcdHRoaXMucGFnZXMgPSBjb3B5LnBhZ2VzIHx8IHt9O1xuXHRcdHRoaXMuY29tcG9uZW50cyA9IGNvcHkuY29tcG9uZW50cyB8fCB7fTtcblx0XHR0aGlzLmZpbGVzID0gY29weS5maWxlcyB8fCB7fTtcblx0XHR0aGlzLmhvdFNpdGUgPSBjb3B5LmhvdFNpdGUgfHwgbnVsbDtcblx0XHR0aGlzLmFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgJWFwaV9uYW1lJSA9ICVhcGlfZXhwb3J0ZWRfbmFtZSUuJWFwaV9uYW1lJTtcblx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0dmFyIG5ld2FwaSA9IG5ldyAlYXBpX25hbWUlICglYmFzZV91cmwlLCBuZXdIb3RDbGllbnQpO1xuXHRcdFx0bmV3SG90Q2xpZW50LmFwaSA9IG5ld2FwaTtcblx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblxuJWFwaXNfdG9fbG9hZCVcblxuXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuXHRcdGZ1bmN0aW9uIGhvdHN0YXFfc3RhcnRBcHAgKClcblx0XHR7XG5cdFx0XHRsZXQgdGVtcE1vZGUgPSAwO1xuXG5cdFx0XHRpZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG5cdFx0XHRcdHRlbXBNb2RlID0gSG90Lk1vZGU7XG5cblx0XHRcdHdpbmRvdy5Ib3RTdGFxID0gSG90U3RhcVdlYi5Ib3RTdGFxO1xuXHRcdFx0d2luZG93LkhvdENsaWVudCA9IEhvdFN0YXFXZWIuSG90Q2xpZW50O1xuXHRcdFx0d2luZG93LkhvdCA9IEhvdFN0YXFXZWIuSG90O1xuXG5cdFx0XHQlbG9hZF9ob3Rfc2l0ZSVcblxuXHRcdFx0dmFyIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXHRcdFx0dmFyIHByb21pc2VzID0gW107XG5cdFx0XHQlZGV2ZWxvcGVyX21vZGUlXG5cblx0XHRcdCVhcGlfY29kZSVcblxuXHRcdFx0JXB1YmxpY19zZWNyZXRzJVxuXHRcdFx0JXRlc3Rlcl9hcGklXG5cdFx0XHQlbG9hZF9maWxlcyVcblxuXHRcdFx0cHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuXHRcdFx0UHJvbWlzZS5hbGwgKHByb21pc2VzKS50aGVuIChmdW5jdGlvbiAoKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5VXJsICh7XG5cdFx0XHRcdFx0XHRcdHVybDogXCIldXJsJVwiLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiBcIiV0aXRsZSVcIixcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6ICVhcmdzJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogJXRlc3Rlcl9uYW1lJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwOiAldGVzdGVyX21hcCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckFQSUJhc2VVcmw6ICV0ZXN0ZXJfYXBpX2Jhc2VfdXJsJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsOiAldGVzdGVyX2xhdW5jaHBhZF91cmwlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aG90c3RhcV9zdGFydEFwcCAoKTtcblx0PC9zY3JpcHQ+XG48L2hlYWQ+XG5cbjxib2R5PlxuPC9ib2R5PlxuXG48L2h0bWw+YDtcblx0XHR0aGlzLmxvZ2dlciA9IG5ldyBIb3RMb2cgKEhvdExvZ0xldmVsLk5vbmUpO1xuXHRcdHRoaXMucHVibGljU2VjcmV0cyA9IHt9O1xuXHRcdHRoaXMudGVzdGVycyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgYm9vbGVhbiB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUJvb2xlYW4gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuXG5cdHtcblx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInRydWVcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwiZmFsc2VcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllc1wiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJub1wiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwieWVwXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcIm5haFwiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRpZiAocGFyc2VJbnQgKHZhbHVlKSAhPSAwKVxuXHRcdFx0XHRyZXR1cm4gKHRydWUpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdH1cblxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW0gKG5hbWU6IHN0cmluZywgb2JqV2l0aFBhcmFtOiBhbnksIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZSwgdGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG9ialdpdGhQYXJhbVtuYW1lXTtcblxuXHRcdGlmICh2YWx1ZSA9PSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChyZXF1aXJlZCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGlmIChyZXF1aXJlZCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJHtuYW1lfS5gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW1EZWZhdWx0IChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBwYWdlLlxuXHQgKi9cblx0YWRkUGFnZSAocGFnZTogSG90UGFnZSk6IHZvaWRcblx0e1xuXHRcdHRoaXMucGFnZXNbcGFnZS5uYW1lXSA9IHBhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcGFnZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Z2V0UGFnZSAocGFnZU5hbWU6IHN0cmluZyk6IEhvdFBhZ2Vcblx0e1xuXHRcdHJldHVybiAodGhpcy5wYWdlc1twYWdlTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUuXG5cdCAqL1xuXHRhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogdm9pZFxuXHR7XG5cdFx0bGV0IG5hbWU6IHN0cmluZyA9IGZpbGUubmFtZTtcblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0bmFtZSA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS51cmw7XG5cblx0XHR0aGlzLmZpbGVzW25hbWVdID0gZmlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBmaWxlLlxuXHQgKi9cblx0Z2V0RmlsZSAobmFtZTogc3RyaW5nKTogSG90RmlsZVxuXHR7XG5cdFx0aWYgKHRoaXMuZmlsZXNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGZpbGUgJHtuYW1lfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmZpbGVzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW5kIHJlZ2lzdGVyIGEgY29tcG9uZW50LlxuXHQgKi9cblx0YWRkQ29tcG9uZW50IChjb21wb25lbnQ6IEhvdENvbXBvbmVudCk6IHZvaWRcblx0e1xuXHRcdHRoaXMuY29tcG9uZW50c1tjb21wb25lbnQubmFtZV0gPSBjb21wb25lbnQ7XG5cdFx0dGhpcy5yZWdpc3RlckNvbXBvbmVudCAoY29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIGNvbXBvbmVudCBmb3IgdXNlIGFzIGEgSFRNTCB0YWcuXG5cdCAqL1xuXHRyZWdpc3RlckNvbXBvbmVudCAoY29tcG9uZW50OiBIb3RDb21wb25lbnQpOiB2b2lkXG5cdHtcblx0XHRjdXN0b21FbGVtZW50cy5kZWZpbmUgKGNvbXBvbmVudC50YWcsIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnRcblx0XHRcdHtcblx0XHRcdFx0Y29uc3RydWN0b3IgKClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHN1cGVyICgpO1xuXG5cdFx0XHRcdFx0Ly8vIEBmaXhtZSBJcyB0aGlzIGJhZD8gQ291bGQgY3JlYXRlIHJhY2UgY29uZGl0aW9ucy5cblx0XHRcdFx0XHQoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aGlzLm9uY2xpY2sgPSBjb21wb25lbnQuY2xpY2suYmluZCAoY29tcG9uZW50KTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIGNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBldmVudCA9IGNvbXBvbmVudC5ldmVudHNba2V5XTtcblxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lciAoZXZlbnQudHlwZSwgZXZlbnQuZnVuYywgZXZlbnQub3B0aW9ucyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbXBvbmVudC5odG1sRWxlbWVudCA9IGF3YWl0IGNvbXBvbmVudC5vbkNyZWF0ZWQgKHRoaXMpO1xuXG5cdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0YXdhaXQgY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgKHRoaXMuYXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGF0dHI6IEF0dHIgPSB0aGlzLmF0dHJpYnV0ZXNbaUlkeF07XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UgKCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGF0dHJWYWx1ZTogc3RyaW5nID0gYXR0ci52YWx1ZTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZSA9PT0gXCJpZFwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwibmFtZVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwidmFsdWVcIilcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudC52YWx1ZSA9IGF0dHJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgc3RyOiBzdHJpbmcgPSBhd2FpdCBjb21wb25lbnQub3V0cHV0ICgpO1xuXHRcdFx0XHRcdFx0bGV0IG5ld0RPTTogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyICgpLnBhcnNlRnJvbVN0cmluZyAoc3RyLCBcInRleHQvaHRtbFwiKTtcblx0XHRcdFx0XHRcdGxldCBzaGFkb3c6IFNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyAoeyBtb2RlOiBcIm9wZW5cIiB9KTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGNoaWxkID0gbmV3RE9NLmJvZHkuY2hpbGRyZW5baUlkeF07XG5cdFx0XHRcdFx0XHRcdHNoYWRvdy5hcHBlbmRDaGlsZCAoY2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIGNvbXBvbmVudC5lbGVtZW50T3B0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgY29tcG9uZW50IHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRDb21wb25lbnQgKG5hbWU6IHN0cmluZyk6IEhvdENvbXBvbmVudFxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLmNvbXBvbmVudHNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBIVE1MIGVsZW1lbnQocykgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG5cdCAqL1xuXHRzdGF0aWMgYWRkSHRtbCAocGFyZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgaHRtbDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W11cblx0e1xuXHRcdGxldCBmb3VuZFBhcmVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGFyZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdGZvdW5kUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAocGFyZW50KTtcblx0XHRlbHNlXG5cdFx0XHRmb3VuZFBhcmVudCA9IHBhcmVudDtcblxuXHRcdGlmIChmb3VuZFBhcmVudCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50ICR7cGFyZW50fSFgKTtcblxuXHRcdGxldCByZXN1bHQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKGh0bWwpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbmV3IERPTVBhcnNlciAoKS5wYXJzZUZyb21TdHJpbmcgKGh0bWwsIFwidGV4dC9odG1sXCIpO1xuXHRcdFx0bGV0IHJlc3VsdHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+bmV3RE9NLmJvZHkuY2hpbGRyZW5baUlkeF0pO1xuXG5cdFx0XHRcdHJlc3VsdHMucHVzaCAoZm91bmRQYXJlbnQuYXBwZW5kQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdCA9IGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChodG1sKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIEhvdFNpdGUncyBuYW1lIGlzIHZhbGlkLlxuXHQgKi9cblx0c3RhdGljIGNoZWNrSG90U2l0ZU5hbWUgKGhvdHNpdGVOYW1lOiBzdHJpbmcsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuXG5cdHtcblx0XHRsZXQgdGhyb3dUaGVFeGNlcHRpb24gPSAoKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke2hvdHNpdGVOYW1lfSBoYXMgYW4gaW52YWxpZCBuYW1lISBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkgYW5kIG11c3QgaGF2ZSBhIHZhbGlkIE5QTSBtb2R1bGUgbmFtZS5gKTtcblx0XHRcdH07XG5cblx0XHRsZXQgcmVzdWx0cyA9IHZhbGlkYXRlTW9kdWxlTmFtZSAoaG90c2l0ZU5hbWUpO1xuXG5cdFx0aWYgKHJlc3VsdHMuZXJyb3JzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlc3VsdHMuZXJyb3JzLmxlbmd0aCA+IDApXG5cdFx0XHRcdHRocm93VGhlRXhjZXB0aW9uICgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZSBhIGtleSBpbiBhICR7S0VZfSB3aXRoIGEgdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgcmVwbGFjZUtleSAoc3RyOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBmaW5hbFN0cjogc3RyaW5nID0gc3RyLnJlcGxhY2UgKG5ldyBSZWdFeHAgKGBcXFxcJFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIHZhbHVlKTtcblxuXHRcdHJldHVybiAoZmluYWxTdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHZhbHVlIGZyb20gYSBIb3RTaXRlIG9iamVjdC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIGhvdHNpdGUgb2JqZWN0LiBSZXR1cm5zIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHN0YXRpYyBnZXRWYWx1ZUZyb21Ib3RTaXRlT2JqIChob3RzaXRlOiBIb3RTaXRlLCBwYXJhbXM6IHN0cmluZ1tdKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG51bGw7XG5cblx0XHRpZiAoaG90c2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBwcmV2VmFsdWU6IGFueSA9IGhvdHNpdGU7XG5cblx0XHRcdC8vIEdvIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgXG5cdFx0XHQvLyBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaW5hbCBwYXJhbWV0ZXIuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHBhcmFtcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBwYXJhbXNbaUlkeF07XG5cblx0XHRcdFx0aWYgKHByZXZWYWx1ZVtwYXJhbV0gPT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHByZXZWYWx1ZSA9IG51bGw7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZWYWx1ZSA9IHByZXZWYWx1ZVtwYXJhbV07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VmFsdWUgIT0gbnVsbClcblx0XHRcdFx0dmFsdWUgPSBwcmV2VmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBmcm9tIGEgSG90U2l0ZS5qc29uIGZpbGUuIEJlIHN1cmUgdG8gbG9hZCBhbmQgYXR0YWNoIGFueSB0ZXN0ZXJzIGJlZm9yZSBcblx0ICogbG9hZGluZyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGpzb25TdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgUmV0cmlldmluZyBIb3RTaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0bGV0IHJlczogYW55ID0gYXdhaXQgZmV0Y2ggKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgUmV0cmlldmVkIHNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRqc29uU3RyID0gcmVzLnRleHQgKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRwYXRoID0gcHBhdGgubm9ybWFsaXplIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYFJldHJpZXZpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGpzb25TdHIgPSBhd2FpdCBuZXcgUHJvbWlzZSAoXG5cdFx0XHRcdChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KTogdm9pZCA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZnMucmVhZEZpbGUgKHBhdGgsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiwgZGF0YTogQnVmZmVyKTogdm9pZCA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcblx0XHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYFJldHJpZXZlZCBzaXRlICR7cGF0aH1gKTtcblx0XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUgKGNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuaG90U2l0ZSA9IEpTT04ucGFyc2UgKGpzb25TdHIpO1xuXG5cdFx0SG90U3RhcS5jaGVja0hvdFNpdGVOYW1lICh0aGlzLmhvdFNpdGUubmFtZSwgdHJ1ZSk7XG5cblx0XHR0aGlzLmhvdFNpdGUuaG90c2l0ZVBhdGggPSBwYXRoO1xuXHRcdGxldCByb3V0ZXMgPSB0aGlzLmhvdFNpdGUucm91dGVzO1xuXHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gbnVsbDtcblx0XHRsZXQgZHJpdmVyOiBIb3RUZXN0RHJpdmVyID0gbnVsbDtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZXR1cFRlc3RlciA9IChwYXJlbnRPYmo6IGFueSkgPT4gXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVOZXdUZXN0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLmNyZWF0ZU5ld1Rlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZU5ld1Rlc3RlciA9IHBhcmVudE9iai5jcmVhdGVOZXdUZXN0ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIlRlc3RlclwiO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSBwYXJlbnRPYmoudGVzdGVyO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0gcGFyZW50T2JqLnRlc3Rlck5hbWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChjcmVhdGVOZXdUZXN0ZXIgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEZpbmQgYSB3YXkgdG8gc2VjdXJlbHkgYWxsb3cgZGV2cyB0byB1c2UgdGhlaXIgb3duIGRyaXZlcnMgYW5kIHRlc3RlcnMuLi5cblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEhhY2sgZm9yIGRlYWxpbmcgd2l0aCBXZWJQYWNrJ3MgYnMuXG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGEgPSByZXF1aXJlIChcIi4vSG90VGVzdGVyTW9jaGFcIikuSG90VGVzdGVyTW9jaGE7XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGFTZWxlbml1bSA9IHJlcXVpcmUgKFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCIpLkhvdFRlc3Rlck1vY2hhU2VsZW5pdW07XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdFNlbGVuaXVtRHJpdmVyID0gcmVxdWlyZSAoXCIuL0hvdFRlc3RTZWxlbml1bURyaXZlclwiKS5Ib3RUZXN0U2VsZW5pdW1Ecml2ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXJBUElVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSBwYXJlbnRPYmoudGVzdGVyQVBJVXJsO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmouZHJpdmVyID09PSBcIkhvdFRlc3RTZWxlbml1bURyaXZlclwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJpdmVyID0gbmV3IEhvdFRlc3RTZWxlbml1bURyaXZlciAoKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciA9PT0gXCJIb3RUZXN0ZXJNb2NoYVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhICh0aGlzLCB0ZXN0ZXJOYW1lLCB0ZXN0ZXJVcmwsIGRyaXZlcik7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXIgPT09IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gKHRoaXMsIHRlc3Rlck5hbWUsIHRlc3RlclVybCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHRzZXR1cFRlc3RlciAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdHNldHVwVGVzdGVyICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJvdXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiByb3V0ZXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gcm91dGVzW2tleV07XG5cdFx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHJvdXRlKTtcblx0XHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLFxuXHRcdFx0XHRcdFx0bmFtZTogcm91dGUubmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0cm91dGU6IGtleSxcblx0XHRcdFx0XHRcdGZpbGVzOiBbZmlsZV1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRpZiAocm91dGUubWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHJvdXRlLm1hcCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGVzdGVyLnRlc3RNYXBzW3JvdXRlLm1hcF0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgbWFwICR7cm91dGUubWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbiB9ID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZS5tYXAgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCByb3V0ZS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5MiBpbiByb3V0ZS5tYXApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2tleTJdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uc1trZXkyXSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gZGVzdGluYXRpb25zO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmRlc3RpbmF0aW9uT3JkZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdLmRlc3RpbmF0aW9uT3JkZXIgPSByb3V0ZS5kZXN0aW5hdGlvbk9yZGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkUGFnZSAocGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS5hcGlzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5hcGlzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYXBpID0gdGhpcy5ob3RTaXRlLmFwaXNba2V5XTtcblxuXHRcdFx0XHRpZiAoYXBpLm1hcCA9PSBudWxsKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IGtleTtcblx0XHRcdFx0XHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gbmV3IEhvdFRlc3RNYXAgKCk7XG5cblx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gW107XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgYXBpLm1hcC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IG1hcDogc3RyaW5nID0gYXBpLm1hcFtpSWR4XTtcblxuXHRcdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChtYXApKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBBIHRlc3RlciB3YXMgbm90IGNyZWF0ZWQgZmlyc3QhIFlvdSBtdXN0IHNwZWNpZnkgb25lIGluIHRoZSBDTEkgb3IgaW4gSG90U2l0ZS5qc29uLmApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0TWFwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vLyBAZml4bWUgQWxsb3cgdGhpcyB0byB3b3JrIGZvciBzZXJ2ZXItc2lkZSBhcyB3ZWxsLi4uXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5jb21wb25lbnRzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY29tcG9uZW50ID0gdGhpcy5ob3RTaXRlLmNvbXBvbmVudHNba2V5XTtcblx0XHRcdFx0bGV0IGNvbXBvbmVudFVybDogc3RyaW5nID0gY29tcG9uZW50LnVybDtcblxuXHRcdFx0XHQvLy8gQGZpeG1lIENyZWF0ZSB1bml0IHRlc3QgZm9yIGZldGNoaW5nLCBsb2FkaW5nLCBhbmQgcmVnaXN0ZXJpbmcuXG5cdFx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChjb21wb25lbnRVcmwpO1xuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50OiBIb3RDb21wb25lbnQgPSBldmFsIChyZXMpO1xuXG5cdFx0XHRcdHRoaXMuYWRkQ29tcG9uZW50IChuZXdDb21wb25lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzID09IG51bGwpXG5cdFx0XHR0aGlzLmhvdFNpdGUucm91dGVzID0ge307XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRIb3RGaWxlcyAodGhpcy5ob3RTaXRlLmZpbGVzKTtcblxuXHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdHRoaXMuYWRkVGVzdGVyICh0ZXN0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIElmIGEgZmlsZSBhbHJlYWR5IGhhcyBjb250ZW50LCBpdCB3aWxsIG5vdCBiZSByZWxvYWRlZCBcblx0ICogdW5sZXNzIGZvcmNlQ29udGVudExvYWRpbmcgaXMgc2V0IHRvIHRydWUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90RmlsZXMgKGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHVybD86IHN0cmluZzsgbG9jYWxGaWxlPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9IH0sIFxuXHRcdFx0Zm9yY2VDb250ZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlID0gZmlsZXNba2V5XTtcblx0XHRcdGxldCBuZXdGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFx0XHRcdFwibmFtZVwiOiBrZXlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZpbGUudXJsICE9IG51bGwpXG5cdFx0XHRcdG5ld0ZpbGUudXJsID0gZmlsZS51cmw7XG5cblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKGZpbGUubG9jYWxGaWxlICE9IG51bGwpXG5cdFx0XHRcdFx0bmV3RmlsZS5sb2NhbEZpbGUgPSBmaWxlLmxvY2FsRmlsZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGxvYWRDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGZpbGUuY29udGVudCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlLmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG5cdFx0XHRcdGxvYWRDb250ZW50ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChmb3JjZUNvbnRlbnRMb2FkaW5nID09PSB0cnVlKVxuXHRcdFx0XHRsb2FkQ29udGVudCA9IHRydWU7XG5cblx0XHRcdGlmIChsb2FkQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0YXdhaXQgbmV3RmlsZS5sb2FkICgpO1xuXG5cdFx0XHR0aGlzLmFkZEZpbGUgKG5ld0ZpbGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZSB0aGUgY29udGVudCB0byBzZW5kIHRvIGEgY2xpZW50LlxuXHQgKi9cblx0Z2VuZXJhdGVDb250ZW50IChyb3V0ZUtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCB1cmw6IHN0cmluZyA9IFwiLi9cIixcblx0XHRcdGpzU3JjUGF0aDogc3RyaW5nID0gXCIuL2pzL0hvdFN0YXEuanNcIiwgcGFzc0FyZ3M6IGJvb2xlYW4gPSB0cnVlLCBcblx0XHRcdGFyZ3M6IGFueSA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBhcGlTY3JpcHRzOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBhcGlDb2RlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBwdWJsaWNTZWNyZXRzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0Ly8vIEB0b2RvIE9wdGltaXplIHRoaXMgZnVuY3Rpb24gYXMgbXVjaCBhcyBwb3NzaWJsZS5cblxuXHRcdC8vIExvYWQgdGhlIEFQSSBzdHJpbmcuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBnbG9iYWxBcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1t0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaV07XG5cblx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGV4aXN0IWApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBsaWJyYXJ5TmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuYXBpTmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7Z2xvYmFsQXBpLmpzYXBpfVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cblx0XHRcdFx0aWYgKHJvdXRlICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocm91dGUuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3JvdXRlLmFwaV07XG5cblx0XHRcdFx0XHRcdGlmIChhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgQVBJICR7cm91dGUuYXBpfWApO1xuXG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChhcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEganNhcGkgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGpzYXBpcGF0aCA9IGFwaS5qc2FwaTtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7anNhcGlwYXRofVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgYXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgYXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5qc1NyY1BhdGggIT0gbnVsbClcblx0XHRcdFx0XHRqc1NyY1BhdGggPSB0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5wdWJsaWNTZWNyZXRzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucHVibGljU2VjcmV0cylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZWNyZXQgPSB0aGlzLmhvdFNpdGUucHVibGljU2VjcmV0c1trZXldO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoc2VjcmV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHZhbHVlID0gSlNPTi5zdHJpbmdpZnkgKHNlY3JldCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkuY29ubmVjdGlvbiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHBhc3Mgc2VjcmV0cyBmcm9tIHRoZSBBUEkgaWYgdGhlcmUncyBubyBjb25uZWN0aW9uIWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlckNvbm46IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuYXBpLmNvbm5lY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5wYXNzU2VjcmV0RnJvbUFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VydmVyQ29ubi5zZWNyZXRzW2tleV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5lbnYgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgQHNlY3Z1bCBJcyB0aGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eT8gTmVlZCB0byB2ZXJpZnkgdGhhdCBcblx0XHRcdFx0XHRcdFx0XHQvLy8gb25seSB0aGUgc2VydmVyIGhhcyBhY2Nlc3MgdG8gdGhpcy4gQXQgdGhpcyBwb2ludCwgSSB0aGluayBvbmx5IHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLy8gc2VydmVyIGhhcyBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW52S2V5OiBzdHJpbmcgPSBzZWNyZXQuZW52O1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAocHJvY2Vzcy5lbnZbZW52S2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwdWJsaWNTZWNyZXRzICs9IGBwcm9jZXNzb3IucHVibGljU2VjcmV0c1tcIiR7a2V5fVwiXSA9ICR7dmFsdWV9O1xcbmA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gdGhpcy5wYWdlQ29udGVudDtcblx0XHRsZXQgZml4Q29udGVudCA9ICh0ZW1wQ29udGVudDogc3RyaW5nKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGV2ZWxvcGVyTW9kZVN0cjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckFQSVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGV2ZWxvcGVyTW9kZVN0ciA9IGB0ZW1wTW9kZSA9IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudDtgO1xuXHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRoaXMudGVzdGVyQXBpQ29udGVudDtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmwgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0ZXN0ZXJBUElTdHIucmVwbGFjZSAoL1xcJWJhc2VcXF90ZXN0ZXJcXF91cmxcXCUvZywgYFxcXCIke3RoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmx9XFxcImApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBsb2FkRmlsZXM6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzICh0aGlzLmZpbGVzKS5sZW5ndGggPiAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGB2YXIgZmlsZXMgPSB7fTtcXG5cXG5gO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuZmlsZXMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGZpbGUgPSB0aGlzLmZpbGVzW2tleV07XG5cdFx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gYFwiJHtmaWxlLnVybH1cImA7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZUNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKGZpbGUuY29udGVudCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRmluZCBhbnkgc2NyaXB0IHRhZ3MgYW5kIGludGVycnVwdCB0aGVtIHNvIHRoZSBIVE1MIHBhcnNlcnMgXG5cdFx0XHRcdFx0XHRcdC8vIGRvbid0IGdldCBjb25mdXNlZC5cblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8c2NyaXB0XCIsIFwiZ21pXCIpLCBcIjxzY3JcXFwiICsgXFxcImlwdFwiKTtcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8XFxcXC9zY3JpcHRcIiwgXCJnbWlcIiksIFwiPC9zY3JcXFwiICsgXFxcImlwdFwiKTtcblxuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGAsIFwiY29udGVudFwiOiAke2VzY2FwZWRDb250ZW50fWA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgXFx0XFx0XFx0ZmlsZXNbXCIke2tleX1cIl0gPSB7IFwidXJsXCI6ICR7ZmlsZVVybH0ke2ZpbGVDb250ZW50fSB9O1xcbmA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGBcXHRcXHRcXHRwcm9taXNlcy5wdXNoIChwcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcykpO1xcbmA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0aXRsZVxcJS9nLCBuYW1lKTtcblxuXHRcdFx0XHRpZiAocGFzc0FyZ3MgPT09IHRydWUpXG5cdFx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXJnc1xcJS9nLCBcIkhvdC5Bcmd1bWVudHNcIik7XG5cblx0XHRcdFx0aWYgKGFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIEpTT04uc3RyaW5naWZ5IChhcmdzKSk7XG5cblx0XHRcdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcm91dGVLZXk7XG5cdFx0XHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIlRlc3RlclwiO1xuXG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubGF1bmNocGFkVXJsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldO1xuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXAgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWhvdHN0YXFcXF9qc1xcX3NyY1xcJS9nLCBqc1NyY1BhdGgpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVkZXZlbG9wZXJcXF9tb2RlXFwlL2csIGRldmVsb3Blck1vZGVTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXCUvZywgdGVzdGVyQVBJU3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpc1xcX3RvXFxfbG9hZFxcJS9nLCBhcGlTY3JpcHRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9hZFxcX2hvdFxcX3NpdGVcXCUvZywgXCJcIik7IC8vLyBAZml4bWUgU2hvdWxkIHRoaXMgb25seSBiZSBkb25lIHNlcnZlci1zaWRlP1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfZmlsZXNcXCUvZywgbG9hZEZpbGVzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfY29kZVxcJS9nLCBhcGlDb2RlKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlcHVibGljXFxfc2VjcmV0c1xcJS9nLCBwdWJsaWNTZWNyZXRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldXJsXFwlL2csIHVybCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX25hbWVcXCUvZywgYFwiJHt0ZXN0ZXJOYW1lfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX21hcFxcJS9nLCBgXCIke3Rlc3Rlck1hcH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXF9iYXNlXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyVXJsfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2xhdW5jaHBhZFxcX3VybFxcJS9nLCBgXCIke3Rlc3RlckxhdW5jaHBhZFVybH1cImApO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcENvbnRlbnQpO1xuXHRcdFx0fTtcblx0XHRjb250ZW50ID0gZml4Q29udGVudCAoY29udGVudCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgRXhwcmVzcyByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcGFnZXMuIEJlIHN1cmUgdG8gbG9hZCB0aGUgXG5cdCAqIHBhZ2VzIGZpcnN0IGJlZm9yZSBkb2luZyB0aGlzLiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBcblx0ICogY3VzdG9taXplZCBFeHByZXNzIGFwcGxpY2F0aW9ucy4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsb2FkZWQgcm91dGVzIFxuXHQgKiBmcm9tIHRoaXMgSG90U3RhcSBvYmplY3Qgd2l0aCBIb3RIVFRQU2VydmVyLCBiZSBzdXJlIHRvIHVzZSBcblx0ICogdGhlIGxvYWRIb3RTaXRlIG1ldGhvZCBpbiBIb3RIVFRQU2VydmVyLlxuXHQgKi9cblx0Y3JlYXRlRXhwcmVzc1JvdXRlcyAoZXhwcmVzc0FwcDogYW55LCBqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLmpzXCIpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5wYWdlcylcblx0XHR7XG5cdFx0XHRsZXQgcGFnZTogSG90UGFnZSA9IHRoaXMucGFnZXNba2V5XTtcblx0XHRcdGNvbnN0IGNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuZ2VuZXJhdGVDb250ZW50IChwYWdlLnJvdXRlLCBwYWdlLm5hbWUsIHBhZ2UuZmlsZXNbMF0udXJsLCBqc1NyY1BhdGgpO1xuXG5cdFx0XHRleHByZXNzQXBwLmdldCAocGFnZS5yb3V0ZSwgKHJlcTogYW55LCByZXM6IGFueSkgPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcy5zZW5kIChjb250ZW50KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3RlciBmb3IgdXNlIGxhdGVyLlxuXHQgKi9cblx0YWRkVGVzdGVyICh0ZXN0ZXI6IEhvdFRlc3Rlcik6IHZvaWRcblx0e1xuXHRcdHRoaXMudGVzdGVyc1t0ZXN0ZXIubmFtZV0gPSB0ZXN0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldFdlYlRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIHdlYiBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgbWFwcyBmb3IgdGVzdGluZyBmcm9tIHRoZSBIb3RTaXRlLlxuXHQgKi9cblx0Z2V0QVBJVGVzdGluZ01hcHMgKCk6IHN0cmluZ1tdXG5cdHtcblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gSG90U2l0ZSB3YXMgbG9hZGVkIVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3RpbmcgYXBpIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSB0ZXN0aW5nIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBtYXBzIVwiKTtcblxuXHRcdHJldHVybiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlJ3Mga2V5IGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLnJvdXRlcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1trZXldO1xuXG5cdFx0XHRcdFx0aWYgKHJvdXRlLm5hbWUgPT09IG5hbWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Zm91bmRLZXkgPSBrZXk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoZm91bmRLZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlIGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBIb3RTaXRlUm91dGVcblx0e1xuXHRcdGxldCBmb3VuZFJvdXRlOiBIb3RTaXRlUm91dGUgPSBudWxsO1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gdGhpcy5nZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lKTtcblxuXHRcdGlmIChmb3VuZEtleSAhPT0gXCJcIilcblx0XHRcdGZvdW5kUm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW2ZvdW5kS2V5XTtcblxuXHRcdHJldHVybiAoZm91bmRSb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0ZXN0cy5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqIEBwYXJhbSBtYXBOYW1lIFRoZSBtYXAgb3IgbWFwcyB0byB1c2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nLCBtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRlc3Rlci5leGVjdXRlIChtYXBOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgd2ViIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyB3ZWIgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxXZWJUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRXZWJUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgYXBpIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyBhcGkgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxBUElUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRBUElUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAocGFnZU5hbWU6IHN0cmluZywgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLmdldFBhZ2UgKHBhZ2VOYW1lKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwYWdlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBsb2NhbCBmaWxlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBwcm9jZXNzTG9jYWxGaWxlIChsb2NhbEZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IGxvY2FsRmlsZXBhdGgsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcImxvY2FsRmlsZVwiOiBsb2NhbEZpbGVwYXRoXG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHVybCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc1VybCAob3B0aW9uczogSG90U3RhcnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcInVybFwiOiBvcHRpb25zLnVybFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogb3B0aW9ucy5wcm9jZXNzb3IsXG5cdFx0XHRcdFwibmFtZVwiOiBvcHRpb25zLm5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdLFxuXHRcdFx0XHRcInRlc3Rlck5hbWVcIjogb3B0aW9ucy50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcInRlc3Rlck1hcFwiOiBvcHRpb25zLnRlc3Rlck1hcFxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29udGVudCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0NvbnRlbnQgKHByb2Nlc3NvcjogSG90U3RhcSwgXG5cdFx0Y29udGVudDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFwiY29udGVudFwiOiBjb250ZW50XG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiB0aGUgd2luZG93IGhhcyBmaW5pc2hlZCBsb2FkaW5nLCBleGVjdXRlIHRoZSBmdW5jdGlvbi5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgb25SZWFkeSAocmVhZHlGdW5jOiAoKSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0aWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRcdFx0cmVhZHlGdW5jICgpO1xuXHRcdGVsc2Vcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgcmVhZHlGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBvdXRwdXQuXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIHVzZU91dHB1dCAob3V0cHV0OiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRkb2N1bWVudC5vcGVuICgpO1xuXHRcdGRvY3VtZW50LndyaXRlIChvdXRwdXQpO1xuXHRcdGRvY3VtZW50LmNsb3NlICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIHRlc3RlcnMgdG8gbG9hZC5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIEFMTCB0ZXN0ZXJzIHRvIGZpbmlzaCBsb2FkaW5nLiBPbmx5IFxuXHQgKiB0aGUgZmlyc3Qgb25lLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXRGb3JUZXN0ZXJzICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAoSG90U3RhcS5pc1JlYWR5Rm9yVGVzdGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0IGZyb20gdGhlIGdpdmVuIHVybC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheVVybCAodXJsOiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uUmVhZHkgKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInVybFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCA9IHVybC51cmw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IHVybC5wcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncyA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5hcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gdXJsLmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTWFwID0gdXJsLnRlc3Rlck1hcDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB1cmwudGVzdGVyTmFtZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3RlckFQSUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSB1cmwudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yLnRlc3RlckFQSSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBcImh0dHA6Ly8xMjcuMC4wLjE6ODE4MlwiO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNsaWVudDogSG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdGVzdGVyQVBJOiBIb3RUZXN0ZXJBUEkgPSBuZXcgSG90VGVzdGVyQVBJIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwsIGNsaWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyQVBJLmNvbm5lY3Rpb24uYXBpID0gdGVzdGVyQVBJO1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Nvci50ZXN0ZXJBUEkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3RTdGFxLnByb2Nlc3NVcmwgKG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBcbmA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuXHRmdW5jdGlvbiBob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKVxuXHR7XG5cdFx0aWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChIb3QuTW9kZSA9PT0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZnVuYyA9IGZ1bmN0aW9uICgpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5UZXN0ZXJBUEkgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHRlc3RQYXRocyA9IHt9O1xuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdE1hcHMgPSBKU09OLnN0cmluZ2lmeSAoSG90LkN1cnJlbnRQYWdlLnRlc3RNYXBzKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gSG90LkN1cnJlbnRQYWdlLnRlc3RQYXRocylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0ZXN0UGF0aCA9IEhvdC5DdXJyZW50UGFnZS50ZXN0UGF0aHNba2V5XTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RQYXRoc1trZXldID0gdGVzdFBhdGgudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdFBhdGhzU3RyID0gSlNPTi5zdHJpbmdpZnkgKHRlc3RQYXRocyk7XG5cblx0XHRcdFx0XHRcdFx0SG90LlRlc3RlckFQSS50ZXN0ZXIucGFnZUxvYWRlZCAoe1xuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXA6IEhvdC5DdXJyZW50UGFnZS50ZXN0ZXJNYXAsXG5cdFx0XHRcdFx0XHRcdFx0XHRwYWdlTmFtZTogSG90LkN1cnJlbnRQYWdlLm5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxlbWVudHM6IHRlc3RFbGVtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRcdHRlc3RQYXRoczogdGVzdFBhdGhzU3RyXG5cdFx0XHRcdFx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAocmVzcC5lcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikgfHwgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiaW50ZXJhY3RpdmVcIikpXG5cdFx0XHRcdFx0ZnVuYyAoKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKTtcbjwvc2NyaXB0PmA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBob3R0IHNjcmlwdC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheUNvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBudWxsKTogUHJvbWlzZTxIb3RTdGFxPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTxIb3RTdGFxPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0SG90U3RhcS5vblJlYWR5IChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc0NvbnRlbnQgKHByb2Nlc3NvciwgY29udGVudCwgbmFtZSk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxufVxuXG4iLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJjcm9zcy1mZXRjaFwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyB0aGF0IGNhbiBiZSBzaG93biBwdWJsaWNseS4gVGhlc2UgY2FuIGJlIHBhc3NlZCBmcm9tIEhvdFNpdGUuanNvbi5cblx0ICovXG5cdHN0YXRpYyBQdWJsaWNTZWNyZXRzOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBDU1Mgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBDU1MgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMgY3NzU3RyOiBzdHJpbmcgPSBgPGxpbmsgcmVsID0gXCJzdHlsZXNoZWV0XCIgaHJlZiA9IFwiJUNTU19GSUxFJVwiIC8+YDtcblx0LyoqXG5cdCAqIFRoZSBDU1MgZmlsZXMgdG8gdXNlIGluIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKiBcblx0ICogQHRvZG8gTWFrZSB0aGlzIGEgXCJzdHJpbmcgfCBDU1NPYmplY3RcIiBkYXRhIHR5cGUgc28gaXQgY2FuIGFsc28gaW5jbHVkZSBcblx0ICogdGhlIGludGVncml0eSBoYXNoZXMgYXMgd2VsbC5cblx0ICovXG5cdHN0YXRpYyBDU1M6IHN0cmluZ1tdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IEpTRmlsZU9iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIEpTRmlsZXM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBpbmxpbmUgY29kZSB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgSlNTY3JpcHRzOiBhbnlbXSA9IFtdO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzRmlsZVN0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIlSlNfRklMRSVcIj48L3NjcmlwdD5gO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzU2NyaXB0c1N0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+JUpTX0NPREUlPC9zY3JpcHQ+YDtcblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGUgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBsb3dlckZpbGU6IHN0cmluZyA9IGZpbGUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgZG9lcyBub3QgaGF2ZSBhIG5haGZhbSwgYWRkIGl0LiBUaGlzIFxuXHRcdFx0XHQvLyB3aWxsIGVuc3VyZSB0aGUgc2VydmVyIHNlbmRzIG9ubHkgdGhlIGZpbGUgY29udGVudC5cblx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIi5ob3R0XCIpID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwibmFoZmFtXCIpIDwgMClcblx0XHRcdFx0XHRcdGZpbGUgKz0gXCI/aHBzZXJ2ZT1uYWhmYW1cIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEhvdC5lY2hvIChhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSwgYXJncykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJ1biBhbiBhbHJlYWR5IGxvYWRlZCBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHJ1bkZpbGUgKGZpbGVOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5nZXRGaWxlIChmaWxlTmFtZSk7XG5cdFx0Ly8vIEBmaXhtZSBEb2VzIHRoZSBmaWxlIG5lZWQgdG8gYmUgZGVlcCBjbG9uZWQgZmlyc3Q/XG5cdFx0Ly9sZXQgY2xvbmVkRmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlIChPYmplY3QuYXNzaWduICh7fSwgZmlsZSkpO1xuXHRcdGxldCB0ZW1wRmlsZTogSG90RmlsZSA9IGZpbGU7XG5cblx0XHR0ZW1wRmlsZS5wYWdlID0gdGhpcy5DdXJyZW50UGFnZTtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGVtcEZpbGUucHJvY2VzcyAoYXJncyk7XG5cblx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBnZXRGaWxlIChwYXRoOiBIb3RGaWxlIHwgc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCB0ZW1wRmlsZTogSG90RmlsZSA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChwYXRoKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHR0ZW1wRmlsZSA9IG5ldyBIb3RGaWxlICgpO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGVtcEZpbGUudXJsID0gcGF0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGVtcEZpbGUubG9jYWxGaWxlID0gcGF0aDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGVtcEZpbGUgPSBwYXRoO1xuXG5cdFx0YXdhaXQgdGVtcEZpbGUubG9hZCAoKTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhbiBhcGkgY2FsbC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBodHRwTWV0aG9kOiBzdHJpbmcgPSBcIlBPU1RcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJDdXJyZW50IHBhZ2UgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBhcGkgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkgIT0gbnVsbClcblx0XHRcdHJlc3VsdCA9IGF3YWl0IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpLmNhbGwgKHJvdXRlLCBkYXRhLCBodHRwTWV0aG9kKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCBKU09OIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIEpTT04uc3RyaW5naWZ5IGFuZCBzZW5kLlxuXHQgKiBAcGFyYW0gaHR0cE1ldGhvZCBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIHRvIHNlbmQgdGhlIGRhdGEuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGpzb25SZXF1ZXN0ICh1cmw6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgaHR0cE1ldGhvZDogc3RyaW5nID0gXCJQT1NUXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCByZXM6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2ggKHVybCwge1xuXHRcdFx0XHRcdFwibWV0aG9kXCI6IGh0dHBNZXRob2QsXG5cdFx0XHRcdFx0XCJoZWFkZXJzXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwiYm9keVwiOiBKU09OLnN0cmluZ2lmeSAoZGF0YSlcblx0XHRcdFx0fSk7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0cmV0dXJuIChKU09OLnN0cmluZ2lmeSAoeyBcImVycm9yXCI6IGAke2V4Lm1lc3NhZ2V9IC0gQ291bGQgbm90IGZldGNoICR7dXJsfWAgfSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCByZXF1ZXN0LiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBmb3IgZmV0Y2guXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSByZXF1ZXN0SW5pdCBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIHNlbmQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgSFRUUCByZXNwb25zZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIHJlcXVlc3RJbml0OiBSZXF1ZXN0SW5pdCA9IHVuZGVmaW5lZCk6IFByb21pc2U8UmVzcG9uc2U+XG5cdHtcblx0XHRsZXQgcmVzOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoICh1cmwsIHJlcXVlc3RJbml0KTtcblxuXHRcdHJldHVybiAocmVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCBzb21lIG91dHB1dC5cblx0ICovXG5cdHN0YXRpYyBlY2hvIChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRIb3QuT3V0cHV0ICs9IG1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgdGhlIENTUyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUNTUyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuQ1NTLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjc3NGaWxlOiBzdHJpbmcgPSBIb3QuQ1NTW2lJZHhdO1xuXHRcdFx0bGV0IGNzc091dDogc3RyaW5nID0gSG90LmNzc1N0cjtcblxuXHRcdFx0Y3NzT3V0ID0gY3NzT3V0LnJlcGxhY2UgKC9cXCVDU1NfRklMRVxcJS9nLCBjc3NGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGNzc091dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBmaWxlcyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTRmlsZXMgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkpTRmlsZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzRmlsZTogc3RyaW5nID0gSG90LkpTRmlsZXNbaUlkeF07XG5cdFx0XHRsZXQganNGaWxlT3V0OiBzdHJpbmcgPSBIb3QuanNGaWxlU3RyO1xuXG5cdFx0XHRqc0ZpbGVPdXQgPSBqc0ZpbGVPdXQucmVwbGFjZSAoL1xcJUpTX0ZJTEVcXCUvZywganNGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGpzRmlsZU91dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBzY3JpcHRzIGZvciB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwbGF5SlNTY3JpcHRzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU1NjcmlwdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzU2NyaXB0OiBzdHJpbmcgPSBIb3QuSlNTY3JpcHRzW2lJZHhdO1xuXHRcdFx0bGV0IGpzU2NyaXB0T3V0OiBzdHJpbmcgPSBIb3QuanNTY3JpcHRzU3RyO1xuXG5cdFx0XHRqc1NjcmlwdE91dCA9IGpzU2NyaXB0T3V0LnJlcGxhY2UgKC9cXCVKU19DT0RFXFwlL2csIGpzU2NyaXB0KTtcblxuXHRcdFx0SG90LmVjaG8gKGpzU2NyaXB0T3V0KTtcblx0XHR9XG5cdH1cbn0iLCJ2YXIgZ2xvYmFsID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXM7XG52YXIgX19zZWxmX18gPSAoZnVuY3Rpb24gKCkge1xuZnVuY3Rpb24gRigpIHtcbnRoaXMuZmV0Y2ggPSBmYWxzZTtcbnRoaXMuRE9NRXhjZXB0aW9uID0gZ2xvYmFsLkRPTUV4Y2VwdGlvblxufVxuRi5wcm90b3R5cGUgPSBnbG9iYWw7XG5yZXR1cm4gbmV3IEYoKTtcbn0pKCk7XG4oZnVuY3Rpb24oc2VsZikge1xuXG52YXIgaXJyZWxldmFudCA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuXG4gIHZhciBzdXBwb3J0ID0ge1xuICAgIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gc2VsZixcbiAgICBpdGVyYWJsZTogJ1N5bWJvbCcgaW4gc2VsZiAmJiAnaXRlcmF0b3InIGluIFN5bWJvbCxcbiAgICBibG9iOlxuICAgICAgJ0ZpbGVSZWFkZXInIGluIHNlbGYgJiZcbiAgICAgICdCbG9iJyBpbiBzZWxmICYmXG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV3IEJsb2IoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gc2VsZixcbiAgICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBzZWxmXG4gIH07XG5cbiAgZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbiAgfVxuXG4gIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gICAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICAgJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gICAgXTtcblxuICAgIHZhciBpc0FycmF5QnVmZmVyVmlldyA9XG4gICAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fl0vaS50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZScpXG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuICBmdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBpdGVyYXRvclxuICB9XG5cbiAgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgdGhpcy5tYXAgPSB7fTtcblxuICAgIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMpIHtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV07XG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWU7XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICBpdGVtcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGl0ZW1zLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICAgIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gICAgfVxuICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKTtcbiAgICAgIH07XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpO1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpO1xuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgICByZXR1cm4gYnVmLnNsaWNlKDApXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSk7XG4gICAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24oYm9keSkge1xuICAgICAgdGhpcy5fYm9keUluaXQgPSBib2R5O1xuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpO1xuICAgICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsIHRoaXMuX2JvZHlCbG9iLnR5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKTtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gY29uc3VtZWQodGhpcykgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKTtcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxuICB2YXIgbWV0aG9kcyA9IFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUE9TVCcsICdQVVQnXTtcblxuICBmdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gICAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG4gIH1cblxuICBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHk7XG5cbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gaW5wdXQudXJsO1xuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0O1xuICAgICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXJsID0gU3RyaW5nKGlucHV0KTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbic7XG4gICAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJyk7XG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsO1xuICAgIHRoaXMuc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgfHwgdGhpcy5zaWduYWw7XG4gICAgdGhpcy5yZWZlcnJlciA9IG51bGw7XG5cbiAgICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cycpXG4gICAgfVxuICAgIHRoaXMuX2luaXRCb2R5KGJvZHkpO1xuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbiAgfTtcblxuICBmdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICAgIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgYm9keVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCcmJylcbiAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICAgIGlmIChieXRlcykge1xuICAgICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gZm9ybVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgLy8gUmVwbGFjZSBpbnN0YW5jZXMgb2YgXFxyXFxuIGFuZCBcXG4gZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIHNwYWNlIG9yIGhvcml6b250YWwgdGFiIHdpdGggYSBzcGFjZVxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gICAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJyk7XG4gICAgcHJlUHJvY2Vzc2VkSGVhZGVycy5zcGxpdCgvXFxyP1xcbi8pLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnOicpO1xuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpO1xuICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKTtcblxuICBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1cztcbiAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJztcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJyc7XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbiAgUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwge1xuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICB1cmw6IHRoaXMudXJsXG4gICAgfSlcbiAgfTtcblxuICBSZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pO1xuICAgIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InO1xuICAgIHJldHVybiByZXNwb25zZVxuICB9O1xuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XTtcblxuICBSZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uKHVybCwgc3RhdHVzKSB7XG4gICAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxuICB9O1xuXG4gIGV4cG9ydHMuRE9NRXhjZXB0aW9uID0gc2VsZi5ET01FeGNlcHRpb247XG4gIHRyeSB7XG4gICAgbmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGV4cG9ydHMuRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKTtcbiAgICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9O1xuICAgIGV4cG9ydHMuRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgICBleHBvcnRzLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBleHBvcnRzLkRPTUV4Y2VwdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoKGlucHV0LCBpbml0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdCk7XG5cbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH1cblxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICBmdW5jdGlvbiBhYm9ydFhocigpIHtcbiAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICB9XG5cbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgfHwgJycpXG4gICAgICAgIH07XG4gICAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJyk7XG4gICAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCBvcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHRydWUpO1xuXG4gICAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyICYmIHN1cHBvcnQuYmxvYikge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpO1xuXG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpO1xuICAgIH0pXG4gIH1cblxuICBmZXRjaC5wb2x5ZmlsbCA9IHRydWU7XG5cbiAgaWYgKCFzZWxmLmZldGNoKSB7XG4gICAgc2VsZi5mZXRjaCA9IGZldGNoO1xuICAgIHNlbGYuSGVhZGVycyA9IEhlYWRlcnM7XG4gICAgc2VsZi5SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgICBzZWxmLlJlc3BvbnNlID0gUmVzcG9uc2U7XG4gIH1cblxuICBleHBvcnRzLkhlYWRlcnMgPSBIZWFkZXJzO1xuICBleHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuICBleHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG4gIGV4cG9ydHMuZmV0Y2ggPSBmZXRjaDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KHt9KSk7XG59KShfX3NlbGZfXyk7XG5fX3NlbGZfXy5mZXRjaC5wb255ZmlsbCA9IHRydWU7XG4vLyBSZW1vdmUgXCJwb2x5ZmlsbFwiIHByb3BlcnR5IGFkZGVkIGJ5IHdoYXR3Zy1mZXRjaFxuZGVsZXRlIF9fc2VsZl9fLmZldGNoLnBvbHlmaWxsO1xuLy8gQ2hvb3NlIGJldHdlZW4gbmF0aXZlIGltcGxlbWVudGF0aW9uIChnbG9iYWwpIG9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiAoX19zZWxmX18pXG4vLyB2YXIgY3R4ID0gZ2xvYmFsLmZldGNoID8gZ2xvYmFsIDogX19zZWxmX187XG52YXIgY3R4ID0gX19zZWxmX187IC8vIHRoaXMgbGluZSBkaXNhYmxlIHNlcnZpY2Ugd29ya2VyIHN1cHBvcnQgdGVtcG9yYXJpbHlcbmV4cG9ydHMgPSBjdHguZmV0Y2ggLy8gVG8gZW5hYmxlOiBpbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnXG5leHBvcnRzLmRlZmF1bHQgPSBjdHguZmV0Y2ggLy8gRm9yIFR5cGVTY3JpcHQgY29uc3VtZXJzIHdpdGhvdXQgZXNNb2R1bGVJbnRlcm9wLlxuZXhwb3J0cy5mZXRjaCA9IGN0eC5mZXRjaCAvLyBUbyBlbmFibGU6IGltcG9ydCB7ZmV0Y2h9IGZyb20gJ2Nyb3NzLWZldGNoJ1xuZXhwb3J0cy5IZWFkZXJzID0gY3R4LkhlYWRlcnNcbmV4cG9ydHMuUmVxdWVzdCA9IGN0eC5SZXF1ZXN0XG5leHBvcnRzLlJlc3BvbnNlID0gY3R4LlJlc3BvbnNlXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNcbiIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHNlcnZlci5cbiAqL1xuZXhwb3J0IGVudW0gSG90U2VydmVyVHlwZVxue1xuXHRIVFRQLFxuXHRXZWJTb2NrZXRzXG59XG5cbi8qKlxuICogVGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90U2VydmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdHlwZS5cblx0ICovXG5cdHNlcnZlclR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgbmV0d29yayBhZGRyZXNzIHRvIGxpc3RlbiBvbi5cblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqL1xuXHRsaXN0ZW5BZGRyZXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHQgKi9cblx0cG9ydHM6IHtcblx0XHRcdGh0dHA6IG51bWJlcjtcblx0XHRcdGh0dHBzOiBudW1iZXI7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFNTTCBzZXR0aW5ncy5cblx0ICovXG5cdHNzbDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2VydDogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIGtleSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGtleTogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIENBIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2E6IHN0cmluZztcblx0XHR9O1xuXHQvKipcblx0ICogUmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTLlxuXHQgKi9cblx0cmVkaXJlY3RIVFRQdG9IVFRQUzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuXG5cdCAqL1xuXHRzZWNyZXRzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSB8IEhvdFNlcnZlcilcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHtcblx0XHRcdFx0XHRodHRwOiA4MCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHtcblx0XHRcdFx0XHRjZXJ0OiBcIlwiLFxuXHRcdFx0XHRcdGtleTogXCJcIixcblx0XHRcdFx0XHRjYTogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWRpcmVjdEhUVFB0b0hUVFBTID0gdHJ1ZTtcblx0XHRcdHRoaXMudHlwZSA9IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0XHRcdHRoaXMuc2VjcmV0cyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3IucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gcHJvY2Vzc29yLnNlcnZlclR5cGUgfHwgXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gcHJvY2Vzc29yLmFwaSB8fCBudWxsO1xuXHRcdFx0dGhpcy5saXN0ZW5BZGRyZXNzID0gcHJvY2Vzc29yLmxpc3RlbkFkZHJlc3MgfHwgXCIwLjAuMC4wXCI7XG5cdFx0XHR0aGlzLnBvcnRzID0gcHJvY2Vzc29yLnBvcnRzIHx8IHtcblx0XHRcdFx0XHRodHRwOiA4MCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHByb2Nlc3Nvci5zc2wgfHwge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSBwcm9jZXNzb3IucmVkaXJlY3RIVFRQdG9IVFRQUyAhPSBudWxsID8gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgOiB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gcHJvY2Vzc29yLnR5cGUgfHwgSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0gcHJvY2Vzc29yLnNlY3JldHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbiBBUEkgdG8gdGhpcyBzZXJ2ZXIuIFRoaXMgd2lsbCBhbHNvIHNldCB0aGUgYXNzb2NpYXRlZCBcblx0ICogcHJvY2Vzc29yIHRvIHRoaXMgQVBJIGFzIHdlbGwuXG5cdCAqL1xuXHRhc3luYyBzZXRBUEkgKGFwaTogSG90QVBJKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IuYXBpID0gYXBpO1xuXHRcdHRoaXMuYXBpID0gYXBpO1xuXG5cdFx0Ly9pZiAocmVnaXN0ZXJSb3V0ZXMgPT09IHRydWUpXG5cdFx0XHQvL2F3YWl0IHRoaXMuYXBpLnJlZ2lzdGVyUm91dGVzICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZT8gKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTaHV0ZG93biB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgc2h1dGRvd24/ICgpOiBQcm9taXNlPHZvaWQ+O1xufSIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcImNyb3NzLWZldGNoXCI7XG5cbmltcG9ydCB7IERldmVsb3Blck1vZGUsIEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuLyoqXG4gKiBBIGZpbGUgdG8gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90RmlsZVxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCBwYWdlLlxuXHQgKi9cblx0cGFnZT86IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIGdldC5cblx0ICovXG5cdGxvY2FsRmlsZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9ycz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBmaWxlIHRvIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RGaWxlIGltcGxlbWVudHMgSUhvdEZpbGVcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHRsb2NhbEZpbGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3JjZSBhbGwgZXJyb3JzIHRvIGJlIHRocm93bi5cblx0ICovXG5cdHRocm93QWxsRXJyb3JzOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90RmlsZSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5wYWdlID0gY29weS5wYWdlIHx8IG51bGw7XG5cdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0dGhpcy51cmwgPSBjb3B5LnVybCB8fCBcIlwiO1xuXHRcdHRoaXMubG9jYWxGaWxlID0gY29weS5sb2NhbEZpbGUgfHwgXCJcIjtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb3B5LmNvbnRlbnQgfHwgXCJcIjtcblx0XHR0aGlzLnRocm93QWxsRXJyb3JzID0gY29weS50aHJvd0FsbEVycm9ycyB8fCBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0c2V0Q29udGVudCAoY29udGVudDogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0Z2V0Q29udGVudCAoKTogc3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMuY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgZ2V0IHJlcXVlc3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaHR0cEdldCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCByZXM6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2ggKHVybCk7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzLnRleHQgKCk7XG5cblx0XHRcdHJldHVybiAoY29udGVudCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgdXJsLlxuXHQgKi9cblx0YXN5bmMgbG9hZFVybCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0aGlzLmNvbnRlbnQgPSBhd2FpdCBIb3RGaWxlLmh0dHBHZXQgKHRoaXMudXJsKTtcblxuXHRcdHJldHVybiAodGhpcy5jb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkTG9jYWxGaWxlICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBuZXcgUHJvbWlzZSAoXG5cdFx0XHQocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT5cblx0XHRcdHtcblx0XHRcdFx0ZnMucmVhZEZpbGUgKHRoaXMubG9jYWxGaWxlLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycjtcblxuXHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXNvbHZlICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gKHByb21pc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnVybCAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRVcmwgKCk7XG5cblx0XHRpZiAodGhpcy5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkTG9jYWxGaWxlICgpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHN0cmluZyBjb250ZW50LiBUaGlzIHdpbGwgdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzQ29udGVudCAoY29udGVudDogc3RyaW5nLCBjb250ZW50UmVnZXg6IFJlZ0V4cCxcblx0XHRjb250ZW50UHJvY2Vzc29yOiAocmVnZXhGb3VuZDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0b2ZmQ29udGVudFByb2Nlc3NvcjogKG9mZkNvbnRlbnQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG51bVJlbW92ZUZyb21CZWdpbm5pbmc6IG51bWJlciA9IDIsXG5cdFx0bnVtUmVtb3ZlRnJvbUVuZDogbnVtYmVyID0gMik6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHJlc3VsdDogUmVnRXhwRXhlY0FycmF5ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR3aGlsZSAocmVzdWx0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHN0YXJ0OiBudW1iZXIgPSByZXN1bHQuaW5kZXggLSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nO1xuXHRcdFx0bGV0IGVuZDogbnVtYmVyID0gY29udGVudFJlZ2V4Lmxhc3RJbmRleCArIG51bVJlbW92ZUZyb21FbmQ7XG5cblx0XHRcdC8vIEdldCB0aGUgcHJldmlvdXMgc2VjdGlvbi5cblx0XHRcdGxldCBwcmV2Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChzdGFydCAtIHByZXZpb3VzSW5kZXgpKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQ7XG5cblx0XHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChwcmV2Q29udGVudCk7XG5cblx0XHRcdC8vIFByb2Nlc3MgdGhlIGNvbnRlbnQgZm91bmQgZnJvbSB0aGUgcmVnZXhcblx0XHRcdGxldCBjb250ZW50Rm91bmQ6IHN0cmluZyA9IHJlc3VsdFswXTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChjb250ZW50Rm91bmQpO1xuXG5cdFx0XHQvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24gdG8gcGFyc2UuXG5cdFx0XHRyZXN1bHQgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW55IGNvbnRlbnQgdGhhdCBjb3VsZCBoYXZlIG5lc3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBcblx0ICogdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBmaXhtZSBOZWVkcyB0byBiZSBhYmxlIHRvIGlnbm9yZSBhbnkgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUgY29tbWVudHMgXG5cdCAqIG9yIGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBpcyB1c2VkIGBgYCR7XCJUZXN0IH1cIn1gYGAgSXQgXG5cdCAqIHdpbGwgZXJyb3Igb3V0LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycyk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IHN0YXJ0VHJpZ2dlclBvczogbnVtYmVyID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIHBvcyk7XG5cdFx0XHRsZXQgbmVzdGVkQ291bnRlcjogbnVtYmVyID0gMDtcblxuXHRcdFx0aWYgKHRyaWdnZXJDaGFyICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXZlcnNlIHNlYXJjaCB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFxuXHRcdFx0XHQvLyBvY2N1cnJlbmNlcy5cblx0XHRcdFx0bGV0IHJwb3M6IG51bWJlciA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBlbmQgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHR3aGlsZSAocnBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJwb3MgPT09IHN0YXJ0VHJpZ2dlclBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0cnBvcyA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBycG9zIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbmVzdGVkIHRyaWdnZXIgY2hhcmFjdGVycywgZ2V0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXG5cdFx0XHQvLyB0aGUgZW5kIGNoYXJhY3Rlci5cblx0XHRcdGlmIChuZXN0ZWRDb3VudGVyID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRsZXQgdGVtcGVwb3M6IG51bWJlciA9IGVwb3M7XG5cblx0XHRcdFx0d2hpbGUgKChlcG9zID4gLTEpICYmIChuZXN0ZWRDb3VudGVyID4gMCkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGVtcGVwb3MgPCAwKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGRpc2NvdmVyaW5nIGVuZENoYXJzIHRoYXQgd2Ugc2hvdWxkbid0IGJlLlxuXHRcdFx0XHRcdGxldCBwb3NPdXRzaWRlT2ZDb250ZW50OiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mIChzdGFydENoYXJzLCB0ZW1wZXBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXG5cdFx0XHRcdFx0aWYgKHBvc091dHNpZGVPZkNvbnRlbnQgPiBlcG9zKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRlcG9zID0gdGVtcGVwb3M7XG5cblx0XHRcdFx0XHR0ZW1wZXBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVwb3MgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0XHRuZXN0ZWRDb3VudGVyLS07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlbmQgPSBlcG9zO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb2ZmQ29udGVudFN0cjogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChwb3MgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAob2ZmQ29udGVudFN0cik7XG5cblx0XHRcdGxldCBmb3VuZENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChcblx0XHRcdFx0cG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZywgKGVuZCAtIChwb3MgKyBudW1SZW1vdmVGcm9tQmVnaW5uaW5nKSkpO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGZvdW5kQ29udGVudCk7XG5cblx0XHRcdC8vIEdldCB0aGUgbmV4dCBjb250ZW50XG5cdFx0XHRwb3MgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0c3RhcnRUcmlnZ2VyUG9zID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQgKyBudW1SZW1vdmVGcm9tRW5kO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHRoZSBjb250ZW50IGluIHRoaXMgZmlsZS4gVGhpcyB0cmVhdHMgZWFjaCBmaWxlIGFzIG9uZSBsYXJnZSBKYXZhU2NyaXB0XG5cdCAqIGZpbGUuIEFueSB0ZXh0IG91dHNpZGUgb2YgdGhlIDwqICo+IGFyZWFzIHdpbGwgYmUgdHJlYXRlZCBhczpcblx0ICogXG5cdCAqIFx0XHRIb3QuZWNobyAoXCJ0ZXh0XCIpO1xuXHQgKiBcblx0ICogQGZpeG1lIFRoZSByZWdleCdzIGluIHRoZSBvZmZDb250ZW50IGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGZpeGVkLiBUaGVyZSdzIHNldmVyYWwgXG5cdCAqIHRlc3QgY2FzZXMgd2hlcmUgdGhleSB3aWxsIGZhaWwuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCB0aGlzQ29udGVudDogc3RyaW5nID0gdGhpcy5jb250ZW50O1xuXG5cdFx0SG90Lk1vZGUgPSB0aGlzLnBhZ2UucHJvY2Vzc29yLm1vZGU7XG5cdFx0SG90LkFyZ3VtZW50cyA9IGFyZ3M7XG5cdFx0SG90LkN1cnJlbnRQYWdlID0gdGhpcy5wYWdlO1xuXHRcdEhvdC5QdWJsaWNTZWNyZXRzID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5wdWJsaWNTZWNyZXRzO1xuXHRcdEhvdC5BUEkgPSB0aGlzLnBhZ2UuZ2V0QVBJICgpO1xuXHRcdEhvdC5UZXN0ZXJBUEkgPSB0aGlzLnBhZ2UuZ2V0VGVzdGVyQVBJICgpO1xuXG5cdFx0Ly8gQXNzZW1ibGUgdGhlIEpTIHRvIGV2YWx1YXRlLiBUaGlzIHdpbGwgdGFrZSBhbGwgY29udGVudCBvdXRzaWRlIG9mIFxuXHRcdC8vIDwqIGFuZCAqPiBhbmQgd3JhcCBhIEhvdC5lY2hvIGFyb3VuZCBpdC4gQW55IEpTIGZvdW5kIGluc2lkZSBvZiB0aGUgXG5cdFx0Ly8gPCogYW5kICo+IHdpbGwgYmUgZXhlY3V0ZWQgYXMgaXMuXG5cdFx0b3V0cHV0ID0gSG90RmlsZS5wcm9jZXNzQ29udGVudCAodGhpc0NvbnRlbnQsIFxuXHRcdFx0bmV3IFJlZ0V4cCAoXCIoPz1cXFxcPFxcXFwqKShbXFxcXHNcXFxcU10qPykoPz1cXFxcKlxcXFw+KVwiLCBcImdcIiksIFxuXHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBIGxpdHRsZSBoYWNrLCBzaW5jZSBJIHN1Y2sgYXQgUmVnZXggOihcblx0XHRcdFx0cmVnZXhGb3VuZCA9IHJlZ2V4Rm91bmQuc3Vic3RyICgyKTtcblxuXHRcdFx0XHRyZXR1cm4gKGAke3JlZ2V4Rm91bmR9YCk7XG5cdFx0XHR9LCBcblx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKG9mZkNvbnRlbnQgPT09IFwiXCIpXG5cdFx0XHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0b2ZmQ29udGVudCwgXCIhe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQyOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0LCBcIlNUUntcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFxuXHRcdFx0XHRcdFx0YComJiUqJUAjQCFlY2hvT3V0cHV0IChKU09OLnN0cmluZ2lmeSgke3JlZ2V4Rm91bmQyfSksICR7dGhpcy50aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0MiwgXCIke1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYComJiUqJUAjQCF0cnkgeyBIb3QuZWNobyAoJHtyZWdleEZvdW5kMn0pOyB9Y2F0Y2ggKGV4KXtIb3QuZWNobyAoXCJcIik7fSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy50aHJvd0FsbEVycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCFIb3QuZWNobyAoJHtyZWdleEZvdW5kMn0pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdC8qbGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3RoaXMudGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKEhvdC5Nb2RlID09PSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb24pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDMsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cdFx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0XHQvKmxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke29mZkNvbnRlbnQzfSwgJHt0aGlzLnRocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKEhvdC5Nb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcE91dHB1dDQgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIj8oXCIsIFwiKVwiLCBcIihcIiwgXG5cdFx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmRTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQgYmUgcGFyc2VkLiBJZiBzbywgc3RyaW5naWZ5IGl0LlxuXHRcdFx0XHRcdFx0XHRcdEpTT04ucGFyc2UgKHJlZ2V4Rm91bmQyKTtcblx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IEpTT04uc3RyaW5naWZ5IChyZWdleEZvdW5kMik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdmFsaWQgSlNPTiBpcyBub3QgcmVjZWl2ZWQsIGRvbid0IHdvcnJ5IGFib3V0IGl0LCBwYXNzIGl0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIGFsb25nIHRvIHRoZSBmdW5jdGlvbiBiZWxvdyBmb3IgaXQgdG8gYmUgcGFyc2VkIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biB0aGVyZSBpbnN0ZWFkLlxuXHRcdFx0XHRcdFx0XHRcdGZvdW5kU3RyID0gYCR7cmVnZXhGb3VuZDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgTWFrZSB0aGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gYW5kIHBhc3MgZm91bmRTdHIsIGV0Yy5cblx0XHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXG5gKiYmJSolQCNAIXtcbmNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoJHtmb3VuZFN0cn0pO1xuSG90LmVjaG8gKFxcYGRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiXFwke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIlxcJHt0ZXN0RWxtLmZ1bmN9XCIgZGF0YS10ZXN0LW9iamVjdC12YWx1ZSA9IFwiXFwke3Rlc3RFbG0udmFsdWV9XCJcXGApO1xufSomISMlQCFAKiFcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHRcdC8qbGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7b2ZmQ29udGVudDN9LCAke3RoaXMudGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDU6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0LCBcIiomJiUqJUAjQCFcIiwgXCIqJiEjJUAhQCohXCIsIFwiKiYmJSolQCNAIVwiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChyZWdleEZvdW5kKTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudCk7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtlc2NhcGVkQ29udGVudH0sICR7dGhpcy50aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcIiomJiUqJUAjQCFcIi5sZW5ndGgsIFwiKiYhIyVAIUAqIVwiLmxlbmd0aCk7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUZW1wb3JhcnkgaGFjay4gVGhlc2UgZGVsaW1pdGVycyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRlbXBPdXRwdXQgd2hlbiBcblx0XHRcdFx0Ly8vIGV4ZWN1dGluZyBwcm9jZXNzTmVzdGVkQ29udGVudC5cblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwmXFwlXFwqXFwlXFxAXFwjXFxAXFwhL2csIFwiXCIpO1xuXHRcdFx0XHR0ZW1wT3V0cHV0NSA9IHRlbXBPdXRwdXQ1LnJlcGxhY2UgKC9cXCpcXCZcXCFcXCNcXCVcXEBcXCFcXEBcXCpcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0cmV0dXJuICh0ZW1wT3V0cHV0NSk7XG5cdFx0XHR9LCAwKTtcblxuXHRcdC8vIEV4ZWN1dGUgdGhlIGFzc2VtYmxlZCBKUyBmaWxlLlxuXHRcdGxldCByZXR1cm5lZE91dHB1dDogYW55ID0gbnVsbDtcblxuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCBleGVjdXRpb25Db250ZW50OiBzdHJpbmcgPSBgXG5cdFx0XHR2YXIgSG90ID0gYXJndW1lbnRzWzBdO1xuXHRcdFx0dmFyIFBhc3NlZEhvdEZpbGUgPSBhcmd1bWVudHNbMV07XG5cblx0XHRcdGA7XG5cblx0XHRcdGlmICh0eXBlb2YgKGFyZ3MpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUaGUgcGFzc2luZyBhcmd1bWVudHMgY2Fubm90IGJlIGEgc3RyaW5nIWApO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gYXJncylcblx0XHRcdHtcblx0XHRcdFx0bGV0IG5ld1Zhcjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlOiBhbnkgPSBhcmdzW2tleV07XG5cdFx0XHRcdGxldCBuZXdWYXJWYWx1ZVN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG5ld1ZhclZhbHVlKTtcblxuXHRcdFx0XHRuZXdWYXIgPSBgdmFyICR7a2V5fSA9ICR7bmV3VmFyVmFsdWVTdHJ9O1xcbmA7XG5cblx0XHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBuZXdWYXI7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjb250ZW50TmFtZTogc3RyaW5nID0gdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoY29udGVudE5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdGNvbnRlbnROYW1lID0gdGhpcy5sb2NhbEZpbGU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLnVybDtcblxuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBgXG5cblx0XHRcdGZ1bmN0aW9uIGVjaG9PdXRwdXQgKGNvbnRlbnQsIHRocm93RXJyb3JzKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFcnJvcnMgPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvd0Vycm9ycyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGNyZWF0ZVRlc3RFbGVtZW50IChmb3VuZFN0cilcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoZm91bmRTdHIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcXGBUZXN0IGVsZW1lbnQgXFwke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhXFxgKTtcblxuXHRcdFx0XHRcdEhvdC5DdXJyZW50UGFnZS5hZGRUZXN0RWxlbWVudCAodGVzdEVsbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFxcYEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50IFxcJHtmb3VuZFN0cn0gaW4gXFwke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6IFxcJHtleC5tZXNzYWdlfVxcYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodGVzdEVsbSk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbnRlbnQgKEN1cnJlbnRIb3RGaWxlKVxuXHRcdFx0e1xcbmA7XG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG91dHB1dDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gYFxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJ1bkNvbnRlbnQgKFBhc3NlZEhvdEZpbGUpLnRoZW4gKCgpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoe1xuXHRcdFx0XHRcdFx0aG90OiBIb3QsXG5cdFx0XHRcdFx0XHRvdXRwdXQ6IEhvdC5PdXRwdXQsXG5cdFx0XHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSAoSG90LkRhdGEpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7YDtcblxuXHRcdFx0Ly8vIEBmaXhtZSBQcmlvciB0byBleGVjdXRpb24gY29tcGlsZSBhbnkgVHlwZVNjcmlwdCBhbmQgbWFrZSBpdCBFUzUgY29tcGF0aWJsZS5cblx0XHRcdGxldCBmdW5jOiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbiAoZXhlY3V0aW9uQ29udGVudCk7XG5cdFx0XHRyZXR1cm5lZE91dHB1dCA9IGF3YWl0IGZ1bmMuYXBwbHkgKHRoaXMsIFtIb3QsIHRoaXNdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yKVxuXHRcdFx0e1xuXHRcdFx0XHQvLy8gQGZpeG1lIFB1dCB3aGF0J3MgaW4gdGhlIGNvbnRlbnQgdmFyaWFibGUgaW50byBhIHByZXYgY29udGVudCB2YXJpYWJsZT9cblx0XHRcdFx0Ly8vIFRoZW4gb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhbnkgc3ludGF4IGVycm9ycyBiZWluZyB0aHJvd24sIGV4ZWN1dGUgdGhlIFxuXHRcdFx0XHQvLy8gY29kZT8gVGhpcyB3b3VsZCBhbHNvIHJlcXVpcmUgc2F2aW5nIGFueSBIVE1MIG91dHNpZGUgb2YgdGhlICo+IGFuZCA8KiBcblx0XHRcdFx0Ly8vIHRoZW4gZWNob2luZyBpdCBvdXQuIFRoZSB0aHJvdyBiZWxvdyB3b3VsZCBoYXZlIHRvIGJlIHJlbW92ZWQgYXMgd2VsbC5cblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93IGV4O1xuXHRcdH1cblxuXHRcdEhvdC5EYXRhID0gcmV0dXJuZWRPdXRwdXQuaG90LkRhdGE7XG5cdFx0bGV0IGZpbmFsT3V0cHV0OiBzdHJpbmcgPSByZXR1cm5lZE91dHB1dC5vdXRwdXQ7XG5cdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHRoZSB0ZXN0IGVsZW1lbnQgaXMgbWlzc2luZywgaWdub3JlIHRoZSBlcnJvci4gVGhpcyBcblx0ICogd2lsbCBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IFxuXHQgKiB3aXRob3V0IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93bi5cblx0ICovXG5cdGlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdCB0ZXN0IGVsZW1lbnQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFRlc3RFbGVtZW50T3B0aW9ucyBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlOiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcjogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFRlc3RFbGVtZW50T3B0aW9ucyA9IHt9KVxuXHR7XG5cdFx0dGhpcy5tdXN0QmVWaXNpYmxlID0gY29weS5tdXN0QmVWaXNpYmxlIHx8IHRydWU7XG5cdFx0dGhpcy5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yID0gY29weS5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yIHx8IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIFxuXHQgKiB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QuXG5cdCAqL1xuXHRmdW5jPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlPzogYW55O1xufVxuXG4vKipcbiAqIEEgdGVzdCBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnQgaW1wbGVtZW50cyBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0byB1c2UuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcgfCBJSG90VGVzdEVsZW1lbnQsIGZ1bmM6IHN0cmluZyA9IFwiXCIsIHZhbHVlOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobmFtZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IGZ1bmM7XG5cdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lLm5hbWU7XG5cdFx0XHR0aGlzLmZ1bmMgPSBuYW1lLmZ1bmMgfHwgZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSBuYW1lLnZhbHVlIHx8IHZhbHVlO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIEhUVFBNZXRob2QsIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLCBUZXN0Q2FzZUZ1bmN0aW9uLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIFRoZSByb3V0ZSB0byB1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0aGF0IG1haW50YWlucyB0aGUgY29ubmVjdGlvbnMuXG5cdCAqL1xuXHRjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmVyc2lvbi5cblx0ICovXG5cdHZlcnNpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwcmVmaXggdG8gYWRkIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByb3V0ZSBtZXRob2QuXG5cdCAqL1xuXHRwcmVmaXg6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBcblx0ICogd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBjYWxscyB0aGF0IGNhbiBiZSBtYWRlLlxuXHQgKi9cblx0bWV0aG9kczogSG90Um91dGVNZXRob2RbXTtcblx0LyoqXG5cdCAqIFRoZSBlcnJvcnMgYW5kIHRoZWlyIEpTT04gdGhhdCBjYW4gYmUgdGhyb3duLiBDYW4gYmU6XG5cdCAqICogbm90X2F1dGhvcml6ZWRcblx0ICovXG5cdGVycm9yczogeyBbZXJyb3I6IHN0cmluZ106IGFueSB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQsIHJvdXRlOiBzdHJpbmcsIG1ldGhvZHM6IEhvdFJvdXRlTWV0aG9kW10gPSBbXSlcblx0e1xuXHRcdHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cdFx0dGhpcy5sb2dnZXIgPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbiAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmNvbm5lY3Rpb24ucHJvY2Vzc29yICE9IG51bGwpXG5cdFx0XHRcdHRoaXMubG9nZ2VyID0gdGhpcy5jb25uZWN0aW9uLnByb2Nlc3Nvci5sb2dnZXI7XG5cdFx0fVxuXG5cdFx0dGhpcy5yb3V0ZSA9IHJvdXRlO1xuXHRcdHRoaXMudmVyc2lvbiA9IFwidjFcIjtcblx0XHR0aGlzLnByZWZpeCA9IFwiXCI7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBudWxsO1xuXHRcdHRoaXMubWV0aG9kcyA9IG1ldGhvZHM7XG5cdFx0dGhpcy5lcnJvcnMgPSB7XG5cdFx0XHRcdFwibm90X2F1dGhvcml6ZWRcIjogSG90Um91dGUuY3JlYXRlRXJyb3IgKFwiTm90IGF1dGhvcml6ZWQuXCIpXG5cdFx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbiBlcnJvciBKU09OIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyBjcmVhdGVFcnJvciAobWVzc2FnZTogc3RyaW5nKTogYW55XG5cdHtcblx0XHRyZXR1cm4gKHsgZXJyb3I6IG1lc3NhZ2UgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuIEFQSSBtZXRob2QgdG8gdGhpcyByb3V0ZS5cblx0ICogXG5cdCAqIEBwYXJhbSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBhZGQuIElmIGEgSG90Um91dGVNZXRob2QgaXMgc3VwcGxpZWQsIHRoZSBcblx0ICogcmVzdCBvZiB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIHdpbGwgYmUgaWdub3JlZC5cblx0ICovXG5cdGFkZE1ldGhvZCAoXG5cdFx0bWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCB8IHN0cmluZyxcblx0XHRleGVjdXRlRnVuY3Rpb246IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gbnVsbCxcblx0XHR0eXBlOiBIVFRQTWV0aG9kID0gSFRUUE1ldGhvZC5QT1NULFxuXHRcdHRlc3RDYXNlczogKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG1ldGhvZCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRtZXRob2QgPSBuZXcgSG90Um91dGVNZXRob2QgKHRoaXMsIG1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uLCB0eXBlLCBudWxsLCBudWxsLCBudWxsLCB0ZXN0Q2FzZXMpO1xuXG5cdFx0dGhpcy5tZXRob2RzLnB1c2ggKG1ldGhvZCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgbWV0aG9kIGJ5IGl0J3MgbmFtZS5cblx0ICovXG5cdGdldE1ldGhvZCAobmFtZTogc3RyaW5nKTogSG90Um91dGVNZXRob2Rcblx0e1xuXHRcdGxldCBmb3VuZE1ldGhvZDogSG90Um91dGVNZXRob2QgPSBudWxsO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLm1ldGhvZHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1ldGhvZDogSG90Um91dGVNZXRob2QgPSB0aGlzLm1ldGhvZHNbaUlkeF07XG5cblx0XHRcdGlmIChtZXRob2QubmFtZSA9PT0gbmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Zm91bmRNZXRob2QgPSBtZXRob2Q7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChmb3VuZE1ldGhvZCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyByb3V0ZSB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb3V0ZSB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvbkV4ZWN1dGUgaW4gdGhlIFxuXHQgKiBjYWxsZWQgSG90Um91dGVNZXRob2QuIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiBcblx0ICogdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKi9cblx0b25BdXRob3JpemVVc2VyOiAocmVxOiBhbnksIHJlczogYW55KSA9PiBQcm9taXNlPGFueT4gPSBudWxsO1xufSIsImltcG9ydCB7IERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RTdGFxV2ViXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcblxuLyoqXG4gKiBBdmFpbGFibGUgSFRUUCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIVFRQTWV0aG9kXG57XG5cdEdFVCA9IFwiZ2V0XCIsXG5cdFBPU1QgPSBcInBvc3RcIlxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB3aXRoIEV4cHJlc3MuXG4gKiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoaXMgcm91dGUgbWV0aG9kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uID0gKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gPSBcblx0KHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgdHlwZSBDbGllbnRFeGVjdXRpb25GdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIGZvciBhdXRob3JpemF0aW9uLiBBbnkgdmFsdWUgXG4gKiByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLlxuICogSWYgYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHJldHVybmVkLCB0aGlzIGluZGljYXRlcyB0aGUgc2VydmVyIHdhcyBub3QgYWJsZSBcbiAqIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgc28gdGhlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHdpbGwgbm90IGJlIFxuICogZXhlY3V0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiA9IChyZXE6IGFueSwgcmVzOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RDYXNlRnVuY3Rpb24gPSAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gUHJvbWlzZTxhbnk+KSB8ICgoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBhbnkpO1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIG9iamVjdCB0byBwYXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDYXNlT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHJvdXRlLlxuXHQgKi9cblx0cGFyZW50Um91dGU6IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdHR5cGU6IEhUVFBNZXRob2Q7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGlzUmVnaXN0ZXJlZDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0ZXhlY3V0ZVNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fTtcblxuXHRjb25zdHJ1Y3RvciAocm91dGU6IEhvdFJvdXRlLCBuYW1lOiBzdHJpbmcsIFxuXHRcdG9uRXhlY3V0ZTogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gfCBDbGllbnRFeGVjdXRpb25GdW5jdGlvbiA9IG51bGwsIFxuXHRcdHR5cGU6IEhUVFBNZXRob2QgPSBIVFRQTWV0aG9kLlBPU1QsIG9uU2VydmVyQXV0aG9yaXplOiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHRvblJlZ2lzdGVyOiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9IG51bGwsIGF1dGhDcmVkZW50aWFsczogYW55ID0gbnVsbCwgXG5cdFx0dGVzdENhc2VzOiAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W10gPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wYXJlbnRSb3V0ZSA9IHJvdXRlO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZXhlY3V0ZVNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBhdXRoQ3JlZGVudGlhbHM7XG5cdFx0dGhpcy5vblNlcnZlckF1dGhvcml6ZSA9IG9uU2VydmVyQXV0aG9yaXplO1xuXHRcdHRoaXMub25SZWdpc3RlciA9IG9uUmVnaXN0ZXI7XG5cdFx0dGhpcy50ZXN0Q2FzZXMgPSB7fTtcblxuXHRcdGlmICh0aGlzLnBhcmVudFJvdXRlLmNvbm5lY3Rpb24ucHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RDYXNlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRlc3RDYXNlcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvYmogPSB0ZXN0Q2FzZXNbaUlkeF07XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IG9iajtcblx0XHRcdFx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+dGVzdENhc2VzW2lJZHggKyAxXSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuYWRkVGVzdENhc2UgKG5hbWUsIGZ1bmMpO1xuXHRcdFx0XHRcdFx0aUlkeCsrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlIChvYmopO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGFyZW50Um91dGUuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdHRoaXMub25TZXJ2ZXJFeGVjdXRlID0gb25FeGVjdXRlO1xuXHRcdC8vZWxzZVxuXHRcdFx0Ly90aGlzLm9uQ2xpZW50RXhlY3V0ZSA9IG9uRXhlY3V0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIG1ldGhvZCB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI/OiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZCBcblx0ICogaXMgc2V0LCB0aGlzIHdpbGwgbm90IGNhbGwgb25BdXRob3JpemUgZm9yIHRoZSBwYXJlbnQgSG90Um91dGUuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlLiBcblx0ICogVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyQXV0aG9yaXplPzogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgc2VydmVyIHNpZGUuIFxuXHQgKiBUaGlzIHdpbGwgc3RyaW5naWZ5IGFueSBKU09OIG9iamVjdCBhbmQgc2VuZCBpdCBhcyBhIEpTT04gcmVzcG9uc2UuIFxuXHQgKiBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQgbm8gcmVzcG9uc2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFxuXHQgKiBTbyB0aGUgZGV2ZWxvcGVyIHdvdWxkIGhhdmUgdG8gc2VuZCBhIHJlc3BvbnNlIHVzaW5nIFwicmVzXCIuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIHNlcnZlciBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckV4ZWN1dGU/OiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBjbGllbnQgc2lkZS5cblx0ICogQGZpeG1lIElzIHRoaXMgbmVjZXNzYXJ5P1xuXHQgKi9cblx0b25DbGllbnRFeGVjdXRlPzogQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyB0ZXN0IGNhc2UuXG5cdCAqL1xuXHRhZGRUZXN0Q2FzZSAobmV3VGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0IHwgc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbiwgXG5cdFx0XHR0ZXN0Q2FzZUZ1bmN0aW9uOiBUZXN0Q2FzZUZ1bmN0aW9uID0gbnVsbCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBuZXdUZXN0Q2FzZTtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSB0ZXN0Q2FzZUZ1bmN0aW9uO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJmdW5jdGlvblwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRlc3RDYXNlSWQ6IG51bWJlciA9IE9iamVjdC5rZXlzICh0aGlzLnRlc3RDYXNlcykubGVuZ3RoO1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gYCR7dGhpcy5wYXJlbnRSb3V0ZS5yb3V0ZX0vJHt0aGlzLm5hbWV9IHRlc3QgY2FzZSAke3Rlc3RDYXNlSWR9YDtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+bmV3VGVzdENhc2UpO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCA9ICg8VGVzdENhc2VPYmplY3Q+bmV3VGVzdENhc2UpO1xuXHRcdHRoaXMudGVzdENhc2VzW3Rlc3RDYXNlLm5hbWVdID0gdGVzdENhc2U7XG5cdH1cbn0iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaW1wb3J0IHsgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbi8qKlxuICogQSBwYWdlIHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFBhZ2Vcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlIHVzZWQgdG8gZ2V0IHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdHJvdXRlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuIEZpbGUgb3JkZXJpbmcgbWF0dGVycyBoZXJlLlxuXHQgKiBFdmVyeSBmaWxlIGlzIHByb2Nlc3NlZCBpbmNyZW1lbnRhbGx5LlxuXHQgKi9cblx0ZmlsZXM/OiBIb3RGaWxlW107XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbmFtZS5cblx0ICovXG5cdHRlc3Rlck5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzPzogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdEVsZW1lbnQ7IH07XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBwYXRocyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RQYXRocz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xufVxuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90UGFnZSBpbXBsZW1lbnRzIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlIHVzZWQgdG8gZ2V0IHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0RWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90UGFnZSB8IEhvdFN0YXEpXG5cdHtcblx0XHRpZiAoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gXCJcIjtcblx0XHRcdHRoaXMuZmlsZXMgPSBbXTtcblx0XHRcdHRoaXMudGVzdEVsZW1lbnRzID0ge307XG5cdFx0XHR0aGlzLnRlc3RQYXRocyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJOYW1lID0gY29weS50ZXN0ZXJOYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IGNvcHkudGVzdGVyTWFwIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gY29weS5yb3V0ZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy5maWxlcyA9IGNvcHkuZmlsZXMgfHwgW107XG5cdFx0XHR0aGlzLnRlc3RFbGVtZW50cyA9IGNvcHkudGVzdEVsZW1lbnRzIHx8IHt9O1xuXHRcdFx0dGhpcy50ZXN0UGF0aHMgPSBjb3B5LnRlc3RQYXRocyB8fCB7fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgZmlsZSB0byBwcm9jZXNzLiBJdCdzIHJlY29tbWVuZCB0byBsb2FkIHRoZSBmaWxlIHByaW9yIHRvIFxuXHQgKiBhZGRpbmcgaXQgdG8gYSBwYWdlIGlmIGl0J3MgYWJvdXQgdG8gYmUgdXNlZC5cblx0ICovXG5cdGFzeW5jIGFkZEZpbGUgKGZpbGU6IEhvdEZpbGUpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRmaWxlLnBhZ2UgPSB0aGlzO1xuXG5cdFx0dGhpcy5maWxlcy5wdXNoIChmaWxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEFQSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLlxuXHQgKi9cblx0Z2V0QVBJICgpOiBIb3RBUElcblx0e1xuXHRcdHJldHVybiAodGhpcy5wcm9jZXNzb3IuYXBpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHRlc3RlciBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldFRlc3RlckFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLnRlc3RlckFQSSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFsbCBmaWxlcyBpbiB0aGUgcGFnZS4gQ291bGQgZGVjcmVhc2UgcGFnZSBsb2FkaW5nIHBlcmZvcm1hbmNlLlxuXHQgKiBJdCdzIHJlY29tbWVuZCB0byBsb2FkIHRoZSBmaWxlIHByaW9yIHRvIGFkZGluZyBpdCB0byBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBsb2FkIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gdGhpcy5maWxlc1tpSWR4XTtcblxuXHRcdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgcGFnZSBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gdGhpcy5maWxlc1tpSWR4XTtcblxuXHRcdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cdFx0XHRmaWxlLnBhZ2UgPSB0aGlzO1xuXG5cdFx0XHRvdXRwdXQgKz0gYXdhaXQgZmlsZS5wcm9jZXNzIChhcmdzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0YWRkVGVzdEVsZW1lbnQgKGVsbTogSG90VGVzdEVsZW1lbnQpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtlbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RFbGVtZW50c1tlbG0ubmFtZV0gPSBlbG07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0Z2V0VGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyk6IEhvdFRlc3RFbGVtZW50XG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke25hbWV9IGRvZXN0IG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGNyZWF0ZVRlc3RQYXRoIChwYXRoTmFtZTogc3RyaW5nLCBkcml2ZXJGdW5jOiBIb3RUZXN0UGF0aCk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgcGF0aCAke3BhdGhOYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMudGVzdFBhdGhzW3BhdGhOYW1lXSA9IGRyaXZlckZ1bmM7XG5cdH1cbn0iLCIvKipcbiAqIFRoZSBsb2dnaW5nIGxldmVsLlxuICovXG5leHBvcnQgZW51bSBIb3RMb2dMZXZlbFxue1xuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgaW5mbyBtZXNzYWdlcy5cblx0ICovXG5cdEluZm8sXG5cdC8qKlxuXHQgKiBQcmludHMgb25seSB3YXJuaW5nIG1lc3NhZ2VzLlxuXHQgKi9cblx0V2FybmluZyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IGVycm9yIG1lc3NhZ2VzLlxuXHQgKi9cblx0RXJyb3IsXG5cdC8qKlxuXHQgKiBQcmludHMgYWxsIG1lc3NhZ2VzLlxuXHQgKi9cblx0VmVyYm9zZSxcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMsIGV4Y2VwdCB2ZXJib3NlLlxuXHQgKi9cblx0QWxsLFxuXHQvKipcblx0ICogRG9lc24ndCBwcmludCBhbnkgbWVzc2FnZS5cblx0ICovXG5cdE5vbmVcbn1cblxuLyoqXG4gKiBUaGUgbG9nZ2VyLlxuICovXG5leHBvcnQgY2xhc3MgSG90TG9nXG57XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2luZyBsZXZlbC5cblx0ICovXG5cdGxvZ0xldmVsOiBIb3RMb2dMZXZlbDtcblxuXHRjb25zdHJ1Y3RvciAobG9nTGV2ZWw6IEhvdExvZ0xldmVsID0gSG90TG9nTGV2ZWwuQWxsKVxuXHR7XG5cdFx0dGhpcy5sb2dMZXZlbCA9IGxvZ0xldmVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRsb2cgKGxldmVsOiBIb3RMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykgfHwgXG5cdFx0XHRcdChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbClcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHZlcmJvc2UgbWVzc2FnZS5cblx0ICovXG5cdHZlcmJvc2UgKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKVxuXHRcdFx0Y29uc29sZS5pbmZvIChtZXNzYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSBtZXNzYWdlLlxuXHQgKi9cblx0aW5mbyAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pKVxuXHRcdHtcblx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHdhcm5pbmcuXG5cdCAqL1xuXHR3YXJuaW5nIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS53YXJuIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRlcnJvciAobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpKVxuXHRcdHtcblx0XHRcdGxldCBtc2c6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRtc2cgPSBtZXNzYWdlO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAobWVzc2FnZS5tZXNzYWdlICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5tZXNzYWdlO1xuXG5cdFx0XHRcdGlmIChtZXNzYWdlLnN0YWNrICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5zdGFjaztcblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS5lcnJvciAobXNnKTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXJUeXBlIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcblxuLyoqXG4gKiBBIGNsaWVudCBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RDbGllbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIEFQSSB0byB1c2UuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgQVBJIHRvIHVzZS5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdHRoaXMudGVzdGVyQVBJID0gbnVsbDtcblx0XHR0aGlzLnR5cGUgPSBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCwgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3RUZXN0ZXJBUEkgZXh0ZW5kcyBIb3RBUElcbntcblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IGFueSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcihiYXNlVXJsLCBjb25uZWN0aW9uLCBkYik7XG5cblx0XHR0aGlzLmV4ZWN1dGVFdmVudHNVc2luZyA9IEV2ZW50RXhlY3V0aW9uVHlwZS5Ib3RBUEk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gbmV3IEhvdFJvdXRlIChjb25uZWN0aW9uLCBcInRlc3RlclwiKTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKFwicGFnZUxvYWRlZFwiLCB0aGlzLnBhZ2VMb2FkZWQpO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoXCJleGVjdXRlVGVzdHNcIiwgdGhpcy5leGVjdXRlVGVzdHMpO1xuXHRcdHRoaXMuYWRkUm91dGUgKHJvdXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGluIGRldmVsb3BtZW50IG1vZGUuXG5cdCAqL1xuXHRhc3luYyBwYWdlTG9hZGVkIChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0ZXJNYXA6IHN0cmluZztcblx0XHRcdFx0cGFnZU5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiBhbnk7XG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGFueTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IGpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdLFxuXHRcdFx0XHR0ZXN0ZXJNYXA6IGpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl0sXG5cdFx0XHRcdHBhZ2VOYW1lOiBqc29uT2JqW1wicGFnZU5hbWVcIl0sXG5cdFx0XHRcdHRlc3RFbGVtZW50czoganNvbk9ialtcInRlc3RFbGVtZW50c1wiXSxcblx0XHRcdFx0dGVzdFBhdGhzU3RyczoganNvbk9ialtcInRlc3RQYXRoc1wiXVxuXHRcdFx0fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmopXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHRlc3RPYmo6IGFueSA9IHRlc3Rlck9ialtrZXldO1xuXHRcdFx0bGV0IHRocm93RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRlc3RPYmogPT0gbnVsbClcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cblx0XHRcdGlmICgodGVzdGVyT2JqLnRlc3Rlck5hbWUgPT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdGVyTWFwID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0RWxlbWVudHMgPT09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMgPT09IFwiXCIpKVxuXHRcdFx0e1xuXHRcdFx0XHR0aHJvd0Vycm9yID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRocm93RXJyb3IgPT09IHRydWUpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogT2JqZWN0ICR7a2V5fSB3YXMgbm90IHBhc3NlZC5gKTtcblx0XHR9XG5cblx0XHR0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RFbGVtZW50cyk7XG5cdFx0dGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMgPSBKU09OLnBhcnNlICh0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycyk7XG5cblx0XHRsZXQgdGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzKVxuXHRcdHtcblx0XHRcdGxldCB0ZXN0UGF0aDogKGRyaXZlcjogSG90VGVzdERyaXZlciwgLi4uYXJnczogYW55KSA9PiBQcm9taXNlPGFueT4gPSBcblx0XHRcdFx0ZXZhbCAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnNba2V5XSk7XG5cblx0XHRcdHRlc3RQYXRoc1trZXldID0gdGVzdFBhdGg7XG5cdFx0fVxuXG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy5jb25uZWN0aW9uLnByb2Nlc3Nvci50ZXN0ZXJzW3Rlc3Rlck9iai50ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogVGVzdGVyICR7dGVzdGVyT2JqLnRlc3Rlck1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRlc3Rlci50ZXN0TWFwc1t0ZXN0ZXJPYmoudGVzdGVyTWFwXTtcblxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciBtYXAgJHt0ZXN0ZXJPYmoudGVzdGVyTWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXSA9IHtcblx0XHRcdFx0XCJ0ZXN0RWxlbWVudHNcIjoge30sXG5cdFx0XHRcdFwidGVzdFBhdGhzXCI6IHt9XG5cdFx0XHR9O1xuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXS50ZXN0RWxlbWVudHMgPSB0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzO1xuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXS50ZXN0UGF0aHMgPSB0ZXN0UGF0aHM7XG5cblx0XHR0ZXN0ZXIuZmluaXNoZWRMb2FkaW5nID0gdHJ1ZTtcblxuXHRcdGlmICh0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgIT0gbnVsbClcblx0XHRcdGF3YWl0IHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAoKTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMgZm9yIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0ganNvbk9ialtcInRlc3Rlck5hbWVcIl07XG5cdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0ganNvbk9ialtcInRlc3Rlck1hcFwiXTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PSBudWxsKSB8fCAodGVzdGVyTWFwID09IG51bGwpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRlc3RlckFQSTogTm90IGFsbCByZXF1aXJlZCBqc29uIG9iamVjdHMgd2VyZSBwYXNzZWQuXCIpO1xuXG5cdFx0aWYgKCh0ZXN0ZXJOYW1lID09PSBcIlwiKSB8fCAodGVzdGVyTWFwID09PSBcIlwiKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGxldCBzZXJ2ZXI6IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuY29ubmVjdGlvbik7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHNlcnZlci5leGVjdXRlVGVzdHMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRhd2FpdCBzZXJ2ZXIuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCB0ZXN0ZXJNYXApO1xuXHRcdH1cblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cbn0iLCJpbXBvcnQgZmV0Y2ggZnJvbSBcImNyb3NzLWZldGNoXCI7XG5cbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdERCIH0gZnJvbSBcIi4vSG90REJcIjtcblxuaW1wb3J0IHsgSG90REJTY2hlbWEgfSBmcm9tIFwiLi9zY2hlbWFzL0hvdERCU2NoZW1hXCI7XG5cbi8qKlxuICogVGhlIHR5cGUgb2Ygb2JqZWN0IHRvIHVzZSBkdXJpbmcgZXZlbnQgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gRXZlbnRFeGVjdXRpb25UeXBlXG57XG5cdEhvdFJvdXRlLFxuXHRIb3RNZXRob2QsXG5cdEhvdEFQSVxufVxuXG4vKipcbiAqIFRoZSBBUEkgdG8gdXNlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90QVBJXG57XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQsIHRoaXMgd2lsbCBjcmVhdGUgdGhlIHJvdXRlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBcblx0ICogZWFzeSBjbGllbnQvc2VydmVyIGNhbGxpbmcuXG5cdCAqL1xuXHRjcmVhdGVGdW5jdGlvbnM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGV4ZWN1dGVFdmVudHNVc2luZzogRXZlbnRFeGVjdXRpb25UeXBlO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRkYjogSG90REI7XG5cdC8qKlxuXHQgKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byB1c2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB1c2VkIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuXHQgKi9cblx0dXNlckF1dGg6IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0cm91dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZSB9O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGUgQVBJIGlzIGFib3V0IHRvIHN0YXJ0IHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaGFzIGZpbmlzaGVkIHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCA9IG51bGwsIGRiOiBIb3REQiA9IG51bGwpXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy5jcmVhdGVGdW5jdGlvbnMgPSB0cnVlO1xuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdFJvdXRlO1xuXHRcdHRoaXMuZGIgPSBkYjtcblx0XHR0aGlzLmF1dGhDcmVkZW50aWFscyA9IG51bGw7XG5cdFx0dGhpcy51c2VyQXV0aCA9IG51bGw7XG5cdFx0dGhpcy5yb3V0ZXMgPSB7fTtcblx0XHR0aGlzLm9uUHJlUmVnaXN0ZXIgPSBudWxsO1xuXHRcdHRoaXMub25Qb3N0UmVnaXN0ZXIgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciB1c2UuXG5cdCAqL1xuXHRzZXREQlNjaGVtYSAoc2NoZW1hOiBIb3REQlNjaGVtYSk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBBUEkgaGFzIGJlZW4gc2V0IWApO1xuXG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0dGhpcy5jb25uZWN0aW9uLmFwaS5kYi5zY2hlbWEgPSBzY2hlbWE7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBiZWluZyB1c2VkLlxuXHQgKi9cblx0Z2V0REIgKCk6IEhvdERCXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQlNjaGVtYSAoKTogSG90REJTY2hlbWFcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYi5zY2hlbWEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHJvdXRlLiBJZiB0aGlzLmNyZWF0ZUZ1bmN0aW9ucyBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHRha2UgdGhlIGluY29taW5nIFxuXHQgKiByb3V0ZSBhbmQgY3JlYXRlIGFuIG9iamVjdCBpbiB0aGlzIEhvdEFQSSBvYmplY3QgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLiBJZiB0aGVyZSdzIFxuXHQgKiBhbnkgSG90Um91dGVNZXRob2RzIGluc2lkZSBvZiB0aGUgaW5jb21pbmcgSG90Um91dGUsIGl0IHdpbGwgY3JlYXRlIHRoZSBtZXRob2RzIFxuXHQgKiBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSG90Um91dGUgb2JqZWN0LlxuXHQgKiBcblx0ICogRXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIGV4cG9ydCBjbGFzcyBVc2VycyBleHRlbmRzIEhvdFJvdXRlXG5cdCAqIHtcblx0ICogXHRcdGNvbnN0cnVjdG9yIChhcGk6IEZyZWVMaWdodEFQSSlcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIgKGFwaS5jb25uZWN0aW9uLCBcInVzZXJcIik7XG5cdCAqIFxuXHQgKiBcdFx0XHR0aGlzLmFkZE1ldGhvZCAoXCJjcmVhdGVcIiwgdGhpcy5fY3JlYXRlLCBIVFRQTWV0aG9kLlBPU1QpO1xuXHQgKiBcdFx0fVxuXHQgKiBcblx0ICogXHRcdHByb3RlY3RlZCBhc3luYyBfY3JlYXRlIChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpOiBQcm9taXNlPGFueT5cblx0ICogXHRcdHtcblx0ICogXHRcdFx0cmV0dXJuICh0cnVlKTtcblx0ICogXHRcdH1cblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIFRoaXMgaW4gdHVybiBjb3VsZCBiZSB1c2VkIGxpa2Ugc286XG5cdCAqIGBgYFxuXHQgKiBIb3QuQVBJLnVzZXIuY3JlYXRlICh7fSk7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogQWRkaXRpb25hbGx5IGl0IHdvdWxkIGNyZWF0ZSB0aGUgZW5kcG9pbnQ6IGBgYGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS91c2VyL2NyZWF0ZWBgYFxuXHQgKiBcblx0ICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBhZGQuIENhbiBiZSBlaXRoZXIgYSBmdWxsIEhvdFJvdXRlIG9iamVjdCwgb3IganVzdCBcblx0ICogdGhlIHJvdXRlJ3MgbmFtZS4gSWYgYSBIb3RSb3V0ZSBvYmplY3QgaXMgc3VwcGxpZWQsIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIFxuXHQgKiB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSByb3V0ZU1ldGhvZCBUaGUgcm91dGUncyBtZXRob2QgdG8gYWRkLiBJZiB0aGUgcm91dGUgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLCBcblx0ICogaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgcm91dGUncyBuYW1lLCBhbmQgdGhpcyB3aWxsIGJlIHRoZSBtZXRob2QgYWRkZWQgdG8gXG5cdCAqIHRoZSBuZXcgcm91dGUuXG5cdCAqIEBwYXJhbSBleGVjdXRlRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiByb3V0ZU1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIEFQSS5cblx0ICovXG5cdGFkZFJvdXRlIChcblx0XHRyb3V0ZTogSG90Um91dGUgfCBzdHJpbmcsXG5cdFx0cm91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kIHwgc3RyaW5nID0gbnVsbCxcblx0XHRleGVjdXRlRnVuY3Rpb246IChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpID0+IFByb21pc2U8YW55PiA9IG51bGxcblx0XHQpOiB2b2lkXG5cdHtcblx0XHRsZXQgcm91dGVOYW1lOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHJvdXRlIGluc3RhbmNlb2YgSG90Um91dGUpXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGUucm91dGU7XG5cdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZS5yb3V0ZV0gPSByb3V0ZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJvdXRlTmFtZSA9IHJvdXRlO1xuXG5cdFx0XHRpZiAodGhpcy5yb3V0ZXNbcm91dGVOYW1lXSA9PSBudWxsKVxuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID0gbmV3IEhvdFJvdXRlICh0aGlzLmNvbm5lY3Rpb24sIHJvdXRlTmFtZSk7XG5cblx0XHRcdGlmIChyb3V0ZU1ldGhvZCBpbnN0YW5jZW9mIEhvdFJvdXRlTWV0aG9kKVxuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAocm91dGVNZXRob2QpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAobmV3IEhvdFJvdXRlTWV0aG9kIChcblx0XHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLCByb3V0ZU1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5jb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSByb3V0ZSBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIvY2xpZW50LlxuXHRcdGlmICh0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgbmV3Um91dGU6IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB0aGlzW3JvdXRlTmFtZV07XG5cblx0XHRcdGlmIChuZXdSb3V0ZSA9PSBudWxsKVxuXHRcdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0XHRsZXQgbmV3Um91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRcdC8qXG5cdFx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHRcdC8vLyBlc3BlY2lhbGx5IGZvciBhY2NydWF0ZSB0ZXN0aW5nLlxuXHRcdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSovXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdC8vLyBAZml4bWUgSXMgb25DbGllbnRFeGVjdXRlIG5lY2Vzc2FyeT8gSSdtIHRoaW5raW5nIHRoZSBkZXYgY2FuIGp1c3Qgc2ltcGx5IGNyZWF0ZSBcblx0XHRcdFx0XHQvLy8gdGhlaXIgb3duIGZ1bmN0aW9uIHRvIGNhbGwuXG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vbkNsaWVudEV4ZWN1dGU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHsqL1xuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSAoZGF0YTogYW55KTogYW55ID0+XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25zdHJ1Y3QgdGhlIHVybCBoZXJlLiBCYXNlICsgcm91dGUgKyByb3V0ZSBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoY3VycmVudFJvdXRlLnZlcnNpb24gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3V0ZVN0ciArPSBgLyR7Y3VycmVudFJvdXRlLnZlcnNpb259YDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Um91dGUucm91dGUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3V0ZVN0ciArPSBgLyR7Y3VycmVudFJvdXRlLnJvdXRlfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QubmFtZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtuZXdSb3V0ZU1ldGhvZC5uYW1lfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWxzOiBhbnkgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gR2V0dGluZyB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyBmcm9tIHRoZSBBUEkgaXMgdGhlIGxvd2VzdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBwcmlvcml0eSBmb3IgZ2V0dGluZyBjcmVkZW50aWFscy4gVGhlIHByaW9yaXRpZXMgYXJlIGluIHRoaXMgb3JkZXI6IFxuXHRcdFx0XHRcdFx0XHRcdC8vIDEuIEhvdFJvdXRlTWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMi4gSG90Um91dGVcblx0XHRcdFx0XHRcdFx0XHQvLyAzLiBIb3RBUElcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IHRoaXMuYXV0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmluZCB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscy4gUHJpb3JpdGl6ZSB0aGVtIHdoZW4gdGhleSdyZSBcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgbWV0aG9kLiBPbmx5IGFkZCB0aGUgb25lcyBmcm9tIHRoZSByb3V0ZSBpZiB0aGUgb25lcyBmcm9tIFxuXHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBtZXRob2QgYXJlIG1pc3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QucGFyZW50Um91dGUuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IG5ld1JvdXRlTWV0aG9kLnBhcmVudFJvdXRlLmF1dGhDcmVkZW50aWFscztcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoSG90KSAhPT0gXCJ1bmRlZmluZWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5BUEkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0uYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byB0aGUgZGF0YSBiZWluZyBzZW50LlxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIGF1dGhDcmVkZW50aWFscylcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGF1dGhDcmVkZW50aWFsOiBhbnkgPSBhdXRoQ3JlZGVudGlhbHNba2V5XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEbyBub3Qgb3ZlcndyaXRlIGFueSBleGlzdGluZyBrZXlzIGluIHRoZSBkYXRhIGFib3V0IFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBiZSBzZW50LlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVtrZXldID0gYXV0aENyZWRlbnRpYWw7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGFyZ3M6IGFueVtdID0gW3JvdXRlU3RyLCBkYXRhLCBodHRwTWV0aG9kXTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5jYWxsLmFwcGx5ICh0aGlzLCBhcmdzKSk7XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Ly99XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpc1tyb3V0ZU5hbWVdID0gbmV3Um91dGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZSAocm91dGU6IEhvdFJvdXRlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYWxsIHJvdXRlcyB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlcyAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucm91dGVzKVxuXHRcdHtcblx0XHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1trZXldO1xuXG5cdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGUgKHJvdXRlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIGNhbGwgdG8gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIGNhbGwgKHJvdXRlOiBzdHJpbmcsIGRhdGE6IGFueSwgaHR0cE1ldGhvZDogc3RyaW5nID0gXCJQT1NUXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVVybDtcblxuXHRcdGlmICh1cmxbKHVybC5sZW5ndGggLSAxKV0gPT09IFwiL1wiKVxuXHRcdFx0dXJsID0gdXJsLnN1YnN0ciAoMCwgKHVybC5sZW5ndGggLSAxKSk7XG5cblx0XHRpZiAocm91dGVbMF0gIT09IFwiL1wiKVxuXHRcdFx0dXJsICs9IFwiL1wiO1xuXG5cdFx0dXJsICs9IHJvdXRlO1xuXG5cdFx0aHR0cE1ldGhvZCA9IGh0dHBNZXRob2QudG9VcHBlckNhc2UgKCk7XG5cblx0XHRsZXQgZmV0Y2hPYmo6IGFueSA9IHtcblx0XHRcdFx0bWV0aG9kOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICgoaHR0cE1ldGhvZCAhPT0gXCJHRVRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZCAhPT0gXCJIRUFEXCIpKVxuXHRcdHtcblx0XHRcdGZldGNoT2JqW1wiYm9keVwiXSA9IEpTT04uc3RyaW5naWZ5IChkYXRhKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzOiBhbnkgPSBudWxsO1xuXHRcdFxuXHRcdHRyeVxuXHRcdHtcblx0XHRcdHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIGZldGNoT2JqKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHRocm93IGV4O1xuXHRcdH1cblxuXHRcdGxldCBqc29uT2JqOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdHJldHVybiAoanNvbk9iaik7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVzdCBwYXRoIGZvciBsYXRlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEhvdFRlc3RQYXRoID0gKGRyaXZlcjogSG90VGVzdERyaXZlciwgLi4uYXJnczogYW55KSA9PiBQcm9taXNlPGFueT47XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHRvIHRha2UgaW4gYSBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlLlxuXHQgKi9cblx0ZGVzdGluYXRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBleGVjdXRpbmcgaXQncyBcblx0ICogdGVzdHMgd2hlbiBpdCdzIHRpbWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGRlc3RpbmF0aW9uOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb24gfCBIb3RTaXRlTWFwUGF0aCA9IFwiXCIsIGF1dG9TdGFydDogYm9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRpZiAodHlwZW9mIChkZXN0aW5hdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuXHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBIb3RUZXN0RGVzdGluYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5kZXN0aW5hdGlvbjtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5wYXRoO1xuXHRcdFx0XHR0aGlzLmF1dG9TdGFydCA9IGRlc3RpbmF0aW9uLmF1dG9TdGFydDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBIHBhZ2UgY29udGFpbmluZyBvbmx5IHRlc3QgcmVsYXRlZCBpbmZvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFRlc3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIG1hcC5cblx0ICovXG5cdHRlc3RFbGVtZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdEVsZW1lbnQ7IH07XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBwYXRocyB0byB0ZXN0IG9uIHRoaXMgbWFwLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBNYXBzIHRoZSBwYXRocyB0aGF0IGFyZSB0YWtlbiB0byBjb21wbGV0ZSBhIHRlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0TWFwXG57XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggcGF0aHMgYXJlIHRvIGJlIHRha2VuLiBFYWNoIGRlc3RpbmF0aW9uIGlzIGEgc3RyaW5nIFxuXHQgKiBpbiBhIHR5cGUgLT4gcGF0aCBvcmRlci4gVGhlIHR5cGUgY291bGQgYmUgZWl0aGVyIGEgcGFnZSBvciBhcGkgcm91dGUuIFxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFtcblx0ICogICAgICBcInBhZ2U6c2lnbmluX3BhZ2UgLT4gc2lnbmluX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV91c2VybmFtZV9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfcGFzc3dvcmRfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX25hbWVfcGF0aCAtPiBjaGFuZ2VfYWRkcmVzc19wYXRoXCIsXG5cdCAqIFx0XHRcInBhZ2U6YWNjb3VudF9wYWdlIC0+IHNpZ25vdXRfcGF0aFwiLFxuXHQgKiBcdFx0XCJhcGk6YWNjb3VudF9hcGlfcm91dGUgLT4gc2lnbm91dF9yb3V0ZV9tZXRob2QgLT4gc2lnbm91dF90ZXN0X3BhdGhcIlxuXHQgKiBdXG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhlIGZpcnN0IHN0cmluZyB0byB0aGUgbGVmdCBvZiB0aGUgLT4gd2lsbCBhbHdheXMgYmUgdGhlIHR5cGUsIHN1Y2ggYXMgYSBcblx0ICogcGFnZSBvciBhbiBhcGkgcm91dGUuIEFueSBzdHJpbmdzIHRvIHRoZSByaWdodCBvZiB0aGUgLT4gd2lsbCBiZSBhIHBhdGgsIGV2ZW4gXG5cdCAqIHdoZW4gY2hhaW5pbmcgYWRkdGlvbmFsIC0+J3MuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGFnZXMgdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhZ2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhZ2Vcblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbnM6IHN0cmluZ1tdIHwgSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb247IH0gPSBbXSwgXG5cdFx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlIH0gPSB7fSwgZGVzdGluYXRpb25PcmRlcjogc3RyaW5nW10gPSBbXSlcblx0e1xuXHRcdC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgYW55IHN0cmluZ3MgaW50byBIb3RUZXN0RGVzdGluYXRpb25zLlxuXHRcdGlmIChkZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGRlc3RpbmF0aW9ucylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNba2V5XTtcblxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uc1trZXldID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0aW5hdGlvbk9yZGVyID0gZGVzdGluYXRpb25PcmRlcjtcblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxLCBJSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBcblx0XHRIb3RTaXRlLCBIb3RTaXRlUm91dGUsIEhvdFNpdGVNYXBQYXRoIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90LCBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcblxuLy8gU2VydmVyIHN0dWZmXG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90QVBJLCBFdmVudEV4ZWN1dGlvblR5cGUgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIVFRQTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24sIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5cbi8vIFRlc3Rpbmcgc3R1ZmZcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyQVBJIH0gZnJvbSBcIi4vSG90VGVzdGVyQVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0RGVzdGluYXRpb24sIEhvdFRlc3RQYXRoLCBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IElIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50T3B0aW9ucywgSUhvdFRlc3RFbGVtZW50T3B0aW9ucyB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuXG5Ib3RTdGFxLmlzV2ViID0gdHJ1ZTtcblxuZXhwb3J0IHtcblx0XHRIb3RTdGFxLCBcblx0XHRIb3RTdGFydE9wdGlvbnMsIFxuXHRcdElIb3RTdGFxLFxuXHRcdEhvdFNpdGUsXG5cdFx0SG90U2l0ZVJvdXRlLFxuXHRcdEhvdFNpdGVNYXBQYXRoLFxuXHRcdEhvdCxcblx0XHREZXZlbG9wZXJNb2RlLFxuXHRcdEhvdENvbXBvbmVudCxcblx0XHRJSG90Q29tcG9uZW50LFxuXHRcdEhvdEFQSSxcblx0XHRFdmVudEV4ZWN1dGlvblR5cGUsXG5cdFx0SG90RmlsZSxcblx0XHRIb3RMb2csXG5cdFx0SG90UGFnZSxcblx0XHRIb3RSb3V0ZSxcblx0XHRIb3RSb3V0ZU1ldGhvZCxcblx0XHRIVFRQTWV0aG9kLFxuXHRcdFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbixcblx0XHRTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbixcblx0XHRIb3RTZXJ2ZXIsXG5cdFx0SG90Q2xpZW50LFxuXHRcdEhvdFRlc3Rlcixcblx0XHRIb3RUZXN0ZXJBUEksXG5cdFx0SG90VGVzdE1hcCxcblx0XHRIb3RUZXN0RGVzdGluYXRpb24sXG5cdFx0SG90VGVzdFBhdGgsXG5cdFx0SG90VGVzdFBhZ2UsXG5cdFx0SG90VGVzdEVsZW1lbnQsXG5cdFx0SUhvdFRlc3RFbGVtZW50LFxuXHRcdEhvdFRlc3RFbGVtZW50T3B0aW9ucyxcblx0XHRJSG90VGVzdEVsZW1lbnRPcHRpb25zLFxuXHRcdEhvdFRlc3REcml2ZXJcblx0fTsiLCIndXNlIHN0cmljdCdcblxudmFyIHNjb3BlZFBhY2thZ2VQYXR0ZXJuID0gbmV3IFJlZ0V4cCgnXig/OkAoW14vXSs/KVsvXSk/KFteL10rPykkJylcbnZhciBidWlsdGlucyA9IHJlcXVpcmUoJ2J1aWx0aW5zJylcbnZhciBibGFja2xpc3QgPSBbXG4gICdub2RlX21vZHVsZXMnLFxuICAnZmF2aWNvbi5pY28nXG5dXG5cbnZhciB2YWxpZGF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHdhcm5pbmdzID0gW11cbiAgdmFyIGVycm9ycyA9IFtdXG5cbiAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICBlcnJvcnMucHVzaCgnbmFtZSBjYW5ub3QgYmUgbnVsbCcpXG4gICAgcmV0dXJuIGRvbmUod2FybmluZ3MsIGVycm9ycylcbiAgfVxuXG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBlcnJvcnMucHVzaCgnbmFtZSBjYW5ub3QgYmUgdW5kZWZpbmVkJylcbiAgICByZXR1cm4gZG9uZSh3YXJuaW5ncywgZXJyb3JzKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCduYW1lIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIHJldHVybiBkb25lKHdhcm5pbmdzLCBlcnJvcnMpXG4gIH1cblxuICBpZiAoIW5hbWUubGVuZ3RoKSB7XG4gICAgZXJyb3JzLnB1c2goJ25hbWUgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8nKVxuICB9XG5cbiAgaWYgKG5hbWUubWF0Y2goL15cXC4vKSkge1xuICAgIGVycm9ycy5wdXNoKCduYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgcGVyaW9kJylcbiAgfVxuXG4gIGlmIChuYW1lLm1hdGNoKC9eXy8pKSB7XG4gICAgZXJyb3JzLnB1c2goJ25hbWUgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZScpXG4gIH1cblxuICBpZiAobmFtZS50cmltKCkgIT09IG5hbWUpIHtcbiAgICBlcnJvcnMucHVzaCgnbmFtZSBjYW5ub3QgY29udGFpbiBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcycpXG4gIH1cblxuICAvLyBObyBmdW5ueSBidXNpbmVzc1xuICBibGFja2xpc3QuZm9yRWFjaChmdW5jdGlvbiAoYmxhY2tsaXN0ZWROYW1lKSB7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYmxhY2tsaXN0ZWROYW1lKSB7XG4gICAgICBlcnJvcnMucHVzaChibGFja2xpc3RlZE5hbWUgKyAnIGlzIGEgYmxhY2tsaXN0ZWQgbmFtZScpXG4gICAgfVxuICB9KVxuXG4gIC8vIEdlbmVyYXRlIHdhcm5pbmdzIGZvciBzdHVmZiB0aGF0IHVzZWQgdG8gYmUgYWxsb3dlZFxuXG4gIC8vIGNvcmUgbW9kdWxlIG5hbWVzIGxpa2UgaHR0cCwgZXZlbnRzLCB1dGlsLCBldGNcbiAgYnVpbHRpbnMuZm9yRWFjaChmdW5jdGlvbiAoYnVpbHRpbikge1xuICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkgPT09IGJ1aWx0aW4pIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYnVpbHRpbiArICcgaXMgYSBjb3JlIG1vZHVsZSBuYW1lJylcbiAgICB9XG4gIH0pXG5cbiAgLy8gcmVhbGx5LWxvbmctcGFja2FnZS1uYW1lcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1zdWNoLS1sZW5ndGgtLS0tLW1hbnktLS13b3dcbiAgLy8gdGhlIHRoaXNpc2FyZWFsbHlyZWFsbHlsb25ncGFja2FnZW5hbWVpdHNob3VsZHB1Ymxpc2hkb3dlbm93aGF2ZWFsaW1pdHRvdGhlbGVuZ3Rob2ZwYWNrYWdlbmFtZXMtcG9jaC5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMjE0KSB7XG4gICAgd2FybmluZ3MucHVzaCgnbmFtZSBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gbW9yZSB0aGFuIDIxNCBjaGFyYWN0ZXJzJylcbiAgfVxuXG4gIC8vIG1JeGVEIENhU2UgbkFNRXNcbiAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gbmFtZSkge1xuICAgIHdhcm5pbmdzLnB1c2goJ25hbWUgY2FuIG5vIGxvbmdlciBjb250YWluIGNhcGl0YWwgbGV0dGVycycpXG4gIH1cblxuICBpZiAoL1t+JyEoKSpdLy50ZXN0KG5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSlbMF0pKSB7XG4gICAgd2FybmluZ3MucHVzaCgnbmFtZSBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIChcIn5cXCchKCkqXCIpJylcbiAgfVxuXG4gIGlmIChlbmNvZGVVUklDb21wb25lbnQobmFtZSkgIT09IG5hbWUpIHtcbiAgICAvLyBNYXliZSBpdCdzIGEgc2NvcGVkIHBhY2thZ2UgbmFtZSwgbGlrZSBAdXNlci9wYWNrYWdlXG4gICAgdmFyIG5hbWVNYXRjaCA9IG5hbWUubWF0Y2goc2NvcGVkUGFja2FnZVBhdHRlcm4pXG4gICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgdmFyIHVzZXIgPSBuYW1lTWF0Y2hbMV1cbiAgICAgIHZhciBwa2cgPSBuYW1lTWF0Y2hbMl1cbiAgICAgIGlmIChlbmNvZGVVUklDb21wb25lbnQodXNlcikgPT09IHVzZXIgJiYgZW5jb2RlVVJJQ29tcG9uZW50KHBrZykgPT09IHBrZykge1xuICAgICAgICByZXR1cm4gZG9uZSh3YXJuaW5ncywgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGVycm9ycy5wdXNoKCduYW1lIGNhbiBvbmx5IGNvbnRhaW4gVVJMLWZyaWVuZGx5IGNoYXJhY3RlcnMnKVxuICB9XG5cbiAgcmV0dXJuIGRvbmUod2FybmluZ3MsIGVycm9ycylcbn1cblxudmFsaWRhdGUuc2NvcGVkUGFja2FnZVBhdHRlcm4gPSBzY29wZWRQYWNrYWdlUGF0dGVyblxuXG52YXIgZG9uZSA9IGZ1bmN0aW9uICh3YXJuaW5ncywgZXJyb3JzKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgdmFsaWRGb3JOZXdQYWNrYWdlczogZXJyb3JzLmxlbmd0aCA9PT0gMCAmJiB3YXJuaW5ncy5sZW5ndGggPT09IDAsXG4gICAgdmFsaWRGb3JPbGRQYWNrYWdlczogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICB3YXJuaW5nczogd2FybmluZ3MsXG4gICAgZXJyb3JzOiBlcnJvcnNcbiAgfVxuICBpZiAoIXJlc3VsdC53YXJuaW5ncy5sZW5ndGgpIGRlbGV0ZSByZXN1bHQud2FybmluZ3NcbiAgaWYgKCFyZXN1bHQuZXJyb3JzLmxlbmd0aCkgZGVsZXRlIHJlc3VsdC5lcnJvcnNcbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsImltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnQuXG5cdCAqL1xuXHRodG1sRWxlbWVudD86IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRhZy5cblx0ICovXG5cdHRhZz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpPzogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG9wdGlvbnMgdG8gaW5jbHVkZSB3aXRoIHJlZ2lzdGVyaW5nIHRoaXMgY29tcG9uZW50LlxuXHQgKi9cblx0ZWxlbWVudE9wdGlvbnM/OiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnM7XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBldmVudHMgdG8gdHJpZ2dlci5cblx0ICovXG5cdGV2ZW50cz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0ZnVuYzogRnVuY3Rpb247XG5cdFx0XHRcdG9wdGlvbnM/OiBhbnk7XG5cdFx0XHR9XG5cdFx0fTtcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90Q29tcG9uZW50IGltcGxlbWVudHMgSUhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBIVE1MRWxlbWVudC5cblx0ICovXG5cdGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudDtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIEFQSS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG9wdGlvbnMgdG8gaW5jbHVkZSB3aXRoIHJlZ2lzdGVyaW5nIHRoaXMgY29tcG9uZW50LlxuXHQgKi9cblx0ZWxlbWVudE9wdGlvbnM6IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudC5cblx0ICovXG5cdHR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0dmFsdWU6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBldmVudHMgdG8gdHJpZ2dlci5cblx0ICovXG5cdGV2ZW50czoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0ZnVuYzogRnVuY3Rpb247XG5cdFx0XHRcdG9wdGlvbnM6IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMuaHRtbEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGFnID0gXCJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLnR5cGUgPSBcIlwiO1xuXHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuaHRtbEVsZW1lbnQgPSBjb3B5Lmh0bWxFbGVtZW50IHx8IG51bGw7XG5cdFx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHRcdHRoaXMudGFnID0gY29weS50YWcgfHwgdGhpcy5uYW1lO1xuXHRcdFx0dGhpcy5hcGkgPSBjb3B5LmFwaSB8fCBudWxsO1xuXHRcdFx0dGhpcy5lbGVtZW50T3B0aW9ucyA9IGNvcHkuZWxlbWVudE9wdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy50eXBlID0gY29weS50eXBlIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gY29weS52YWx1ZSB8fCBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0aGlzLmFwaSA9IGFwaTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCB0aGF0J3MgY2FsbGVkIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgY3JlYXRlZC4gVGhpcyBpcyBcblx0ICogY2FsbGVkIGJlZm9yZSBvdXRwdXQgaXMgY2FsbGVkLiBSaWdodCBhZnRlciB0aGlzIGlzIGNhbGxlZCwgXG5cdCAqIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIEhUTUxFbGVtZW50IHdpbGwgYmUgcHJvY2Vzc2VkLiBJZiBcblx0ICogdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGF0dHJpYnV0ZXMgcHJvY2Vzc2luZyBuZWVkIHRvIGJlIFxuXHQgKiBvdmVyd3JpdHRlbiwgdXNlIHRoZSBoYW5kbGVBdHRyaWJ1dGVzIG1ldGhvZCB0byBoYW5kbGUgdGhlbS5cblx0ICovXG5cdGFzeW5jIG9uQ3JlYXRlZCAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHJldHVybiAoZWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIHRoZSBhdHRyaWJ1dGVzIG1hbnVhbGx5LlxuXHQgKi9cblx0YXN5bmMgaGFuZGxlQXR0cmlidXRlcz8gKGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhIGNsaWNrIGV2ZW50LlxuXHQgKi9cblx0YWJzdHJhY3QgY2xpY2sgKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0YWJzdHJhY3Qgb3V0cHV0ICgpOiBQcm9taXNlPHN0cmluZz47XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0TWFwLCBIb3RUZXN0UGFnZSwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbi8qKlxuICogVGhlIHRlc3Qgc3RvcCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGVpdGhlciBhIGRlc3RpbmF0aW9uIG9yIFxuICogYSBwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFRlc3RTdG9wXG57XG5cdC8qKlxuXHQgKiBBIGNvbW1hbmQgdG8gZXhlY3V0ZS4gQ2FuIGJlOlxuXHQgKiAqIHByaW50KHgpXG5cdCAqICAgKiBQcmludCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlcidzIGNvbnNvbGUuXG5cdCAqICogcHJpbnRsbih4KVxuXHQgKiAgICogUHJpbnQgYSBtZXNzYWdlIHdpdGggYSBuZXcgbGluZSB0byB0aGUgc2VydmVyJ3MgY29uc29sZS5cblx0ICogKiB1cmwoeClcblx0ICogICAqIE9wZW4gYSB1cmwuIE11c3QgYmUgYW4gYWJzb2x1dGUgdXJsLlxuXHQgKiAqIHdhaXRGb3JUZXN0ZXJBUElEYXRhXG5cdCAqICAgKiBUaGlzIHdpbGwgd2FpdCBmb3IgdGhlIHRlc3RlciBBUEkgdG8gcmVjZWl2ZSBkYXRhLlxuXHQgKiAqIHdhaXQoeClcblx0ICogICAqIFRoaXMgd2lsbCB3YWl0IGZvciB4IG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqICogd2FpdEZvclRlc3RPYmplY3QoeClcblx0ICogICAqIFRoaXMgd2lsbCB3YWl0IGZvciBhIHRlc3Qgb2JqZWN0IHRvIGJlIGxvYWRlZC5cblx0ICovXG5cdGNtZDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc3RpbmF0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRkZXN0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byBleGVjdXRlLlxuXHQgKi9cblx0cGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZXN0aW5hdGlvbiBmb3IgYSB0ZXN0IHRvIHRha2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBtYXAuXG5cdCAqL1xuXHRtYXBOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSB0byBzdGFydCBhdC5cblx0ICovXG5cdHBhZ2U6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgcm91dGUgdG8gc3RhcnQgdXNpbmcuXG5cdCAqL1xuXHRhcGk6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRocyB0byB0YWtlIG9uIHRoZSBwYWdlLlxuXHQgKi9cblx0cGF0aHM6IEhvdFRlc3RTdG9wW107XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGVzdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RUZXN0ZXJcbntcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCB0aGF0IHdpbGwgY29uc3RydWN0IGZ1dHVyZSB1cmxzLlxuXHQgKi9cblx0YmFzZVVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgcHJvY2Vzc29yLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIHRlc3QgbWFwcyB0byB0ZXN0LlxuXHQgKi9cblx0dGVzdE1hcHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RNYXA7IH07XG5cdC8qKlxuXHQgKiBUaGUgZHJpdmVyIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGVzdHMuXG5cdCAqL1xuXHRkcml2ZXI6IEhvdFRlc3REcml2ZXI7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgbG9hZGluZz9cblx0ICovXG5cdGZpbmlzaGVkTG9hZGluZzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBzZXR0aW5nIHVwP1xuXHQgKi9cblx0aGFzQmVlblNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuRGVzdHJveWVkOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEsIG5hbWU6IHN0cmluZywgYmFzZVVybDogc3RyaW5nLCBcblx0XHRkcml2ZXI6IEhvdFRlc3REcml2ZXIsIHRlc3RNYXBzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0TWFwOyB9ID0ge30pXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy50ZXN0TWFwcyA9IHRlc3RNYXBzO1xuXHRcdHRoaXMuZHJpdmVyID0gZHJpdmVyO1xuXHRcdHRoaXMuZmluaXNoZWRMb2FkaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNCZWVuU2V0dXAgPSBmYWxzZTtcblx0XHR0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHNldHRpbmcgdXAgdGhlIHRlc3Rlci5cblx0ICovXG5cdGFic3RyYWN0IHNldHVwIChpc1dlYlJvdXRlOiBib29sZWFuLCB1cmw6IHN0cmluZywgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBkZXN0cm95aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhYnN0cmFjdCBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgaXQgd2lsbCBcblx0ICogY29udGludWUgYW5kIGV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMuIElmIHRoaXMgcmV0dXJucyBpdCB3aWxsIFxuXHQgKiBza2lwIGFsbCB0ZXN0IHBhdGhzIGFuZCBleGVjdXRlIG9uVGVzdEVuZCBpbnN0ZWFkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0U3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIEFQSSB0ZXN0IHBhdGggaGFzIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgXG5cdCAqIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlcndhcmRzLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0QVBJUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBwYWdlIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBcblx0ICogaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoU3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBcblx0XHRzdG9wOiBIb3RUZXN0U3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYSBwYWdlIHRlc3QgaGFzIGVuZGVkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0UGFnZVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHRlc3RQYXRoOiBIb3RUZXN0UGF0aCwgXG5cdFx0cmVzdWx0OiBhbnksIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGEgY29tbWFuZCBpcyBleGVjdXRlZC5cblx0ICovXG5cdGFzeW5jIG9uQ29tbWFuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgcGFnZTogSG90VGVzdFBhZ2UsIHN0b3A6IEhvdFRlc3RTdG9wLCBcblx0XHRjbWQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGVzdHMgYXJlIGZpbmlzaGVkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0RW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGlzIHRlc3RlciBoYXMgYmVlbiBleGVjdXRlZCBmcm9tIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBvbkV4ZWN1dGU/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGlzIHRlc3RlciBoYXMgZmluaXNoZWQgbG9hZGluZyBhbGwgZGF0YSBmcm9tIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBvbkZpbmlzaGVkTG9hZGluZz8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGZpbmlzaCBsb2FkaW5nIGFsbCBkYXRhLlxuXHQgKi9cblx0YXN5bmMgd2FpdEZvckRhdGEgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHdoaWxlICh0aGlzLmZpbmlzaGVkTG9hZGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0UGFnZSAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogSG90VGVzdFBhZ2Vcblx0e1xuXHRcdGxldCBwYWdlID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXS5wYWdlc1tkZXN0aW5hdGlvbi5wYWdlXTtcblxuXHRcdHJldHVybiAocGFnZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBwYXRoLlxuXHQgKi9cblx0Z2V0VGVzdFBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgcGF0aE5hbWU6IHN0cmluZyk6IEhvdFRlc3RQYXRoXG5cdHtcblx0XHRsZXQgcGFnZSA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV0ucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRyZXR1cm4gKHBhZ2UudGVzdFBhdGhzW3BhdGhOYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgZGVzdGluYXRpb24gSlNPTiBvYmplY3QgdG8gdXNlLlxuXHQgKi9cblx0c3RhdGljIGludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lOiBzdHJpbmcsIHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24pOiBIb3REZXN0aW5hdGlvblxuXHR7XG5cdFx0bGV0IGRlc3RpbmF0aW9uOiBzdHJpbmcgPSB0ZXN0RGVzdC5kZXN0aW5hdGlvbjtcblx0XHRsZXQgbmV3RGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0ge1xuXHRcdFx0XHRtYXBOYW1lOiBtYXBOYW1lLFxuXHRcdFx0XHRwYWdlOiBcIlwiLFxuXHRcdFx0XHRhcGk6IFwiXCIsXG5cdFx0XHRcdHBhdGhzOiBbXVxuXHRcdFx0fTtcblx0XHRsZXQgc3Ryczogc3RyaW5nW10gPSBkZXN0aW5hdGlvbi5zcGxpdCAoL1xcLVxcPi9nKTtcblx0XHRsZXQgdHlwZTogc3RyaW5nID0gc3Ryc1swXTtcblx0XHRsZXQgZ2V0VHlwZTogKHR5cGVTdHI6IHN0cmluZywgdHlwZURlbGltaXRlcjogc3RyaW5nKSA9PiBzdHJpbmcgPSBcblx0XHRcdCh0eXBlU3RyOiBzdHJpbmcsIHR5cGVEZWxpbWl0ZXI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcG9zOiBudW1iZXIgPSB0eXBlU3RyLmluZGV4T2YgKHR5cGVEZWxpbWl0ZXIpO1xuXHRcdFx0XHRsZXQgdHlwZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFxuXHRcdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlVmFsdWUgPSB0eXBlU3RyLnN1YnN0ciAocG9zICsgdHlwZURlbGltaXRlci5sZW5ndGgpO1xuXHRcdFx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVWYWx1ZS50cmltICgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICh0eXBlVmFsdWUpO1xuXHRcdFx0fTtcblxuXHRcdG5ld0Rlc3RpbmF0aW9uLnBhZ2UgPSBnZXRUeXBlICh0eXBlLCBcInBhZ2U6XCIpO1xuXHRcdG5ld0Rlc3RpbmF0aW9uLmFwaSA9IGdldFR5cGUgKHR5cGUsIFwiYXBpOlwiKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAxOyBpSWR4IDwgc3Rycy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbmV3UGF0aFN0cjogc3RyaW5nID0gc3Ryc1tpSWR4XTtcblx0XHRcdGxldCBuZXdQYXRoOiBIb3RUZXN0U3RvcCA9IHtcblx0XHRcdFx0XHRjbWQ6IFwiXCIsXG5cdFx0XHRcdFx0ZGVzdDogXCJcIixcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdG5ld1BhdGhTdHIgPSBuZXdQYXRoU3RyLnRyaW0gKCk7XG5cdFx0XHRuZXdQYXRoLmRlc3QgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImRlc3Q6XCIpO1xuXHRcdFx0bmV3UGF0aC5jbWQgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImNtZDpcIik7XG5cdFx0XHRuZXdQYXRoLnBhdGggPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcInBhdGg6XCIpO1xuXG5cdFx0XHRpZiAoKG5ld1BhdGguZGVzdCA9PSBcIlwiKSAmJiAobmV3UGF0aC5jbWQgPT0gXCJcIikgJiYgKG5ld1BhdGgucGF0aCA9PSBcIlwiKSlcblx0XHRcdFx0bmV3UGF0aC5wYXRoID0gbmV3UGF0aFN0cjtcblxuXHRcdFx0bmV3RGVzdGluYXRpb24ucGF0aHMucHVzaCAobmV3UGF0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChuZXdEZXN0aW5hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBBUEkncyB0ZXN0IHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgc2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RBUElQYXRoU3RhcnQgKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChydW5UZXN0UGF0aCA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRsZXQgdGVzdENhc2VPYmplY3Q6IFRlc3RDYXNlT2JqZWN0ID0gbWV0aG9kLnRlc3RDYXNlc1t0ZXN0TmFtZV07XG5cblx0XHRcdGlmICh0ZXN0Q2FzZU9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgY2FzZSBvYmplY3QgJHt0ZXN0TmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRlc3RDYXNlT2JqZWN0LmZ1bmMgKHRoaXMuZHJpdmVyKTtcblx0XHR9XG5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RBUElQYXRoRW5kIChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgcmVzdWx0LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMgaW4gYW4gQVBJIHJvdXRlLlxuXHQgKiBcblx0ICogQGZpeG1lIFRoaXMgbmVlZHMgYSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0QVBJUGF0aHMgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGlmICh0aGlzLnByb2Nlc3Nvci5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQXNzb2NpYXRlZCBwcm9jZXNzb3IgZG9lcyBub3QgaGF2ZSBhbiBBUEkhYCk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5wcm9jZXNzb3IuYXBpLnJvdXRlc1tkZXN0aW5hdGlvbi5hcGldO1xuXG5cdFx0aWYgKHJvdXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBkb2VzIG5vdCBoYXZlIHJvdXRlICR7ZGVzdGluYXRpb24uYXBpfSFgKTtcblxuXHRcdC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBhdGggaW4gdGhlIGRlc3RpbmF0aW9uIHVudGlsIGNvbXBsZXRlLlxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZGVzdGluYXRpb24ucGF0aHMubGVuZ3RoOyBpSWR4ICs9IDIpXG5cdFx0e1xuXHRcdFx0bGV0IHN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeF07XG5cdFx0XHRsZXQgcGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gcm91dGUuZ2V0TWV0aG9kIChwYXRoTmFtZSk7XG5cdFx0XHRsZXQgbmV4dFN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeCArIDFdO1xuXHRcdFx0bGV0IHRlc3ROYW1lOiBzdHJpbmcgPSBuZXh0U3RvcC5wYXRoO1xuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHRlc3QgcGFnZSBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0c2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0bGV0IHBhZ2U6IEhvdFRlc3RQYWdlID0gdGVzdE1hcC5wYWdlc1tkZXN0aW5hdGlvbi5wYWdlXTtcblxuXHRcdGlmIChwYWdlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFBhZ2UgJHtkZXN0aW5hdGlvbi5wYWdlfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRoaXMuZHJpdmVyLnBhZ2UgPSBwYWdlO1xuXG5cdFx0bGV0IHRlc3RQYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdGxldCB0ZXN0UGF0aDogSG90VGVzdFBhdGggPSBwYWdlLnRlc3RQYXRoc1t0ZXN0UGF0aE5hbWVdO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgcGFnZSwgc3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RQYXRoID09IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGRlYnVnZ2VyO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgcGF0aCAke3Rlc3RQYXRoTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIWApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0UGF0aCAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aEVuZCAoZGVzdGluYXRpb24sIHRlc3RQYXRoLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIGNtZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbW1hbmQgbWF0Y2hlcy5cblx0XHQgKi9cblx0XHRsZXQgaGFzQ21kOiAoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbikgPT4gYm9vbGVhbiA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcsIGNtZDogc3RyaW5nLCBoYXNBcmd1bWVudHM6IGJvb2xlYW4pOiBib29sZWFuID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoc3RvcC5jbWQgPT09IGNtZClcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHBvczogbnVtYmVyID0gc3RvcC5jbWQuaW5kZXhPZiAoXCIoXCIpO1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3MgcGFyZW50aGVzaXMsIGdldCB0aGUgaW5jb21pbmcgY29tbWFuZC5cblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0Q21kOiBzdHJpbmcgPSBzdG9wLmNtZC5zdWJzdHIgKDAsIHBvcyk7XG5cblx0XHRcdFx0XHRpZiAoaW5wdXRDbWQgPT09IGNtZClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEdldCB0aGUgYXJndW1lbnRzIGluIGEgY29tbWFuZC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGEgXG5cdFx0ICogc2luZ2xlIGFyZ3VtZW50IGZvciBub3cuXG5cdFx0ICogXG5cdFx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcmd1bWVudHMuXG5cdFx0ICovXG5cdFx0bGV0IGdldENtZEFyZ3M6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdbXSA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaCAoLyg/PVxcKCkoLio/KSg/PVxcKSkvZyk7XG5cblx0XHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZW1wTWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdFx0dGVtcE1hdGNoID0gdGVtcE1hdGNoLnN1YnN0ciAoMiwgdGVtcE1hdGNoLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRyZXN1bHRzLnB1c2ggKHRlbXBNYXRjaCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0cy5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke2lucHV0fSByZXF1aXJlcyBhcmd1bWVudHMsIGJ1dCBub25lIHdlcmUgc3VwcGxpZWQuYCk7XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHRcdH07XG5cblx0XHRsZXQgY21kRnVuYzogKChjbWRBcmdzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPikgPSBudWxsO1xuXHRcdGxldCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RlckFQSURhdGFcIiwgZmFsc2UpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMud2FpdEZvckRhdGEgKCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG51bU1pbGxpc2Vjb25kczogbnVtYmVyID0gcGFyc2VJbnQgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgSG90U3RhcS53YWl0IChudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInVybFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIubmF2aWdhdGVUb1VybCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50XCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50bG5cIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBpbnB1dDogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZHJpdmVyLnByaW50bG4gKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ3YWl0Rm9yVGVzdE9iamVjdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3RPYmplY3Q6IHN0cmluZyA9IEpTT04ucGFyc2UgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50ICh0ZXN0T2JqZWN0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoY21kRnVuYyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBDb21tYW5kICR7c3RvcC5jbWR9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0YXdhaXQgdGhpcy5vbkNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBjbWQsIGFyZ3MsIGNtZEZ1bmMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMgaW4gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aHMgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cdFx0XHRsZXQgcGFnZTogSG90VGVzdFBhZ2UgPSB0ZXN0TWFwLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXHRcblx0XHRcdGlmIChwYWdlID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogUGFnZSAke2Rlc3RpbmF0aW9uLnBhZ2V9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRpZiAoc3RvcC5kZXN0ICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdE1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdoZW4gdXNpbmcgdHlwZSAnZGVzdCcgaW4gYSBkZXN0aW5hdGlvbiBzdHJpbmcsIGFsbCBkZXN0aW5hdGlvbnMgaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gbXVzdCBiZSBuYW1lZC5gKTtcblxuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IHRlc3RNYXAuZGVzdGluYXRpb25zW3N0b3AuZGVzdF07XG5cdFx0XHRcdGxldCBuZXdEZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbi5tYXBOYW1lLCB0ZXN0RGVzdCk7XG5cblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAobmV3RGVzdGluYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3RvcC5jbWQgIT09IFwiXCIpXG5cdFx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZUNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBzdG9wLmNtZCk7XG5cblx0XHRcdGlmIChzdG9wLnBhdGggIT09IFwiXCIpXG5cdFx0XHRcdHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb24sIHN0b3AsIGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZSAobWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbbWFwTmFtZV07XG5cblx0XHRpZiAobWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke21hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gUHJvY2VzcyByb3V0ZXMgdGVzdGluZyBmaXJzdC5cblx0XHRsZXQgcm91dGVLZXk6IHN0cmluZyA9IHRoaXMucHJvY2Vzc29yLmdldFJvdXRlS2V5RnJvbU5hbWUgKG1hcE5hbWUpO1xuXHRcdGxldCB1cmw6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocm91dGVLZXkgIT09IFwiXCIpXG5cdFx0XHR1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtyb3V0ZUtleX1gO1xuXG5cdFx0bGV0IGV4ZWN1dGVEZXN0aW5hdGlvbjogKHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24sIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+ID0gXG5cdFx0XHRhc3luYyAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk6IHN0cmluZyA9IFwiXCIpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0RGVzdC5hdXRvU3RhcnQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRsZXQgZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0gSG90VGVzdGVyLmludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lLCB0ZXN0RGVzdCk7XG5cdFx0XHRcdGxldCBpc1dlYlJvdXRlOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBydW5UZXN0UGF0aHM6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdGlzV2ViUm91dGUgPSB0cnVlO1xuXHRcblx0XHRcdFx0aWYgKHRoaXMuc2V0dXAgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5TZXR1cCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zZXR1cCAoaXNXZWJSb3V0ZSwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XG5cdFx0XHRcdGlmICh0aGlzLm9uVGVzdFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdFx0cnVuVGVzdFBhdGhzID0gYXdhaXQgdGhpcy5vblRlc3RTdGFydCAoZGVzdGluYXRpb24sIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcblx0XHRcdFx0aWYgKHJ1blRlc3RQYXRocyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcblx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24uYXBpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RFbmQgKGRlc3RpbmF0aW9uKTtcblx0XG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3kgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZGVzdHJveSAoKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBtYXAgZGVzdGluYXRpb25zIGFyZSBpbiBhbiBhcnJheSwganVzdCBleGVjdXRlIHRob3NlIGluIG9yZGVyLlxuXHRcdGlmIChtYXAuZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IG1hcC5kZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgZGVzdGluYXRpb24gb3JkZXIsIHVzZSB0aGF0LlxuXHRcdFx0aWYgKG1hcC5kZXN0aW5hdGlvbk9yZGVyLmxlbmd0aCA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBoYXNFeGVjdXRlZEtleXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0Ly8gR28gdGhyb3VnaCB0aGUgZGVzdGluYXRpb24gb3JkZXIgYW5kIGV4ZWN1dGUgZWFjaCBvbmUuXG5cdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb3JkZXJLZXk6IHN0cmluZyA9IG1hcC5kZXN0aW5hdGlvbk9yZGVyW2lJZHhdO1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tvcmRlcktleV07XG5cblx0XHRcdFx0XHRpZiAodGVzdERlc3QgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogRGVzdGluYXRpb24gJHtvcmRlcktleX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRoYXNFeGVjdXRlZEtleXMucHVzaCAob3JkZXJLZXkpO1xuXHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIG9yZGVyS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlIGRlc3RpbmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgeWV0LlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBleGVjdXRlRGVzdDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhhc0V4ZWN1dGVkS2V5cy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXhlY3V0ZWRLZXk6IHN0cmluZyA9IGhhc0V4ZWN1dGVkS2V5c1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKGV4ZWN1dGVkS2V5ID09PSBrZXkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGV4ZWN1dGVEZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGV4ZWN1dGVEZXN0ID09PSB0cnVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBkZXN0aW5hdGlvbnMgaW4gYW55IG9yZGVyLlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEVuZCBvZiByb3V0ZXMgdGVzdGluZ1xuXG5cdFx0Ly8gU3RhcnQgb2YgQVBJIHRlc3RpbmdcblxuXHR9XG59IiwiaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90U3RhcVdlYlwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50T3B0aW9ucyB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcblxuLyoqXG4gKiBUaGlzIGFjdHVhbGx5IGV4ZWN1dGVzIHRoZSB0ZXN0cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdFRlc3REcml2ZXJcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RUZXN0UGFnZTtcblxuXHRjb25zdHJ1Y3RvciAocGFnZTogSG90VGVzdFBhZ2UgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IG9iamVjdCBieSBpdCdzIG5hbWUuIElmIGEgKiBpcyB1c2VkLCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBcblx0ICogd2lsZGNhcmQgZm9yIHRoZSBvYmplY3QncyBuYW1lLiBJZiBhID4gaXMgdXNlZCwgdGhlbiB0aGUgbmFtZSB3aWxsIFxuXHQgKiBiZSB0cmVhdGVkIGFzIGEgQ1NTIHNlbGVjdG9yLlxuXHQgKi9cblx0cGFyc2VUZXN0T2JqZWN0IChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IG5hbWUuaW5kZXhPZiAoXCIqXCIpO1xuXHRcdGxldCB3aWxkY2FyZDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFwqLywgXCJcIik7XG5cdFx0XHR3aWxkY2FyZCA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdGxldCBzZWxlY3Rvcjogc3RyaW5nID0gYFtkYXRhLXRlc3Qtb2JqZWN0LW5hbWUke3dpbGRjYXJkfT0nJHtuYW1lfSddYDtcblx0XHRwb3MgPSBuYW1lLmluZGV4T2YgKFwiPlwiKTtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFw+LywgXCJcIik7XG5cdFx0XHRzZWxlY3RvciA9IG5hbWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzZWxlY3Rvcik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0YXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRhc3luYyBwcmludCAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUgKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZSBsaW5lLlxuXHQgKi9cblx0YXN5bmMgcHJpbnRsbiAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgdGhpcy5wcmludCAoYCR7bWVzc2FnZX1cXG5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoaXMgc2VydmVyIG9yIGRlc3Ryb3kgYW55dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSG90VGVzdERyaXZlci5cblx0ICovXG5cdGFic3RyYWN0IGRlc3Ryb3kgKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlIHRvIGEgdXJsLlxuXHQgKi9cblx0YWJzdHJhY3QgbmF2aWdhdGVUb1VybCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogV2FpdCBmb3IgYSBIb3RUZXN0RWxlbWVudCB0byBsb2FkLlxuXHQgKi9cblx0YWJzdHJhY3Qgd2FpdEZvclRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgb3B0aW9ucz86IEhvdFRlc3RFbGVtZW50T3B0aW9ucyk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIEZpbmQgYSBIb3RUZXN0RWxlbWVudCB0byB1dGlsaXplLlxuXHQgKi9cblx0YWJzdHJhY3QgZmluZFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgb3B0aW9ucz86IEhvdFRlc3RFbGVtZW50T3B0aW9ucyk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIFJ1biBhIEhvdFRlc3RFbGVtZW50IGNvbW1hbmQuXG5cdCAqL1xuXHRhYnN0cmFjdCBydW5Db21tYW5kICh0ZXN0RWxtOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgZnVuY05hbWU/OiBzdHJpbmcsIHZhbHVlU3RyPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogQW4gZXhwcmVzc2lvbiB0byB0ZXN0LlxuXHQgKi9cblx0YWJzdHJhY3QgYXNzZXJ0RWxlbWVudFZhbHVlIChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgdmFsdWU6IGFueSwgXG5cdFx0ZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogQW4gZXhwcmVzc2lvbiB0byB0ZXN0LlxuXHQgKi9cblx0YXN5bmMgYXNzZXJ0ICh2YWx1ZTogYW55LCBlcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGlmICghICh2YWx1ZSkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGVycm9yTWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIGEgc2VyaWVzIG9mIHRlc3QgZWxlbWVudHMuXG5cdCAqL1xuXHRhc3luYyBydW4gKGV4ZWN1dGlvbnM6IHN0cmluZ1tdIHwgc3RyaW5nW11bXSk6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZXhlY3V0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uOiBhbnkgPSBleGVjdXRpb25zW2lJZHhdO1xuXHRcdFx0bGV0IHRlc3RFbG06IEhvdFRlc3RFbGVtZW50ID0gbnVsbDtcblx0XHRcdGxldCBmdW5jOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAodHlwZW9mIChleGVjdXRpb24pID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHR0ZXN0RWxtID0gdGhpcy5wYWdlLnRlc3RFbGVtZW50c1tleGVjdXRpb25dO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGhpcyBpcyBnb2luZyB0byB3cmVjayBzZWxlY3RpbmcgdGVzdCBlbGVtZW50cyBieSB3aWxkY2FyZHMuXG5cdFx0XHRcdGlmICh0ZXN0RWxtID09IG51bGwpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdERyaXZlcjogVW5hYmxlIHRvIGZpbmQgdGVzdCBlbGVtZW50ICR7ZXhlY3V0aW9ufWApO1xuXG5cdFx0XHRcdGZ1bmMgPSB0ZXN0RWxtLmZ1bmM7XG5cdFx0XHRcdHZhbHVlID0gdGVzdEVsbS52YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGV4ZWN1dGlvbiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmFtZTogc3RyaW5nID0gZXhlY3V0aW9uWzBdO1xuXHRcdFx0XHR0ZXN0RWxtID0gdGhpcy5wYWdlLnRlc3RFbGVtZW50c1tuYW1lXTtcblxuXHRcdFx0XHQvLyBUaGlzIG51bGwgY2F0Y2ggaXMgc3BlY2lmaWNhbGx5IHRvIGhlbHAgZmluZCB3aWxkY2FyZCB0ZXN0IGVsZW1lbnRzLlxuXHRcdFx0XHRpZiAodGVzdEVsbSA9PSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3RUZXN0RWxlbWVudCAobmFtZSk7XG5cdFx0XHRcdFx0ZnVuYyA9IGV4ZWN1dGlvblsxXTtcblx0XHRcdFx0XHR2YWx1ZSA9IGV4ZWN1dGlvblsyXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmdW5jID0gdGVzdEVsbS5mdW5jO1xuXHRcdFx0XHRcdHZhbHVlID0gdGVzdEVsbS52YWx1ZTtcblxuXHRcdFx0XHRcdGlmIChleGVjdXRpb24ubGVuZ3RoID4gMSlcblx0XHRcdFx0XHRcdGZ1bmMgPSBleGVjdXRpb25bMV07XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0aW9uLmxlbmd0aCA+IDIpXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGV4ZWN1dGlvblsyXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0ZXN0RWxtLmZ1bmMgPSBmdW5jO1xuXHRcdFx0dGVzdEVsbS52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0XHRyZXN1bHRzLnB1c2ggKGF3YWl0IHRoaXMucnVuQ29tbWFuZCAodGVzdEVsbSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cbn0iXSwic291cmNlUm9vdCI6IiJ9
|