oxygen-cli 1.22.0 → 1.99.0-alpha.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 (232) hide show
  1. package/CHANGELOG.md +0 -50
  2. package/build/core/OxygenCore.js +56 -145
  3. package/build/errors/OxygenError.js +5 -15
  4. package/build/errors/helper.js +45 -49
  5. package/build/index.js +14 -6
  6. package/build/lib/cli-util.js +19 -19
  7. package/build/lib/cli.js +4 -2
  8. package/build/lib/parallel-launcher.js +333 -0
  9. package/build/lib/param-manager.js +66 -47
  10. package/build/lib/util.js +38 -9
  11. package/build/ox_modules/index.js +1 -97
  12. package/build/ox_modules/module-assert.js +19 -9
  13. package/build/ox_modules/module-dns.js +220 -0
  14. package/build/ox_modules/module-http.js +39 -51
  15. package/build/ox_modules/module-shell.js +19 -75
  16. package/build/ox_modules/module-utils.js +1 -108
  17. package/build/ox_modules/utils.js +1 -357
  18. package/build/reporter/FileReporterBase.js +5 -5
  19. package/build/reporter/ReportAggregator.js +127 -4
  20. package/build/runners/WorkerProcess.js +15 -28
  21. package/build/runners/index.js +2 -6
  22. package/build/runners/oxygen/OxygenWorker.js +8 -8
  23. package/build/runners/oxygen/index.js +17 -18
  24. package/build/runners/oxygen/worker.js +10 -8
  25. package/package.json +12 -46
  26. package/build/lib/img-merge.js +0 -163
  27. package/build/ox_modules/module-db.js +0 -146
  28. package/build/ox_modules/module-email.js +0 -212
  29. package/build/ox_modules/module-eyes.js +0 -189
  30. package/build/ox_modules/module-mailinator.js +0 -207
  31. package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
  32. package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
  33. package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
  34. package/build/ox_modules/module-mob/commands/assertText.js +0 -45
  35. package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
  36. package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
  37. package/build/ox_modules/module-mob/commands/back.js +0 -27
  38. package/build/ox_modules/module-mob/commands/clear.js +0 -40
  39. package/build/ox_modules/module-mob/commands/click.js +0 -35
  40. package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
  41. package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
  42. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
  43. package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
  44. package/build/ox_modules/module-mob/commands/debug.js +0 -26
  45. package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
  46. package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
  47. package/build/ox_modules/module-mob/commands/execute.js +0 -32
  48. package/build/ox_modules/module-mob/commands/findElement.js +0 -36
  49. package/build/ox_modules/module-mob/commands/findElements.js +0 -39
  50. package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
  51. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
  52. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
  53. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
  54. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
  55. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
  56. package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
  57. package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
  58. package/build/ox_modules/module-mob/commands/getSource.js +0 -26
  59. package/build/ox_modules/module-mob/commands/getText.js +0 -36
  60. package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
  61. package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
  62. package/build/ox_modules/module-mob/commands/getValue.js +0 -50
  63. package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
  64. package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
  65. package/build/ox_modules/module-mob/commands/index.js +0 -594
  66. package/build/ox_modules/module-mob/commands/installApp.js +0 -28
  67. package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
  68. package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
  69. package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
  70. package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
  71. package/build/ox_modules/module-mob/commands/isExist.js +0 -36
  72. package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
  73. package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
  74. package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
  75. package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
  76. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
  77. package/build/ox_modules/module-mob/commands/open.js +0 -43
  78. package/build/ox_modules/module-mob/commands/pause.js +0 -27
  79. package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
  80. package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
  81. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
  82. package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
  83. package/build/ox_modules/module-mob/commands/select.js +0 -54
  84. package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
  85. package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
  86. package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
  87. package/build/ox_modules/module-mob/commands/setContext.js +0 -28
  88. package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
  89. package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
  90. package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
  91. package/build/ox_modules/module-mob/commands/shake.js +0 -27
  92. package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
  93. package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
  94. package/build/ox_modules/module-mob/commands/swipe.js +0 -58
  95. package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
  96. package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
  97. package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
  98. package/build/ox_modules/module-mob/commands/tap.js +0 -34
  99. package/build/ox_modules/module-mob/commands/type.js +0 -67
  100. package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
  101. package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
  102. package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
  103. package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
  104. package/build/ox_modules/module-mob.js +0 -699
  105. package/build/ox_modules/module-pdf.js +0 -328
  106. package/build/ox_modules/module-proxy.js +0 -324
  107. package/build/ox_modules/module-serial.js +0 -187
  108. package/build/ox_modules/module-soap.js +0 -260
  109. package/build/ox_modules/module-twilio.js +0 -192
  110. package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
  111. package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
  112. package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
  113. package/build/ox_modules/module-web/commands/assertExist.js +0 -28
  114. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
  115. package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
  116. package/build/ox_modules/module-web/commands/assertText.js +0 -45
  117. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
  118. package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
  119. package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
  120. package/build/ox_modules/module-web/commands/assertValue.js +0 -44
  121. package/build/ox_modules/module-web/commands/back.js +0 -27
  122. package/build/ox_modules/module-web/commands/clear.js +0 -41
  123. package/build/ox_modules/module-web/commands/click.js +0 -112
  124. package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
  125. package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
  126. package/build/ox_modules/module-web/commands/debug.js +0 -25
  127. package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
  128. package/build/ox_modules/module-web/commands/deselect.js +0 -34
  129. package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
  130. package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
  131. package/build/ox_modules/module-web/commands/execute.js +0 -36
  132. package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
  133. package/build/ox_modules/module-web/commands/findElement.js +0 -35
  134. package/build/ox_modules/module-web/commands/findElements.js +0 -38
  135. package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
  136. package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
  137. package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
  138. package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
  139. package/build/ox_modules/module-web/commands/getCookies.js +0 -23
  140. package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
  141. package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
  142. package/build/ox_modules/module-web/commands/getHTML.js +0 -30
  143. package/build/ox_modules/module-web/commands/getSource.js +0 -26
  144. package/build/ox_modules/module-web/commands/getText.js +0 -36
  145. package/build/ox_modules/module-web/commands/getTitle.js +0 -22
  146. package/build/ox_modules/module-web/commands/getUrl.js +0 -26
  147. package/build/ox_modules/module-web/commands/getValue.js +0 -43
  148. package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
  149. package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
  150. package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
  151. package/build/ox_modules/module-web/commands/index.js +0 -634
  152. package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
  153. package/build/ox_modules/module-web/commands/isChecked.js +0 -30
  154. package/build/ox_modules/module-web/commands/isExist.js +0 -36
  155. package/build/ox_modules/module-web/commands/isSelected.js +0 -35
  156. package/build/ox_modules/module-web/commands/isVisible.js +0 -36
  157. package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
  158. package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
  159. package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
  160. package/build/ox_modules/module-web/commands/newWindow.js +0 -27
  161. package/build/ox_modules/module-web/commands/open.js +0 -42
  162. package/build/ox_modules/module-web/commands/pause.js +0 -26
  163. package/build/ox_modules/module-web/commands/point.js +0 -37
  164. package/build/ox_modules/module-web/commands/pointJS.js +0 -56
  165. package/build/ox_modules/module-web/commands/refresh.js +0 -26
  166. package/build/ox_modules/module-web/commands/rightClick.js +0 -61
  167. package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
  168. package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
  169. package/build/ox_modules/module-web/commands/select.js +0 -55
  170. package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
  171. package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
  172. package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
  173. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
  174. package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
  175. package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
  176. package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
  177. package/build/ox_modules/module-web/commands/type.js +0 -52
  178. package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
  179. package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
  180. package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
  181. package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
  182. package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
  183. package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
  184. package/build/ox_modules/module-web/commands/waitForText.js +0 -45
  185. package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
  186. package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
  187. package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
  188. package/build/ox_modules/module-web.js +0 -909
  189. package/build/ox_modules/module-win/commands/assertText.js +0 -41
  190. package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
  191. package/build/ox_modules/module-win/commands/assertValue.js +0 -62
  192. package/build/ox_modules/module-win/commands/back.js +0 -21
  193. package/build/ox_modules/module-win/commands/clear.js +0 -34
  194. package/build/ox_modules/module-win/commands/click.js +0 -25
  195. package/build/ox_modules/module-win/commands/clickLong.js +0 -30
  196. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
  197. package/build/ox_modules/module-win/commands/findElement.js +0 -31
  198. package/build/ox_modules/module-win/commands/findElements.js +0 -31
  199. package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
  200. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
  201. package/build/ox_modules/module-win/commands/getLocation.js +0 -26
  202. package/build/ox_modules/module-win/commands/getSource.js +0 -22
  203. package/build/ox_modules/module-win/commands/getText.js +0 -32
  204. package/build/ox_modules/module-win/commands/getValue.js +0 -46
  205. package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
  206. package/build/ox_modules/module-win/commands/index.js +0 -298
  207. package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
  208. package/build/ox_modules/module-win/commands/isChecked.js +0 -26
  209. package/build/ox_modules/module-win/commands/isClickable.js +0 -26
  210. package/build/ox_modules/module-win/commands/isExist.js +0 -32
  211. package/build/ox_modules/module-win/commands/isSelected.js +0 -26
  212. package/build/ox_modules/module-win/commands/isVisible.js +0 -32
  213. package/build/ox_modules/module-win/commands/open.js +0 -24
  214. package/build/ox_modules/module-win/commands/pause.js +0 -23
  215. package/build/ox_modules/module-win/commands/rightClick.js +0 -30
  216. package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
  217. package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
  218. package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
  219. package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
  220. package/build/ox_modules/module-win/commands/tap.js +0 -29
  221. package/build/ox_modules/module-win/commands/type.js +0 -38
  222. package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
  223. package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
  224. package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
  225. package/build/ox_modules/module-win.js +0 -367
  226. package/build/ox_services/service-devtools/submodule-network.js +0 -338
  227. package/build/ox_services/service-devtools.js +0 -83
  228. package/build/runners/cucumber/CucumberEventListener.js +0 -181
  229. package/build/runners/cucumber/CucumberReporter.js +0 -277
  230. package/build/runners/cucumber/CucumberWorker.js +0 -337
  231. package/build/runners/cucumber/index.js +0 -159
  232. package/build/runners/cucumber/worker.js +0 -184
@@ -7,8 +7,6 @@ exports.default = void 0;
7
7
 
8
8
  require("source-map-support/register");
9
9
 
10
- const Fiber = require('fibers');
11
-
12
10
  const path = require('path');
13
11
 
14
12
  const {
@@ -85,11 +83,13 @@ class OxygenWorker extends EventEmitter {
85
83
 
86
84
  try {
87
85
  this._oxygen && this._oxygen.onBeforeCase && (await this._oxygen.onBeforeCase(context));
88
- await this._runFnInFiberContext(() => {
86
+ await this._runFnInFiberContext(async () => {
89
87
  try {
90
88
  require.cache[require.resolve(scriptPath)] && delete require.cache[require.resolve(scriptPath)];
91
89
 
92
- require(scriptPath);
90
+ const call = require(scriptPath);
91
+
92
+ await call();
93
93
  } catch (e) {
94
94
  if (e && e.type && e.type === errorHelper.errorCode.ASSERT_PASSED) {} else {
95
95
  error = e;
@@ -173,14 +173,14 @@ class OxygenWorker extends EventEmitter {
173
173
  }
174
174
 
175
175
  async _runFnInFiberContext(fn) {
176
- return new Promise((resolve, reject) => Fiber(() => {
176
+ return new Promise((resolve, reject) => (async () => {
177
177
  try {
178
- const result = fn.apply(this);
178
+ const result = await fn.apply(this);
179
179
  return resolve(result);
180
180
  } catch (err) {
181
181
  return reject(err);
182
182
  }
183
- }).run());
183
+ })());
184
184
  }
185
185
 
186
186
  async replStart() {
@@ -243,4 +243,4 @@ class OxygenWorker extends EventEmitter {
243
243
  }
244
244
 
245
245
  exports.default = OxygenWorker;
246
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9PeHlnZW5Xb3JrZXIuanMiXSwibmFtZXMiOlsiRmliZXIiLCJyZXF1aXJlIiwicGF0aCIsIkV2ZW50RW1pdHRlciIsIk94eWdlbiIsImRlZmF1bHQiLCJveHV0aWwiLCJlcnJvckhlbHBlciIsIm1vZHVsZSIsImdsb2JhbCIsImJyb3dzZXIiLCJPeHlnZW5Xb3JrZXIiLCJjb25zdHJ1Y3RvciIsInJlcG9ydGVyIiwibG9nZ2VyIiwiX294eWdlbiIsIl9vcHRzIiwiX2xvZ2dlciIsIl90ZXN0SG9va3MiLCJfcmVwb3J0ZXIiLCJfcnVuSWQiLCJpbml0IiwicnVuSWQiLCJvcHRpb25zIiwiY2FwcyIsIl9jd2QiLCJjd2QiLCJwcm9jZXNzIiwib24iLCJfaGFuZGxlQmVmb3JlQ29tbWFuZCIsImJpbmQiLCJfaGFuZGxlQWZ0ZXJDb21tYW5kIiwiX2hhbmRsZUxvZ0VudHJ5IiwibG9hZFRlc3RIb29rcyIsImRlYnVnIiwiZSIsInRvU3RyaW5nIiwicnVuIiwic2NyaXB0UGF0aCIsImNvbnRleHQiLCJwb0ZpbGUiLCJFcnJvciIsImxvYWRQYWdlT2JqZWN0RmlsZSIsIl9zdGVwcyIsImlzQWJzb2x1dGUiLCJyZXNvbHZlIiwiZXJyb3IiLCJvbkJlZm9yZUNhc2UiLCJfcnVuRm5JbkZpYmVyQ29udGV4dCIsImNhY2hlIiwidHlwZSIsImVycm9yQ29kZSIsIkFTU0VSVF9QQVNTRUQiLCJfd2FpdFN0ZXBSZXN1bHQiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwibW9kdWxlQ2FwcyIsImdldE1vZHVsZXNDYXBhYmlsaXRpZXMiLCJvbkFmdGVyQ2FzZSIsInJlc3VsdFN0b3JlIiwicmVzdWx0cyIsInJlc2V0UmVzdWx0cyIsIm94Q29udGV4dCIsInZhcnMiLCJkaXNwb3NlIiwic3RhdHVzIiwiZGlzcG9zZU1vZHVsZXMiLCJjYWxsVGVzdEhvb2siLCJob29rTmFtZSIsImhvb2tBcmdzIiwiZXhlY3V0ZVRlc3RIb29rIiwiZm4iLCJQcm9taXNlIiwicmVqZWN0IiwicmVzdWx0IiwiYXBwbHkiLCJlcnIiLCJyZXBsU3RhcnQiLCJjb21tYW5kUmVzb2x2ZSIsInNldFRpbWVvdXQiLCJtb2R1bGVzIiwia2V5cyIsIk9iamVjdCIsIm1hcCIsIml0ZW0iLCJkcml2ZXIiLCJlbWl0IiwicHVzaCIsImxldmVsIiwibWVzc2FnZSIsInNyYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBWUEsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsUUFBRCxDQUFyQjs7QUFDQSxNQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU07QUFBRUUsRUFBQUE7QUFBRixJQUFtQkYsT0FBTyxDQUFDLFFBQUQsQ0FBaEM7O0FBRUEsTUFBTUcsTUFBTSxHQUFHSCxPQUFPLENBQUMsdUJBQUQsQ0FBUCxDQUFpQ0ksT0FBaEQ7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHTCxPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTU0sV0FBVyxHQUFHTixPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBR0FBLE9BQU8sR0FBR0EsT0FBTyxDQUFDLEtBQUQsQ0FBUCxDQUFlTyxNQUFmLENBQVY7QUFHQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLEVBQWpCOztBQUVlLE1BQU1DLFlBQU4sU0FBMkJSLFlBQTNCLENBQXdDO0FBQ25EUyxFQUFBQSxXQUFXLENBQUVDLFFBQUYsRUFBWUMsTUFBWixFQUFvQjtBQUMzQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWVILE1BQWY7QUFDQSxTQUFLSSxVQUFMLEdBQWtCLEVBQWxCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQk4sUUFBakI7QUFDQSxTQUFLTyxNQUFMLEdBQWMsSUFBZDtBQUNIOztBQUVTLFFBQUpDLElBQUksQ0FBQ0MsS0FBRCxFQUFRQyxPQUFSLEVBQWlCQyxJQUFqQixFQUF1QjtBQUM3QixTQUFLSixN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RCxDQUFDLENBQUNxRCxPQUF4QixFQUFpQ3JELENBQUMsQ0FBQ3NELEdBQW5DLEVBQXdDdEQsQ0FBQyxDQUFDd0MsR0FBMUM7QUFDSCxLQUZELE1BRU87QUFDSCxXQUFLMUQsT0FBTCxDQUFha0IsQ0FBQyxDQUFDb0QsS0FBZixFQUFzQnBELENBQUMsQ0FBQ3FELE9BQXhCLEVBQWlDckQsQ0FBQyxDQUFDc0QsR0FBbkM7QUFDSDtBQUNKOztBQTlNa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuY29uc3QgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xyXG5cclxuY29uc3QgT3h5Z2VuID0gcmVxdWlyZSgnLi4vLi4vY29yZS9PeHlnZW5Db3JlJykuZGVmYXVsdDtcclxuY29uc3Qgb3h1dGlsID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKTtcclxuY29uc3QgZXJyb3JIZWxwZXIgPSByZXF1aXJlKCcuLi8uLi9lcnJvcnMvaGVscGVyJyk7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxyXG5yZXF1aXJlID0gcmVxdWlyZSgnZXNtJykobW9kdWxlKTtcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW5Xb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IgKHJlcG9ydGVyLCBsb2dnZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX294eWdlbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RIb29rcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5fcnVuSWQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQocnVuSWQsIG9wdGlvbnMsIGNhcHMpIHtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IHJ1bklkO1xyXG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMuX2N3ZCA9IHRoaXMuX29wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9veHlnZW4gPSBuZXcgT3h5Z2VuKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9veHlnZW4ub24oJ2NvbW1hbmQ6YmVmb3JlJywgdGhpcy5faGFuZGxlQmVmb3JlQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignbG9nJywgdGhpcy5faGFuZGxlTG9nRW50cnkuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uaW5pdChvcHRpb25zLCBjYXBzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlc3RIb29rcyA9IG94dXRpbC5sb2FkVGVzdEhvb2tzKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgLy9tYWtlTW9kdWxlc0dsb2JhbChvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnT3h5Z2VuIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYE94eWdlbiBpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICR7ZS50b1N0cmluZygpfWApO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oeyBzY3JpcHRQYXRoLCBjb250ZXh0LCBwb0ZpbGUgPSBudWxsIH0pIHtcclxuICAgICAgICAvLyBhc3NpZ24gdXAgdG8gZGF0ZSBjb250ZXh0IHRvIE94eWdlbiBDb3JlIHRvIHJlZmxlY3QgbmV3IHBhcmFtZXRlcnMgYW5kIG90aGVyIGNvbnRleHQgZGF0YVxyXG4gICAgICAgIGlmICghdGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yICgnT3h5Z2VuIGlzIG5vdCBpbml0aWFsaXplZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9veHlnZW4uY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuLmxvYWRQYWdlT2JqZWN0RmlsZShwb0ZpbGUpO1xyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuX2N3ZCAmJiAhcGF0aC5pc0Fic29sdXRlKHNjcmlwdFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHNjcmlwdFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5fY3dkLCBzY3JpcHRQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICAvLyBsb2FkIGFuZCBydW4gdGhlIHRlc3Qgc2NyaXB0XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgdGhpcy5fb3h5Z2VuLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcnVuRm5JbkZpYmVyQ29udGV4dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciByZXF1aXJlIGNhY2hlIHNvIHRoZSBzY3JpcHQgd2lsbCBiZSBleGVjdXRlZCBvbiBlYWNoIGl0ZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHNjcmlwdFBhdGgpXSAmJiBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoc2NyaXB0UGF0aCldO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoc2NyaXB0UGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yID0gZS5jb2RlICYmIGUuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnID8gbmV3IFNjcmlwdE5vdEZvdW5kRXJyb3Ioc2NyaXB0UGF0aCkgOiBlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnR5cGUgJiYgZS50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyBzdGVwIHJlc3VsdCBnZW5lcmF0aW9uIHRha2VzIHNvbWUgdGltZSB0byBtYWtlIHNjcmVlbnNob3RcclxuICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uX3dhaXRTdGVwUmVzdWx0KCk7XHJcblxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1vZHVsZUNhcHMgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4uZ2V0TW9kdWxlc0NhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICBtb2R1bGVDYXBzID0gdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ub25BZnRlckNhc2UgJiYgYXdhaXQgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlKGVycm9yKTtcclxuXHJcbiAgICAgICAgLy8gY2xvbmUgdGhlIHJlc3VsdHMsIG90aGVyd2lzZSByZXN1bHRTdG9yZSB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoZSBmb2xsb3dpbmcgdGhpcy5fb3h5Z2VuLnJlc2V0UmVzdWx0cygpIGNhbGxcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdFN0b3JlID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLnJlc3VsdHMpIHtcclxuICAgICAgICAgICAgcmVzdWx0U3RvcmUgPSB7IC4uLnRoaXMuX294eWdlbi5yZXN1bHRzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMpIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RlcHMgYW5kIG90aGVyIHJlc3VsdCBkYXRhXHJcbiAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgb3hDb250ZXh0ID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4uY29udGV4dCkge1xyXG4gICAgICAgICAgICBveENvbnRleHQgPSB0aGlzLl9veHlnZW4uY29udGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3hDb250ZXh0LnZhcnMgPSBnbG9iYWwudmFycztcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZXJyb3IsIG1vZHVsZUNhcHMsIHJlc3VsdFN0b3JlLCBjb250ZXh0OiBveENvbnRleHQgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIE94eWdlbicsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RlcHMgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4gbW9kdWxlcycsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLnJlc2V0UmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNhbGxUZXN0SG9vayhob29rTmFtZSwgaG9va0FyZ3MpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Rlc3RIb29rcyB8fCAhdGhpcy5fdGVzdEhvb2tzW2hvb2tOYW1lXSB8fCB0eXBlb2YgdGhpcy5fdGVzdEhvb2tzW2hvb2tOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhvb2sgZG9lcyBub3QgZXhpc3Q6ICR7aG9va05hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IG94dXRpbC5leGVjdXRlVGVzdEhvb2sodGhpcy5fdGVzdEhvb2tzLCBob29rTmFtZSwgaG9va0FyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9ydW5GbkluRmliZXJDb250ZXh0IChmbikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBGaWJlcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbi5hcHBseSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkucnVuKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBsZXQgY29tbWFuZFJlc29sdmUgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9veHlnZW4ubW9kdWxlcyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVidWc7XHJcbiAgICAgICAgICAgICAgICBrZXlzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydnZXREcml2ZXInXSAmJiB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnID0gdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2RlYnVnJ107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVidWcoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kUmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kUmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiAoY29tbWFuZFJlc29sdmUgPSByZXNvbHZlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUJlZm9yZUNvbW1hbmQoZSkge1xyXG4gICAgICAgIGlmICghZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDpiZWZvcmUnLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQWZ0ZXJDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUgfHwgIWUucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3N0ZXBzICYmIHRoaXMuX3N0ZXBzLnB1c2goZS5yZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDphZnRlcicsIGUpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVMb2dFbnRyeShlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLmxldmVsIHx8ICFlLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZSAmJiBlLmxldmVsICYmIGUubGV2ZWwgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMsIGUuZXJyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dnZXJbZS5sZXZlbF0oZS5tZXNzYWdlLCBlLnNyYyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
246
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9PeHlnZW5Xb3JrZXIuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJFdmVudEVtaXR0ZXIiLCJPeHlnZW4iLCJkZWZhdWx0Iiwib3h1dGlsIiwiZXJyb3JIZWxwZXIiLCJtb2R1bGUiLCJnbG9iYWwiLCJicm93c2VyIiwiT3h5Z2VuV29ya2VyIiwiY29uc3RydWN0b3IiLCJyZXBvcnRlciIsImxvZ2dlciIsIl9veHlnZW4iLCJfb3B0cyIsIl9sb2dnZXIiLCJfdGVzdEhvb2tzIiwiX3JlcG9ydGVyIiwiX3J1bklkIiwiaW5pdCIsInJ1bklkIiwib3B0aW9ucyIsImNhcHMiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIm9uIiwiX2hhbmRsZUJlZm9yZUNvbW1hbmQiLCJiaW5kIiwiX2hhbmRsZUFmdGVyQ29tbWFuZCIsIl9oYW5kbGVMb2dFbnRyeSIsImxvYWRUZXN0SG9va3MiLCJkZWJ1ZyIsImUiLCJ0b1N0cmluZyIsInJ1biIsInNjcmlwdFBhdGgiLCJjb250ZXh0IiwicG9GaWxlIiwiRXJyb3IiLCJsb2FkUGFnZU9iamVjdEZpbGUiLCJfc3RlcHMiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsImVycm9yIiwib25CZWZvcmVDYXNlIiwiX3J1bkZuSW5GaWJlckNvbnRleHQiLCJjYWNoZSIsImNhbGwiLCJ0eXBlIiwiZXJyb3JDb2RlIiwiQVNTRVJUX1BBU1NFRCIsIl93YWl0U3RlcFJlc3VsdCIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJtb2R1bGVDYXBzIiwiZ2V0TW9kdWxlc0NhcGFiaWxpdGllcyIsIm9uQWZ0ZXJDYXNlIiwicmVzdWx0U3RvcmUiLCJyZXN1bHRzIiwicmVzZXRSZXN1bHRzIiwib3hDb250ZXh0IiwidmFycyIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTW9kdWxlcyIsImNhbGxUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJleGVjdXRlVGVzdEhvb2siLCJmbiIsIlByb21pc2UiLCJyZWplY3QiLCJyZXN1bHQiLCJhcHBseSIsImVyciIsInJlcGxTdGFydCIsImNvbW1hbmRSZXNvbHZlIiwic2V0VGltZW91dCIsIm1vZHVsZXMiLCJrZXlzIiwiT2JqZWN0IiwibWFwIiwiaXRlbSIsImRyaXZlciIsImVtaXQiLCJwdXNoIiwibGV2ZWwiLCJtZXNzYWdlIiwic3JjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQSxNQUFNQSxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUFtQkQsT0FBTyxDQUFDLFFBQUQsQ0FBaEM7O0FBRUEsTUFBTUUsTUFBTSxHQUFHRixPQUFPLENBQUMsdUJBQUQsQ0FBUCxDQUFpQ0csT0FBaEQ7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHSixPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTUssV0FBVyxHQUFHTCxPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBR0FBLE9BQU8sR0FBR0EsT0FBTyxDQUFDLEtBQUQsQ0FBUCxDQUFlTSxNQUFmLENBQVY7QUFHQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLEVBQWpCOztBQUVlLE1BQU1DLFlBQU4sU0FBMkJSLFlBQTNCLENBQXdDO0FBQ25EUyxFQUFBQSxXQUFXLENBQUVDLFFBQUYsRUFBWUMsTUFBWixFQUFvQjtBQUMzQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWVILE1BQWY7QUFDQSxTQUFLSSxVQUFMLEdBQWtCLEVBQWxCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQk4sUUFBakI7QUFDQSxTQUFLTyxNQUFMLEdBQWMsSUFBZDtBQUNIOztBQUVTLFFBQUpDLElBQUksQ0FBQ0MsS0FBRCxFQUFRQyxPQUFSLEVBQWlCQyxJQUFqQixFQUF1QjtBQUM3QixTQUFLSixNQUFMLEdBQWNFLEtBQWQ7QUFDQSxTQUFLTixLQUFMLEdBQWFPLE9BQWI7QUFD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Q0FBQyxDQUFDdUQsR0FBbkMsRUFBd0N2RCxDQUFDLENBQUN5QyxHQUExQztBQUNILEtBRkQsTUFFTztBQUNILFdBQUszRCxPQUFMLENBQWFrQixDQUFDLENBQUNxRCxLQUFmLEVBQXNCckQsQ0FBQyxDQUFDc0QsT0FBeEIsRUFBaUN0RCxDQUFDLENBQUN1RCxHQUFuQztBQUNIO0FBQ0o7O0FBL01rRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqXHJcbiAqIEJhc2VkIG9uOlxyXG4gKiBDb3B5cmlnaHQgKGMpIE9wZW5KUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMuIExpY2Vuc2VkIHVuZGVyIE1JVC5cclxuICovXHJcblxyXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XHJcblxyXG5jb25zdCBPeHlnZW4gPSByZXF1aXJlKCcuLi8uLi9jb3JlL094eWdlbkNvcmUnKS5kZWZhdWx0O1xyXG5jb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXHJcbnJlcXVpcmUgPSByZXF1aXJlKCdlc20nKShtb2R1bGUpO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbldvcmtlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAocmVwb3J0ZXIsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0ge307XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChydW5JZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIHRoaXMuX3J1bklkID0gcnVuSWQ7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fY3dkID0gdGhpcy5fb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbiA9IG5ldyBPeHlnZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdjb21tYW5kOmFmdGVyJywgdGhpcy5faGFuZGxlQWZ0ZXJDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdsb2cnLCB0aGlzLl9oYW5kbGVMb2dFbnRyeS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX294eWdlbi5pbml0KG9wdGlvbnMsIGNhcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0gb3h1dGlsLmxvYWRUZXN0SG9va3Mob3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAvL21ha2VNb2R1bGVzR2xvYmFsKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdPeHlnZW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgT3h5Z2VuIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJHtlLnRvU3RyaW5nKCl9YCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bih7IHNjcmlwdFBhdGgsIGNvbnRleHQsIHBvRmlsZSA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGFzc2lnbiB1cCB0byBkYXRlIGNvbnRleHQgdG8gT3h5Z2VuIENvcmUgdG8gcmVmbGVjdCBuZXcgcGFyYW1ldGVycyBhbmQgb3RoZXIgY29udGV4dCBkYXRhXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IgKCdPeHlnZW4gaXMgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX294eWdlbi5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICB0aGlzLl9veHlnZW4ubG9hZFBhZ2VPYmplY3RGaWxlKHBvRmlsZSk7XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5fY3dkICYmICFwYXRoLmlzQWJzb2x1dGUoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgICAgICAgc2NyaXB0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QsIHNjcmlwdFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8vIGxvYWQgYW5kIHJ1biB0aGUgdGVzdCBzY3JpcHRcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm9uQmVmb3JlQ2FzZSAmJiBhd2FpdCB0aGlzLl9veHlnZW4ub25CZWZvcmVDYXNlKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ydW5GbkluRmliZXJDb250ZXh0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGNsZWFyIHJlcXVpcmUgY2FjaGUgc28gdGhlIHNjcmlwdCB3aWxsIGJlIGV4ZWN1dGVkIG9uIGVhY2ggaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoc2NyaXB0UGF0aCldICYmIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShzY3JpcHRQYXRoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbCA9IHJlcXVpcmUoc2NyaXB0UGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciA9IGUuY29kZSAmJiBlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJyA/IG5ldyBTY3JpcHROb3RGb3VuZEVycm9yKHNjcmlwdFBhdGgpIDogZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS50eXBlICYmIGUudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIHNvbWUgY2FzZXMgc3RlcCByZXN1bHQgZ2VuZXJhdGlvbiB0YWtlcyBzb21lIHRpbWUgdG8gbWFrZSBzY3JlZW5zaG90XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLl93YWl0U3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtb2R1bGVDYXBzID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgbW9kdWxlQ2FwcyA9IHRoaXMuX294eWdlbi5nZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkFmdGVyQ2FzZShlcnJvcik7XHJcblxyXG4gICAgICAgIC8vIGNsb25lIHRoZSByZXN1bHRzLCBvdGhlcndpc2UgcmVzdWx0U3RvcmUgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGUgZm9sbG93aW5nIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKSBjYWxsXHJcblxyXG4gICAgICAgIGxldCByZXN1bHRTdG9yZSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFN0b3JlID0geyAuLi50aGlzLl9veHlnZW4ucmVzdWx0cyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHN0ZXBzIGFuZCBvdGhlciByZXN1bHQgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IG94Q29udGV4dCA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgb3hDb250ZXh0ID0gdGhpcy5fb3h5Z2VuLmNvbnRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG94Q29udGV4dC52YXJzID0gZ2xvYmFsLnZhcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGVycm9yLCBtb2R1bGVDYXBzLCByZXN1bHRTdG9yZSwgY29udGV4dDogb3hDb250ZXh0IH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4nLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2UgT3h5Z2VuIG1vZHVsZXMnLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYWxsVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90ZXN0SG9va3MgfHwgIXRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gfHwgdHlwZW9mIHRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIb29rIGRvZXMgbm90IGV4aXN0OiAke2hvb2tOYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBveHV0aWwuZXhlY3V0ZVRlc3RIb29rKHRoaXMuX3Rlc3RIb29rcywgaG9va05hbWUsIGhvb2tBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuRm5JbkZpYmVyQ29udGV4dCAoZm4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuLmFwcGx5KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmRSZXNvbHZlID0gKCkgPT4geyB9O1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fb3h5Z2VuLm1vZHVsZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlYnVnO1xyXG4gICAgICAgICAgICAgICAga2V5cy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2dldERyaXZlciddKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydkZWJ1ZyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlYnVnKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmRSZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gKGNvbW1hbmRSZXNvbHZlID0gcmVzb2x2ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YmVmb3JlJywgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLnJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zdGVwcyAmJiB0aGlzLl9zdGVwcy5wdXNoKGUucmVzdWx0KTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YWZ0ZXInLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTG9nRW50cnkoZSkge1xyXG4gICAgICAgIGlmICghZSB8fCAhZS5sZXZlbCB8fCAhZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUgJiYgZS5sZXZlbCAmJiBlLmxldmVsID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlcltlLmxldmVsXShlLm1lc3NhZ2UsIGUuc3JjLCBlLmVycik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=