oxygen-cli 1.25.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/util.js +58 -3
  27. package/build/model/case-result.js +4 -2
  28. package/build/model/failure.js +2 -1
  29. package/build/model/status.js +2 -1
  30. package/build/model/step-result.js +2 -1
  31. package/build/model/suite-result.js +2 -1
  32. package/build/model/test-result.js +2 -1
  33. package/build/model/testcase.js +2 -1
  34. package/build/model/testsuite.js +2 -1
  35. package/build/ox_modules/index.js +33 -13
  36. package/build/ox_modules/module-assert.js +24 -8
  37. package/build/ox_modules/module-date.js +8 -3
  38. package/build/ox_modules/module-db.js +28 -7
  39. package/build/ox_modules/module-email.js +36 -10
  40. package/build/ox_modules/module-eyes.js +46 -5
  41. package/build/ox_modules/module-http.js +102 -41
  42. package/build/ox_modules/module-log.js +22 -5
  43. package/build/ox_modules/module-mailinator.js +32 -10
  44. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  45. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  46. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  47. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  48. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  49. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  50. package/build/ox_modules/module-mob/commands/back.js +2 -1
  51. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  52. package/build/ox_modules/module-mob/commands/click.js +4 -3
  53. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  54. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  55. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  56. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  57. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  58. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  59. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  60. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  61. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  62. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  63. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  64. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  66. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  70. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  73. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  74. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  76. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  77. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  78. package/build/ox_modules/module-mob/commands/index.js +94 -19
  79. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  80. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  85. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  86. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  87. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  88. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  89. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  90. package/build/ox_modules/module-mob/commands/open.js +3 -1
  91. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  92. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  93. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  96. package/build/ox_modules/module-mob/commands/select.js +4 -1
  97. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  99. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  100. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  101. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  104. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  105. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  107. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  108. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  110. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  111. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  112. package/build/ox_modules/module-mob/commands/type.js +7 -3
  113. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  114. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  115. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  116. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  117. package/build/ox_modules/module-mob.js +139 -67
  118. package/build/ox_modules/module-pdf.js +62 -23
  119. package/build/ox_modules/module-proxy.js +68 -8
  120. package/build/ox_modules/module-serial.js +32 -7
  121. package/build/ox_modules/module-shell.js +27 -8
  122. package/build/ox_modules/module-soap.js +47 -14
  123. package/build/ox_modules/module-twilio.js +53 -10
  124. package/build/ox_modules/module-utils.js +51 -16
  125. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  126. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  127. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  128. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  129. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  131. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  133. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  135. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  136. package/build/ox_modules/module-web/commands/back.js +2 -1
  137. package/build/ox_modules/module-web/commands/clear.js +5 -1
  138. package/build/ox_modules/module-web/commands/click.js +13 -4
  139. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  140. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  141. package/build/ox_modules/module-web/commands/debug.js +2 -2
  142. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  143. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  144. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  145. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  146. package/build/ox_modules/module-web/commands/execute.js +2 -1
  147. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  148. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  149. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  150. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  151. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  153. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  154. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  155. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  156. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  157. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  158. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  159. package/build/ox_modules/module-web/commands/getText.js +4 -1
  160. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  161. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  162. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  163. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  164. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  165. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  166. package/build/ox_modules/module-web/commands/index.js +100 -19
  167. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  168. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  169. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  170. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  171. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  172. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  173. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  174. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  175. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/open.js +4 -1
  178. package/build/ox_modules/module-web/commands/pause.js +2 -1
  179. package/build/ox_modules/module-web/commands/point.js +2 -1
  180. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  181. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  182. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  183. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  184. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  185. package/build/ox_modules/module-web/commands/select.js +5 -1
  186. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  187. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  188. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  189. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  190. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  191. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  192. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  193. package/build/ox_modules/module-web/commands/type.js +5 -1
  194. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  195. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  196. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  198. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  199. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  203. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  204. package/build/ox_modules/module-web.js +179 -77
  205. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  206. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  207. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  208. package/build/ox_modules/module-win/commands/back.js +2 -1
  209. package/build/ox_modules/module-win/commands/clear.js +4 -1
  210. package/build/ox_modules/module-win/commands/click.js +2 -1
  211. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  213. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  214. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  215. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  216. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  217. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  218. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  219. package/build/ox_modules/module-win/commands/getText.js +4 -1
  220. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  221. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  222. package/build/ox_modules/module-win/commands/index.js +43 -5
  223. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  224. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  225. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  226. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  227. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  228. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  229. package/build/ox_modules/module-win/commands/open.js +2 -1
  230. package/build/ox_modules/module-win/commands/pause.js +2 -1
  231. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  232. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  233. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  234. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  235. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  236. package/build/ox_modules/module-win/commands/tap.js +2 -1
  237. package/build/ox_modules/module-win/commands/type.js +4 -1
  238. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  239. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  240. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  241. package/build/ox_modules/module-win.js +87 -48
  242. package/build/ox_modules/utils.js +76 -22
  243. package/build/ox_reporters/reporter-excel.js +58 -1
  244. package/build/ox_reporters/reporter-html.js +28 -1
  245. package/build/ox_reporters/reporter-json.js +14 -1
  246. package/build/ox_reporters/reporter-junit.js +24 -1
  247. package/build/ox_reporters/reporter-pdf.js +19 -1
  248. package/build/ox_reporters/reporter-xml.js +17 -1
  249. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  250. package/build/ox_services/service-devtools.js +23 -1
  251. package/build/reporter/FileReporterBase.js +44 -5
  252. package/build/reporter/ReportAggregator.js +65 -1
  253. package/build/reporter/ReporterBase.js +6 -1
  254. package/build/runners/WorkerProcess.js +99 -1
  255. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  256. package/build/runners/cucumber/CucumberReporter.js +56 -1
  257. package/build/runners/cucumber/CucumberWorker.js +66 -1
  258. package/build/runners/cucumber/index.js +30 -1
  259. package/build/runners/cucumber/worker.js +18 -1
  260. package/build/runners/index.js +6 -1
  261. package/build/runners/oxygen/OxygenWorker.js +60 -3
  262. package/build/runners/oxygen/index.js +178 -17
  263. package/build/runners/oxygen/worker.js +25 -2
  264. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable no-unused-vars */
2
+
2
3
  /*
3
4
  * Copyright (C) 2015-present CloudBeat Limited
4
5
  *
@@ -7,9 +8,7 @@
7
8
  * the Free Software Foundation, either version 3 of the License, or
8
9
  * (at your option) any later version.
9
10
  */
10
-
11
11
  'use strict';
12
-
13
12
  /**
14
13
  * @name web
15
14
  * @description Provides methods for browser automation.
@@ -42,30 +41,52 @@
42
41
  */
43
42
 
44
43
  /* eslint-disable quotes */
44
+
45
45
  Object.defineProperty(exports, "__esModule", {
46
46
  value: true
47
47
  });
48
48
  exports.default = void 0;
49
+
49
50
  require("source-map-support/register");
51
+
50
52
  var _chromeHar = require("chrome-har");
53
+
51
54
  var _url = _interopRequireDefault(require("url"));
55
+
52
56
  var wdio = _interopRequireWildcard(require("webdriverio"));
57
+
53
58
  var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
59
+
54
60
  var _when = require("when");
61
+
55
62
  var _utils = _interopRequireDefault(require("./utils"));
63
+
56
64
  var _helper = _interopRequireDefault(require("../errors/helper"));
65
+
57
66
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
67
+
58
68
  var _util = _interopRequireDefault(require("util"));
69
+
59
70
  var _saucelabs = _interopRequireDefault(require("saucelabs"));
71
+
60
72
  var _nodeRestClient = _interopRequireDefault(require("@lambdatest/node-rest-client"));
73
+
61
74
  var _testingbotApi = _interopRequireDefault(require("testingbot-api"));
75
+
62
76
  var _child_process = require("child_process");
77
+
63
78
  var _perfectoReporting = _interopRequireDefault(require("perfecto-reporting"));
79
+
64
80
  var _request = _interopRequireDefault(require("request"));
81
+
65
82
  var _imgMerge = _interopRequireDefault(require("../lib/img-merge"));
83
+
66
84
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
85
+
67
86
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
87
+
68
88
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
89
+
69
90
  const MODULE_NAME = 'web';
70
91
  const DEFAULT_SELENIUM_URL = 'http://localhost:4444/wd/hub';
71
92
  const DEFAULT_BROWSER_NAME = 'chrome';
@@ -78,93 +99,101 @@ class WebModule extends _WebDriverModule.default {
78
99
  constructor(options, context, rs, logger, modules, services) {
79
100
  super(options, context, rs, logger, modules, services);
80
101
  this.transactions = {}; // transaction->har dictionary
102
+
81
103
  this.lastNavigationStartTime = null;
82
104
  this.helpers = {};
83
- this._loadHelperFunctions();
84
- // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
105
+
106
+ this._loadHelperFunctions(); // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
107
+
108
+
85
109
  this.OxError = _OxygenError.default;
86
- this.errHelper = _helper.default;
87
- // holds element operation timeout value
110
+ this.errHelper = _helper.default; // holds element operation timeout value
111
+
88
112
  this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
89
113
  }
114
+
90
115
  get name() {
91
116
  return MODULE_NAME;
92
117
  }
93
-
94
118
  /**
95
119
  * @function getDriver
96
120
  * @summary Returns the underlying WDIO driver.
97
121
  * @return {Object} WDIO driver.
98
122
  */
123
+
124
+
99
125
  getDriver() {
100
126
  return super.getDriver();
101
127
  }
102
-
103
128
  /**
104
129
  * @function getCapabilities
105
130
  * @summary Returns currently defined capabilities.
106
131
  * @return {Object} Current capabilities object.
107
132
  */
133
+
134
+
108
135
  getCapabilities() {
109
136
  return this.caps || super.getCapabilities();
110
137
  }
111
-
112
138
  /**
113
139
  * @function init
114
140
  * @summary Initializes new Selenium session.
115
141
  * @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
116
142
  * @param {String=} seleniumUrl - Remote server URL (default: http://localhost:4444/wd/hub).
117
143
  */
144
+
145
+
118
146
  async init(caps, seleniumUrl) {
119
147
  if (this.isInitialized) {
120
148
  return;
121
149
  }
150
+
122
151
  if (!seleniumUrl) {
123
152
  seleniumUrl = this.options.seleniumUrl || DEFAULT_SELENIUM_URL;
124
- }
125
-
126
- // take capabilities either from init method argument or from context parameters passed in the constructor
153
+ } // take capabilities either from init method argument or from context parameters passed in the constructor
127
154
  // merge capabilities from context and from init function argument, give preference to context-passed capabilities
155
+
156
+
128
157
  this.caps = {};
158
+
129
159
  if (this.ctx.caps) {
130
- this.caps = {
131
- ...this.ctx.caps
160
+ this.caps = { ...this.ctx.caps
132
161
  };
133
162
  }
163
+
134
164
  if (caps) {
135
- this.caps = {
136
- ...this.caps,
165
+ this.caps = { ...this.caps,
137
166
  ...caps
138
167
  };
139
- }
168
+ } // populate browserName caps from options. FIXME: why is this even needed?
169
+
140
170
 
141
- // populate browserName caps from options. FIXME: why is this even needed?
142
171
  let defaultBrowser = false;
172
+
143
173
  if (!this.caps.browserName) {
144
174
  this.caps.browserName = this.options.browserName || DEFAULT_BROWSER_NAME;
145
175
  defaultBrowser = true;
146
- }
147
- // FIXME: shall we throw an exception if browserName is not specified, neither in caps nor in options?!
176
+ } // FIXME: shall we throw an exception if browserName is not specified, neither in caps nor in options?!
177
+
178
+
148
179
  if (!this.caps.browserName) {
149
180
  throw new _OxygenError.default(_helper.default.errorCode.INVALID_CAPABILITIES, 'Failed to initialize `web` module - browserName must be specified.');
150
- }
181
+ } // adjust browserName-s
182
+
151
183
 
152
- // adjust browserName-s
153
184
  if (this.caps.browserName.toLowerCase() === 'ie') {
154
185
  // IE is specified as 'ie' through the command line and possibly suites
155
186
  // but selenium standalone server expects 'internet explorer'
156
187
  this.caps.browserName = 'internet explorer';
157
- } else if (this.caps['lambda:options']) {
158
- // lambdatest expects original case names
159
- } else if (this.caps['perfectoMobile:options']) {
160
- // perfectoMobile expects original case names
188
+ } else if (this.caps['lambda:options']) {// lambdatest expects original case names
189
+ } else if (this.caps['perfectoMobile:options']) {// perfectoMobile expects original case names
161
190
  } else if (this.caps.browserName !== 'MicrosoftEdge') {
162
191
  // selenium standalone server expects all browserNames to be lowercase
163
192
  // except "MicrosoftEdge"
164
193
  this.caps.browserName = this.caps.browserName.toLowerCase();
165
- }
194
+ } // adjust capabilities to enable collecting browser and performance stats in Chrome
195
+
166
196
 
167
- // adjust capabilities to enable collecting browser and performance stats in Chrome
168
197
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
169
198
  this.caps['goog:loggingPrefs'] = {
170
199
  // for ChromeDriver >= 75
@@ -184,16 +213,16 @@ class WebModule extends _WebDriverModule.default {
184
213
  }
185
214
  };
