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
@@ -4,10 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.compareScenarioLineWithSourceLine = compareScenarioLineWithSourceLine;
7
- exports.default = void 0;
8
7
  exports.getStepFromFeature = getStepFromFeature;
8
+ exports.default = void 0;
9
+
9
10
  require("source-map-support/register");
11
+
10
12
  var _events = require("events");
13
+
11
14
  class CucumberEventListener extends _events.EventEmitter {
12
15
  constructor(eventBroadcaster) {
13
16
  super();
@@ -20,6 +23,7 @@ class CucumberEventListener extends _events.EventEmitter {
20
23
  this.testCasePreparedEvents = [];
21
24
  eventBroadcaster.on('gherkin-document', this.onGherkinDocument.bind(this)).on('pickle-accepted', this.onPickleAccepted.bind(this)).on('test-case-prepared', this.onTestCasePrepared.bind(this)).on('test-case-started', this.onTestCaseStarted.bind(this)).on('test-step-started', this.onTestStepStarted.bind(this)).on('test-step-finished', this.onTestStepFinished.bind(this)).on('test-case-finished', this.onTestCaseFinished.bind(this)).on('test-run-started', this.onTestRunStarted.bind(this)).on('test-run-finished', this.onTestRunFinished.bind(this));
22
25
  }
26
+
23
27
  onGherkinDocument(gherkinDocEvent) {
24
28
  this.gherkinDocEvents.push(gherkinDocEvent);
25
29
  const uri = gherkinDocEvent.uri;
@@ -27,9 +31,11 @@ class CucumberEventListener extends _events.EventEmitter {
27
31
  const feature = doc.feature;
28
32
  this.emit('feature:ready', uri, feature);
29
33
  }
34
+
30
35
  onPickleAccepted(pickleEvent) {
31
36
  this.acceptedPickles.push(pickleEvent);
32
37
  }
38
+
33
39
  onTestCaseStarted(testCaseStartedEvent) {
34
40
  const pickleEvent = this.acceptedPickles.shift();
35
41
  const uri = pickleEvent.uri;
@@ -37,6 +43,7 @@ class CucumberEventListener extends _events.EventEmitter {
37
43
  const feature = doc.feature;
38
44
  const scenario = pickleEvent.pickle;
39
45
  this.currentPickle = scenario;
46
+
40
47
  if (this.currentFeatureUri && this.currentFeatureUri !== uri) {
41
48
  this.emit('feature:after', this.currentFeatureUri, this.currentFeature);
42
49
  this.currentFeatureUri = uri;
@@ -47,8 +54,10 @@ class CucumberEventListener extends _events.EventEmitter {
47
54
  this.currentFeatureUri = uri;
48
55
  this.emit('feature:before', this.currentFeatureUri, this.currentFeature);
49
56
  }
57
+
50
58
  this.emit('scenario:before', uri, feature, scenario);
51
59
  }
60
+
52
61
  onTestStepStarted(testStepStartedEvent) {
53
62
  const sourceLocation = testStepStartedEvent.testCase.sourceLocation;
54
63
  const uri = sourceLocation.uri;
@@ -58,6 +67,7 @@ class CucumberEventListener extends _events.EventEmitter {
58
67
  const step = getStepFromFeature(feature, this.currentPickle, testStepStartedEvent.index, sourceLocation);
59
68
  this.emit('step:before', uri, feature, scenario, step, sourceLocation);
60
69
  }
70
+
61
71
  onTestCasePrepared(testCasePreparedEvent) {
62
72
  this.testCasePreparedEvents.push(testCasePreparedEvent);
63
73
  const sourceLocation = testCasePreparedEvent.sourceLocation;
@@ -65,9 +75,11 @@ class CucumberEventListener extends _events.EventEmitter {
65
75
  const doc = this.gherkinDocEvents.find(gde => gde.uri === uri).document;
66
76
  const scenario = doc.feature.children.find(child => compareScenarioLineWithSourceLine(child, sourceLocation));
67
77
  const scenarioHasHooks = scenario.steps.filter(step => step.type === 'Hook').length > 0;
78
+
68
79
  if (scenarioHasHooks) {
69
80
  return;
70
81
  }
82
+
71
83
  const allSteps = testCasePreparedEvent.steps;
72
84
  allSteps.forEach((step, idx) => {
73
85
  if (!step.sourceLocation) {
@@ -86,6 +98,7 @@ class CucumberEventListener extends _events.EventEmitter {
86
98
  }
87
99
  });
88
100
  }
101
+
89
102
  onTestStepFinished(testStepFinishedEvent) {
90
103
  const sourceLocation = testStepFinishedEvent.testCase.sourceLocation;
91
104
  const uri = sourceLocation.uri;
@@ -96,6 +109,7 @@ class CucumberEventListener extends _events.EventEmitter {
96
109
  const result = testStepFinishedEvent.result;
97
110
  this.emit('step:after', uri, feature, scenario, step, result, sourceLocation);
98
111
  }
112
+
99
113
  onTestCaseFinished(testCaseFinishedEvent) {
100
114
  const sourceLocation = testCaseFinishedEvent.sourceLocation;
101
115
  const uri = sourceLocation.uri;
@@ -105,18 +119,24 @@ class CucumberEventListener extends _events.EventEmitter {
105
119
  this.emit('scenario:after', uri, feature, scenario, sourceLocation);
106
120
  this.currentPickle = null;
107
121
  }
122
+
108
123
  onTestRunStarted(testRunStartedEvent) {
109
124
  this.emit('test:start');
110
125
  }
126
+
111
127
  onTestRunFinished(testRunFinishedEvent) {
112
128
  if (this.currentFeature) {
113
129
  this.emit('feature:after', this.currentFeatureUri, this.currentFeature);
114
130
  this.currentFeature = null;
115
131
  }
132
+
116
133
  this.emit('test:end', testRunFinishedEvent.result);
117
134
  }
135
+
118
136
  }
137
+
119
138
  exports.default = CucumberEventListener;
139
+
120
140
  function attachEventLogger(eventBroadcaster) {
121
141
  const EVENTS = ['source', 'attachment', 'gherkin-document', 'pickle', 'pickle-accepted', 'pickle-rejected', 'test-run-started', 'test-case-prepared', 'test-case-started', 'test-step-started', 'test-step-attachment', 'test-step-finished', 'test-case-finished', 'test-run-finished'];
122
142
  EVENTS.forEach(e => {
@@ -125,6 +145,7 @@ function attachEventLogger(eventBroadcaster) {
125
145
  });
126
146
  });
127
147
  }
148
+
128
149
  function compareScenarioLineWithSourceLine(scenario, sourceLocation) {
129
150
  if (scenario.type.indexOf('ScenarioOutline') > -1) {
130
151
  return scenario.examples.some(example => example.tableBody.some(tableEntry => tableEntry.location.line === sourceLocation.line));
@@ -132,25 +153,29 @@ function compareScenarioLineWithSourceLine(scenario, sourceLocation) {
132
153
  return scenario.location.line === sourceLocation.line;
133
154
  }
134
155
  }
156
+
135
157
  function getStepFromFeature(feature, pickle, stepIndex, sourceLocation) {
136
158
  let combinedSteps = [];
137
159
  feature.children.forEach(child => {
138
160
  if (child.type.indexOf('Scenario') > -1 && !compareScenarioLineWithSourceLine(child, sourceLocation)) {
139
161
  return;
140
162
  }
163
+
141
164
  combinedSteps = combinedSteps.concat(child.steps);
142
165
  });
143
166
  const targetStep = combinedSteps[stepIndex];
167
+
144
168
  if (targetStep.type === 'Step') {
145
169
  const stepLine = targetStep.location.line;
146
170
  const pickleStep = pickle.steps.find(s => s.locations.some(loc => loc.line === stepLine));
171
+
147
172
  if (pickleStep) {
148
- return {
149
- ...targetStep,
173
+ return { ...targetStep,
150
174
  text: pickleStep.text
151
175
  };
152
176
  }
153
177
  }
178
+
154
179
  return targetStep;
155
180
  }
156
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDdWN1bWJlckV2ZW50TGlzdGVuZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImV2ZW50QnJvYWRjYXN0ZXIiLCJmZWF0dXJlcyIsImdoZXJraW5Eb2NFdmVudHMiLCJhY2NlcHRlZFBpY2tsZXMiLCJjdXJyZW50UGlja2xlIiwiY3VycmVudEZlYXR1cmUiLCJjdXJyZW50RmVhdHVyZVVyaSIsInRlc3RDYXNlUHJlcGFyZWRFdmVudHMiLCJvbiIsIm9uR2hlcmtpbkRvY3VtZW50IiwiYmluZCIsIm9uUGlja2xlQWNjZXB0ZWQiLCJvblRlc3RDYXNlUHJlcGFyZWQiLCJvblRlc3RDYXNlU3RhcnRlZCIsIm9uVGVzdFN0ZXBTdGFydGVkIiwib25UZXN0U3RlcEZpbmlzaGVkIiwib25UZXN0Q2FzZUZpbmlzaGVkIiwib25UZXN0UnVuU3RhcnRlZCIsIm9uVGVzdFJ1bkZpbmlzaGVkIiwiZ2hlcmtpbkRvY0V2ZW50IiwicHVzaCIsInVyaSIsImRvYyIsImRvY3VtZW50IiwiZmVhdHVyZSIsImVtaXQiLCJwaWNrbGVFdmVudCIsInRlc3RDYXNlU3RhcnRlZEV2ZW50Iiwic2hpZnQiLCJmaW5kIiwiZ2RlIiwic2NlbmFyaW8iLCJwaWNrbGUiLCJ0ZXN0U3RlcFN0YXJ0ZWRFdmVudCIsInNvdXJjZUxvY2F0aW9uIiwidGVzdENhc2UiLCJjaGlsZHJlbiIsImNoaWxkIiwiY29tcGFyZVNjZW5hcmlvTGluZVdpdGhTb3VyY2VMaW5lIiwic3RlcCIsImdldFN0ZXBGcm9tRmVhdHVyZSIsImluZGV4IiwidGVzdENhc2VQcmVwYXJlZEV2ZW50Iiwic2NlbmFyaW9IYXNIb29rcyIsInN0ZXBzIiwiZmlsdGVyIiwidHlwZSIsImxlbmd0aCIsImFsbFN0ZXBzIiwiZm9yRWFjaCIsImlkeCIsImxpbmUiLCJhY3Rpb25Mb2NhdGlvbiIsImNvbHVtbiIsImhvb2siLCJsb2NhdGlvbiIsImtleXdvcmQiLCJ0ZXh0Iiwic3BsaWNlIiwidGVzdFN0ZXBGaW5pc2hlZEV2ZW50IiwicmVzdWx0IiwidGVzdENhc2VGaW5pc2hlZEV2ZW50IiwidGVzdFJ1blN0YXJ0ZWRFdmVudCIsInRlc3RSdW5GaW5pc2hlZEV2ZW50IiwiYXR0YWNoRXZlbnRMb2dnZXIiLCJFVkVOVFMiLCJlIiwieCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiaW5kZXhPZiIsImV4YW1wbGVzIiwic29tZSIsImV4YW1wbGUiLCJ0YWJsZUJvZHkiLCJ0YWJsZUVudHJ5Iiwic3RlcEluZGV4IiwiY29tYmluZWRTdGVwcyIsImNvbmNhdCIsInRhcmdldFN0ZXAiLCJzdGVwTGluZSIsInBpY2tsZVN0ZXAiLCJzIiwibG9jYXRpb25zIiwibG9jIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bm5lcnMvY3VjdW1iZXIvQ3VjdW1iZXJFdmVudExpc3RlbmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqIFxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1Y3VtYmVyRXZlbnRMaXN0ZW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAoZXZlbnRCcm9hZGNhc3Rlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcclxuICAgICAgICB0aGlzLmdoZXJraW5Eb2NFdmVudHMgPSBbXTtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkUGlja2xlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBpY2tsZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZXN0Q2FzZVByZXBhcmVkRXZlbnRzID0gW107XHJcbiAgICAgICAgLy8gYXR0YWNoRXZlbnRMb2dnZXIoZXZlbnRCcm9hZGNhc3RlcilcclxuXHJcbiAgICAgICAgZXZlbnRCcm9hZGNhc3RlclxyXG4gICAgICAgICAgICAub24oJ2doZXJraW4tZG9jdW1lbnQnLCB0aGlzLm9uR2hlcmtpbkRvY3VtZW50LmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigncGlja2xlLWFjY2VwdGVkJywgdGhpcy5vblBpY2tsZUFjY2VwdGVkLmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigndGVzdC1jYXNlLXByZXBhcmVkJywgdGhpcy5vblRlc3RDYXNlUHJlcGFyZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LWNhc2Utc3RhcnRlZCcsIHRoaXMub25UZXN0Q2FzZVN0YXJ0ZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LXN0ZXAtc3RhcnRlZCcsIHRoaXMub25UZXN0U3RlcFN0YXJ0ZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LXN0ZXAtZmluaXNoZWQnLCB0aGlzLm9uVGVzdFN0ZXBGaW5pc2hlZC5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICAub24oJ3Rlc3QtY2FzZS1maW5pc2hlZCcsIHRoaXMub25UZXN0Q2FzZUZpbmlzaGVkLmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigndGVzdC1ydW4tc3RhcnRlZCcsIHRoaXMub25UZXN0UnVuU3RhcnRlZC5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICAub24oJ3Rlc3QtcnVuLWZpbmlzaGVkJywgdGhpcy5vblRlc3RSdW5GaW5pc2hlZC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnaGVya2luRG9jRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgdXJpOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgZG9jdW1lbnQ6IHtcclxuICAgIC8vICAgICAgICAgdHlwZTogJ0doZXJraW5Eb2N1bWVudCcsXHJcbiAgICAvLyAgICAgICAgIGZlYXR1cmU6IHtcclxuICAgIC8vICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcclxuICAgIC8vICAgICAgICAgICAgIHRhZ3M6IFt7IG5hbWU6IHN0cmluZyB9XSxcclxuICAgIC8vICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcclxuICAgIC8vICAgICAgICAgICAgIGtleXdvcmQ6ICdGZWF0dXJlJyxcclxuICAgIC8vICAgICAgICAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgIC8vICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogW3tcclxuICAgIC8vICAgICAgICAgICAgICAgICB0eXBlOiAnU2NlbmFyaW8nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRhZ3M6IFtdLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdTY2VuYXJpbycsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHN0ZXBzOiBbe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RlcCcsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnR2l2ZW4nIHwgJ1doZW4nIHwgJ1RoZW4nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XVxyXG4gICAgLy8gICAgICAgICAgICAgfV1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgY29tbWVudHM6IFt7XHJcbiAgICAvLyAgICAgICAgIHR5cGU6ICdDb21tZW50JyxcclxuICAgIC8vICAgICAgICAgbG9jYXRpb246IHsgbGluZTogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgICAgIHRleHQ6IHN0cmluZ1xyXG4gICAgLy8gICAgIH1dXHJcbiAgICAvLyB9XHJcbiAgICBvbkdoZXJraW5Eb2N1bWVudCAoZ2hlcmtpbkRvY0V2ZW50KSB7XHJcbiAgICAgICAgLy8gZW1pdCAnZmVhdHVyZTphZnRlcicgZXZlbnQgYmVmb3JlIHRoZSBuZXh0IGZlYXR1cmUgaXMgcHJvY2VlZGVkXHJcbiAgICAgICAgLyppZiAodGhpcy5jdXJyZW50RmVhdHVyZSkge1xyXG4gICAgICAgICAgICAvL2NvbnN0IGdoZXJraW5Eb2NFdmVudCA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5wb3AoKSAvLyBzZWUgLnB1c2goKSBpbiBgaGFuZGxlQmVmb3JlRmVhdHVyZSgpYFxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2ZlYXR1cmU6YWZ0ZXInLCB0aGlzLmN1cnJlbnRGZWF0dXJlVXJpLCB0aGlzLmN1cnJlbnRGZWF0dXJlKVxyXG4gICAgICAgIH0qL1xyXG5cclxuICAgICAgICB0aGlzLmdoZXJraW5Eb2NFdmVudHMucHVzaChnaGVya2luRG9jRXZlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCB1cmkgPSBnaGVya2luRG9jRXZlbnQudXJpO1xyXG4gICAgICAgIGNvbnN0IGRvYyA9IGdoZXJraW5Eb2NFdmVudC5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBmZWF0dXJlID0gZG9jLmZlYXR1cmU7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdCgnZmVhdHVyZTpyZWFkeScsIHVyaSwgZmVhdHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGlja2xlRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgdXJpOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgcGlja2xlOiB7XHJcbiAgICAvLyAgICAgICAgIHRhZ3M6IFt7IG5hbWU6IHN0cmluZyB9XSxcclxuICAgIC8vICAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgLy8gICAgICAgICBsb2NhdGlvbnM6IFt7IGxpbmU6IDAsIGNvbHVtbjogMCB9XSxcclxuICAgIC8vICAgICAgICAgc3RlcHM6IFt7XHJcbiAgICAvLyAgICAgICAgICAgICBsb2NhdGlvbnM6IFt7IGxpbmU6IDAsIGNvbHVtbjogMCB9XSxcclxuICAgIC8vICAgICAgICAgICAgIGtleXdvcmQ6ICdHaXZlbicgfCAnV2hlbicgfCAnVGhlbicsXHJcbiAgICAvLyAgICAgICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgfV1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICBvblBpY2tsZUFjY2VwdGVkIChwaWNrbGVFdmVudCkge1xyXG4gICAgICAgIC8vIGJlY2F1c2UgJ3BpY2tsZS1hY2NlcHRlZCcgZXZlbnRzIGFyZSBlbWl0dGVkIHRvZ2V0aGVyIGluIGZvckVhY2ggbG9vcFxyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRQaWNrbGVzLnB1c2gocGlja2xlRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3RDYXNlU3RhcnRlZEV2ZW50ID0ge1xyXG4gICAgLy8gICAgIHNvdXJjZUxvY2F0aW9uOiB7IHVyaTogc3RyaW5nLCBsaW5lOiAwIH1cclxuICAgIC8vIH1cclxuICAgIG9uVGVzdENhc2VTdGFydGVkICh0ZXN0Q2FzZVN0YXJ0ZWRFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IHBpY2tsZUV2ZW50ID0gdGhpcy5hY2NlcHRlZFBpY2tsZXMuc2hpZnQoKTtcclxuICAgICAgICBjb25zdCB1cmkgPSBwaWNrbGVFdmVudC51cmk7XHJcbiAgICAgICAgY29uc3QgZG9jID0gdGhpcy5naGVya2luRG9jRXZlbnRzLmZpbmQoZ2RlID0+IGdkZS51cmkgPT09IHVyaSkuZG9jdW1lbnQ7XHJcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGRvYy5mZWF0dXJlO1xyXG4gICAgICAgIGNvbnN0IHNjZW5hcmlvID0gcGlja2xlRXZlbnQucGlja2xlO1xyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRQaWNrbGUgPSBzY2VuYXJpbztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZlYXR1cmVVcmkgJiYgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSAhPT0gdXJpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmVhdHVyZTphZnRlcicsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlVXJpID0gdXJpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmJlZm9yZScsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdGhpcy5jdXJyZW50RmVhdHVyZSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSA9IHVyaTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmJlZm9yZScsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzY2VuYXJpbzpiZWZvcmUnLCB1cmksIGZlYXR1cmUsIHNjZW5hcmlvKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXN0U3RlcFN0YXJ0ZWRFdmVudCA9IHtcclxuICAgIC8vICAgICBpbmRleDogMCxcclxuICAgIC8vICAgICB0ZXN0Q2FzZToge1xyXG4gICAgLy8gICAgICAgICBzb3VyY2VMb2NhdGlvbjogeyB1cmk6IHN0cmluZywgbGluZTogMCB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0U3RlcFN0YXJ0ZWQgKHRlc3RTdGVwU3RhcnRlZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0U3RlcFN0YXJ0ZWRFdmVudC50ZXN0Q2FzZS5zb3VyY2VMb2NhdGlvbjtcclxuICAgICAgICBjb25zdCB1cmkgPSBzb3VyY2VMb2NhdGlvbi51cmk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5maW5kKGdkZSA9PiBnZGUudXJpID09PSB1cmkpLmRvY3VtZW50O1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBkb2MuZmVhdHVyZTtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGZlYXR1cmUuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNvbXBhcmVTY2VuYXJpb0xpbmVXaXRoU291cmNlTGluZShjaGlsZCwgc291cmNlTG9jYXRpb24pKTtcclxuICAgICAgICBjb25zdCBzdGVwID0gZ2V0U3RlcEZyb21GZWF0dXJlKGZlYXR1cmUsIHRoaXMuY3VycmVudFBpY2tsZSwgdGVzdFN0ZXBTdGFydGVkRXZlbnQuaW5kZXgsIHNvdXJjZUxvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmJlZm9yZScsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHNvdXJjZUxvY2F0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gICAgIHN0ZXBzOiBbXHJcbiAgICAvLyAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgIGFjdGlvbkxvY2F0aW9uOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdXJpOiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgICAgICAgICBsaW5lOiAwXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICBdXHJcbiAgICAvLyB9XHJcbiAgICBvblRlc3RDYXNlUHJlcGFyZWQgKHRlc3RDYXNlUHJlcGFyZWRFdmVudCkge1xyXG4gICAgICAgIHRoaXMudGVzdENhc2VQcmVwYXJlZEV2ZW50cy5wdXNoKHRlc3RDYXNlUHJlcGFyZWRFdmVudCk7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQuc291cmNlTG9jYXRpb247XHJcbiAgICAgICAgY29uc3QgdXJpID0gc291cmNlTG9jYXRpb24udXJpO1xyXG5cclxuICAgICAgICBjb25zdCBkb2MgPSB0aGlzLmdoZXJraW5Eb2NFdmVudHMuZmluZChnZGUgPT4gZ2RlLnVyaSA9PT0gdXJpKS5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGRvYy5mZWF0dXJlLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5hcmlvSGFzSG9va3MgPSBzY2VuYXJpby5zdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAudHlwZSA9PT0gJ0hvb2snKS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGlmIChzY2VuYXJpb0hhc0hvb2tzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3RlcHMgPSB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQuc3RlcHM7XHJcbiAgICAgICAgYWxsU3RlcHMuZm9yRWFjaCgoc3RlcCwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc3RlcC5zb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zb3VyY2VMb2NhdGlvbiA9IHsgbGluZTogc3RlcC5hY3Rpb25Mb2NhdGlvbi5saW5lLCBjb2x1bW46IDAsIHVyaTogc3RlcC5hY3Rpb25Mb2NhdGlvbi51cmkgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhvb2sgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0hvb2snLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBzdGVwLnNvdXJjZUxvY2F0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdIb29rJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHNjZW5hcmlvLnN0ZXBzLnNwbGljZShpZHgsIDAsIGhvb2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGVzdFN0ZXBGaW5pc2hlZEV2ZW50ID0ge1xyXG4gICAgLy8gICAgIGluZGV4OiAwLFxyXG4gICAgLy8gICAgIHJlc3VsdDogeyBkdXJhdGlvbjogMCwgc3RhdHVzOiBzdHJpbmcsIGV4Y2VwdGlvbj86IEVycm9yIH0sXHJcbiAgICAvLyAgICAgdGVzdENhc2U6IHtcclxuICAgIC8vICAgICAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuICAgIG9uVGVzdFN0ZXBGaW5pc2hlZCAodGVzdFN0ZXBGaW5pc2hlZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0U3RlcEZpbmlzaGVkRXZlbnQudGVzdENhc2Uuc291cmNlTG9jYXRpb247XHJcbiAgICAgICAgY29uc3QgdXJpID0gc291cmNlTG9jYXRpb24udXJpO1xyXG5cclxuICAgICAgICBjb25zdCBkb2MgPSB0aGlzLmdoZXJraW5Eb2NFdmVudHMuZmluZChnZGUgPT4gZ2RlLnVyaSA9PT0gdXJpKS5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBmZWF0dXJlID0gZG9jLmZlYXR1cmU7XHJcbiAgICAgICAgY29uc3Qgc2NlbmFyaW8gPSBmZWF0dXJlLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSk7XHJcbiAgICAgICAgY29uc3Qgc3RlcCA9IGdldFN0ZXBGcm9tRmVhdHVyZShmZWF0dXJlLCB0aGlzLmN1cnJlbnRQaWNrbGUsIHRlc3RTdGVwRmluaXNoZWRFdmVudC5pbmRleCwgc291cmNlTG9jYXRpb24pO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RTdGVwRmluaXNoZWRFdmVudC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdCgnc3RlcDphZnRlcicsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHJlc3VsdCwgc291cmNlTG9jYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3RDYXNlRmluaXNoZWRFdmVudCA9IHtcclxuICAgIC8vICAgICByZXN1bHQ6IHsgZHVyYXRpb246IDAsIHN0YXR1czogc3RyaW5nIH0sXHJcbiAgICAvLyAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0Q2FzZUZpbmlzaGVkICh0ZXN0Q2FzZUZpbmlzaGVkRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBzb3VyY2VMb2NhdGlvbiA9IHRlc3RDYXNlRmluaXNoZWRFdmVudC5zb3VyY2VMb2NhdGlvbjtcclxuICAgICAgICBjb25zdCB1cmkgPSBzb3VyY2VMb2NhdGlvbi51cmk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5maW5kKGdkZSA9PiBnZGUudXJpID09PSB1cmkpLmRvY3VtZW50O1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBkb2MuZmVhdHVyZTtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGZlYXR1cmUuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNvbXBhcmVTY2VuYXJpb0xpbmVXaXRoU291cmNlTGluZShjaGlsZCwgc291cmNlTG9jYXRpb24pKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzY2VuYXJpbzphZnRlcicsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHNvdXJjZUxvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGlja2xlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblRlc3RSdW5TdGFydGVkICh0ZXN0UnVuU3RhcnRlZEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0OnN0YXJ0Jyk7XHJcbiAgICB9XHJcbiAgICAvLyB0ZXN0UnVuRmluaXNoZWRFdmVudCA9IHtcclxuICAgIC8vICAgICByZXN1bHQ6IHsgZHVyYXRpb246IDQwMDQsIHN1Y2Nlc3M6IHRydWUgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0UnVuRmluaXNoZWQgKHRlc3RSdW5GaW5pc2hlZEV2ZW50KSB7XHJcbiAgICAgICAgLy8gZW1pdCAnZmVhdHVyZTphZnRlcicgZXZlbnQgYmVmb3JlIHRoZSBuZXh0IGZlYXR1cmUgaXMgcHJvY2VlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZlYXR1cmUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmFmdGVyJywgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSwgdGhpcy5jdXJyZW50RmVhdHVyZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZlYXR1cmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0OmVuZCcsIHRlc3RSdW5GaW5pc2hlZEV2ZW50LnJlc3VsdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG5mdW5jdGlvbiBhdHRhY2hFdmVudExvZ2dlciAoZXZlbnRCcm9hZGNhc3Rlcikge1xyXG4gICAgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlZFxyXG4gICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY3VjdW1iZXIvY3VjdW1iZXItanMvYmxvYi92NC4xLjAvc3JjL2Zvcm1hdHRlci9ldmVudF9wcm90b2NvbF9mb3JtYXR0ZXIuanNcclxuICAgIGNvbnN0IEVWRU5UUyA9IFtcclxuICAgICAgICAnc291cmNlJyxcclxuICAgICAgICAnYXR0YWNobWVudCcsXHJcbiAgICAgICAgJ2doZXJraW4tZG9jdW1lbnQnLFxyXG4gICAgICAgICdwaWNrbGUnLFxyXG4gICAgICAgICdwaWNrbGUtYWNjZXB0ZWQnLFxyXG4gICAgICAgICdwaWNrbGUtcmVqZWN0ZWQnLFxyXG4gICAgICAgICd0ZXN0LXJ1bi1zdGFydGVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLXByZXBhcmVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLXN0YXJ0ZWQnLFxyXG4gICAgICAgICd0ZXN0LXN0ZXAtc3RhcnRlZCcsXHJcbiAgICAgICAgJ3Rlc3Qtc3RlcC1hdHRhY2htZW50JyxcclxuICAgICAgICAndGVzdC1zdGVwLWZpbmlzaGVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLWZpbmlzaGVkJyxcclxuICAgICAgICAndGVzdC1ydW4tZmluaXNoZWQnXHJcbiAgICBdO1xyXG4gICAgRVZFTlRTLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgZXZlbnRCcm9hZGNhc3Rlci5vbihlLCB4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1xcbi0tLS0tJyArIGUgKyAnIC0tLS0tXFxuJyArIEpTT04uc3RyaW5naWZ5KHgsIG51bGwsIDIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVNjZW5hcmlvTGluZVdpdGhTb3VyY2VMaW5lIChzY2VuYXJpbywgc291cmNlTG9jYXRpb24pIHtcclxuICAgIGlmIChzY2VuYXJpby50eXBlLmluZGV4T2YoJ1NjZW5hcmlvT3V0bGluZScpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gc2NlbmFyaW8uZXhhbXBsZXMuc29tZSgoZXhhbXBsZSkgPT4gZXhhbXBsZS50YWJsZUJvZHkuc29tZSgodGFibGVFbnRyeSkgPT4gdGFibGVFbnRyeS5sb2NhdGlvbi5saW5lID09PSBzb3VyY2VMb2NhdGlvbi5saW5lKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzY2VuYXJpby5sb2NhdGlvbi5saW5lID09PSBzb3VyY2VMb2NhdGlvbi5saW5lO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZyb21GZWF0dXJlIChmZWF0dXJlLCBwaWNrbGUsIHN0ZXBJbmRleCwgc291cmNlTG9jYXRpb24pIHtcclxuICAgIGxldCBjb21iaW5lZFN0ZXBzID0gW107XHJcbiAgICBmZWF0dXJlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUuaW5kZXhPZignU2NlbmFyaW8nKSA+IC0xICYmICFjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbWJpbmVkU3RlcHMgPSBjb21iaW5lZFN0ZXBzLmNvbmNhdChjaGlsZC5zdGVwcyk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHRhcmdldFN0ZXAgPSBjb21iaW5lZFN0ZXBzW3N0ZXBJbmRleF07XHJcblxyXG4gICAgaWYgKHRhcmdldFN0ZXAudHlwZSA9PT0gJ1N0ZXAnKSB7XHJcbiAgICAgICAgY29uc3Qgc3RlcExpbmUgPSB0YXJnZXRTdGVwLmxvY2F0aW9uLmxpbmU7XHJcbiAgICAgICAgY29uc3QgcGlja2xlU3RlcCA9IHBpY2tsZS5zdGVwcy5maW5kKHMgPT4gcy5sb2NhdGlvbnMuc29tZShsb2MgPT4gbG9jLmxpbmUgPT09IHN0ZXBMaW5lKSk7XHJcblxyXG4gICAgICAgIGlmIChwaWNrbGVTdGVwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRhcmdldFN0ZXAsIHRleHQ6IHBpY2tsZVN0ZXAudGV4dCB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0U3RlcDtcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBO0FBRWUsTUFBTUEscUJBQXFCLFNBQVNDLG9CQUFZLENBQUM7RUFDNURDLFdBQVcsQ0FBRUMsZ0JBQWdCLEVBQUU7SUFDM0IsS0FBSyxFQUFFO0lBRVAsSUFBSSxDQUFDQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUcsRUFBRTtJQUMxQixJQUFJLENBQUNDLGVBQWUsR0FBRyxFQUFFO0lBQ3pCLElBQUksQ0FB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
181
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL0N1Y3VtYmVyRXZlbnRMaXN0ZW5lci5qcyJdLCJuYW1lcyI6WyJDdWN1bWJlckV2ZW50TGlzdGVuZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImV2ZW50QnJvYWRjYXN0ZXIiLCJmZWF0dXJlcyIsImdoZXJraW5Eb2NFdmVudHMiLCJhY2NlcHRlZFBpY2tsZXMiLCJjdXJyZW50UGlja2xlIiwiY3VycmVudEZlYXR1cmUiLCJjdXJyZW50RmVhdHVyZVVyaSIsInRlc3RDYXNlUHJlcGFyZWRFdmVudHMiLCJvbiIsIm9uR2hlcmtpbkRvY3VtZW50IiwiYmluZCIsIm9uUGlja2xlQWNjZXB0ZWQiLCJvblRlc3RDYXNlUHJlcGFyZWQiLCJvblRlc3RDYXNlU3RhcnRlZCIsIm9uVGVzdFN0ZXBTdGFydGVkIiwib25UZXN0U3RlcEZpbmlzaGVkIiwib25UZXN0Q2FzZUZpbmlzaGVkIiwib25UZXN0UnVuU3RhcnRlZCIsIm9uVGVzdFJ1bkZpbmlzaGVkIiwiZ2hlcmtpbkRvY0V2ZW50IiwicHVzaCIsInVyaSIsImRvYyIsImRvY3VtZW50IiwiZmVhdHVyZSIsImVtaXQiLCJwaWNrbGVFdmVudCIsInRlc3RDYXNlU3RhcnRlZEV2ZW50Iiwic2hpZnQiLCJmaW5kIiwiZ2RlIiwic2NlbmFyaW8iLCJwaWNrbGUiLCJ0ZXN0U3RlcFN0YXJ0ZWRFdmVudCIsInNvdXJjZUxvY2F0aW9uIiwidGVzdENhc2UiLCJjaGlsZHJlbiIsImNoaWxkIiwiY29tcGFyZVNjZW5hcmlvTGluZVdpdGhTb3VyY2VMaW5lIiwic3RlcCIsImdldFN0ZXBGcm9tRmVhdHVyZSIsImluZGV4IiwidGVzdENhc2VQcmVwYXJlZEV2ZW50Iiwic2NlbmFyaW9IYXNIb29rcyIsInN0ZXBzIiwiZmlsdGVyIiwidHlwZSIsImxlbmd0aCIsImFsbFN0ZXBzIiwiZm9yRWFjaCIsImlkeCIsImxpbmUiLCJhY3Rpb25Mb2NhdGlvbiIsImNvbHVtbiIsImhvb2siLCJsb2NhdGlvbiIsImtleXdvcmQiLCJ0ZXh0Iiwic3BsaWNlIiwidGVzdFN0ZXBGaW5pc2hlZEV2ZW50IiwicmVzdWx0IiwidGVzdENhc2VGaW5pc2hlZEV2ZW50IiwidGVzdFJ1blN0YXJ0ZWRFdmVudCIsInRlc3RSdW5GaW5pc2hlZEV2ZW50IiwiYXR0YWNoRXZlbnRMb2dnZXIiLCJFVkVOVFMiLCJlIiwieCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiaW5kZXhPZiIsImV4YW1wbGVzIiwic29tZSIsImV4YW1wbGUiLCJ0YWJsZUJvZHkiLCJ0YWJsZUVudHJ5Iiwic3RlcEluZGV4IiwiY29tYmluZWRTdGVwcyIsImNvbmNhdCIsInRhcmdldFN0ZXAiLCJzdGVwTGluZSIsInBpY2tsZVN0ZXAiLCJzIiwibG9jYXRpb25zIiwibG9jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBOztBQUVlLE1BQU1BLHFCQUFOLFNBQW9DQyxvQkFBcEMsQ0FBaUQ7QUFDNURDLEVBQUFBLFdBQVcsQ0FBRUMsZ0JBQUYsRUFBb0I7QUFDM0I7QUFFQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0MsZ0JBQUwsR0FBd0IsRUFBeEI7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixJQUFyQjtBQUNBLFNBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxTQUFLQyxpQkFBTCxHQUF5QixJQUF6QjtBQUNBLFNBQUtDLHNCQUFMLEdBQThCLEVBQTlCO0FBR0FQLElBQUFBLGdCQUFnQixDQUNYUSxFQURMLENBQ1Esa0JBRFIsRUFDNEIsS0FBS0MsaUJBQUwsQ0FBdUJDLElBQXZCLENBQTRCLElBQTVCLENBRDVCLEVBRUtGLEVBRkwsQ0FFUSxpQkFGUixFQUUyQixLQUFLRyxnQkFBTCxDQUFzQkQsSUFBdEIsQ0FBMkIsSUFBM0IsQ0FGM0IsRUFHS0YsRUFITCxDQUdRLG9CQUhSLEVBRzhCLEtBQUtJLGtCQUFMLENBQXdCRixJQUF4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QVosQ0FBaUJZLEdBQUcsSUFBSUEsR0FBRyxDQUFDbkMsSUFBSixLQUFhK0IsUUFBckMsQ0FBdkIsQ0FBbkI7O0FBRUEsUUFBSUMsVUFBSixFQUFnQjtBQUNaLGFBQU8sRUFBRSxHQUFHRixVQUFMO0FBQWlCeEIsUUFBQUEsSUFBSSxFQUFFMEIsVUFBVSxDQUFDMUI7QUFBbEMsT0FBUDtBQUNIO0FBQ0o7O0FBRUQsU0FBT3dCLFVBQVA7QUFDSCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqIFxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1Y3VtYmVyRXZlbnRMaXN0ZW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAoZXZlbnRCcm9hZGNhc3Rlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcclxuICAgICAgICB0aGlzLmdoZXJraW5Eb2NFdmVudHMgPSBbXTtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkUGlja2xlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBpY2tsZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZXN0Q2FzZVByZXBhcmVkRXZlbnRzID0gW107XHJcbiAgICAgICAgLy8gYXR0YWNoRXZlbnRMb2dnZXIoZXZlbnRCcm9hZGNhc3RlcilcclxuXHJcbiAgICAgICAgZXZlbnRCcm9hZGNhc3RlclxyXG4gICAgICAgICAgICAub24oJ2doZXJraW4tZG9jdW1lbnQnLCB0aGlzLm9uR2hlcmtpbkRvY3VtZW50LmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigncGlja2xlLWFjY2VwdGVkJywgdGhpcy5vblBpY2tsZUFjY2VwdGVkLmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigndGVzdC1jYXNlLXByZXBhcmVkJywgdGhpcy5vblRlc3RDYXNlUHJlcGFyZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LWNhc2Utc3RhcnRlZCcsIHRoaXMub25UZXN0Q2FzZVN0YXJ0ZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LXN0ZXAtc3RhcnRlZCcsIHRoaXMub25UZXN0U3RlcFN0YXJ0ZWQuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgLm9uKCd0ZXN0LXN0ZXAtZmluaXNoZWQnLCB0aGlzLm9uVGVzdFN0ZXBGaW5pc2hlZC5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICAub24oJ3Rlc3QtY2FzZS1maW5pc2hlZCcsIHRoaXMub25UZXN0Q2FzZUZpbmlzaGVkLmJpbmQodGhpcykpXHJcbiAgICAgICAgICAgIC5vbigndGVzdC1ydW4tc3RhcnRlZCcsIHRoaXMub25UZXN0UnVuU3RhcnRlZC5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICAub24oJ3Rlc3QtcnVuLWZpbmlzaGVkJywgdGhpcy5vblRlc3RSdW5GaW5pc2hlZC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnaGVya2luRG9jRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgdXJpOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgZG9jdW1lbnQ6IHtcclxuICAgIC8vICAgICAgICAgdHlwZTogJ0doZXJraW5Eb2N1bWVudCcsXHJcbiAgICAvLyAgICAgICAgIGZlYXR1cmU6IHtcclxuICAgIC8vICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcclxuICAgIC8vICAgICAgICAgICAgIHRhZ3M6IFt7IG5hbWU6IHN0cmluZyB9XSxcclxuICAgIC8vICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcclxuICAgIC8vICAgICAgICAgICAgIGtleXdvcmQ6ICdGZWF0dXJlJyxcclxuICAgIC8vICAgICAgICAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgIC8vICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogW3tcclxuICAgIC8vICAgICAgICAgICAgICAgICB0eXBlOiAnU2NlbmFyaW8nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRhZ3M6IFtdLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdTY2VuYXJpbycsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHN0ZXBzOiBbe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RlcCcsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnR2l2ZW4nIHwgJ1doZW4nIHwgJ1RoZW4nLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XVxyXG4gICAgLy8gICAgICAgICAgICAgfV1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgY29tbWVudHM6IFt7XHJcbiAgICAvLyAgICAgICAgIHR5cGU6ICdDb21tZW50JyxcclxuICAgIC8vICAgICAgICAgbG9jYXRpb246IHsgbGluZTogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgICAgIHRleHQ6IHN0cmluZ1xyXG4gICAgLy8gICAgIH1dXHJcbiAgICAvLyB9XHJcbiAgICBvbkdoZXJraW5Eb2N1bWVudCAoZ2hlcmtpbkRvY0V2ZW50KSB7XHJcbiAgICAgICAgLy8gZW1pdCAnZmVhdHVyZTphZnRlcicgZXZlbnQgYmVmb3JlIHRoZSBuZXh0IGZlYXR1cmUgaXMgcHJvY2VlZGVkXHJcbiAgICAgICAgLyppZiAodGhpcy5jdXJyZW50RmVhdHVyZSkge1xyXG4gICAgICAgICAgICAvL2NvbnN0IGdoZXJraW5Eb2NFdmVudCA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5wb3AoKSAvLyBzZWUgLnB1c2goKSBpbiBgaGFuZGxlQmVmb3JlRmVhdHVyZSgpYFxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2ZlYXR1cmU6YWZ0ZXInLCB0aGlzLmN1cnJlbnRGZWF0dXJlVXJpLCB0aGlzLmN1cnJlbnRGZWF0dXJlKVxyXG4gICAgICAgIH0qL1xyXG5cclxuICAgICAgICB0aGlzLmdoZXJraW5Eb2NFdmVudHMucHVzaChnaGVya2luRG9jRXZlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCB1cmkgPSBnaGVya2luRG9jRXZlbnQudXJpO1xyXG4gICAgICAgIGNvbnN0IGRvYyA9IGdoZXJraW5Eb2NFdmVudC5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBmZWF0dXJlID0gZG9jLmZlYXR1cmU7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdCgnZmVhdHVyZTpyZWFkeScsIHVyaSwgZmVhdHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGlja2xlRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgdXJpOiBzdHJpbmcsXHJcbiAgICAvLyAgICAgcGlja2xlOiB7XHJcbiAgICAvLyAgICAgICAgIHRhZ3M6IFt7IG5hbWU6IHN0cmluZyB9XSxcclxuICAgIC8vICAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgLy8gICAgICAgICBsb2NhdGlvbnM6IFt7IGxpbmU6IDAsIGNvbHVtbjogMCB9XSxcclxuICAgIC8vICAgICAgICAgc3RlcHM6IFt7XHJcbiAgICAvLyAgICAgICAgICAgICBsb2NhdGlvbnM6IFt7IGxpbmU6IDAsIGNvbHVtbjogMCB9XSxcclxuICAgIC8vICAgICAgICAgICAgIGtleXdvcmQ6ICdHaXZlbicgfCAnV2hlbicgfCAnVGhlbicsXHJcbiAgICAvLyAgICAgICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgfV1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICBvblBpY2tsZUFjY2VwdGVkIChwaWNrbGVFdmVudCkge1xyXG4gICAgICAgIC8vIGJlY2F1c2UgJ3BpY2tsZS1hY2NlcHRlZCcgZXZlbnRzIGFyZSBlbWl0dGVkIHRvZ2V0aGVyIGluIGZvckVhY2ggbG9vcFxyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRQaWNrbGVzLnB1c2gocGlja2xlRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3RDYXNlU3RhcnRlZEV2ZW50ID0ge1xyXG4gICAgLy8gICAgIHNvdXJjZUxvY2F0aW9uOiB7IHVyaTogc3RyaW5nLCBsaW5lOiAwIH1cclxuICAgIC8vIH1cclxuICAgIG9uVGVzdENhc2VTdGFydGVkICh0ZXN0Q2FzZVN0YXJ0ZWRFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IHBpY2tsZUV2ZW50ID0gdGhpcy5hY2NlcHRlZFBpY2tsZXMuc2hpZnQoKTtcclxuICAgICAgICBjb25zdCB1cmkgPSBwaWNrbGVFdmVudC51cmk7XHJcbiAgICAgICAgY29uc3QgZG9jID0gdGhpcy5naGVya2luRG9jRXZlbnRzLmZpbmQoZ2RlID0+IGdkZS51cmkgPT09IHVyaSkuZG9jdW1lbnQ7XHJcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGRvYy5mZWF0dXJlO1xyXG4gICAgICAgIGNvbnN0IHNjZW5hcmlvID0gcGlja2xlRXZlbnQucGlja2xlO1xyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRQaWNrbGUgPSBzY2VuYXJpbztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZlYXR1cmVVcmkgJiYgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSAhPT0gdXJpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmVhdHVyZTphZnRlcicsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlVXJpID0gdXJpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmJlZm9yZScsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdGhpcy5jdXJyZW50RmVhdHVyZSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSA9IHVyaTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmJlZm9yZScsIHRoaXMuY3VycmVudEZlYXR1cmVVcmksIHRoaXMuY3VycmVudEZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzY2VuYXJpbzpiZWZvcmUnLCB1cmksIGZlYXR1cmUsIHNjZW5hcmlvKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXN0U3RlcFN0YXJ0ZWRFdmVudCA9IHtcclxuICAgIC8vICAgICBpbmRleDogMCxcclxuICAgIC8vICAgICB0ZXN0Q2FzZToge1xyXG4gICAgLy8gICAgICAgICBzb3VyY2VMb2NhdGlvbjogeyB1cmk6IHN0cmluZywgbGluZTogMCB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0U3RlcFN0YXJ0ZWQgKHRlc3RTdGVwU3RhcnRlZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0U3RlcFN0YXJ0ZWRFdmVudC50ZXN0Q2FzZS5zb3VyY2VMb2NhdGlvbjtcclxuICAgICAgICBjb25zdCB1cmkgPSBzb3VyY2VMb2NhdGlvbi51cmk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5maW5kKGdkZSA9PiBnZGUudXJpID09PSB1cmkpLmRvY3VtZW50O1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBkb2MuZmVhdHVyZTtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGZlYXR1cmUuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNvbXBhcmVTY2VuYXJpb0xpbmVXaXRoU291cmNlTGluZShjaGlsZCwgc291cmNlTG9jYXRpb24pKTtcclxuICAgICAgICBjb25zdCBzdGVwID0gZ2V0U3RlcEZyb21GZWF0dXJlKGZlYXR1cmUsIHRoaXMuY3VycmVudFBpY2tsZSwgdGVzdFN0ZXBTdGFydGVkRXZlbnQuaW5kZXgsIHNvdXJjZUxvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmJlZm9yZScsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHNvdXJjZUxvY2F0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQgPSB7XHJcbiAgICAvLyAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gICAgIHN0ZXBzOiBbXHJcbiAgICAvLyAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgIGFjdGlvbkxvY2F0aW9uOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdXJpOiBzdHJpbmdcclxuICAgIC8vICAgICAgICAgICAgICAgICBsaW5lOiAwXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICBdXHJcbiAgICAvLyB9XHJcbiAgICBvblRlc3RDYXNlUHJlcGFyZWQgKHRlc3RDYXNlUHJlcGFyZWRFdmVudCkge1xyXG4gICAgICAgIHRoaXMudGVzdENhc2VQcmVwYXJlZEV2ZW50cy5wdXNoKHRlc3RDYXNlUHJlcGFyZWRFdmVudCk7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQuc291cmNlTG9jYXRpb247XHJcbiAgICAgICAgY29uc3QgdXJpID0gc291cmNlTG9jYXRpb24udXJpO1xyXG5cclxuICAgICAgICBjb25zdCBkb2MgPSB0aGlzLmdoZXJraW5Eb2NFdmVudHMuZmluZChnZGUgPT4gZ2RlLnVyaSA9PT0gdXJpKS5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGRvYy5mZWF0dXJlLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5hcmlvSGFzSG9va3MgPSBzY2VuYXJpby5zdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAudHlwZSA9PT0gJ0hvb2snKS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGlmIChzY2VuYXJpb0hhc0hvb2tzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3RlcHMgPSB0ZXN0Q2FzZVByZXBhcmVkRXZlbnQuc3RlcHM7XHJcbiAgICAgICAgYWxsU3RlcHMuZm9yRWFjaCgoc3RlcCwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc3RlcC5zb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zb3VyY2VMb2NhdGlvbiA9IHsgbGluZTogc3RlcC5hY3Rpb25Mb2NhdGlvbi5saW5lLCBjb2x1bW46IDAsIHVyaTogc3RlcC5hY3Rpb25Mb2NhdGlvbi51cmkgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhvb2sgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0hvb2snLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBzdGVwLnNvdXJjZUxvY2F0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdIb29rJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHNjZW5hcmlvLnN0ZXBzLnNwbGljZShpZHgsIDAsIGhvb2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGVzdFN0ZXBGaW5pc2hlZEV2ZW50ID0ge1xyXG4gICAgLy8gICAgIGluZGV4OiAwLFxyXG4gICAgLy8gICAgIHJlc3VsdDogeyBkdXJhdGlvbjogMCwgc3RhdHVzOiBzdHJpbmcsIGV4Y2VwdGlvbj86IEVycm9yIH0sXHJcbiAgICAvLyAgICAgdGVzdENhc2U6IHtcclxuICAgIC8vICAgICAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuICAgIG9uVGVzdFN0ZXBGaW5pc2hlZCAodGVzdFN0ZXBGaW5pc2hlZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB0ZXN0U3RlcEZpbmlzaGVkRXZlbnQudGVzdENhc2Uuc291cmNlTG9jYXRpb247XHJcbiAgICAgICAgY29uc3QgdXJpID0gc291cmNlTG9jYXRpb24udXJpO1xyXG5cclxuICAgICAgICBjb25zdCBkb2MgPSB0aGlzLmdoZXJraW5Eb2NFdmVudHMuZmluZChnZGUgPT4gZ2RlLnVyaSA9PT0gdXJpKS5kb2N1bWVudDtcclxuICAgICAgICBjb25zdCBmZWF0dXJlID0gZG9jLmZlYXR1cmU7XHJcbiAgICAgICAgY29uc3Qgc2NlbmFyaW8gPSBmZWF0dXJlLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSk7XHJcbiAgICAgICAgY29uc3Qgc3RlcCA9IGdldFN0ZXBGcm9tRmVhdHVyZShmZWF0dXJlLCB0aGlzLmN1cnJlbnRQaWNrbGUsIHRlc3RTdGVwRmluaXNoZWRFdmVudC5pbmRleCwgc291cmNlTG9jYXRpb24pO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RTdGVwRmluaXNoZWRFdmVudC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdCgnc3RlcDphZnRlcicsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHJlc3VsdCwgc291cmNlTG9jYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3RDYXNlRmluaXNoZWRFdmVudCA9IHtcclxuICAgIC8vICAgICByZXN1bHQ6IHsgZHVyYXRpb246IDAsIHN0YXR1czogc3RyaW5nIH0sXHJcbiAgICAvLyAgICAgc291cmNlTG9jYXRpb246IHsgdXJpOiBzdHJpbmcsIGxpbmU6IDAgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0Q2FzZUZpbmlzaGVkICh0ZXN0Q2FzZUZpbmlzaGVkRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBzb3VyY2VMb2NhdGlvbiA9IHRlc3RDYXNlRmluaXNoZWRFdmVudC5zb3VyY2VMb2NhdGlvbjtcclxuICAgICAgICBjb25zdCB1cmkgPSBzb3VyY2VMb2NhdGlvbi51cmk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZ2hlcmtpbkRvY0V2ZW50cy5maW5kKGdkZSA9PiBnZGUudXJpID09PSB1cmkpLmRvY3VtZW50O1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBkb2MuZmVhdHVyZTtcclxuICAgICAgICBjb25zdCBzY2VuYXJpbyA9IGZlYXR1cmUuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNvbXBhcmVTY2VuYXJpb0xpbmVXaXRoU291cmNlTGluZShjaGlsZCwgc291cmNlTG9jYXRpb24pKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzY2VuYXJpbzphZnRlcicsIHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHNvdXJjZUxvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGlja2xlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblRlc3RSdW5TdGFydGVkICh0ZXN0UnVuU3RhcnRlZEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0OnN0YXJ0Jyk7XHJcbiAgICB9XHJcbiAgICAvLyB0ZXN0UnVuRmluaXNoZWRFdmVudCA9IHtcclxuICAgIC8vICAgICByZXN1bHQ6IHsgZHVyYXRpb246IDQwMDQsIHN1Y2Nlc3M6IHRydWUgfVxyXG4gICAgLy8gfVxyXG4gICAgb25UZXN0UnVuRmluaXNoZWQgKHRlc3RSdW5GaW5pc2hlZEV2ZW50KSB7XHJcbiAgICAgICAgLy8gZW1pdCAnZmVhdHVyZTphZnRlcicgZXZlbnQgYmVmb3JlIHRoZSBuZXh0IGZlYXR1cmUgaXMgcHJvY2VlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZlYXR1cmUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmZWF0dXJlOmFmdGVyJywgdGhpcy5jdXJyZW50RmVhdHVyZVVyaSwgdGhpcy5jdXJyZW50RmVhdHVyZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZlYXR1cmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0OmVuZCcsIHRlc3RSdW5GaW5pc2hlZEV2ZW50LnJlc3VsdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG5mdW5jdGlvbiBhdHRhY2hFdmVudExvZ2dlciAoZXZlbnRCcm9hZGNhc3Rlcikge1xyXG4gICAgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlZFxyXG4gICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY3VjdW1iZXIvY3VjdW1iZXItanMvYmxvYi92NC4xLjAvc3JjL2Zvcm1hdHRlci9ldmVudF9wcm90b2NvbF9mb3JtYXR0ZXIuanNcclxuICAgIGNvbnN0IEVWRU5UUyA9IFtcclxuICAgICAgICAnc291cmNlJyxcclxuICAgICAgICAnYXR0YWNobWVudCcsXHJcbiAgICAgICAgJ2doZXJraW4tZG9jdW1lbnQnLFxyXG4gICAgICAgICdwaWNrbGUnLFxyXG4gICAgICAgICdwaWNrbGUtYWNjZXB0ZWQnLFxyXG4gICAgICAgICdwaWNrbGUtcmVqZWN0ZWQnLFxyXG4gICAgICAgICd0ZXN0LXJ1bi1zdGFydGVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLXByZXBhcmVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLXN0YXJ0ZWQnLFxyXG4gICAgICAgICd0ZXN0LXN0ZXAtc3RhcnRlZCcsXHJcbiAgICAgICAgJ3Rlc3Qtc3RlcC1hdHRhY2htZW50JyxcclxuICAgICAgICAndGVzdC1zdGVwLWZpbmlzaGVkJyxcclxuICAgICAgICAndGVzdC1jYXNlLWZpbmlzaGVkJyxcclxuICAgICAgICAndGVzdC1ydW4tZmluaXNoZWQnXHJcbiAgICBdO1xyXG4gICAgRVZFTlRTLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgZXZlbnRCcm9hZGNhc3Rlci5vbihlLCB4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1xcbi0tLS0tJyArIGUgKyAnIC0tLS0tXFxuJyArIEpTT04uc3RyaW5naWZ5KHgsIG51bGwsIDIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVNjZW5hcmlvTGluZVdpdGhTb3VyY2VMaW5lIChzY2VuYXJpbywgc291cmNlTG9jYXRpb24pIHtcclxuICAgIGlmIChzY2VuYXJpby50eXBlLmluZGV4T2YoJ1NjZW5hcmlvT3V0bGluZScpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gc2NlbmFyaW8uZXhhbXBsZXMuc29tZSgoZXhhbXBsZSkgPT4gZXhhbXBsZS50YWJsZUJvZHkuc29tZSgodGFibGVFbnRyeSkgPT4gdGFibGVFbnRyeS5sb2NhdGlvbi5saW5lID09PSBzb3VyY2VMb2NhdGlvbi5saW5lKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzY2VuYXJpby5sb2NhdGlvbi5saW5lID09PSBzb3VyY2VMb2NhdGlvbi5saW5lO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZyb21GZWF0dXJlIChmZWF0dXJlLCBwaWNrbGUsIHN0ZXBJbmRleCwgc291cmNlTG9jYXRpb24pIHtcclxuICAgIGxldCBjb21iaW5lZFN0ZXBzID0gW107XHJcbiAgICBmZWF0dXJlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUuaW5kZXhPZignU2NlbmFyaW8nKSA+IC0xICYmICFjb21wYXJlU2NlbmFyaW9MaW5lV2l0aFNvdXJjZUxpbmUoY2hpbGQsIHNvdXJjZUxvY2F0aW9uKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbWJpbmVkU3RlcHMgPSBjb21iaW5lZFN0ZXBzLmNvbmNhdChjaGlsZC5zdGVwcyk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHRhcmdldFN0ZXAgPSBjb21iaW5lZFN0ZXBzW3N0ZXBJbmRleF07XHJcblxyXG4gICAgaWYgKHRhcmdldFN0ZXAudHlwZSA9PT0gJ1N0ZXAnKSB7XHJcbiAgICAgICAgY29uc3Qgc3RlcExpbmUgPSB0YXJnZXRTdGVwLmxvY2F0aW9uLmxpbmU7XHJcbiAgICAgICAgY29uc3QgcGlja2xlU3RlcCA9IHBpY2tsZS5zdGVwcy5maW5kKHMgPT4gcy5sb2NhdGlvbnMuc29tZShsb2MgPT4gbG9jLmxpbmUgPT09IHN0ZXBMaW5lKSk7XHJcblxyXG4gICAgICAgIGlmIChwaWNrbGVTdGVwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRhcmdldFN0ZXAsIHRleHQ6IHBpY2tsZVN0ZXAudGV4dCB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0U3RlcDtcclxufVxyXG4iXX0=
@@ -4,14 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  var _suiteResult = _interopRequireDefault(require("../../model/suite-result"));
11
+
9
12
  var _caseResult = _interopRequireDefault(require("../../model/case-result"));
13
+
10
14
  var _stepResult = _interopRequireDefault(require("../../model/step-result"));
15
+
11
16
  var _status = _interopRequireDefault(require("../../model/status"));
17
+
12
18
  var _util = _interopRequireDefault(require("../../lib/util"));
19
+
13
20
  var _helper = _interopRequireDefault(require("../../errors/helper"));
21
+
14
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
15
24
  class CucumberReporter {
16
25
  constructor(runnerId, options, cucumberEventListener, oxygenEventListener, reportDispatcher, testHooks) {
17
26
  this.runnerId = runnerId;
@@ -35,6 +44,7 @@ class CucumberReporter {
35
44
  this.testHooks = testHooks;
36
45
  this.hookEvents();
37
46
  }
47
+
38
48
  hookEvents() {
39
49
  this.cucumberEventListener.on('feature:before', this.onBeforeFeature);
40
50
  this.cucumberEventListener.on('feature:after', this.onAfterFeature);
@@ -47,20 +57,25 @@ class CucumberReporter {
47
57
  this.oxygenEventListener.on('command:after', this.onAfterOxygenCommand);
48
58
  this.oxygenEventListener.on('log', this.onOxygenLog);
49
59
  }
60
+
50
61
  onBeforeOxygenCommand(e) {}
62
+
51
63
  onAfterOxygenCommand(e) {
52
64
  if (this.currentStep && e.result) {
53
65
  if (!this.currentStep.steps) {
54
66
  this.currentStep.steps = [];
55
67
  }
68
+
56
69
  this.currentStep.steps.push(e.result);
57
70
  }
58
71
  }
72
+
59
73
  onOxygenLog(log) {
60
74
  if (this.currentCase) {
61
75
  if (!this.currentCase.logs) {
62
76
  this.currentCase.logs = [];
63
77
  }
78
+
64
79
  this.currentCase.logs.push({
65
80
  time: log.time,
66
81
  level: log.level.toUpperCase(),
@@ -68,10 +83,12 @@ class CucumberReporter {
68
83
  src: log.src
69
84
  });
70
85
  }
86
+
71
87
  if (this.reportDispatcher.onLogEntry && typeof this.reportDispatcher.onLogEntry === 'function') {
72
88
  this.reportDispatcher.onLogEntry(log.time, log.level, log.message, log.src);
73
89
  }
74
90
  }
91
+
75
92
  onBeforeFeature(uri, feature) {
76
93
  const location = `${uri}:${feature.location.line}`;
77
94
  const suiteResult = this.suites[location] = new _suiteResult.default();
@@ -79,29 +96,37 @@ class CucumberReporter {
79
96
  suiteResult.tags = this.simplifyCucumberTags(feature.tags);
80
97
  suiteResult.location = location;
81
98
  suiteResult.startTime = _util.default.getTimeStamp();
99
+
82
100
  if (typeof this.testHooks.beforeSuite === 'function') {
83
101
  this.testHooks.beforeSuite(this.runnerId, suiteResult);
84
102
  }
103
+
85
104
  if (this.reportDispatcher.onSuiteStart && typeof this.reportDispatcher.onSuiteStart === 'function') {
86
105
  this.reportDispatcher.onSuiteStart(this.runnerId, uri, suiteResult);
87
106
  }
88
107
  }
108
+
89
109
  onAfterFeature(uri, feature) {
90
110
  const location = `${uri}:${feature.location.line}`;
91
111
  const suiteResult = this.suites[location];
112
+
92
113
  if (!suiteResult) {
93
114
  return;
94
115
  }
116
+
95
117
  suiteResult.endTime = _util.default.getTimeStamp();
96
118
  suiteResult.duration = suiteResult.endTime - suiteResult.startTime;
97
119
  suiteResult.status = this.determineSuiteStatus(suiteResult);
120
+
98
121
  if (typeof this.testHooks.afterSuite === 'function') {
99
122
  this.testHooks.afterSuite(this.runnerId, suiteResult);
100
123
  }
124
+
101
125
  if (this.reportDispatcher.onSuiteEnd && typeof this.reportDispatcher.onSuiteEnd === 'function') {
102
126
  this.reportDispatcher.onSuiteEnd(this.runnerId, uri, suiteResult);
103
127
  }
104
128
  }
129
+
105
130
  async onBeforeScenario(uri, feature, scenario) {
106
131
  const suiteId = `${uri}:${feature.location.line}`;
107
132
  const caseLocation = scenario.locations.length > 0 ? scenario.locations[0] : {
@@ -116,40 +141,50 @@ class CucumberReporter {
116
141
  caseResult.location = caseId;
117
142
  caseResult.startTime = _util.default.getTimeStamp();
118
143
  cases.push(caseResult);
144
+
119
145
  if (typeof this.oxygenEventListener.onBeforeCase === 'function') {
120
146
  await this.oxygenEventListener.onBeforeCase();
121
147
  }
148
+
122
149
  if (typeof this.testHooks.beforeCase === 'function') {
123
150
  this.testHooks.beforeCase(this.runnerId, scenario);
124
151
  }
152
+
125
153
  if (this.reportDispatcher.onCaseStart && typeof this.reportDispatcher.onCaseStart === 'function') {
126
154
  this.reportDispatcher.onCaseStart(this.runnerId, uri, caseId, scenario);
127
155
  }
128
156
  }
157
+
129
158
  async onAfterScenario(uri, feature, scenario, sourceLocation) {
130
159
  const suiteId = `${uri}:${feature.location.line}`;
131
160
  const caseId = `${uri}:${sourceLocation.line}`;
132
161
  const suiteResult = this.suites[suiteId];
133
162
  const cases = suiteResult.cases;
134
163
  const caseResult = cases.find(x => x.location === caseId);
164
+
135
165
  if (!caseResult) {
136
166
  return;
137
167
  }
168
+
138
169
  caseResult.endTime = _util.default.getTimeStamp();
139
170
  caseResult.duration = caseResult.endTime - caseResult.startTime;
140
171
  caseResult.status = this.determineCaseStatus(caseResult);
141
172
  caseResult.logs = this.oxygenEventListener.resultStore && this.oxygenEventListener.resultStore.logs ? this.oxygenEventListener.resultStore.logs : [];
142
173
  caseResult.har = this.oxygenEventListener.resultStore && this.oxygenEventListener.resultStore.har ? this.oxygenEventListener.resultStore.har : null;
174
+
143
175
  if (typeof this.oxygenEventListener.onAfterCase === 'function') {
144
176
  await this.oxygenEventListener.onAfterCase();
145
177
  }
178
+
146
179
  if (typeof this.testHooks.afterCase === 'function') {
147
180
  this.testHooks.afterCase(this.runnerId, caseResult);
148
181
  }
182
+
149
183
  if (this.reportDispatcher.onCaseEnd && typeof this.reportDispatcher.onCaseEnd === 'function') {
150
184
  this.reportDispatcher.onCaseEnd(this.runnerId, uri, caseId, caseResult);
151
185
  }
152
186
  }
187
+
153
188
  onBeforeStep(uri, feature, scenario, step, sourceLocation) {
154
189
  const suiteId = `${uri}:${feature.location.line}`;
155
190
  const caseId = `${uri}:${sourceLocation.line}`;
@@ -161,13 +196,16 @@ class CucumberReporter {
161
196
  stepResult.name = step.text;
162
197
  stepResult.startTime = _util.default.getTimeStamp();
163
198
  stepResult.location = `${uri}:${step.location.line}`;
199
+
164
200
  if (typeof this.testHooks.beforeStep === 'function') {
165
201
  this.testHooks.beforeStep(this.runnerId, step);
166
202
  }
203
+
167
204
  if (this.reportDispatcher.onStepStart && typeof this.reportDispatcher.onStepStart === 'function') {
168
205
  this.reportDispatcher.onStepStart(this.runnerId, stepResult);
169
206
  }
170
207
  }
208
+
171
209
  onAfterStep(uri, feature, scenario, step, result, sourceLocation) {
172
210
  const suiteId = `${uri}:${feature.location.line}`;
173
211
  const caseId = `${uri}:${sourceLocation.line}`;
@@ -179,44 +217,61 @@ class CucumberReporter {
179
217
  stepResult.endTime = _util.default.getTimeStamp();
180
218
  stepResult.duration = stepResult.endTime - stepResult.startTime;
181
219
  stepResult.status = result.status;
220
+
182
221
  if (result.exception) {
183
222
  stepResult.failure = _helper.default.getFailureFromError(result.exception);
223
+
184
224
  if (this.currentStep && this.currentStep.location) {
185
225
  stepResult.failure.cucumberLocation = this.currentStep.location;
186
226
  }
187
227
  }
228
+
188
229
  if (typeof this.testHooks.afterStep === 'function') {
189
230
  this.testHooks.afterStep(this.runnerId, stepResult, result.exception);
190
231
  }
232
+
191
233
  if (this.reportDispatcher.onStepEnd && typeof this.reportDispatcher.onStepEnd === 'function') {
192
234
  this.reportDispatcher.onStepEnd(this.runnerId, stepResult);
193
235
  }
194
236
  }
237
+
195
238
  onTestEnd(result) {}
239
+
196
240
  determineCaseStatus(caseResult) {
197
241
  const hasFailedStep = caseResult.steps.some(x => x.status === _status.default.FAILED);
242
+
198
243
  if (hasFailedStep) {
199
244
  return _status.default.FAILED;
200
245
  }
246
+
201
247
  return _status.default.PASSED;
202
248
  }
249
+
203
250
  determineSuiteStatus(suiteResult) {
204
251
  const hasFailedCase = suiteResult.cases.some(x => x.status === _status.default.FAILED);
252
+
205
253
  if (hasFailedCase) {
206
254
  return _status.default.FAILED;
207
255
  }
256
+
208
257
  return _status.default.PASSED;
209
258
  }
259
+
210
260
  simplifyCucumberTags(tags) {
211
261
  if (!Array.isArray(tags) || tags.length == 0) {
212
262
  return tags;
213
263
  }
264
+
214
265
  const simpleTags = [];
266
+
215
267
  for (let tag of tags) {
216
268
  simpleTags.push(tag.name);
217
269
  }
270
+
218
271
  return simpleTags;
219
272
  }
273
+
220
274
  }
275
+
221
276
  exports.default = CucumberReporter;
222
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDdWN1bWJlclJlcG9ydGVyIiwiY29uc3RydWN0b3IiLCJydW5uZXJJZCIsIm9wdGlvbnMiLCJjdWN1bWJlckV2ZW50TGlzdGVuZXIiLCJveHlnZW5FdmVudExpc3RlbmVyIiwicmVwb3J0RGlzcGF0Y2hlciIsInRlc3RIb29rcyIsInN1aXRlcyIsImN1cnJlbnRTdGVwIiwiY3VycmVudENhc2UiLCJvbkJlZm9yZUZlYXR1cmUiLCJiaW5kIiwib25BZnRlckZlYXR1cmUiLCJvbkJlZm9yZVNjZW5hcmlvIiwib25BZnRlclNjZW5hcmlvIiwib25CZWZvcmVTdGVwIiwib25BZnRlclN0ZXAiLCJvblRlc3RFbmQiLCJvbkJlZm9yZU94eWdlbkNvbW1hbmQiLCJvbkFmdGVyT3h5Z2VuQ29tbWFuZCIsIm9uT3h5Z2VuTG9nIiwiaG9va0V2ZW50cyIsIm9uIiwiZSIsInJlc3VsdCIsInN0ZXBzIiwicHVzaCIsImxvZyIsImxvZ3MiLCJ0aW1lIiwibGV2ZWwiLCJ0b1VwcGVyQ2FzZSIsIm1zZyIsIm1lc3NhZ2UiLCJzcmMiLCJvbkxvZ0VudHJ5IiwidXJpIiwiZmVhdHVyZSIsImxvY2F0aW9uIiwibGluZSIsInN1aXRlUmVzdWx0IiwiVGVzdFN1aXRlUmVzdWx0IiwibmFtZSIsInRhZ3MiLCJzaW1wbGlmeUN1Y3VtYmVyVGFncyIsInN0YXJ0VGltZSIsIm94dXRpbCIsImdldFRpbWVTdGFtcCIsImJlZm9yZVN1aXRlIiwib25TdWl0ZVN0YXJ0IiwiZW5kVGltZSIsImR1cmF0aW9uIiwic3RhdHVzIiwiZGV0ZXJtaW5lU3VpdGVTdGF0dXMiLCJhZnRlclN1aXRlIiwib25TdWl0ZUVuZCIsInNjZW5hcmlvIiwic3VpdGVJZCIsImNhc2VMb2NhdGlvbiIsImxvY2F0aW9ucyIsImxlbmd0aCIsImNhc2VJZCIsImNhc2VzIiwiY2FzZVJlc3VsdCIsIlRlc3RDYXNlUmVzdWx0Iiwib25CZWZvcmVDYXNlIiwiYmVmb3JlQ2FzZSIsIm9uQ2FzZVN0YXJ0Iiwic291cmNlTG9jYXRpb24iLCJmaW5kIiwieCIsImRldGVybWluZUNhc2VTdGF0dXMiLCJyZXN1bHRTdG9yZSIsImhhciIsIm9uQWZ0ZXJDYXNlIiwiYWZ0ZXJDYXNlIiwib25DYXNlRW5kIiwic3RlcCIsInN0ZXBSZXN1bHQiLCJUZXN0U3RlcFJlc3VsdCIsInRleHQiLCJiZWZvcmVTdGVwIiwib25TdGVwU3RhcnQiLCJzdGVwTG9jYXRpb24iLCJleGNlcHRpb24iLCJmYWlsdXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiY3VjdW1iZXJMb2NhdGlvbiIsImFmdGVyU3RlcCIsIm9uU3RlcEVuZCIsImhhc0ZhaWxlZFN0ZXAiLCJzb21lIiwiU3RhdHVzIiwiRkFJTEVEIiwiUEFTU0VEIiwiaGFzRmFpbGVkQ2FzZSIsIkFycmF5IiwiaXNBcnJheSIsInNpbXBsZVRhZ3MiLCJ0YWciXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVubmVycy9jdWN1bWJlci9DdWN1bWJlclJlcG9ydGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXN0U3VpdGVSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvc3VpdGUtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RDYXNlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL2Nhc2UtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RTdGVwUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi8uLi9tb2RlbC9zdGF0dXMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uLy4uL2Vycm9ycy9oZWxwZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VjdW1iZXJSZXBvcnRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihydW5uZXJJZCwgb3B0aW9ucywgY3VjdW1iZXJFdmVudExpc3RlbmVyLCBveHlnZW5FdmVudExpc3RlbmVyLCByZXBvcnREaXNwYXRjaGVyLCB0ZXN0SG9va3MpIHtcclxuICAgICAgICB0aGlzLnJ1bm5lcklkID0gcnVubmVySWQ7XHJcbiAgICAgICAgdGhpcy5zdWl0ZXMgPSB7fTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYXNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lciA9IGN1Y3VtYmVyRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIgPSBveHlnZW5FdmVudExpc3RlbmVyO1xyXG4gICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlciA9IHJlcG9ydERpc3BhdGNoZXI7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZUZlYXR1cmUgPSB0aGlzLm9uQmVmb3JlRmVhdHVyZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlckZlYXR1cmUgPSB0aGlzLm9uQWZ0ZXJGZWF0dXJlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZVNjZW5hcmlvID0gdGhpcy5vbkJlZm9yZVNjZW5hcmlvLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyU2NlbmFyaW8gPSB0aGlzLm9uQWZ0ZXJTY2VuYXJpby5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25CZWZvcmVTdGVwID0gdGhpcy5vbkJlZm9yZVN0ZXAuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJTdGVwID0gdGhpcy5vbkFmdGVyU3RlcC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25UZXN0RW5kID0gdGhpcy5vblRlc3RFbmQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQmVmb3JlT3h5Z2VuQ29tbWFuZCA9IHRoaXMub25CZWZvcmVPeHlnZW5Db21tYW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyT3h5Z2VuQ29tbWFuZCA9IHRoaXMub25BZnRlck94eWdlbkNvbW1hbmQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uT3h5Z2VuTG9nID0gdGhpcy5vbk94eWdlbkxvZy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRlc3RIb29rcyA9IHRlc3RIb29rcztcclxuXHJcbiAgICAgICAgdGhpcy5ob29rRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaG9va0V2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignZmVhdHVyZTpiZWZvcmUnLCB0aGlzLm9uQmVmb3JlRmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ2ZlYXR1cmU6YWZ0ZXInLCB0aGlzLm9uQWZ0ZXJGZWF0dXJlKTtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignc2NlbmFyaW86YmVmb3JlJywgdGhpcy5vbkJlZm9yZVNjZW5hcmlvKTtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignc2NlbmFyaW86YWZ0ZXInLCB0aGlzLm9uQWZ0ZXJTY2VuYXJpbyk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3N0ZXA6YmVmb3JlJywgdGhpcy5vbkJlZm9yZVN0ZXApO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdzdGVwOmFmdGVyJywgdGhpcy5vbkFmdGVyU3RlcCk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3Rlc3Q6ZW5kJywgdGhpcy5vblRlc3RFbmQpO1xyXG5cclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2NvbW1hbmQ6YmVmb3JlJywgdGhpcy5vbkJlZm9yZU94eWdlbkNvbW1hbmQpO1xyXG4gICAgICAgIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbignY29tbWFuZDphZnRlcicsIHRoaXMub25BZnRlck94eWdlbkNvbW1hbmQpO1xyXG4gICAgICAgIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbignbG9nJywgdGhpcy5vbk94eWdlbkxvZyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25CZWZvcmVPeHlnZW5Db21tYW5kKGUpIHtcclxuICAgIH1cclxuXHJcbiAgICBvbkFmdGVyT3h5Z2VuQ29tbWFuZChlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgJiYgZS5yZXN1bHQpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRTdGVwLnN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLnN0ZXBzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5zdGVwcy5wdXNoKGUucmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25PeHlnZW5Mb2cobG9nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENhc2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDYXNlLmxvZ3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhc2UubG9ncyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhc2UubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbC50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICAgICAgICAgICAgbXNnOiBsb2cubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogbG9nLnNyY1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkxvZ0VudHJ5ICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25Mb2dFbnRyeSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25Mb2dFbnRyeShsb2cudGltZSwgbG9nLmxldmVsLCBsb2cubWVzc2FnZSwgbG9nLnNyYyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlRmVhdHVyZSh1cmksIGZlYXR1cmUpIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW2xvY2F0aW9uXSA9IG5ldyBUZXN0U3VpdGVSZXN1bHQoKTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5uYW1lID0gZmVhdHVyZS5uYW1lO1xyXG4gICAgICAgIHN1aXRlUmVzdWx0LnRhZ3MgPSB0aGlzLnNpbXBsaWZ5Q3VjdW1iZXJUYWdzKGZlYXR1cmUudGFncyk7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN1aXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN1aXRlKHRoaXMucnVubmVySWQsIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3VpdGVTdGFydCh0aGlzLnJ1bm5lcklkLCB1cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG9uQWZ0ZXJGZWF0dXJlKHVyaSwgZmVhdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbbG9jYXRpb25dO1xyXG4gICAgICAgIGlmICghc3VpdGVSZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2RlbGV0ZSB0aGlzLnN1aXRlc1tsb2NhdGlvbl1cclxuICAgICAgICBzdWl0ZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHN1aXRlUmVzdWx0LmR1cmF0aW9uID0gc3VpdGVSZXN1bHQuZW5kVGltZSAtIHN1aXRlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSB0aGlzLmRldGVybWluZVN1aXRlU3RhdHVzKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5hZnRlclN1aXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmFmdGVyU3VpdGUodGhpcy5ydW5uZXJJZCwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHJlcG9ydCBnZW5lcmF0b3JcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3VpdGVFbmQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlRW5kID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlRW5kKHRoaXMucnVubmVySWQsIHVyaSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkJlZm9yZVNjZW5hcmlvKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZUlkID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IGNhc2VMb2NhdGlvbiA9IHNjZW5hcmlvLmxvY2F0aW9ucy5sZW5ndGggPiAwID8gc2NlbmFyaW8ubG9jYXRpb25zWzBdIDogeyBsaW5lOiAxIH07XHJcbiAgICAgICAgY29uc3QgY2FzZUlkID0gYCR7dXJpfToke2Nhc2VMb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBjYXNlcyA9IHN1aXRlUmVzdWx0LmNhc2VzO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSB0aGlzLmN1cnJlbnRDYXNlID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5uYW1lID0gc2NlbmFyaW8ubmFtZTtcclxuICAgICAgICBjYXNlUmVzdWx0LnRhZ3MgPSB0aGlzLnNpbXBsaWZ5Q3VjdW1iZXJUYWdzKHNjZW5hcmlvLnRhZ3MpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXNlSWQ7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgY2FzZXMucHVzaChjYXNlUmVzdWx0KTtcclxuXHJcbiAgICAgICAgLy8gY2FsbCBveHlnZW4gb25CZWZvcmVDYXNlIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkJlZm9yZUNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uQmVmb3JlQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYmVmb3JlQ2FzZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5iZWZvcmVDYXNlKHRoaXMucnVubmVySWQsIHNjZW5hcmlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VTdGFydCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZVN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VTdGFydCh0aGlzLnJ1bm5lcklkLCB1cmksIGNhc2VJZCwgc2NlbmFyaW8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkFmdGVyU2NlbmFyaW8odXJpLCBmZWF0dXJlLCBzY2VuYXJpbywgc291cmNlTG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZUlkID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtzb3VyY2VMb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBjYXNlcyA9IHN1aXRlUmVzdWx0LmNhc2VzO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBjYXNlcy5maW5kKHggPT4geC5sb2NhdGlvbiA9PT0gY2FzZUlkKTtcclxuICAgICAgICBpZiAoIWNhc2VSZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IGNhc2VSZXN1bHQuZW5kVGltZSAtIGNhc2VSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gdGhpcy5kZXRlcm1pbmVDYXNlU3RhdHVzKGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9ncyA9IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZSAmJiB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUubG9ncyA/IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZS5sb2dzIDogW107XHJcbiAgICAgICAgY2FzZVJlc3VsdC5oYXIgPSB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUgJiYgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlLmhhciA/IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZS5oYXIgOiBudWxsO1xyXG5cclxuICAgICAgICAvLyBjYWxsIG94eWdlbiBvbkFmdGVyQ2FzZSBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub25BZnRlckNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uQWZ0ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5hZnRlckNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYWZ0ZXJDYXNlKHRoaXMucnVubmVySWQsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHJlcG9ydCBnZW5lcmF0b3JcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZUVuZCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZUVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlRW5kKHRoaXMucnVubmVySWQsIHVyaSwgY2FzZUlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25CZWZvcmVTdGVwKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHNvdXJjZUxvY2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlSWQgPSBgJHt1cml9OiR7c291cmNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gY2FzZXMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IGNhc2VJZCk7XHJcbiAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IHRoaXMuY3VycmVudFN0ZXAgPSBuZXcgVGVzdFN0ZXBSZXN1bHQoKTtcclxuICAgICAgICBjYXNlUmVzdWx0LnN0ZXBzLnB1c2goc3RlcFJlc3VsdCk7XHJcblxyXG4gICAgICAgIHN0ZXBSZXN1bHQubmFtZSA9IHN0ZXAudGV4dDtcclxuICAgICAgICBzdGVwUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdGVwUmVzdWx0LmxvY2F0aW9uID0gYCR7dXJpfToke3N0ZXAubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN0ZXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYmVmb3JlU3RlcCh0aGlzLnJ1bm5lcklkLCBzdGVwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBTdGFydCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBTdGFydCh0aGlzLnJ1bm5lcklkLCBzdGVwUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25BZnRlclN0ZXAodXJpLCBmZWF0dXJlLCBzY2VuYXJpbywgc3RlcCwgcmVzdWx0LCBzb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSWQgPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3QgY2FzZUlkID0gYCR7dXJpfToke3NvdXJjZUxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW3N1aXRlSWRdO1xyXG4gICAgICAgIGNvbnN0IGNhc2VzID0gc3VpdGVSZXN1bHQuY2FzZXM7XHJcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IGNhc2VzLmZpbmQoeCA9PiB4LmxvY2F0aW9uID09PSBjYXNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBMb2NhdGlvbiA9IGAke3VyaX06JHtzdGVwLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdGVwUmVzdWx0ID0gY2FzZVJlc3VsdC5zdGVwcy5maW5kKHggPT4geC5sb2NhdGlvbiA9PT0gc3RlcExvY2F0aW9uKTtcclxuXHJcbiAgICAgICAgc3RlcFJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHN0ZXBSZXN1bHQuZHVyYXRpb24gPSBzdGVwUmVzdWx0LmVuZFRpbWUgLSBzdGVwUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICBzdGVwUmVzdWx0LnN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XHJcbiAgICAgICAgLy8gZ2V0IGZhaWx1cmUgZGV0YWlscyBpZiBlcnJvciB3YXMgdGhyb3duIGluIHRoZSBzdGVwXHJcbiAgICAgICAgaWYgKHJlc3VsdC5leGNlcHRpb24pIHtcclxuICAgICAgICAgICAgc3RlcFJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihyZXN1bHQuZXhjZXB0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgJiYgdGhpcy5jdXJyZW50U3RlcC5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5mYWlsdXJlLmN1Y3VtYmVyTG9jYXRpb24gPSB0aGlzLmN1cnJlbnRTdGVwLmxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmFmdGVyU3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5hZnRlclN0ZXAodGhpcy5ydW5uZXJJZCwgc3RlcFJlc3VsdCwgcmVzdWx0LmV4Y2VwdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwRW5kICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwRW5kID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBFbmQodGhpcy5ydW5uZXJJZCwgc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uVGVzdEVuZChyZXN1bHQpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZGV0ZXJtaW5lQ2FzZVN0YXR1cyhjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3RlcCA9IGNhc2VSZXN1bHQuc3RlcHMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICBpZiAoaGFzRmFpbGVkU3RlcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTRUQ7XHJcbiAgICB9XHJcblxyXG4gICAgZGV0ZXJtaW5lU3VpdGVTdGF0dXMoc3VpdGVSZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBoYXNGYWlsZWRDYXNlID0gc3VpdGVSZXN1bHQuY2FzZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICBpZiAoaGFzRmFpbGVkQ2FzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTRUQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVtb3ZlcyBhbGwgdW5uZWNlc3NhcnkgbWV0YWRhdGEgZnJvbSBDdWN1bWJlciB0YWdzLCByZXR1cm5pbmcgYSBzaW1wbGUgYXJyYXkgb2YgdGFnIG5hbWVzXHJcbiAgICBzaW1wbGlmeUN1Y3VtYmVyVGFncyh0YWdzKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ3MpIHx8IHRhZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRhZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNpbXBsZVRhZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCB0YWcgb2YgdGFncykge1xyXG4gICAgICAgICAgICBzaW1wbGVUYWdzLnB1c2godGFnLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2ltcGxlVGFncztcclxuICAgIH1cclxufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUE4QztBQUUvQixNQUFNQSxnQkFBZ0IsQ0FBQztFQUNsQ0MsV0FBVyxDQUFDQyxRQUFRLEVBQUVDLE9BQU8sRUFBRUMscUJBQXFCLEVBQUVDLG1CQUFtQixFQUFFQyxnQkFBZ0IsRUFBRUMsU0FBUyxFQUFFO0lBQ3BHLElBQUksQ0FBQ0wsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQ00sTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUNDLFdBQVcsR0FBRyxJQUFJO0lBQ3ZCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUk7SUFDdkIsSUFBSSxDQUFDTixxQkFBcUIsR0FBR0EscUJBQXFCO0lBQ2xELElBQUksQ0FBQ0MsbUJBQW1CLEdBQUdBLG1CQUFtQjtJQUM5QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHQSxnQkFBZ0I7SUFDeEMsSUFBSSxDQUFDSCxPQUFPLEdBQUdBLE9BQU87SUFFdEIsSUFBSSxDQUFDUSxlQUFlLEdBQUcsSUFBSSxDQUFDQSxlQUFlLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDdEQsSUFBSSxDQUFD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
277
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL0N1Y3VtYmVyUmVwb3J0ZXIuanMiXSwibmFtZXMiOlsiQ3VjdW1iZXJSZXBvcnRlciIsImNvbnN0cnVjdG9yIiwicnVubmVySWQiLCJvcHRpb25zIiwiY3VjdW1iZXJFdmVudExpc3RlbmVyIiwib3h5Z2VuRXZlbnRMaXN0ZW5lciIsInJlcG9ydERpc3BhdGNoZXIiLCJ0ZXN0SG9va3MiLCJzdWl0ZXMiLCJjdXJyZW50U3RlcCIsImN1cnJlbnRDYXNlIiwib25CZWZvcmVGZWF0dXJlIiwiYmluZCIsIm9uQWZ0ZXJGZWF0dXJlIiwib25CZWZvcmVTY2VuYXJpbyIsIm9uQWZ0ZXJTY2VuYXJpbyIsIm9uQmVmb3JlU3RlcCIsIm9uQWZ0ZXJTdGVwIiwib25UZXN0RW5kIiwib25CZWZvcmVPeHlnZW5Db21tYW5kIiwib25BZnRlck94eWdlbkNvbW1hbmQiLCJvbk94eWdlbkxvZyIsImhvb2tFdmVudHMiLCJvbiIsImUiLCJyZXN1bHQiLCJzdGVwcyIsInB1c2giLCJsb2ciLCJsb2dzIiwidGltZSIsImxldmVsIiwidG9VcHBlckNhc2UiLCJtc2ciLCJtZXNzYWdlIiwic3JjIiwib25Mb2dFbnRyeSIsInVyaSIsImZlYXR1cmUiLCJsb2NhdGlvbiIsImxpbmUiLCJzdWl0ZVJlc3VsdCIsIlRlc3RTdWl0ZVJlc3VsdCIsIm5hbWUiLCJ0YWdzIiwic2ltcGxpZnlDdWN1bWJlclRhZ3MiLCJzdGFydFRpbWUiLCJveHV0aWwiLCJnZXRUaW1lU3RhbXAiLCJiZWZvcmVTdWl0ZSIsIm9uU3VpdGVTdGFydCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInN0YXR1cyIsImRldGVybWluZVN1aXRlU3RhdHVzIiwiYWZ0ZXJTdWl0ZSIsIm9uU3VpdGVFbmQiLCJzY2VuYXJpbyIsInN1aXRlSWQiLCJjYXNlTG9jYXRpb24iLCJsb2NhdGlvbnMiLCJsZW5ndGgiLCJjYXNlSWQiLCJjYXNlcyIsImNhc2VSZXN1bHQiLCJUZXN0Q2FzZVJlc3VsdCIsIm9uQmVmb3JlQ2FzZSIsImJlZm9yZUNhc2UiLCJvbkNhc2VTdGFydCIsInNvdXJjZUxvY2F0aW9uIiwiZmluZCIsIngiLCJkZXRlcm1pbmVDYXNlU3RhdHVzIiwicmVzdWx0U3RvcmUiLCJoYXIiLCJvbkFmdGVyQ2FzZSIsImFmdGVyQ2FzZSIsIm9uQ2FzZUVuZCIsInN0ZXAiLCJzdGVwUmVzdWx0IiwiVGVzdFN0ZXBSZXN1bHQiLCJ0ZXh0IiwiYmVmb3JlU3RlcCIsIm9uU3RlcFN0YXJ0Iiwic3RlcExvY2F0aW9uIiwiZXhjZXB0aW9uIiwiZmFpbHVyZSIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsImN1Y3VtYmVyTG9jYXRpb24iLCJhZnRlclN0ZXAiLCJvblN0ZXBFbmQiLCJoYXNGYWlsZWRTdGVwIiwic29tZSIsIlN0YXR1cyIsIkZBSUxFRCIsIlBBU1NFRCIsImhhc0ZhaWxlZENhc2UiLCJBcnJheSIsImlzQXJyYXkiLCJzaW1wbGVUYWdzIiwidGFnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVlLE1BQU1BLGdCQUFOLENBQXVCO0FBQ2xDQyxFQUFBQSxXQUFXLENBQUNDLFFBQUQsRUFBV0MsT0FBWCxFQUFvQkMscUJBQXBCLEVBQTJDQyxtQkFBM0MsRUFBZ0VDLGdCQUFoRSxFQUFrRkMsU0FBbEYsRUFBNkY7QUFDcEcsU0FBS0wsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLTSxNQUFMLEdBQWMsRUFBZDtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsU0FBS04scUJBQUwsR0FBNkJBLHFCQUE3QjtBQUNBLFNBQUtDLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDQSxTQUFLQyxnQkFBTCxHQUF3QkEsZ0JBQXhCO0FBQ0EsU0FBS0gsT0FBTCxHQUFlQSxPQUFmO0FBRUEsU0FBS1EsZUFBTCxHQUF1QixLQUFLQSxlQUFMLENB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eEQsV0FBVyxDQUFDc0IsS0FBWixDQUFrQjhCLElBQWxCLENBQXVCdEIsQ0FBQyxJQUFJQSxDQUFDLENBQUNsQixNQUFGLEtBQWF5QyxnQkFBT0MsTUFBaEQsQ0FBdEI7O0FBQ0EsUUFBSUUsYUFBSixFQUFtQjtBQUNmLGFBQU9ILGdCQUFPQyxNQUFkO0FBQ0g7O0FBQ0QsV0FBT0QsZ0JBQU9FLE1BQWQ7QUFDSDs7QUFHRG5ELEVBQUFBLG9CQUFvQixDQUFDRCxJQUFELEVBQU87QUFDdkIsUUFBSSxDQUFDc0QsS0FBSyxDQUFDQyxPQUFOLENBQWN2RCxJQUFkLENBQUQsSUFBd0JBLElBQUksQ0FBQ2lCLE1BQUwsSUFBZSxDQUEzQyxFQUE4QztBQUMxQyxhQUFPakIsSUFBUDtBQUNIOztBQUNELFVBQU13RCxVQUFVLEdBQUcsRUFBbkI7O0FBQ0EsU0FBSyxJQUFJQyxHQUFULElBQWdCekQsSUFBaEIsRUFBc0I7QUFDbEJ3RCxNQUFBQSxVQUFVLENBQUN6RSxJQUFYLENBQWdCMEUsR0FBRyxDQUFDMUQsSUFBcEI7QUFDSDs7QUFDRCxXQUFPeUQsVUFBUDtBQUNIOztBQXhQaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0U3RlcFJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9zdGVwLXJlc3VsdCc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vLi4vbW9kZWwvc3RhdHVzJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi8uLi9saWIvdXRpbCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1Y3VtYmVyUmVwb3J0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocnVubmVySWQsIG9wdGlvbnMsIGN1Y3VtYmVyRXZlbnRMaXN0ZW5lciwgb3h5Z2VuRXZlbnRMaXN0ZW5lciwgcmVwb3J0RGlzcGF0Y2hlciwgdGVzdEhvb2tzKSB7XHJcbiAgICAgICAgdGhpcy5ydW5uZXJJZCA9IHJ1bm5lcklkO1xyXG4gICAgICAgIHRoaXMuc3VpdGVzID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIgPSBjdWN1bWJlckV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyID0gb3h5Z2VuRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIgPSByZXBvcnREaXNwYXRjaGVyO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIHRoaXMub25CZWZvcmVGZWF0dXJlID0gdGhpcy5vbkJlZm9yZUZlYXR1cmUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJGZWF0dXJlID0gdGhpcy5vbkFmdGVyRmVhdHVyZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25CZWZvcmVTY2VuYXJpbyA9IHRoaXMub25CZWZvcmVTY2VuYXJpby5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlclNjZW5hcmlvID0gdGhpcy5vbkFmdGVyU2NlbmFyaW8uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQmVmb3JlU3RlcCA9IHRoaXMub25CZWZvcmVTdGVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyU3RlcCA9IHRoaXMub25BZnRlclN0ZXAuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uVGVzdEVuZCA9IHRoaXMub25UZXN0RW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZU94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQmVmb3JlT3h5Z2VuQ29tbWFuZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlck94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbk94eWdlbkxvZyA9IHRoaXMub25PeHlnZW5Mb2cuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy50ZXN0SG9va3MgPSB0ZXN0SG9va3M7XHJcblxyXG4gICAgICAgIHRoaXMuaG9va0V2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhvb2tFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ2ZlYXR1cmU6YmVmb3JlJywgdGhpcy5vbkJlZm9yZUZlYXR1cmUpO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdmZWF0dXJlOmFmdGVyJywgdGhpcy5vbkFmdGVyRmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmJlZm9yZScsIHRoaXMub25CZWZvcmVTY2VuYXJpbyk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmFmdGVyJywgdGhpcy5vbkFmdGVyU2NlbmFyaW8pO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdzdGVwOmJlZm9yZScsIHRoaXMub25CZWZvcmVTdGVwKTtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignc3RlcDphZnRlcicsIHRoaXMub25BZnRlclN0ZXApO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCd0ZXN0OmVuZCcsIHRoaXMub25UZXN0RW5kKTtcclxuXHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uKCdjb21tYW5kOmJlZm9yZScsIHRoaXMub25CZWZvcmVPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2xvZycsIHRoaXMub25PeHlnZW5Mb2cpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlT3h5Z2VuQ29tbWFuZChlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZnRlck94eWdlbkNvbW1hbmQoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIGUucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcC5zdGVwcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5zdGVwcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAuc3RlcHMucHVzaChlLnJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uT3h5Z2VuTG9nKGxvZykge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FzZS5sb2dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0aW1lOiBsb2cudGltZSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBzcmM6IGxvZy5zcmNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25Mb2dFbnRyeSAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkobG9nLnRpbWUsIGxvZy5sZXZlbCwgbG9nLm1lc3NhZ2UsIGxvZy5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkJlZm9yZUZlYXR1cmUodXJpLCBmZWF0dXJlKSB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tsb2NhdGlvbl0gPSBuZXcgVGVzdFN1aXRlUmVzdWx0KCk7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQubmFtZSA9IGZlYXR1cmUubmFtZTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhmZWF0dXJlLnRhZ3MpO1xyXG4gICAgICAgIHN1aXRlUmVzdWx0LmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSh0aGlzLnJ1bm5lcklkLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkFmdGVyRmVhdHVyZSh1cmksIGZlYXR1cmUpIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW2xvY2F0aW9uXTtcclxuICAgICAgICBpZiAoIXN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9kZWxldGUgdGhpcy5zdWl0ZXNbbG9jYXRpb25dXHJcbiAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gdGhpcy5kZXRlcm1pbmVTdWl0ZVN0YXR1cyhzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5hZnRlclN1aXRlKHRoaXMucnVubmVySWQsIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlRW5kICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25CZWZvcmVTY2VuYXJpbyh1cmksIGZlYXR1cmUsIHNjZW5hcmlvKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlTG9jYXRpb24gPSBzY2VuYXJpby5sb2NhdGlvbnMubGVuZ3RoID4gMCA/IHNjZW5hcmlvLmxvY2F0aW9uc1swXSA6IHsgbGluZTogMSB9O1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtjYXNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gdGhpcy5jdXJyZW50Q2FzZSA9IG5ldyBUZXN0Q2FzZVJlc3VsdCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubmFtZSA9IHNjZW5hcmlvLm5hbWU7XHJcbiAgICAgICAgY2FzZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhzY2VuYXJpby50YWdzKTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvY2F0aW9uID0gY2FzZUlkO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIGNhbGwgb3h5Z2VuIG9uQmVmb3JlQ2FzZSBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub25CZWZvcmVDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkJlZm9yZUNhc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmJlZm9yZUNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYmVmb3JlQ2FzZSh0aGlzLnJ1bm5lcklkLCBzY2VuYXJpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBjYXNlSWQsIHNjZW5hcmlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlclNjZW5hcmlvKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHNvdXJjZUxvY2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlSWQgPSBgJHt1cml9OiR7c291cmNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gY2FzZXMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IGNhc2VJZCk7XHJcbiAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSBjYXNlUmVzdWx0LmVuZFRpbWUgLSBjYXNlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVN0YXR1cyhjYXNlUmVzdWx0KTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUgJiYgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlLmxvZ3MgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuaGFyID0gdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlICYmIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZS5oYXIgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUuaGFyIDogbnVsbDtcclxuXHJcbiAgICAgICAgLy8gY2FsbCBveHlnZW4gb25BZnRlckNhc2UgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uQWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkFmdGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmFmdGVyQ2FzZSh0aGlzLnJ1bm5lcklkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIGNhc2VJZCwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlU3RlcCh1cmksIGZlYXR1cmUsIHNjZW5hcmlvLCBzdGVwLCBzb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSWQgPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3QgY2FzZUlkID0gYCR7dXJpfToke3NvdXJjZUxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW3N1aXRlSWRdO1xyXG4gICAgICAgIGNvbnN0IGNhc2VzID0gc3VpdGVSZXN1bHQuY2FzZXM7XHJcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IGNhc2VzLmZpbmQoeCA9PiB4LmxvY2F0aW9uID09PSBjYXNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSB0aGlzLmN1cnJlbnRTdGVwID0gbmV3IFRlc3RTdGVwUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5zdGVwcy5wdXNoKHN0ZXBSZXN1bHQpO1xyXG5cclxuICAgICAgICBzdGVwUmVzdWx0Lm5hbWUgPSBzdGVwLnRleHQ7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5sb2NhdGlvbiA9IGAke3VyaX06JHtzdGVwLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdGVwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN0ZXAodGhpcy5ydW5uZXJJZCwgc3RlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQodGhpcy5ydW5uZXJJZCwgc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQWZ0ZXJTdGVwKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHJlc3VsdCwgc291cmNlTG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZUlkID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtzb3VyY2VMb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBjYXNlcyA9IHN1aXRlUmVzdWx0LmNhc2VzO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBjYXNlcy5maW5kKHggPT4geC5sb2NhdGlvbiA9PT0gY2FzZUlkKTtcclxuICAgICAgICBjb25zdCBzdGVwTG9jYXRpb24gPSBgJHt1cml9OiR7c3RlcC5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IGNhc2VSZXN1bHQuc3RlcHMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IHN0ZXBMb2NhdGlvbik7XHJcblxyXG4gICAgICAgIHN0ZXBSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdGVwUmVzdWx0LmR1cmF0aW9uID0gc3RlcFJlc3VsdC5lbmRUaW1lIC0gc3RlcFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGF0dXMgPSByZXN1bHQuc3RhdHVzO1xyXG4gICAgICAgIC8vIGdldCBmYWlsdXJlIGRldGFpbHMgaWYgZXJyb3Igd2FzIHRocm93biBpbiB0aGUgc3RlcFxyXG4gICAgICAgIGlmIChyZXN1bHQuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IocmVzdWx0LmV4Y2VwdGlvbik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIHRoaXMuY3VycmVudFN0ZXAubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZS5jdWN1bWJlckxvY2F0aW9uID0gdGhpcy5jdXJyZW50U3RlcC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5hZnRlclN0ZXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdGVwKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQsIHJlc3VsdC5leGNlcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHJlcG9ydCBnZW5lcmF0b3JcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwRW5kKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRlc3RFbmQocmVzdWx0KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZUNhc2VTdGF0dXMoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN0ZXAgPSBjYXNlUmVzdWx0LnN0ZXBzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN0ZXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZVN1aXRlU3RhdHVzKHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkQ2FzZSA9IHN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZENhc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbW92ZXMgYWxsIHVubmVjZXNzYXJ5IG1ldGFkYXRhIGZyb20gQ3VjdW1iZXIgdGFncywgcmV0dXJuaW5nIGEgc2ltcGxlIGFycmF5IG9mIHRhZyBuYW1lc1xyXG4gICAgc2ltcGxpZnlDdWN1bWJlclRhZ3ModGFncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSB8fCB0YWdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0YWdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzaW1wbGVUYWdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgdGFnIG9mIHRhZ3MpIHtcclxuICAgICAgICAgICAgc2ltcGxlVGFncy5wdXNoKHRhZy5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNpbXBsZVRhZ3M7XHJcbiAgICB9XHJcbn0iXX0=