186
215
  */
187
- }
216
+ } // populate WDIO options
217
+
188
218
 
189
- // populate WDIO options
190
219
  const url = _url.default.parse(seleniumUrl || DEFAULT_SELENIUM_URL);
220
+
191
221
  const protocol = url.protocol.replace(/:$/, '');
192
222
  const host = url.hostname;
193
223
  const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
194
- const path = url.pathname;
224
+ const path = url.pathname; // auth is needed mostly for cloud providers such as LambdaTest
195
225
 
196
- // auth is needed mostly for cloud providers such as LambdaTest
197
226
  if (url.auth) {
198
227
  const auth = url.auth.split(':');
199
228
  this.options.wdioOpts = {
@@ -201,8 +230,8 @@ class WebModule extends _WebDriverModule.default {
201
230
  key: auth[1]
202
231
  };
203
232
  }
204
- const wdioOpts = {
205
- ...(this.options.wdioOpts || {}),
233
+
234
+ const wdioOpts = { ...(this.options.wdioOpts || {}),
206
235
  protocol: protocol,
207
236
  hostname: host,
208
237
  port: port,
@@ -216,45 +245,59 @@ class WebModule extends _WebDriverModule.default {
216
245
  connectionRetryCount: 1
217
246
  };
218
247
  let initError = null;
248
+
219
249
  const _this = this;
250
+
220
251
  const provider = _utils.default.determineProvider(wdioOpts);
252
+
221
253
  if (provider === _utils.default.provider.PERFECTO) {
222
254
  wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
223
255
  wdioOpts.port = 80;
224
256
  wdioOpts.protocol = 'http';
225
257
  wdioOpts.openDeviceTimeout = 15;
226
258
  }
259
+
227
260
  let name = 'name';
261
+
228
262
  if (wdioOpts.capabilities['perfectoMobile:options'] && wdioOpts.capabilities['perfectoMobile:options']['name']) {
229
263
  name = wdioOpts.capabilities['perfectoMobile:options']['name'];
230
264
  delete wdioOpts.capabilities['perfectoMobile:options'];
231
265
  }
266
+
232
267
  if (wdioOpts.capabilities['lambda:options'] && wdioOpts.capabilities['lambda:options']['name']) {
233
268
  name = wdioOpts.capabilities['lambda:options']['name'];
234
269
  delete wdioOpts.capabilities['lambda:options'];
235
270
  }
271
+
236
272
  if (wdioOpts.capabilities['testingBot:options'] && wdioOpts.capabilities['testingBot:options']['name']) {
237
273
  name = wdioOpts.capabilities['testingBot:options']['name'];
238
274
  delete wdioOpts.capabilities['testingBot:options'];
239
275
  }
276
+
240
277
  if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
241
278
  name = wdioOpts.capabilities['bstack:options']['name'];
242
279
  delete wdioOpts.capabilities['bstack:options'];
243
- }
244
- // set default browser for mobile web tests, if executed against remote devices of a cloud provider
280
+ } // set default browser for mobile web tests, if executed against remote devices of a cloud provider
281
+
282
+
245
283
  if (defaultBrowser && provider) {
246
284
  this.caps.browserName = wdioOpts.capabilities.browserName = DEFAULT_MOBILE_BROWSER;
247
285
  }
286
+
248
287
  this.wdioOpts = wdioOpts;
288
+
249
289
  try {
250
290
  this.driver = await wdio.remote(wdioOpts);
251
291
  this.driver.provider = provider;
292
+
252
293
  if (this.options.seleniumBrowserTimeout) {
253
294
  this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
254
295
  }
296
+
255
297
  if (this.options.seleniumTimeout) {
256
298
  this.driver.seleniumTimeout = this.options.seleniumTimeout;
257
299
  }
300
+
258
301
  if (provider === _utils.default.provider.PERFECTO) {
259
302
  const perfectoExecutionContext = await new _perfectoReporting.default.Perfecto.PerfectoExecutionContext({
260
303
  webdriver: {
@@ -268,9 +311,9 @@ class WebModule extends _WebDriverModule.default {
268
311
  }
269
312
  } catch (e) {
270
313
  throw _helper.default.getSeleniumInitError(e);
271
- }
314
+ } // reset browser logs if auto collect logs option is enabled
315
+
272
316
 
273
- // reset browser logs if auto collect logs option is enabled
274
317
  if (this.options.collectBrowserLogs && this.caps.browserName === 'chrome') {
275
318
  try {
276
319
  // simply call this to clear the previous logs and start the test with the clean logs
@@ -279,16 +322,15 @@ class WebModule extends _WebDriverModule.default {
279
322
  this.logger.error('Cannot retrieve browser logs.', e);
280
323
  }
281
324
  }
325
+
282
326
  try {
283
- if ([_utils.default.provider.LAMBDATEST, _utils.default.provider.BROWSERSTACK, _utils.default.provider.PERFECTO].includes(this.driver.provider)
284
- //['MicrosoftEdge', 'msedge', 'Edge', 'Internet Explorer'].includes(this.driver.capabilities.browserName)
285
- ) {
286
- // do not maximize window if the test is executed against external cloud provider infrastructure
287
- // as most of cloud providers do not support this functionality
288
- } else {
327
+ if ([_utils.default.provider.LAMBDATEST, _utils.default.provider.BROWSERSTACK, _utils.default.provider.PERFECTO].includes(this.driver.provider) //['MicrosoftEdge', 'msedge', 'Edge', 'Internet Explorer'].includes(this.driver.capabilities.browserName)
328
+ ) {// do not maximize window if the test is executed against external cloud provider infrastructure
329
+ // as most of cloud providers do not support this functionality
330
+ } else {
289
331
  // maximize browser window
290
- await this.driver.maximizeWindow();
291
- // set initial Timeout
332
+ await this.driver.maximizeWindow(); // set initial Timeout
333
+
292
334
  await this.driver.setTimeout({
293
335
  'implicit': this.waitForTimeout,
294
336
  'pageLoad': this.waitForTimeout
@@ -297,29 +339,36 @@ class WebModule extends _WebDriverModule.default {
297
339
  } catch (err) {
298
340
  throw new _OxygenError.default(_helper.default.errorCode.UNKNOWN_ERROR, err.message, _util.default.inspect(err));
299
341
  }
342
+
300
343
  super.init(this.driver);
301
344
  }
302
-
303
345
  /**
304
346
  * @function dispose
305
347
  * @summary Ends the current session.
306
348
  * @param {String=} status - Test status, either `passed` or `failed`.
307
349
  */
350
+
351
+
308
352
  async dispose(status) {
309
353
  this.transactions = {};
310
354
  this._whenWebModuleDispose = (0, _when.defer)();
355
+
311
356
  if (!status) {
312
357
  status = 'passed';
358
+
313
359
  if (this.rs.steps && Array.isArray(this.rs.steps) && this.rs.steps.length > 0) {
314
360
  const failedFinded = this.rs.steps.find(item => item.status === 'failed');
361
+
315
362
  if (failedFinded) {
316
363
  status = 'failed';
317
364
  }
318
365
  }
319
366
  }
367
+
320
368
  if (this.driver && this.isInitialized) {
321
369
  try {
322
370
  status = status.toUpperCase();
371
+
323
372
  if (this.driver.provider === _utils.default.provider.SAUCELABS) {
324
373
  const username = this.wdioOpts.capabilities['sauce:options']['username'];
325
374
  const accessKey = this.wdioOpts.capabilities['sauce:options']['accessKey'];
@@ -346,6 +395,7 @@ class WebModule extends _WebDriverModule.default {
346
395
  await this._sendResultStatusToBrowserstack(status);
347
396
  await this.deleteSession();
348
397
  }
398
+
349
399
  if (this.driver.provider === null && ['PASSED', 'FAILED'].includes(status)) {
350
400
  await this.closeBrowserWindows(status);
351
401
  } else {
@@ -358,13 +408,14 @@ class WebModule extends _WebDriverModule.default {
358
408
  } else {
359
409
  this.disposeContinue();
360
410
  }
411
+
361
412
  return this._whenWebModuleDispose.promise;
362
413
  }
414
+
363
415
  async deleteSession() {
364
416
  try {
365
417
  if (this.driver && this.driver.deleteSession) {
366
- if (this.seleniumSessionTimeout) {
367
- // ignore
418
+ if (this.seleniumSessionTimeout) {// ignore
368
419
  // deleteSession will take 5 min to call
369
420
  } else {
370
421
  await this.driver.deleteSession();
@@ -374,20 +425,22 @@ class WebModule extends _WebDriverModule.default {
374
425
  this.logger.error('deleteSession error', e);
375
426
  }
376
427
  }
428
+
377
429
  async closeBrowserWindows(status) {
378
430
  try {
379
431
  await this.deleteSession();
380
432
  } catch (e) {
381
433
  this.logger.warn('Failed to close browser windows:', e);
382
434
  }
435
+
383
436
  this.disposeContinue();
384
437
  }
438
+
385
439
  disposeContinue(status) {
386
440
  this.driver = null;
387
441
  this.lastNavigationStartTime = null;
388
- super.dispose();
442
+ super.dispose(); // cleanup chromedriver and edgedriver only when running from within the IDE and test did not fail
389
443
 
390
- // cleanup chromedriver and edgedriver only when running from within the IDE and test did not fail
391
444
  if (this.options && this.options.seleniumPid && (!status || 'FAILED' !== status.toUpperCase())) {
392
445
  try {
393
446
  if (process.platform === 'win32') {
@@ -396,8 +449,10 @@ class WebModule extends _WebDriverModule.default {
396
449
  });
397
450
  } else {
398
451
  let pgrepResult = (0, _child_process.execSync)("pgrep -d' ' chromedriver");
452
+
399
453
  if (pgrepResult && pgrepResult.toString) {
400
454
  pgrepResult = pgrepResult.toString();
455
+
401
456
  if (pgrepResult) {
402
457
  (0, _child_process.execSync)('kill -9 ' + pgrepResult, {
403
458
  stdio: ['ignore', 'ignore', 'ignore']
@@ -405,9 +460,9 @@ class WebModule extends _WebDriverModule.default {
405
460
  }
406
461
  }
407
462
  }
408
- } catch (e) {
409
- // ignore errors
463
+ } catch (e) {// ignore errors
410
464
  }
465
+
411
466
  try {
412
467
  if (process.platform === 'win32') {
413
468
  (0, _child_process.execSync)('taskkill /IM msedgedriver.exe /F', {
@@ -415,8 +470,10 @@ class WebModule extends _WebDriverModule.default {
415
470
  });
416
471
  } else {
417
472
  let pgrepResult = (0, _child_process.execSync)("pgrep -d' ' msedgedriver");
473
+
418
474
  if (pgrepResult && pgrepResult.toString) {
419
475
  pgrepResult = pgrepResult.toString();
476
+
420
477
  if (pgrepResult) {
421
478
  (0, _child_process.execSync)('kill -9 ' + pgrepResult, {
422
479
  stdio: ['ignore', 'ignore', 'ignore']
@@ -424,16 +481,18 @@ class WebModule extends _WebDriverModule.default {
424
481
  }
425
482
  }
426
483
  }
427
- } catch (e) {
428
- // ignore errors
484
+ } catch (e) {// ignore errors
429
485
  }
430
486
  }
487
+
431
488
  this._whenWebModuleDispose.resolve(null);
432
489
  }
490
+
433
491
  _iterationStart() {
434
492
  // clear transaction name saved in previous iteration if any
435
493
  global._lastTransactionName = null;
436
494
  }
495
+
437
496
  async _iterationEnd(error) {
438
497
  if (error && error.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT) {
439
498
  this.seleniumSessionTimeout = true;
@@ -441,13 +500,16 @@ class WebModule extends _WebDriverModule.default {
441
500
  } else {
442
501
  this.seleniumSessionTimeout = false;
443
502
  }
503
+
444
504
  if (!this.isInitialized) {
445
505
  return;
446
- }
447
- // collect browser logs for this session
506
+ } // collect browser logs for this session
507
+
508
+
448
509
  if (this.options.collectBrowserLogs === true && this.caps.browserName === 'chrome') {
449
510
  try {
450
511
  const logs = await this.getBrowserLogs();
512
+
451
513
  if (logs && Array.isArray(logs)) {
452
514
  for (var log of logs) {
453
515
  this.rs.logs.push(this._adjustBrowserLog(log));
@@ -457,23 +519,28 @@ class WebModule extends _WebDriverModule.default {
457
519
  // ignore errors
458
520
  this.logger.error('Cannot retrieve browser logs.', e);
459
521
  }
460
- }
461
- // TODO: should clear transactions to avoid duplicate names across iterations
522
+ } // TODO: should clear transactions to avoid duplicate names across iterations
462
523
  // also should throw on duplicate names.
524
+
525
+
463
526
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
464
527
  // there might be no transactions set if test fails before web.transaction command
465
528
  if (global._lastTransactionName) {
466
529
  this.transactions[global._lastTransactionName] = await this._getHAR();
467
530
  }
468
531
  }
532
+
469
533
  this.rs.har = this.transactions;
470
534
  }
535
+
471
536
  _isAction(name) {
472
537
  return ACTION_COMMANDS.includes(name);
473
538
  }
539
+
474
540
  _takeScreenshotSilent(name) {
475
541
  if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
476
542
  let error;
543
+
477
544
  try {
478
545
  if (this.driver && this.driver.takeScreenshot) {
479
546
  let retval;
@@ -481,37 +548,43 @@ class WebModule extends _WebDriverModule.default {
481
548
  return new Promise((resolve, reject) => {
482
549
  const waitUntilRetVal = this.driver.waitUntil(async () => {
483
550
  try {
484
- let images = [];
551
+ let images = []; // collect all (screenshot and title) images
485
552
 
486
- // collect all (screenshot and title) images
487
553
  const handles = await this.driver.getWindowHandles();
554
+
488
555
  if (handles && Array.isArray(handles) && handles.length > 0) {
489
556
  for (const handle of handles) {
490
557
  await this.driver.switchToWindow(handle);
491
558
  const image = await this.driver.takeScreenshot();
492
559
  const title = await this.driver.getTitle();
560
+
493
561
  if (title) {
494
562
  const textToImage = require('text-to-image');
563
+
495
564
  let titleImage = await textToImage.generate(title, {
496
565
  debug: false,
497
566
  fontFamily: 'Arial'
498
567
  });
568
+
499
569
  if (titleImage && typeof titleImage === 'string') {
500
570
  titleImage = titleImage.replace('data:image/png;base64,', '');
501
571
  images.push(titleImage);
502
572
  }
503
573
  }
574
+
504
575
  images.push(image);
505
576
  }
506
- }
577
+ } // merge all images into one
578
+
507
579
 
508
- // merge all images into one
509
580
  const mergedImage = await (0, _imgMerge.default)(images, {
510
581
  direction: true
511
582
  });
583
+
512
584
  if (mergedImage && typeof mergedImage === 'string') {
513
585
  retval = mergedImage.replace('data:image/jpeg;base64,', '');
514
586
  }
587
+
515
588
  return true;
516
589
  } catch (e) {
517
590
  error = e;
@@ -520,6 +593,7 @@ class WebModule extends _WebDriverModule.default {
520
593
  }, {
521
594
  timeout: 30 * 1000
522
595
  });
596
+
523
597
  if (waitUntilRetVal && waitUntilRetVal.then) {
524
598
  waitUntilRetVal.then(() => {
525
599
  resolve();
@@ -531,17 +605,20 @@ class WebModule extends _WebDriverModule.default {
531
605
  }
532
606
  });
533
607
  });
608
+
534
609
  if (error) {
535
610
  this.logger.error('Cannot get screenshot', error);
536
611
  }
612
+
537
613
  return retval;
538
614
  }
539
615
  } catch (e) {
540
616
  this.logger.error('Cannot get screenshot', e);
617
+
541
618
  if (error) {
542
619
  this.logger.error('Cannot get screenshot inner error', error);
543
- }
544
- // ignore
620
+ } // ignore
621
+
545
622
  }
546
623
  }
547
624
  }
@@ -549,8 +626,9 @@ class WebModule extends _WebDriverModule.default {
549
626
  _adjustBrowserLog(log) {
550
627
  if (!log || typeof log !== 'object') {
551
628
  return null;
552
- }
553
- // TODO: convert log.timestamp from the browser time zone to the local one (so we can later correlate between steps and logs)
629
+ } // TODO: convert log.timestamp from the browser time zone to the local one (so we can later correlate between steps and logs)
630
+
631
+
554
632
  return {
555
633
  time: log.timestamp,
556
634
  msg: log.message,
@@ -559,7 +637,6 @@ class WebModule extends _WebDriverModule.default {
559
637
  src: 'browser'
560
638
  };
561
639
  }
562
-
563
640
  /*
564
641
  * FIXME: There is a bug with IE. See the comment within function body.
565
642
  *
@@ -584,16 +661,17 @@ class WebModule extends _WebDriverModule.default {
584
661
  * 8. loadEventStart - The browser have finished loading all the resources like images, swf, etc.
585
662
  * 9. loadEventEnd - The load event callback, if any, finished executing.
586
663
  */
664
+
665
+
587
666
  _getStats(commandName) {
588
667
  if (this.options.fetchStats && this.isInitialized && this._isAction(commandName)) {
589
668
  var navigationStart;
590
669
  var domContentLoaded = 0;
591
670
  var load = 0;
592
- var samePage = false;
593
-
594
- // TODO: handle following situation:
671
+ var samePage = false; // TODO: handle following situation:
595
672
  // if navigateStart equals to the one we got from previous attempt (we need to save it)
596
673
  // it means we are still on the same page and don't need to record load/domContentLoaded times
674
+
597
675
  try {
598
676
  this.driver.call(() => {
599
677
  return new Promise((resolve, reject) => {
@@ -609,6 +687,7 @@ class WebModule extends _WebDriverModule.default {
609
687
  };
610
688
  });
611
689
  lastError = false;
690
+
612
691
  if (timings.domContentLoadedEventStart > 0 && timings.loadEventStart > 0) {
613
692
  samePage = this.lastNavigationStartTime && this.lastNavigationStartTime == timings.navigationStart;
614
693
  navigationStart = this.lastNavigationStartTime = timings.navigationStart;
@@ -627,18 +706,21 @@ class WebModule extends _WebDriverModule.default {
627
706
  }, {
628
707
  timeout: 30 * 1000
629
708
  });
709
+
630
710
  if (waitUntilRetVal && waitUntilRetVal.then) {
631
711
  waitUntilRetVal.then(() => {
632
712
  if (lastError) {
633
713
  // print error from driver.execute or driver.waitUntil
634
714
  console.log(lastError);
635
715
  }
716
+
636
717
  resolve();
637
718
  }).catch(err => {
638
719
  if (lastError) {
639
720
  // print error from driver.execute or driver.waitUntil
640
721
  console.log(lastError);
641
722
  }
723
+
642
724
  reject(err);
643
725
  });
644
726
  } else {
@@ -647,8 +729,7 @@ class WebModule extends _WebDriverModule.default {
647
729
  });
648
730
  });
649
731
  } catch (e) {
650
- return {};
651
- // couldn't get timings.
732
+ return {}; // couldn't get timings.
652
733
  }
653
734
 
654
735
  this.lastNavigationStartTime = navigationStart;
@@ -657,9 +738,9 @@ class WebModule extends _WebDriverModule.default {
657
738
  LoadEvent: load
658
739
  };
659
740
  }
741
+
660
742
  return {};
661
743
  }
662
-
663
744
  /**
664
745
  * @summary Opens new transaction.
665
746
  * @description The transaction will persist till a new one is opened. Transaction names must be
@@ -667,13 +748,17 @@ class WebModule extends _WebDriverModule.default {
667
748
  * @function transaction
668
749
  * @param {String} name - The transaction name.
669
750
  */
751
+
752
+
670
753
  async transaction(name) {
671
754
  if (global._lastTransactionName) {
672
755
  this.transactions[global._lastTransactionName] = null;
756
+
673
757
  if (this.options.recordHAR && this.isInitialized && this.caps.browserName === 'chrome') {
674
758
  this.transactions[global._lastTransactionName] = await this._getHAR();
675
759
  }
676
760
  }
761
+
677
762
  if (typeof this.transactions[name] !== 'undefined') {
678
763
  const counter = Object.keys(this.transactions).filter(item => item.startsWith(name)).length + 1;
679
764
  global._lastTransactionName = name + ' (#' + counter + ')';
@@ -681,6 +766,7 @@ class WebModule extends _WebDriverModule.default {
681
766
  global._lastTransactionName = name;
682
767
  }
683
768
  }
769
+
684
770
  _loadHelperFunctions() {
685
771
  this.helpers.getWdioLocator = _utils.default.getWdioLocator;
686
772
  this.helpers.matchPattern = _utils.default.matchPattern;
@@ -699,22 +785,27 @@ class WebModule extends _WebDriverModule.default {
699
785
  this.helpers.assertArgumentTimeout = _utils.default.assertArgumentTimeout;
700
786
  this.helpers.assertArgumentString = _utils.default.assertArgumentString;
701
787
  }
788
+
702
789
  async _getHAR() {
703
790
  try {
704
791
  const types = await this.driver.getLogTypes();
792
+
705
793
  if (types.includes('performance')) {
706
- const logs = await this.driver.getLogs('performance');
794
+ const logs = await this.driver.getLogs('performance'); // in one instance, logs was not iterable for some reason - hence the following check:
707
795
 
708
- // in one instance, logs was not iterable for some reason - hence the following check:
709
796
  if (!logs || typeof logs[Symbol.iterator] !== 'function') {
710
797
  this.logger.error('getHAR: logs not iterable: ' + JSON.stringify(logs));
711
798
  return null;
712
799
  }
800
+
713
801
  const events = [];
802
+
714
803
  for (let log of logs) {
715
804
  const msgObj = JSON.parse(log.message); // returned as string
805
+
716
806
  events.push(msgObj.message);
717
807
  }
808
+
718
809
  const har = (0, _chromeHar.harFromMessages)(events);
719
810
  return JSON.stringify(har);
720
811
  } else {
@@ -725,11 +816,13 @@ class WebModule extends _WebDriverModule.default {
725
816
  return null;
726
817
  }
727
818
  }
819
+
728
820
  async checkWaitForAngular() {
729
821
  if (this.autoWaitForAngular) {
730
822
  await this.waitForAngular(this.autoWaitForAngularRootSelector, this.autoWaitForAngularTimeout);
731
823
  }
732
824
  }
825
+
733
826
  async _sendResultStatusToLambdaTest(status) {
734
827
  return new Promise((resolve, reject) => {
735
828
  const lambdaCredentials = {
@@ -737,10 +830,13 @@ class WebModule extends _WebDriverModule.default {
737
830
  accessKey: this.wdioOpts.key
738
831
  };
739
832
  const sessionId = this.driver.sessionId;
833
+
740
834
  const lambdaAutomationClient = _nodeRestClient.default.AutomationClient(lambdaCredentials);
835
+
741
836
  const requestBody = {
742
837
  status_ind: status === 'PASSED' ? 'passed' : 'failed'
743
838
  };
839
+
744
840
  try {
745
841
  lambdaAutomationClient.updateSessionById(sessionId, requestBody, error => {
746
842
  resolve();
@@ -751,6 +847,7 @@ class WebModule extends _WebDriverModule.default {
751
847
  }
752
848
  });
753
849
  }
850
+
754
851
  async _sendResultStatusToTestingBot(status) {
755
852
  return new Promise((resolve, reject) => {
756
853
  const sessionId = this.driver.sessionId;
@@ -761,6 +858,7 @@ class WebModule extends _WebDriverModule.default {
761
858
  const testData = {
762
859
  "test[success]": status === 'PASSED' ? "1" : "0"
763
860
  };
861
+
764
862
  try {
765
863
  tb.updateTest(testData, sessionId, function (error, testDetails) {
766
864
  resolve();
@@ -771,6 +869,7 @@ class WebModule extends _WebDriverModule.default {
771
869
  }
772
870
  });
773
871
  }
872
+
774
873
  async _sendResultStatusToBrowserstack(status) {
775
874
  return new Promise((resolve, reject) => {
776
875
  const requestBody = {
@@ -788,6 +887,7 @@ class WebModule extends _WebDriverModule.default {
788
887
  'sendImmediately': false
789
888
  }
790
889
  };
890
+
791
891
  try {
792
892
  (0, _request.default)(options, (err, res, body) => {
793
893
  resolve();
@@ -798,6 +898,8 @@ class WebModule extends _WebDriverModule.default {
798
898
  }
799
899
  });
800
900
  }
901
+
801
902
  }
903
+
802
904
  exports.default = WebModule;
803
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIkRFRkFVTFRfU0VMRU5JVU1fVVJMIiwiREVGQVVMVF9CUk9XU0VSX05BTUUiLCJERUZBVUxUX01PQklMRV9CUk9XU0VSIiwiTk9fU0NSRUVOU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiV2ViTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJoZWxwZXJzIiwiX2xvYWRIZWxwZXJGdW5jdGlvbnMiLCJPeEVycm9yIiwiZXJySGVscGVyIiwid2FpdEZvclRpbWVvdXQiLCJuYW1lIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY2FwcyIsImluaXQiLCJzZWxlbml1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJjdHgiLCJkZWZhdWx0QnJvd3NlciIsImJyb3dzZXJOYW1lIiwiZXJyb3JDb2RlIiwiSU5WQUxJRF9DQVBBQklMSVRJRVMiLCJ0b0xvd2VyQ2FzZSIsInJlY29yZEhBUiIsImJyb3dzZXIiLCJwZXJmb3JtYW5jZSIsInVybCIsIlVSTCIsInBhcnNlIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicGF0aCIsInBhdGhuYW1lIiwiYXV0aCIsInNwbGl0Iiwid2Rpb09wdHMiLCJ1c2VyIiwia2V5IiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsImluaXRFcnJvciIsIl90aGlzIiwicHJvdmlkZXIiLCJtb2RVdGlscyIsImRldGVybWluZVByb3ZpZGVyIiwiUEVSRkVDVE8iLCJvcGVuRGV2aWNlVGltZW91dCIsImRyaXZlciIsIndkaW8iLCJyZW1vdGUiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwicGVyZmVjdG9FeGVjdXRpb25Db250ZXh0IiwicGVyZmVjdG9SZXBvcnRpbmciLCJQZXJmZWN0byIsIlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsIndlYmRyaXZlciIsImV4ZWN1dGVTY3JpcHQiLCJjb21tYW5kIiwicGFyYW1zIiwiZXhlY3V0ZSIsInJlcG9ydGluZ0NsaWVudCIsIlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50IiwidGVzdFN0YXJ0IiwiZSIsImdldFNlbGVuaXVtSW5pdEVycm9yIiwiY29sbGVjdEJyb3dzZXJMb2dzIiwiZ2V0QnJvd3NlckxvZ3MiLCJlcnJvciIsIkxBTUJEQVRFU1QiLCJCUk9XU0VSU1RBQ0siLCJpbmNsdWRlcyIsIm1heGltaXplV2luZG93Iiwic2V0VGltZW91dCIsImVyciIsIlVOS05PV05fRVJST1IiLCJtZXNzYWdlIiwidXRpbCIsImluc3BlY3QiLCJkaXNwb3NlIiwic3RhdHVzIiwiX3doZW5XZWJNb2R1bGVEaXNwb3NlIiwiZGVmZXIiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJTQVVDRUxBQlMiLCJ1c2VybmFtZSIsImFjY2Vzc0tleSIsInBhc3NlZCIsImlkIiwic2Vzc2lvbklkIiwiYm9keSIsIm15QWNjb3VudCIsIlNhdWNlTGFicyIsInVwZGF0ZUpvYiIsInN0b3BKb2IiLCJfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdCIsImRlbGV0ZVNlc3Npb24iLCJURVNUSU5HQk9UIiwiX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3QiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJmYWlsZWQiLCJfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrIiwiY2xvc2VCcm93c2VyV2luZG93cyIsImRpc3Bvc2VDb250aW51ZSIsIndhcm4iLCJwcm9taXNlIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsInNlbGVuaXVtUGlkIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiZXhlY1N5bmMiLCJzdGRpbyIsInBncmVwUmVzdWx0IiwidG9TdHJpbmciLCJyZXNvbHZlIiwiX2l0ZXJhdGlvblN0YXJ0IiwiZ2xvYmFsIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJfaXRlcmF0aW9uRW5kIiwidHlwZSIsImVycm9ySGVscGVyIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImxvZyIsInB1c2giLCJfYWRqdXN0QnJvd3NlckxvZyIsIl9nZXRIQVIiLCJoYXIiLCJfaXNBY3Rpb24iLCJfdGFrZVNjcmVlbnNob3RTaWxlbnQiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsImNhbGwiLCJQcm9taXNlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwiaGFuZGxlcyIsImdldFdpbmRvd0hhbmRsZXMiLCJoYW5kbGUiLCJzd2l0Y2hUb1dpbmRvdyIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwicmVxdWlyZSIsInRpdGxlSW1hZ2UiLCJnZW5lcmF0ZSIsImRlYnVnIiwiZm9udEZhbWlseSIsIm1lcmdlZEltYWdlIiwibWVyZ2VJbWFnZXMiLCJkaXJlY3Rpb24iLCJ0aW1lb3V0IiwidGhlbiIsImNhdGNoIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsImxldmVsIiwic3JjIiwiX2dldFN0YXRzIiwiY29tbWFuZE5hbWUiLCJmZXRjaFN0YXRzIiwibmF2aWdhdGlvblN0YXJ0IiwiZG9tQ29udGVudExvYWRlZCIsImxvYWQiLCJzYW1lUGFnZSIsImxhc3RFcnJvciIsInRpbWluZ3MiLCJ3aW5kb3ciLCJ0aW1pbmciLCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCIsImxvYWRFdmVudFN0YXJ0IiwiZXhlY3V0ZUVycm9yIiwiY29uc29sZSIsIkRvbUNvbnRlbnRMb2FkZWRFdmVudCIsIkxvYWRFdmVudCIsInRyYW5zYWN0aW9uIiwiY291bnRlciIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0QXJndW1lbnRTdHJpbmciLCJ0eXBlcyIsImdldExvZ1R5cGVzIiwiZ2V0TG9ncyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50cyIsIm1zZ09iaiIsImhhckZyb21NZXNzYWdlcyIsImNoZWNrV2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXIiLCJ3YWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhclJvb3RTZWxlY3RvciIsImF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQiLCJsYW1iZGFDcmVkZW50aWFscyIsImxhbWJkYUF1dG9tYXRpb25DbGllbnQiLCJsYW1iZGFSZXN0Q2xpZW50IiwiQXV0b21hdGlvbkNsaWVudCIsInJlcXVlc3RCb2R5Iiwic3RhdHVzX2luZCIsInVwZGF0ZVNlc3Npb25CeUlkIiwidGIiLCJUZXN0aW5nQm90IiwiYXBpX2tleSIsImFwaV9zZWNyZXQiLCJ0ZXN0RGF0YSIsInVwZGF0ZVRlc3QiLCJ0ZXN0RGV0YWlscyIsIm1ldGhvZCIsImpzb24iLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJyZXF1ZXN0IiwicmVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL294X21vZHVsZXMvbW9kdWxlLXdlYi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG4vKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEBuYW1lIHdlYlxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnJvd3NlciBhdXRvbWF0aW9uLlxyXG4gKiBAc2FtcGxlICoqTm90ZXM6KiogIFxyXG4gKiAgIFxyXG4gKiBDb21tYW5kcyB3aGljaCBvcGVyYXRlIG9uIGVsZW1lbnRzIHN1Y2ggYXMgY2xpY2ssIGFzc2VydCwgd2FpdEZvciwgdHlwZSwgc2VsZWN0LCBhbmQgb3RoZXJzIHdpbGwgYXV0b21hdGljYWxseSB3YWl0IGZvciBhIHBlcmlvZCBvZiB0aW1lIGZvciB0aGUgZWxlbWVudCB0byBhcHBlYXIgaW4gRE9NIGFuZCBiZWNvbWUgdmlzaWJsZS4gQnkgZGVmYXVsdCB0aGlzIHBlcmlvZCBlcXVhbHMgdG8gNjAgc2Vjb25kcywgYnV0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBgc2V0VGltZW91dGBjb21tYW5kLlxyXG4gKiAgIFxyXG4gKiAqKlN0cmluZyBtYXRjaGluZyBwYXR0ZXJuczoqKiBcclxuICogXHJcbiAqICBDb21tYW5kcyB3aGljaCBleHBlY3QgYSBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybiBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIHBhdHRlcm5zIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogICogYHJlZ2V4OlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAgKiBgcmVnZXhpOlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGBleGFjdDpTVFJJTkdgIC0gTWF0Y2ggdGhlIHN0cmluZyB2ZXJiYXRpbS5cclxuICogICogYGdsb2I6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIGdsb2IgcGF0dGVybi4gYD9gIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIgZXhjZXB0IG5ldyBsaW5lIFxcKFxcblxcKS4gYCpgIHdpbGwgbWF0Y2ggYW55IHNlcXVlbmNlIFxcKDAgb3IgbW9yZVxcKSBvZiBjaGFyYWN0ZXJzIGV4Y2VwdCBuZXcgbGluZS4gRW1wdHkgICAgIFBBVFRFUk4gd2lsbCBtYXRjaCBvbmx5IG90aGVyIGVtcHR5IHN0cmluZ3MuXHJcbiAqICAqIGBQQVRURVJOYCAtIFNhbWUgYXMgZ2xvYiBtYXRjaGluZy4gIFxyXG4gKlxyXG4gKiAqKkxvY2F0b3JzOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhbiBlbGVtZW50IGxvY2F0b3IgaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBsb2NhdG9yIHR5cGVzIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogICogYGlkPUlEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgSUQgYXR0cmlidXRlLlxyXG4gKiAgKiBgY3NzPUNTU19TRUxFQ1RPUmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXHJcbiAqICAqIGBsaW5rPVRFWFRgIC0gTG9jYXRlcyBsaW5rIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSB0ZXh0IG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogICogYGxpbmstY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogICogYG5hbWU9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIE5BTUUgYXR0cmlidXRlLlxyXG4gKiAgKiBgdGFnPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB0YWcgbmFtZS5cclxuICogICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICAqIGAoWFBBVEgpW11gIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKi9cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCc7XHJcbmltcG9ydCBTYXVjZUxhYnMgZnJvbSAnc2F1Y2VsYWJzJztcclxuaW1wb3J0IGxhbWJkYVJlc3RDbGllbnQgZnJvbSAnQGxhbWJkYXRlc3Qvbm9kZS1yZXN0LWNsaWVudCc7XHJcbmltcG9ydCBUZXN0aW5nQm90IGZyb20gJ3Rlc3Rpbmdib3QtYXBpJztcclxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ3dlYic7XHJcbmNvbnN0IERFRkFVTFRfU0VMRU5JVU1fVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWInO1xyXG5jb25zdCBERUZBVUxUX0JST1dTRVJfTkFNRSA9ICdjaHJvbWUnO1xyXG5jb25zdCBERUZBVUxUX01PQklMRV9CUk9XU0VSID0gJ2RlZmF1bHQnO1xyXG5jb25zdCBOT19TQ1JFRU5TSE9UX0NPTU1BTkRTID0gWydpbml0JywgJ2Fzc2VydEFsZXJ0J107XHJcbmNvbnN0IEFDVElPTl9DT01NQU5EUyA9IFsnb3BlbicsICdjbGljayddO1xyXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRU9VVCA9IDYwICogMTAwMDsgICAgICAgICAgICAvLyBkZWZhdWx0IDYwcyB3YWl0IHRpbWVvdXRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYk1vZHVsZSBleHRlbmRzIFdlYkRyaXZlck1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi0+aGFyIGRpY3Rpb25hcnlcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMgPSB7fTtcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG5ldyBTZWxlbml1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzZWxlbml1bVVybCAtIFJlbW90ZSBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViKS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdChjYXBzLCBzZWxlbml1bVVybCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlbml1bVVybCkge1xyXG4gICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRha2UgY2FwYWJpbGl0aWVzIGVpdGhlciBmcm9tIGluaXQgbWV0aG9kIGFyZ3VtZW50IG9yIGZyb20gY29udGV4dCBwYXJhbWV0ZXJzIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3JcclxuICAgICAgICAvLyBtZXJnZSBjYXBhYmlsaXRpZXMgZnJvbSBjb250ZXh0IGFuZCBmcm9tIGluaXQgZnVuY3Rpb24gYXJndW1lbnQsIGdpdmUgcHJlZmVyZW5jZSB0byBjb250ZXh0LXBhc3NlZCBjYXBhYmlsaXRpZXNcclxuICAgICAgICB0aGlzLmNhcHMgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5jdHguY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY3R4LmNhcHMgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmNhcHMsIC4uLmNhcHMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvcHVsYXRlIGJyb3dzZXJOYW1lIGNhcHMgZnJvbSBvcHRpb25zLiBGSVhNRTogd2h5IGlzIHRoaXMgZXZlbiBuZWVkZWQ/XHJcbiAgICAgICAgbGV0IGRlZmF1bHRCcm93c2VyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lIHx8IERFRkFVTFRfQlJPV1NFUl9OQU1FO1xyXG4gICAgICAgICAgICBkZWZhdWx0QnJvd3NlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZJWE1FOiBzaGFsbCB3ZSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYnJvd3Nlck5hbWUgaXMgbm90IHNwZWNpZmllZCwgbmVpdGhlciBpbiBjYXBzIG5vciBpbiBvcHRpb25zPyFcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLklOVkFMSURfQ0FQQUJJTElUSUVTLFxyXG4gICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBpbml0aWFsaXplIGB3ZWJgIG1vZHVsZSAtIGJyb3dzZXJOYW1lIG11c3QgYmUgc3BlY2lmaWVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRqdXN0IGJyb3dzZXJOYW1lLXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZScpIHtcclxuICAgICAgICAgICAgLy8gSUUgaXMgc3BlY2lmaWVkIGFzICdpZScgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lIGFuZCBwb3NzaWJseSBzdWl0ZXNcclxuICAgICAgICAgICAgLy8gYnV0IHNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGV4cGVjdHMgJ2ludGVybmV0IGV4cGxvcmVyJ1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSAnaW50ZXJuZXQgZXhwbG9yZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzWydsYW1iZGE6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIGxhbWJkYXRlc3QgZXhwZWN0cyBvcmlnaW5hbCBjYXNlIG5hbWVzXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICAvLyBwZXJmZWN0b01vYmlsZSBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwcy5icm93c2VyTmFtZSAhPT0gJ01pY3Jvc29mdEVkZ2UnKSB7XHJcbiAgICAgICAgICAgIC8vIHNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGV4cGVjdHMgYWxsIGJyb3dzZXJOYW1lcyB0byBiZSBsb3dlcmNhc2VcclxuICAgICAgICAgICAgLy8gZXhjZXB0IFwiTWljcm9zb2Z0RWRnZVwiXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRqdXN0IGNhcGFiaWxpdGllcyB0byBlbmFibGUgY29sbGVjdGluZyBicm93c2VyIGFuZCBwZXJmb3JtYW5jZSBzdGF0cyBpbiBDaHJvbWUgXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRIQVIgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHNbJ2dvb2c6bG9nZ2luZ1ByZWZzJ10gPSB7ICAgICAvLyBmb3IgQ2hyb21lRHJpdmVyID49IDc1XHJcbiAgICAgICAgICAgICAgICBicm93c2VyOiAnQUxMJyxcclxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlOiAnQUxMJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAvLyBzcGVjaWZ5aW5nIHRoaXMgbGVhZHMgQ2hyb21lIDc3KyB0byByZWZ1c2UgbG9hZGluZ1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMubG9nZ2luZ1ByZWZzID0geyAgICAgICAgICAgICAvLyBmb3IgQ2hyb21lRHJpdmVyIDwgNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5jaHJvbWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgcGVyZkxvZ2dpbmdQcmVmczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldHdvcms6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlUGFnZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvcHVsYXRlIFdESU8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5wYXJzZShzZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTCk7XHJcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyk7XHJcbiAgICAgICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZTtcclxuICAgICAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQodXJsLnBvcnQgfHwgKHByb3RvY29sID09PSAnaHR0cHMnID8gNDQzIDogODApKTtcclxuICAgICAgICBjb25zdCBwYXRoID0gdXJsLnBhdGhuYW1lO1xyXG5cclxuICAgICAgICAvLyBhdXRoIGlzIG5lZWRlZCBtb3N0bHkgZm9yIGNsb3VkIHByb3ZpZGVycyBzdWNoIGFzIExhbWJkYVRlc3RcclxuICAgICAgICBpZiAodXJsLmF1dGgpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0aCA9IHVybC5hdXRoLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy53ZGlvT3B0cyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXI6IGF1dGhbMF0sXHJcbiAgICAgICAgICAgICAgICBrZXk6IGF1dGhbMV1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaW5pdEVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMucGF0aCA9ICcvbmV4cGVyaWVuY2UvcGVyZmVjdG9tb2JpbGUvd2QvaHViJztcclxuICAgICAgICAgICAgd2Rpb09wdHMucG9ydCA9IDgwO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wcm90b2NvbCA9ICdodHRwJztcclxuICAgICAgICAgICAgd2Rpb09wdHMub3BlbkRldmljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lID0gJ25hbWUnO1xyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgZGVmYXVsdCBicm93c2VyIGZvciBtb2JpbGUgd2ViIHRlc3RzLCBpZiBleGVjdXRlZCBhZ2FpbnN0IHJlbW90ZSBkZXZpY2VzIG9mIGEgY2xvdWQgcHJvdmlkZXJcclxuICAgICAgICBpZiAoZGVmYXVsdEJyb3dzZXIgJiYgcHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9NT0JJTEVfQlJPV1NFUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJIZWxwZXIuZ2V0U2VsZW5pdW1Jbml0RXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXNldCBicm93c2VyIGxvZ3MgaWYgYXV0byBjb2xsZWN0IGxvZ3Mgb3B0aW9uIGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzaW1wbHkgY2FsbCB0aGlzIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBsb2dzIGFuZCBzdGFydCB0aGUgdGVzdCB3aXRoIHRoZSBjbGVhbiBsb2dzXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBbbW9kVXRpbHMucHJvdmlkZXIuTEFNQkRBVEVTVCwgbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLLCBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUT10uaW5jbHVkZXModGhpcy5kcml2ZXIucHJvdmlkZXIpXHJcbiAgICAgICAgICAgICAgICAvL1snTWljcm9zb2Z0RWRnZScsICdtc2VkZ2UnLCAnRWRnZScsICdJbnRlcm5ldCBFeHBsb3JlciddLmluY2x1ZGVzKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWF4aW1pemUgd2luZG93IGlmIHRoZSB0ZXN0IGlzIGV4ZWN1dGVkIGFnYWluc3QgZXh0ZXJuYWwgY2xvdWQgcHJvdmlkZXIgaW5mcmFzdHJ1Y3R1cmVcclxuICAgICAgICAgICAgICAgIC8vIGFzIG1vc3Qgb2YgY2xvdWQgcHJvdmlkZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gbWF4aW1pemUgYnJvd3NlciB3aW5kb3dcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLm1heGltaXplV2luZG93KCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCBUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgICdwYWdlTG9hZCc6IHRoaXMud2FpdEZvclRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlVOS05PV05fRVJST1IsIGVyci5tZXNzYWdlLCB1dGlsLmluc3BlY3QoZXJyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmluaXQodGhpcy5kcml2ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGRpc3Bvc2VcclxuICAgICAqIEBzdW1tYXJ5IEVuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gc3RhdHVzIC0gVGVzdCBzdGF0dXMsIGVpdGhlciBgcGFzc2VkYCBvciBgZmFpbGVkYC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlID0gZGVmZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcclxuICAgICAgICAgICAgc3RhdHVzID0gJ3Bhc3NlZCc7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ycy5zdGVwcyAmJiBBcnJheS5pc0FycmF5KHRoaXMucnMuc3RlcHMpICYmIHRoaXMucnMuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkRmluZGVkID0gdGhpcy5ycy5zdGVwcy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZEZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlNBVUNFTEFCUykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsndXNlcm5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NLZXkgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddWydhY2Nlc3NLZXknXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXNzZWQgPSBzdGF0dXMgPT09ICdQQVNTRUQnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBcIntcXFwicGFzc2VkXFxcIjpcIitwYXNzZWQrXCJ9XCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG15QWNjb3VudCA9IG5ldyBTYXVjZUxhYnMoeyB1c2VyOiB1c2VybmFtZSwga2V5OiBhY2Nlc3NLZXl9KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBteUFjY291bnQudXBkYXRlSm9iKHVzZXJuYW1lLCBpZCwgYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnN0b3BKb2IodXNlcm5hbWUsIGlkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkxBTUJEQVRFU1QpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUmVzdWx0U3RhdHVzVG9MYW1iZGFUZXN0KHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5URVNUSU5HQk9UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvVGVzdGluZ0JvdChzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RvcCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLnBhc3NlZCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLmZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBudWxsICYmIFsnUEFTU0VEJywnRkFJTEVEJ10uaW5jbHVkZXMoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xvc2VCcm93c2VyV2luZG93cyhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYW5jZWxlZCBvciBvdGhlciBzdGF0dXNcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdFcnJvciBkaXNwb3NpbmcgZHJpdmVyOiAnLCBlKTsgICAgLy8gaWdub3JlIGFueSBlcnJvcnMgYXQgZGlzcG9zYWwgc3RhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbldlYk1vZHVsZURpc3Bvc2UucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVTZXNzaW9uKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlU2Vzc2lvbiB3aWxsIHRha2UgNSBtaW4gdG8gY2FsbFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdkZWxldGVTZXNzaW9uIGVycm9yJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWlsZWQgdG8gY2xvc2UgYnJvd3NlciB3aW5kb3dzOicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2VDb250aW51ZShzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGNocm9tZWRyaXZlciBhbmQgZWRnZWRyaXZlciBvbmx5IHdoZW4gcnVubmluZyBmcm9tIHdpdGhpbiB0aGUgSURFIGFuZCB0ZXN0IGRpZCBub3QgZmFpbFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkICYmICghc3RhdHVzIHx8ICdGQUlMRUQnICE9PSBzdGF0dXMudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3Rhc2traWxsIC9JTSBjaHJvbWVkcml2ZXIuZXhlIC9GJywgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGdyZXBSZXN1bHQgPSBleGVjU3luYyhcInBncmVwIC1kJyAnIGNocm9tZWRyaXZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQgJiYgcGdyZXBSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGdyZXBSZXN1bHQgPSBwZ3JlcFJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdraWxsIC05ICcgKyBwZ3JlcFJlc3VsdCwgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCd0YXNra2lsbCAvSU0gbXNlZGdlZHJpdmVyLmV4ZSAvRicsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBtc2VkZ2Vkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyA9PT0gdHJ1ZSAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEJyb3dzZXJMb2cobG9nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2xlYXIgdHJhbnNhY3Rpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZSBuYW1lcyBhY3Jvc3MgaXRlcmF0aW9uc1xyXG4gICAgICAgIC8vIGFsc28gc2hvdWxkIHRocm93IG9uIGR1cGxpY2F0ZSBuYW1lcy5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG5vIHRyYW5zYWN0aW9ucyBzZXQgaWYgdGVzdCBmYWlscyBiZWZvcmUgd2ViLnRyYW5zYWN0aW9uIGNvbW1hbmRcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJzLmhhciA9IHRoaXMudHJhbnNhY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0V2luZG93SGFuZGxlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGhhbmRsZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZSBvZiBoYW5kbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRUaXRsZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCd0ZXh0LXRvLWltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUltYWdlID0gYXdhaXQgdGV4dFRvSW1hZ2UuZ2VuZXJhdGUodGl0bGUsIHsgZGVidWc6IGZhbHNlLCBmb250RmFtaWx5OiAnQXJpYWwnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGVJbWFnZSAmJiB0eXBlb2YgdGl0bGVJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSB0aXRsZUltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCh0aXRsZUltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgaW1hZ2VzIGludG8gb25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZEltYWdlID0gYXdhaXQgbWVyZ2VJbWFnZXMoaW1hZ2VzLCB7IGRpcmVjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZEltYWdlICYmIHR5cGVvZiBtZXJnZWRJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG1lcmdlZEltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCBpbm5lciBlcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9hZGp1c3RCcm93c2VyTG9nKGxvZykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgYnJvd3NlciB0aW1lIHpvbmUgdG8gdGhlIGxvY2FsIG9uZSAoc28gd2UgY2FuIGxhdGVyIGNvcnJlbGF0ZSBiZXR3ZWVuIHN0ZXBzIGFuZCBsb2dzKVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgU0VWRVJFIGxvZyBsZXZlbCB0byBFUlJPUlxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsID09PSAnU0VWRVJFJyA/ICdFUlJPUicgOiBsb2cubGV2ZWwsXHJcbiAgICAgICAgICAgIHNyYzogJ2Jyb3dzZXInXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogRklYTUU6IFRoZXJlIGlzIGEgYnVnIHdpdGggSUUuIFNlZSB0aGUgY29tbWVudCB3aXRoaW4gZnVuY3Rpb24gYm9keS5cclxuICAgICAqXHJcbiAgICAgKiAgZG9tQ29udGVudExvYWRlZCAoYWthIEZpcnN0IFZpc3VhbCBUaW1lKS0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKiAgbG9hZCAoYWthIEZ1bGwgTG9hZCBUaW1lKSAgICAgICAgICAgICAgIC0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvYWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb2Nlc3NpbmcgbW9kZWw6XHJcbiAgICAgKlxyXG4gICAgICogIDEuIG5hdmlnYXRpb25TdGFydCAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXMgcmVxdWVzdGVkIHRoZSBkb2N1bWVudC5cclxuICAgICAqICAyLiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC0gTm90IHJlbGV2YW50IHRvIHVzLiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvbmF2aWdhdGlvbi10aW1pbmcvI3Byb2Nlc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiAgMy4gZG9tTG9hZGluZyAgICAgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIHN0YXJ0cyBwYXJzaW5nIHRoZSBkb2N1bWVudC5cclxuICAgICAqICA0LiBkb21JbnRlcmFjdGl2ZSAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGRvY3VtZW50IGFuZCB0aGUgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZS5cclxuICAgICAqICA1LiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCAgIC0gVGhlIGRvY3VtZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgbG9hZGVkIGFuZCBwYXJzZWQgYW5kIGRlZmVycmVkIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC4gXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZXhlY3V0ZWQuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXRzWzFdLCBpbWFnZXMsIGFuZCBzdWJmcmFtZXMgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZmluaXNoZWQgbG9hZGluZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0gLSBTdHlsZXNoZWV0cyAvdXN1YWxseS8gZGVmZXIgdGhpcyBldmVudCEgLSBodHRwOi8vbW9saWx5LmRlL3dlYmxvZy9kb21jb250ZW50bG9hZGVkXHJcbiAgICAgKiAgNi4gZG9tQ29udGVudExvYWRlZEV2ZW50RW5kICAgICAtIFRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGNhbGxiYWNrLCBpZiBhbnksIGZpbmlzaGVkIGV4ZWN1dGluZy4gRS5nLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRE9NIGZ1bGx5IGxvYWRlZCBhbmQgcGFyc2VkXCIpO1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICogIDcuIGRvbUNvbXBsZXRlICAgICAgICAgICAgICAgICAgLSBUaGUgRE9NIHRyZWUgaXMgY29tcGxldGVseSBidWlsdC4gQXN5bmMgc2NyaXB0cywgaWYgYW55LCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogIDguIGxvYWRFdmVudFN0YXJ0ICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYWxsIHRoZSByZXNvdXJjZXMgbGlrZSBpbWFnZXMsIHN3ZiwgZXRjLlxyXG4gICAgICogIDkuIGxvYWRFdmVudEVuZCAgICAgICAgICAgICAgICAgLSBUaGUgbG9hZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuXHJcbiAgICAgKi9cclxuICAgIF9nZXRTdGF0cyhjb21tYW5kTmFtZSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmV0Y2hTdGF0cyAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5faXNBY3Rpb24oY29tbWFuZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHZhciBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkID0gMDtcclxuICAgICAgICAgICAgdmFyIGxvYWQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgc2FtZVBhZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmb2xsb3dpbmcgc2l0dWF0aW9uOlxyXG4gICAgICAgICAgICAvLyBpZiBuYXZpZ2F0ZVN0YXJ0IGVxdWFscyB0byB0aGUgb25lIHdlIGdvdCBmcm9tIHByZXZpb3VzIGF0dGVtcHQgKHdlIG5lZWQgdG8gc2F2ZSBpdClcclxuICAgICAgICAgICAgLy8gaXQgbWVhbnMgd2UgYXJlIHN0aWxsIG9uIHRoZSBzYW1lIHBhZ2UgYW5kIGRvbid0IG5lZWQgdG8gcmVjb3JkIGxvYWQvZG9tQ29udGVudExvYWRlZCB0aW1lc1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2xvYmFsIHdpbmRvdyovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWluZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEV2ZW50U3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubG9hZEV2ZW50U3RhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIHRpbWluZ3MubG9hZEV2ZW50U3RhcnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVQYWdlID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSAmJiB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID09IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uU3RhcnQgPSB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gdGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA9IHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkRXZlbnRTdGFydCA9IHRpbWluZ3MubG9hZEV2ZW50U3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkID0gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgPSBsb2FkRXZlbnRTdGFydCAtIG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA+IDAgJiYgbG9hZEV2ZW50U3RhcnQgPiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGVjdXRlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGVycm9yIGluc2lkZSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXhlY3V0ZUVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBlcnJvciBmcm9tIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGFzdEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgICAgICAgICAvLyBjb3VsZG4ndCBnZXQgdGltaW5ncy5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzYW1lUGFnZSA/IHt9IDogeyBEb21Db250ZW50TG9hZGVkRXZlbnQ6IGRvbUNvbnRlbnRMb2FkZWQsIExvYWRFdmVudDogbG9hZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2FjdGlvbnNbbmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBPYmplY3Qua2V5cyh0aGlzLnRyYW5zYWN0aW9ucykuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN0YXJ0c1dpdGgobmFtZSkpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWUrJyAoIycrY291bnRlcisnKSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gbW9kVXRpbHMuZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEhBUigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ1R5cGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ3BlcmZvcm1hbmNlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dzKCdwZXJmb3JtYW5jZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBpbnN0YW5jZSwgbG9ncyB3YXMgbm90IGl0ZXJhYmxlIGZvciBzb21lIHJlYXNvbiAtIGhlbmNlIHRoZSBmb2xsb3dpbmcgY2hlY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvZ3MgfHwgdHlwZW9mIGxvZ3NbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdnZXRIQVI6IGxvZ3Mgbm90IGl0ZXJhYmxlOiAnICsgSlNPTi5zdHJpbmdpZnkobG9ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dPYmogPSBKU09OLnBhcnNlKGxvZy5tZXNzYWdlKTsgICAvLyByZXR1cm5lZCBhcyBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChtc2dPYmoubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKGV2ZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaGFyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGZldGNoIEhBUjogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja1dhaXRGb3JBbmd1bGFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JBbmd1bGFyKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yLCB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFDcmVkZW50aWFscyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgY29uc3QgbGFtYmRhQXV0b21hdGlvbkNsaWVudCA9IGxhbWJkYVJlc3RDbGllbnQuQXV0b21hdGlvbkNsaWVudChcclxuICAgICAgICAgICAgICAgIGxhbWJkYUNyZWRlbnRpYWxzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzX2luZDogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxhbWJkYUF1dG9tYXRpb25DbGllbnQudXBkYXRlU2Vzc2lvbkJ5SWQoc2Vzc2lvbklkLCByZXF1ZXN0Qm9keSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIExhbWJkYVRlc3Q6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YiA9IG5ldyBUZXN0aW5nQm90KHtcclxuICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFwaV9zZWNyZXQ6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RGF0YSA9IHsgXCJ0ZXN0W3N1Y2Nlc3NdXCIgOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gXCIxXCIgOiBcIjBcIiB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGIudXBkYXRlVGVzdCh0ZXN0RGF0YSwgc2Vzc2lvbklkLCBmdW5jdGlvbihlcnJvciwgdGVzdERldGFpbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gVGVzdGluZ0JvdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMua2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBCcm93c2Vyc3RhY2s6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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
905
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiREVGQVVMVF9NT0JJTEVfQlJPV1NFUiIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIldlYk1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwiaGVscGVycyIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0Iiwic2VsZW5pdW1VcmwiLCJpc0luaXRpYWxpemVkIiwiY3R4IiwiZGVmYXVsdEJyb3dzZXIiLCJicm93c2VyTmFtZSIsImVycm9yQ29kZSIsIklOVkFMSURfQ0FQQUJJTElUSUVTIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJpbml0RXJyb3IiLCJfdGhpcyIsInByb3ZpZGVyIiwibW9kVXRpbHMiLCJkZXRlcm1pbmVQcm92aWRlciIsIlBFUkZFQ1RPIiwib3BlbkRldmljZVRpbWVvdXQiLCJkcml2ZXIiLCJ3ZGlvIiwicmVtb3RlIiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInNlbGVuaXVtVGltZW91dCIsInBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsInBlcmZlY3RvUmVwb3J0aW5nIiwiUGVyZmVjdG8iLCJQZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJ3ZWJkcml2ZXIiLCJleGVjdXRlU2NyaXB0IiwiY29tbWFuZCIsInBhcmFtcyIsImV4ZWN1dGUiLCJyZXBvcnRpbmdDbGllbnQiLCJQZXJmZWN0b1JlcG9ydGluZ0NsaWVudCIsInRlc3RTdGFydCIsImUiLCJnZXRTZWxlbml1bUluaXRFcnJvciIsImNvbGxlY3RCcm93c2VyTG9ncyIsImdldEJyb3dzZXJMb2dzIiwiZXJyb3IiLCJMQU1CREFURVNUIiwiQlJPV1NFUlNUQUNLIiwiaW5jbHVkZXMiLCJtYXhpbWl6ZVdpbmRvdyIsInNldFRpbWVvdXQiLCJlcnIiLCJVTktOT1dOX0VSUk9SIiwibWVzc2FnZSIsInV0aWwiLCJpbnNwZWN0IiwiZGlzcG9zZSIsInN0YXR1cyIsIl93aGVuV2ViTW9kdWxlRGlzcG9zZSIsInN0ZXBzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZmFpbGVkRmluZGVkIiwiZmluZCIsIml0ZW0iLCJ0b1VwcGVyQ2FzZSIsIlNBVUNFTEFCUyIsInVzZXJuYW1lIiwiYWNjZXNzS2V5IiwicGFzc2VkIiwiaWQiLCJzZXNzaW9uSWQiLCJib2R5IiwibXlBY2NvdW50IiwiU2F1Y2VMYWJzIiwidXBkYXRlSm9iIiwic3RvcEpvYiIsIl9zZW5kUmVzdWx0U3RhdHVzVG9MYW1iZGFUZXN0IiwiZGVsZXRlU2Vzc2lvbiIsIlRFU1RJTkdCT1QiLCJfc2VuZFJlc3VsdFN0YXR1c1RvVGVzdGluZ0JvdCIsInRlc3RTdG9wIiwiQ29uc3RhbnRzIiwicmVzdWx0cyIsImZhaWxlZCIsIl9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2siLCJjbG9zZUJyb3dzZXJXaW5kb3dzIiwiZGlzcG9zZUNvbnRpbnVlIiwid2FybiIsInByb21pc2UiLCJzZWxlbml1bVNlc3Npb25UaW1lb3V0Iiwic2VsZW5pdW1QaWQiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJzdGRpbyIsInBncmVwUmVzdWx0IiwidG9TdHJpbmciLCJyZXNvbHZlIiwiX2l0ZXJhdGlvblN0YXJ0IiwiZ2xvYmFsIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJfaXRlcmF0aW9uRW5kIiwidHlwZSIsImVycm9ySGVscGVyIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImxvZyIsInB1c2giLCJfYWRqdXN0QnJvd3NlckxvZyIsIl9nZXRIQVIiLCJoYXIiLCJfaXNBY3Rpb24iLCJfdGFrZVNjcmVlbnNob3RTaWxlbnQiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsImNhbGwiLCJQcm9taXNlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwiaGFuZGxlcyIsImdldFdpbmRvd0hhbmRsZXMiLCJoYW5kbGUiLCJzd2l0Y2hUb1dpbmRvdyIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwicmVxdWlyZSIsInRpdGxlSW1hZ2UiLCJnZW5lcmF0ZSIsImRlYnVnIiwiZm9udEZhbWlseSIsIm1lcmdlZEltYWdlIiwiZGlyZWN0aW9uIiwidGltZW91dCIsInRoZW4iLCJjYXRjaCIsInRpbWUiLCJ0aW1lc3RhbXAiLCJtc2ciLCJsZXZlbCIsInNyYyIsIl9nZXRTdGF0cyIsImNvbW1hbmROYW1lIiwiZmV0Y2hTdGF0cyIsIm5hdmlnYXRpb25TdGFydCIsImRvbUNvbnRlbnRMb2FkZWQiLCJsb2FkIiwic2FtZVBhZ2UiLCJsYXN0RXJyb3IiLCJ0aW1pbmdzIiwid2luZG93IiwidGltaW5nIiwiZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQiLCJsb2FkRXZlbnRTdGFydCIsImV4ZWN1dGVFcnJvciIsImNvbnNvbGUiLCJEb21Db250ZW50TG9hZGVkRXZlbnQiLCJMb2FkRXZlbnQiLCJ0cmFuc2FjdGlvbiIsImNvdW50ZXIiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwidHlwZXMiLCJnZXRMb2dUeXBlcyIsImdldExvZ3MiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudHMiLCJtc2dPYmoiLCJjaGVja1dhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyIiwid2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0IiwibGFtYmRhQ3JlZGVudGlhbHMiLCJsYW1iZGFBdXRvbWF0aW9uQ2xpZW50IiwibGFtYmRhUmVzdENsaWVudCIsIkF1dG9tYXRpb25DbGllbnQiLCJyZXF1ZXN0Qm9keSIsInN0YXR1c19pbmQiLCJ1cGRhdGVTZXNzaW9uQnlJZCIsInRiIiwiVGVzdGluZ0JvdCIsImFwaV9rZXkiLCJhcGlfc2VjcmV0IiwidGVzdERhdGEiLCJ1cGRhdGVUZXN0IiwidGVzdERldGFpbHMiLCJtZXRob2QiLCJq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QUF0QixHQUFpQztBQUR6QixPQUFwQjtBQUlBLFlBQU0zRixPQUFPLEdBQUc7QUFDWjZCLFFBQUFBLEdBQUcsRUFBRyxrREFBaUQsS0FBSzZCLE1BQUwsQ0FBWWdELFNBQVUsT0FEakU7QUFFWjRJLFFBQUFBLE1BQU0sRUFBRSxLQUZJO0FBR1pDLFFBQUFBLElBQUksRUFBRSxJQUhNO0FBSVpDLFFBQUFBLGtCQUFrQixFQUFFLEtBSlI7QUFLWjdJLFFBQUFBLElBQUksRUFBRWlJLFdBTE07QUFNWixnQkFBUTtBQUNKLGtCQUFRLEtBQUtsTSxRQUFMLENBQWNDLElBRGxCO0FBRUosa0JBQVEsS0FBS0QsUUFBTCxDQUFjRSxHQUZsQjtBQUdKLDZCQUFtQjtBQUhmO0FBTkksT0FBaEI7O0FBYUEsVUFBSTtBQUNBLDhCQUFRNUMsT0FBUixFQUFpQixDQUFDcUYsR0FBRCxFQUFNb0ssR0FBTixFQUFXOUksSUFBWCxLQUFvQjtBQUNqQ3lCLFVBQUFBLE9BQU87QUFDVixTQUZEO0FBR0gsT0FKRCxDQUlFLE9BQU96RCxDQUFQLEVBQVU7QUFDUixhQUFLeEUsTUFBTCxDQUFZNEUsS0FBWixDQUFrQixtREFBbURKLENBQUMsQ0FBQ3dELFFBQUYsRUFBckU7QUFDQUMsUUFBQUEsT0FBTztBQUNWO0FBQ0osS0ExQk0sQ0FBUDtBQTJCSDs7QUF6dkJrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgd2ViXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBicm93c2VyIGF1dG9tYXRpb24uXHJcbiAqIEBzYW1wbGUgKipOb3RlczoqKiAgXHJcbiAqICAgXHJcbiAqIENvbW1hbmRzIHdoaWNoIG9wZXJhdGUgb24gZWxlbWVudHMgc3VjaCBhcyBjbGljaywgYXNzZXJ0LCB3YWl0Rm9yLCB0eXBlLCBzZWxlY3QsIGFuZCBvdGhlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHdhaXQgZm9yIGEgcGVyaW9kIG9mIHRpbWUgZm9yIHRoZSBlbGVtZW50IHRvIGFwcGVhciBpbiBET00gYW5kIGJlY29tZSB2aXNpYmxlLiBCeSBkZWZhdWx0IHRoaXMgcGVyaW9kIGVxdWFscyB0byA2MCBzZWNvbmRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIGBzZXRUaW1lb3V0YGNvbW1hbmQuXHJcbiAqICAgXHJcbiAqICoqU3RyaW5nIG1hdGNoaW5nIHBhdHRlcm5zOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhIHN0cmluZyBtYXRjaGluZyBwYXR0ZXJuIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgcGF0dGVybnMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGByZWdleGk6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYGV4YWN0OlNUUklOR2AgLSBNYXRjaCB0aGUgc3RyaW5nIHZlcmJhdGltLlxyXG4gKiAgKiBgZ2xvYjpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgZ2xvYiBwYXR0ZXJuLiBgP2Agd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgbmV3IGxpbmUgXFwoXFxuXFwpLiBgKmAgd2lsbCBtYXRjaCBhbnkgc2VxdWVuY2UgXFwoMCBvciBtb3JlXFwpIG9mIGNoYXJhY3RlcnMgZXhjZXB0IG5ldyBsaW5lLiBFbXB0eSAgICAgUEFUVEVSTiB3aWxsIG1hdGNoIG9ubHkgb3RoZXIgZW1wdHkgc3RyaW5ncy5cclxuICogICogYFBBVFRFUk5gIC0gU2FtZSBhcyBnbG9iIG1hdGNoaW5nLiAgXHJcbiAqXHJcbiAqICoqTG9jYXRvcnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGFuIGVsZW1lbnQgbG9jYXRvciBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIGxvY2F0b3IgdHlwZXMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBJRCBhdHRyaWJ1dGUuXHJcbiAqICAqIGBjc3M9Q1NTX1NFTEVDVE9SYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3Rvci5cclxuICogICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbGluay1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgTkFNRSBhdHRyaWJ1dGUuXHJcbiAqICAqIGB0YWc9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHRhZyBuYW1lLlxyXG4gKiAgKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogICogYChYUEFUSClbXWAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgcXVvdGVzICovXHJcbmltcG9ydCB7IGhhckZyb21NZXNzYWdlcyB9IGZyb20gJ2Nocm9tZS1oYXInO1xyXG5pbXBvcnQgVVJMIGZyb20gJ3VybCc7XHJcbmltcG9ydCAqIGFzIHdkaW8gZnJvbSAnd2ViZHJpdmVyaW8nO1xyXG5pbXBvcnQgV2ViRHJpdmVyTW9kdWxlIGZyb20gJy4uL2NvcmUvV2ViRHJpdmVyTW9kdWxlJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcclxuaW1wb3J0IFNhdWNlTGFicyBmcm9tICdzYXVjZWxhYnMnO1xyXG5pbXBvcnQgbGFtYmRhUmVzdENsaWVudCBmcm9tICdAbGFtYmRhdGVzdC9ub2RlLXJlc3QtY2xpZW50JztcclxuaW1wb3J0IFRlc3RpbmdCb3QgZnJvbSAndGVzdGluZ2JvdC1hcGknO1xyXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgcGVyZmVjdG9SZXBvcnRpbmcgZnJvbSAncGVyZmVjdG8tcmVwb3J0aW5nJztcclxuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCc7XHJcbmltcG9ydCBtZXJnZUltYWdlcyBmcm9tICcuLi9saWIvaW1nLW1lcmdlJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnd2ViJztcclxuY29uc3QgREVGQVVMVF9TRUxFTklVTV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo0NDQ0L3dkL2h1Yic7XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9OQU1FID0gJ2Nocm9tZSc7XHJcbmNvbnN0IERFRkFVTFRfTU9CSUxFX0JST1dTRVIgPSAnZGVmYXVsdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywgJ2NsaWNrJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307ICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLT5oYXIgZGljdGlvbmFyeVxyXG4gICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXREcml2ZXJcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgV0RJTyBkcml2ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFdESU8gZHJpdmVyLlxyXG4gICAgICovXHJcbiAgICBnZXREcml2ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldERyaXZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldENhcGFiaWxpdGllc1xyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBjdXJyZW50bHkgZGVmaW5lZCBjYXBhYmlsaXRpZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcHMgfHwgc3VwZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgbmV3IFNlbGVuaXVtIHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNhcHMgLSBEZXNpcmVkIGNhcGFiaWxpdGllcy4gSWYgbm90IHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgd2lsbCBiZSB0YWtlbiBmcm9tIHN1aXRlIGRlZmluaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHNlbGVuaXVtVXJsIC0gUmVtb3RlIHNlcnZlciBVUkwgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWIpLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KGNhcHMsIHNlbGVuaXVtVXJsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVuaXVtVXJsKSB7XHJcbiAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGFrZSBjYXBhYmlsaXRpZXMgZWl0aGVyIGZyb20gaW5pdCBtZXRob2QgYXJndW1lbnQgb3IgZnJvbSBjb250ZXh0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgYnJvd3Nlck5hbWUgY2FwcyBmcm9tIG9wdGlvbnMuIEZJWE1FOiB3aHkgaXMgdGhpcyBldmVuIG5lZWRlZD9cclxuICAgICAgICBsZXQgZGVmYXVsdEJyb3dzZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgfHwgREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgICAgIGRlZmF1bHRCcm93c2VyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRklYTUU6IHNoYWxsIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBicm93c2VyTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBuZWl0aGVyIGluIGNhcHMgbm9yIGluIG9wdGlvbnM/IVxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSU5WQUxJRF9DQVBBQklMSVRJRVMsXHJcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGluaXRpYWxpemUgYHdlYmAgbW9kdWxlIC0gYnJvd3Nlck5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgYnJvd3Nlck5hbWUtc1xyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2llJykge1xyXG4gICAgICAgICAgICAvLyBJRSBpcyBzcGVjaWZpZWQgYXMgJ2llJyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUgYW5kIHBvc3NpYmx5IHN1aXRlc1xyXG4gICAgICAgICAgICAvLyBidXQgc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyAnaW50ZXJuZXQgZXhwbG9yZXInXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9ICdpbnRlcm5ldCBleHBsb3Jlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ2xhbWJkYTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gbGFtYmRhdGVzdCBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIHBlcmZlY3RvTW9iaWxlIGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICE9PSAnTWljcm9zb2Z0RWRnZScpIHtcclxuICAgICAgICAgICAgLy8gc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyBhbGwgYnJvd3Nlck5hbWVzIHRvIGJlIGxvd2VyY2FzZVxyXG4gICAgICAgICAgICAvLyBleGNlcHQgXCJNaWNyb3NvZnRFZGdlXCJcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIC8vIHNwZWNpZnlpbmcgdGhpcyBsZWFkcyBDaHJvbWUgNzcrIHRvIHJlZnVzZSBsb2FkaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5sb2dnaW5nUHJlZnMgPSB7ICAgICAgICAgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPCA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmNocm9tZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBwZXJmTG9nZ2luZ1ByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV0d29yazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVQYWdlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgV0RJTyBvcHRpb25zXHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLnBhcnNlKHNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucy53ZGlvT3B0cyB8fCB7fSxcclxuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxyXG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdCxcclxuICAgICAgICAgICAgcG9ydDogcG9ydCxcclxuICAgICAgICAgICAgcGF0aDogcGF0aCxcclxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB0aGlzLmNhcHMsXHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcclxuICAgICAgICAgICAgcnVubmVyOiAncmVwbCcsXHJcbiAgICAgICAgICAgIHdhaXRmb3JUaW1lb3V0OiA1MDAwLCAvLyBpbmNyZWFzZSB0aGUgZGVmYXVsdCAzMDAwXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IDMxMCoxMDAwLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogMVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBpbml0RXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IG1vZFV0aWxzLmRldGVybWluZVByb3ZpZGVyKHdkaW9PcHRzKTtcclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wYXRoID0gJy9uZXhwZXJpZW5jZS9wZXJmZWN0b21vYmlsZS93ZC9odWInO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wb3J0ID0gODA7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnByb3RvY29sID0gJ2h0dHAnO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5vcGVuRGV2aWNlVGltZW91dCA9IDE1O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNldCBkZWZhdWx0IGJyb3dzZXIgZm9yIG1vYmlsZSB3ZWIgdGVzdHMsIGlmIGV4ZWN1dGVkIGFnYWluc3QgcmVtb3RlIGRldmljZXMgb2YgYSBjbG91ZCBwcm92aWRlclxyXG4gICAgICAgIGlmIChkZWZhdWx0QnJvd3NlciAmJiBwcm92aWRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBERUZBVUxUX01PQklMRV9CUk9XU0VSO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndkaW9PcHRzID0gd2Rpb09wdHM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBhd2FpdCB3ZGlvLnJlbW90ZSh3ZGlvT3B0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIHdlYmRyaXZlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU2NyaXB0OiBhc3luYyAoY29tbWFuZCwgcGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShjb21tYW5kLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGluZ0NsaWVudCA9IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b1JlcG9ydGluZ0NsaWVudChwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0YXJ0KG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVyckhlbHBlci5nZXRTZWxlbml1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGJyb3dzZXIgbG9ncyBpZiBhdXRvIGNvbGxlY3QgbG9ncyBvcHRpb24gaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHNpbXBseSBjYWxsIHRoaXMgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGxvZ3MgYW5kIHN0YXJ0IHRoZSB0ZXN0IHdpdGggdGhlIGNsZWFuIGxvZ3NcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIFttb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNULCBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0ssIG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5wcm92aWRlcilcclxuICAgICAgICAgICAgICAgIC8vWydNaWNyb3NvZnRFZGdlJywgJ21zZWRnZScsICdFZGdlJywgJ0ludGVybmV0IEV4cGxvcmVyJ10uaW5jbHVkZXModGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtYXhpbWl6ZSB3aW5kb3cgaWYgdGhlIHRlc3QgaXMgZXhlY3V0ZWQgYWdhaW5zdCBleHRlcm5hbCBjbG91ZCBwcm92aWRlciBpbmZyYXN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgLy8gYXMgbW9zdCBvZiBjbG91ZCBwcm92aWRlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYXhpbWl6ZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIubWF4aW1pemVXaW5kb3coKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIFRpbWVvdXRcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCc6IHRoaXMud2FpdEZvclRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3BhZ2VMb2FkJzogdGhpcy53YWl0Rm9yVGltZW91dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVU5LTk9XTl9FUlJPUiwgZXJyLm1lc3NhZ2UsIHV0aWwuaW5zcGVjdChlcnIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzdGF0dXMgLSBUZXN0IHN0YXR1cywgZWl0aGVyIGBwYXNzZWRgIG9yIGBmYWlsZWRgLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fd2hlbldlYk1vZHVsZURpc3Bvc2UgPSBkZWZlcigpO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSAncGFzc2VkJztcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJzLnN0ZXBzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ycy5zdGVwcykgJiYgdGhpcy5ycy5zdGVwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRGaW5kZWQgPSB0aGlzLnJzLnN0ZXBzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uc3RhdHVzID09PSAnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuU0FVQ0VMQUJTKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddWyd1c2VybmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc0tleSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ2FjY2Vzc0tleSddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZCA9IHN0YXR1cyA9PT0gJ1BBU1NFRCc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IFwie1xcXCJwYXNzZWRcXFwiOlwiK3Bhc3NlZCtcIn1cIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXlBY2NvdW50ID0gbmV3IFNhdWNlTGFicyh7IHVzZXI6IHVzZXJuYW1lLCBrZXk6IGFjY2Vzc0tleX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC51cGRhdGVKb2IodXNlcm5hbWUsIGlkLCBib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBteUFjY291bnQuc3RvcEpvYih1c2VybmFtZSwgaWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuTEFNQkRBVEVTVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0xhbWJkYVRlc3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlRFU1RJTkdCT1QpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUmVzdWx0U3RhdHVzVG9UZXN0aW5nQm90KHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdG9wKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMucGFzc2VkIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMuZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2soc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG51bGwgJiYgWydQQVNTRUQnLCdGQUlMRUQnXS5pbmNsdWRlcyhzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGVkIG9yIG90aGVyIHN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Vycm9yIGRpc3Bvc2luZyBkcml2ZXI6ICcsIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZVNlc3Npb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIHdpbGwgdGFrZSA1IG1pbiB0byBjYWxsXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlc3Npb24gZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyV2luZG93cyhzdGF0dXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBjbG9zZSBicm93c2VyIHdpbmRvd3M6JywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZUNvbnRpbnVlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFudXAgY2hyb21lZHJpdmVyIGFuZCBlZGdlZHJpdmVyIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gd2l0aGluIHRoZSBJREUgYW5kIHRlc3QgZGlkIG5vdCBmYWlsXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQgJiYgKCFzdGF0dXMgfHwgJ0ZBSUxFRCcgIT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjU3luYygndGFza2tpbGwgL0lNIGNocm9tZWRyaXZlci5leGUgL0YnLCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZ3JlcFJlc3VsdCA9IGV4ZWNTeW5jKFwicGdyZXAgLWQnICcgY2hyb21lZHJpdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCAmJiBwZ3JlcFJlc3VsdC50b1N0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZ3JlcFJlc3VsdCA9IHBncmVwUmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2tpbGwgLTkgJyArIHBncmVwUmVzdWx0LCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3Rhc2traWxsIC9JTSBtc2VkZ2Vkcml2ZXIuZXhlIC9GJywgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGdyZXBSZXN1bHQgPSBleGVjU3luYyhcInBncmVwIC1kJyAnIG1zZWRnZWRyaXZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQgJiYgcGdyZXBSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGdyZXBSZXN1bHQgPSBwZ3JlcFJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdraWxsIC05ICcgKyBwZ3JlcFJlc3VsdCwgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2l0ZXJhdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHRyYW5zYWN0aW9uIG5hbWUgc2F2ZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIGFueVxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2l0ZXJhdGlvbkVuZChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29sbGVjdCBicm93c2VyIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzID09PSB0cnVlICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QnJvd3NlckxvZyhsb2cpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IHNob3VsZCBjbGVhciB0cmFuc2FjdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlIG5hbWVzIGFjcm9zcyBpdGVyYXRpb25zXHJcbiAgICAgICAgLy8gYWxzbyBzaG91bGQgdGhyb3cgb24gZHVwbGljYXRlIG5hbWVzLlxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgbm8gdHJhbnNhY3Rpb25zIHNldCBpZiB0ZXN0IGZhaWxzIGJlZm9yZSB3ZWIudHJhbnNhY3Rpb24gY29tbWFuZFxyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucnMuaGFyID0gdGhpcy50cmFuc2FjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgX2lzQWN0aW9uKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gQUNUSU9OX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIF90YWtlU2NyZWVuc2hvdFNpbGVudChuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFOT19TQ1JFRU5TSE9UX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlciAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90XHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhbGwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmV0VmFsID0gdGhpcy5kcml2ZXIud2FpdFVudGlsKGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIChzY3JlZW5zaG90IGFuZCB0aXRsZSkgaW1hZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRXaW5kb3dIYW5kbGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaGFuZGxlcykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGhhbmRsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zd2l0Y2hUb1dpbmRvdyhoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy5kcml2ZXIudGFrZVNjcmVlbnNob3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFRpdGxlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0VG9JbWFnZSA9IHJlcXVpcmUoJ3RleHQtdG8taW1hZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlSW1hZ2UgPSBhd2FpdCB0ZXh0VG9JbWFnZS5nZW5lcmF0ZSh0aXRsZSwgeyBkZWJ1ZzogZmFsc2UsIGZvbnRGYW1pbHk6ICdBcmlhbCcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZUltYWdlICYmIHR5cGVvZiB0aXRsZUltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJbWFnZSA9IHRpdGxlSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKHRpdGxlSW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkSW1hZ2UgJiYgdHlwZW9mIG1lcmdlZEltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90IGlubmVyIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2FkanVzdEJyb3dzZXJMb2cobG9nKSB7XHJcbiAgICAgICAgaWYgKCFsb2cgfHwgdHlwZW9mIGxvZyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IGNvbnZlcnQgbG9nLnRpbWVzdGFtcCBmcm9tIHRoZSBicm93c2VyIHRpbWUgem9uZSB0byB0aGUgbG9jYWwgb25lIChzbyB3ZSBjYW4gbGF0ZXIgY29ycmVsYXRlIGJldHdlZW4gc3RlcHMgYW5kIGxvZ3MpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGltZTogbG9nLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgbXNnOiBsb2cubWVzc2FnZSxcclxuICAgICAgICAgICAgLy8gY29udmVydCBTRVZFUkUgbG9nIGxldmVsIHRvIEVSUk9SXHJcbiAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwgPT09ICdTRVZFUkUnID8gJ0VSUk9SJyA6IGxvZy5sZXZlbCxcclxuICAgICAgICAgICAgc3JjOiAnYnJvd3NlcidcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBGSVhNRTogVGhlcmUgaXMgYSBidWcgd2l0aCBJRS4gU2VlIHRoZSBjb21tZW50IHdpdGhpbiBmdW5jdGlvbiBib2R5LlxyXG4gICAgICpcclxuICAgICAqICBkb21Db250ZW50TG9hZGVkIChha2EgRmlyc3QgVmlzdWFsIFRpbWUpLSBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgYW5kIG5hdmlnYXRpb25TdGFydC5cclxuICAgICAqICBsb2FkIChha2EgRnVsbCBMb2FkIFRpbWUpICAgICAgICAgICAgICAgLSBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbG9hZEV2ZW50U3RhcnQgYW5kIG5hdmlnYXRpb25TdGFydC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBtb2RlbDpcclxuICAgICAqXHJcbiAgICAgKiAgMS4gbmF2aWdhdGlvblN0YXJ0ICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhcyByZXF1ZXN0ZWQgdGhlIGRvY3VtZW50LlxyXG4gICAgICogIDIuIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBOb3QgcmVsZXZhbnQgdG8gdXMuIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy8jcHJvY2VzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqICAzLiBkb21Mb2FkaW5nICAgICAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgc3RhcnRzIHBhcnNpbmcgdGhlIGRvY3VtZW50LlxyXG4gICAgICogIDQuIGRvbUludGVyYWN0aXZlICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgZG9jdW1lbnQgYW5kIHRoZSB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBwYWdlLlxyXG4gICAgICogIDUuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ICAgLSBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY29tcGxldGVseSBsb2FkZWQgYW5kIHBhcnNlZCBhbmQgZGVmZXJyZWQgc2NyaXB0cywgaWYgYW55LCBoYXZlIGV4ZWN1dGVkLiBcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmMgc2NyaXB0cywgaWYgYW55LCBtaWdodCBvciBtaWdodCBub3QgaGF2ZSBleGVjdXRlZC5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVzaGVldHNbMV0sIGltYWdlcywgYW5kIHN1YmZyYW1lcyBtaWdodCBvciBtaWdodCBub3QgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSAtIFN0eWxlc2hlZXRzIC91c3VhbGx5LyBkZWZlciB0aGlzIGV2ZW50ISAtIGh0dHA6Ly9tb2xpbHkuZGUvd2VibG9nL2RvbWNvbnRlbnRsb2FkZWRcclxuICAgICAqICA2LiBkb21Db250ZW50TG9hZGVkRXZlbnRFbmQgICAgIC0gVGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgY2FsbGJhY2ssIGlmIGFueSwgZmluaXNoZWQgZXhlY3V0aW5nLiBFLmcuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJET00gZnVsbHkgbG9hZGVkIGFuZCBwYXJzZWRcIik7XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgKiAgNy4gZG9tQ29tcGxldGUgICAgICAgICAgICAgICAgICAtIFRoZSBET00gdHJlZSBpcyBjb21wbGV0ZWx5IGJ1aWx0LiBBc3luYyBzY3JpcHRzLCBpZiBhbnksIGhhdmUgZXhlY3V0ZWQuXHJcbiAgICAgKiAgOC4gbG9hZEV2ZW50U3RhcnQgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhbGwgdGhlIHJlc291cmNlcyBsaWtlIGltYWdlcywgc3dmLCBldGMuXHJcbiAgICAgKiAgOS4gbG9hZEV2ZW50RW5kICAgICAgICAgICAgICAgICAtIFRoZSBsb2FkIGV2ZW50IGNhbGxiYWNrLCBpZiBhbnksIGZpbmlzaGVkIGV4ZWN1dGluZy5cclxuICAgICAqL1xyXG4gICAgX2dldFN0YXRzKGNvbW1hbmROYW1lKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mZXRjaFN0YXRzICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLl9pc0FjdGlvbihjb21tYW5kTmFtZSkpIHtcclxuICAgICAgICAgICAgdmFyIG5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgdmFyIGRvbUNvbnRlbnRMb2FkZWQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgbG9hZCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBzYW1lUGFnZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZvbGxvd2luZyBzaXR1YXRpb246XHJcbiAgICAgICAgICAgIC8vIGlmIG5hdmlnYXRlU3RhcnQgZXF1YWxzIHRvIHRoZSBvbmUgd2UgZ290IGZyb20gcHJldmlvdXMgYXR0ZW1wdCAod2UgbmVlZCB0byBzYXZlIGl0KVxyXG4gICAgICAgICAgICAvLyBpdCBtZWFucyB3ZSBhcmUgc3RpbGwgb24gdGhlIHNhbWUgcGFnZSBhbmQgZG9uJ3QgbmVlZCB0byByZWNvcmQgbG9hZC9kb21Db250ZW50TG9hZGVkIHRpbWVzXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypnbG9iYWwgd2luZG93Ki9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltaW5ncyA9IGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uU3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRXZlbnRTdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5sb2FkRXZlbnRTdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltaW5ncy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA+IDAgJiYgdGltaW5ncy5sb2FkRXZlbnRTdGFydCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVBhZ2UgPSB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lICYmIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPT0gdGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25TdGFydCA9IHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSB0aW1pbmdzLm5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID0gdGltaW5ncy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRFdmVudFN0YXJ0ID0gdGltaW5ncy5sb2FkRXZlbnRTdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNvbnRlbnRMb2FkZWQgPSBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCAtIG5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGxvYWRFdmVudFN0YXJ0IC0gbmF2aWdhdGlvblN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID4gMCAmJiBsb2FkRXZlbnRTdGFydCA+IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4ZWN1dGVFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZXJyb3IgaW5zaWRlIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBleGVjdXRlRXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGVycm9yIGZyb20gZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBlcnJvciBmcm9tIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGFzdEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICAgICAgICAgIC8vIGNvdWxkbid0IGdldCB0aW1pbmdzLlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbmF2aWdhdGlvblN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNhbWVQYWdlID8ge30gOiB7IERvbUNvbnRlbnRMb2FkZWRFdmVudDogZG9tQ29udGVudExvYWRlZCwgTG9hZEV2ZW50OiBsb2FkIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmVcclxuICAgICAqICAgICAgICAgICAgICB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zW2dsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZV0gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRIQVIgJiYgdGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zW2dsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZV0gPSBhd2FpdCB0aGlzLl9nZXRIQVIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zYWN0aW9uc1tuYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnRlciA9IE9iamVjdC5rZXlzKHRoaXMudHJhbnNhY3Rpb25zKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc3RhcnRzV2l0aChuYW1lKSkubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZSsnICgjJytjb3VudGVyKycpJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEhlbHBlckZ1bmN0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IgPSBtb2RVdGlscy5nZXRXZGlvTG9jYXRvcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMubWF0Y2hQYXR0ZXJuID0gbW9kVXRpbHMubWF0Y2hQYXR0ZXJuO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudHMgPSBtb2RVdGlscy5nZXRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuc2V0VGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMuc2V0VGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5yZXN0b3JlVGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXI7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2w7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50VGltZW91dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZ2V0SEFSKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0TG9nVHlwZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcygncGVyZm9ybWFuY2UnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ3MoJ3BlcmZvcm1hbmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW4gb25lIGluc3RhbmNlLCBsb2dzIHdhcyBub3QgaXRlcmFibGUgZm9yIHNvbWUgcmVhc29uIC0gaGVuY2UgdGhlIGZvbGxvd2luZyBjaGVjazpcclxuICAgICAgICAgICAgICAgIGlmICghbG9ncyB8fCB0eXBlb2YgbG9nc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2dldEhBUjogbG9ncyBub3QgaXRlcmFibGU6ICcgKyBKU09OLnN0cmluZ2lmeShsb2dzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZ09iaiA9IEpTT04ucGFyc2UobG9nLm1lc3NhZ2UpOyAgIC8vIHJldHVybmVkIGFzIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG1zZ09iai5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYXIgPSBoYXJGcm9tTWVzc2FnZXMoZXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gZmV0Y2ggSEFSOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrV2FpdEZvckFuZ3VsYXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFuZ3VsYXIodGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IsIHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZW5kUmVzdWx0U3RhdHVzVG9MYW1iZGFUZXN0KHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhbWJkYUNyZWRlbnRpYWxzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFjY2Vzc0tleTogdGhpcy53ZGlvT3B0cy5rZXlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFBdXRvbWF0aW9uQ2xpZW50ID0gbGFtYmRhUmVzdENsaWVudC5BdXRvbWF0aW9uQ2xpZW50KFxyXG4gICAgICAgICAgICAgICAgbGFtYmRhQ3JlZGVudGlhbHNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNfaW5kOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGFtYmRhQXV0b21hdGlvbkNsaWVudC51cGRhdGVTZXNzaW9uQnlJZChzZXNzaW9uSWQsIHJlcXVlc3RCb2R5LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gTGFtYmRhVGVzdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvVGVzdGluZ0JvdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHRiID0gbmV3IFRlc3RpbmdCb3Qoe1xyXG4gICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgYXBpX3NlY3JldDogdGhpcy53ZGlvT3B0cy5rZXlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3REYXRhID0geyBcInRlc3Rbc3VjY2Vzc11cIiA6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyBcIjFcIiA6IFwiMFwiIH07XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0Yi51cGRhdGVUZXN0KHRlc3REYXRhLCBzZXNzaW9uSWQsIGZ1bmN0aW9uKGVycm9yLCB0ZXN0RGV0YWlscykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBUZXN0aW5nQm90OiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2soc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyAncGFzc2VkJyA6ICdmYWlsZWQnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmAsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5rZXksXHJcbiAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qob3B0aW9ucywgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIEJyb3dzZXJzdGFjazogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuIl19