oxygen-cli 1.25.0-beta.2 → 1.25.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 (265) hide show
  1. package/.husky/pre-commit +4 -0
  2. package/CHANGELOG.md +65 -0
  3. package/build/core/OxygenCore.js +36 -257
  4. package/build/core/OxygenEvents.js +1 -11
  5. package/build/core/OxygenModule.js +1 -14
  6. package/build/core/OxygenService.js +1 -12
  7. package/build/core/OxygenSubModule.js +1 -10
  8. package/build/core/WebDriverModule.js +1 -30
  9. package/build/core/utils.js +1 -17
  10. package/build/errors/HookError.js +1 -7
  11. package/build/errors/ModuleError.js +1 -7
  12. package/build/errors/ModuleUnavailableError.js +1 -3
  13. package/build/errors/OxygenError.js +1 -33
  14. package/build/errors/ScriptNotFound.js +1 -7
  15. package/build/errors/helper.js +46 -77
  16. package/build/index.js +6 -18
  17. package/build/lib/cli-util.js +28 -90
  18. package/build/lib/cli.js +1 -23
  19. package/build/lib/debugger.js +1 -144
  20. package/build/lib/img-merge.js +1 -15
  21. package/build/lib/launcher.js +1 -28
  22. package/build/lib/moduleRequire.js +1 -4
  23. package/build/lib/param-manager.js +1 -28
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/util.js +3 -58
  28. package/build/model/case-result.js +1 -2
  29. package/build/model/failure.js +1 -2
  30. package/build/model/status.js +1 -2
  31. package/build/model/step-result.js +1 -2
  32. package/build/model/suite-result.js +1 -2
  33. package/build/model/test-result.js +1 -2
  34. package/build/model/testcase.js +1 -2
  35. package/build/model/testsuite.js +1 -2
  36. package/build/ox_modules/index.js +13 -33
  37. package/build/ox_modules/module-assert.js +8 -24
  38. package/build/ox_modules/module-date.js +3 -8
  39. package/build/ox_modules/module-db.js +7 -28
  40. package/build/ox_modules/module-email.js +10 -36
  41. package/build/ox_modules/module-eyes.js +5 -46
  42. package/build/ox_modules/module-http.js +42 -104
  43. package/build/ox_modules/module-log.js +5 -22
  44. package/build/ox_modules/module-mailinator.js +10 -32
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
  48. package/build/ox_modules/module-mob/commands/assertText.js +1 -3
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
  50. package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
  51. package/build/ox_modules/module-mob/commands/back.js +1 -2
  52. package/build/ox_modules/module-mob/commands/clear.js +1 -4
  53. package/build/ox_modules/module-mob/commands/click.js +3 -4
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
  55. package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
  57. package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
  61. package/build/ox_modules/module-mob/commands/execute.js +1 -2
  62. package/build/ox_modules/module-mob/commands/findElement.js +1 -3
  63. package/build/ox_modules/module-mob/commands/findElements.js +1 -4
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
  71. package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
  72. package/build/ox_modules/module-mob/commands/getSource.js +1 -2
  73. package/build/ox_modules/module-mob/commands/getText.js +1 -4
  74. package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
  75. package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
  76. package/build/ox_modules/module-mob/commands/getValue.js +5 -9
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
  79. package/build/ox_modules/module-mob/commands/index.js +19 -94
  80. package/build/ox_modules/module-mob/commands/installApp.js +1 -2
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
  83. package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
  84. package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
  85. package/build/ox_modules/module-mob/commands/isExist.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
  87. package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
  89. package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
  91. package/build/ox_modules/module-mob/commands/open.js +1 -3
  92. package/build/ox_modules/module-mob/commands/pause.js +1 -2
  93. package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
  94. package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
  97. package/build/ox_modules/module-mob/commands/select.js +1 -4
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
  101. package/build/ox_modules/module-mob/commands/setContext.js +1 -2
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
  105. package/build/ox_modules/module-mob/commands/shake.js +1 -2
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
  108. package/build/ox_modules/module-mob/commands/swipe.js +1 -2
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
  112. package/build/ox_modules/module-mob/commands/tap.js +1 -2
  113. package/build/ox_modules/module-mob/commands/type.js +3 -7
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
  118. package/build/ox_modules/module-mob.js +72 -142
  119. package/build/ox_modules/module-pdf.js +23 -62
  120. package/build/ox_modules/module-proxy.js +8 -68
  121. package/build/ox_modules/module-serial.js +7 -32
  122. package/build/ox_modules/module-shell.js +8 -27
  123. package/build/ox_modules/module-soap.js +14 -47
  124. package/build/ox_modules/module-twilio.js +10 -53
  125. package/build/ox_modules/module-utils.js +16 -51
  126. package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
  128. package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
  129. package/build/ox_modules/module-web/commands/assertExist.js +1 -2
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertText.js +1 -3
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
  135. package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
  136. package/build/ox_modules/module-web/commands/assertValue.js +1 -3
  137. package/build/ox_modules/module-web/commands/back.js +1 -2
  138. package/build/ox_modules/module-web/commands/clear.js +1 -5
  139. package/build/ox_modules/module-web/commands/click.js +4 -13
  140. package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
  141. package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
  144. package/build/ox_modules/module-web/commands/deselect.js +1 -2
  145. package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
  147. package/build/ox_modules/module-web/commands/execute.js +1 -2
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
  149. package/build/ox_modules/module-web/commands/findElement.js +1 -3
  150. package/build/ox_modules/module-web/commands/findElements.js +1 -4
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
  152. package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
  153. package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
  155. package/build/ox_modules/module-web/commands/getCookies.js +1 -2
  156. package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
  157. package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
  158. package/build/ox_modules/module-web/commands/getHTML.js +1 -2
  159. package/build/ox_modules/module-web/commands/getSource.js +1 -2
  160. package/build/ox_modules/module-web/commands/getText.js +1 -4
  161. package/build/ox_modules/module-web/commands/getTitle.js +1 -2
  162. package/build/ox_modules/module-web/commands/getUrl.js +1 -2
  163. package/build/ox_modules/module-web/commands/getValue.js +1 -5
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
  167. package/build/ox_modules/module-web/commands/index.js +26 -99
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
  169. package/build/ox_modules/module-web/commands/isChecked.js +1 -2
  170. package/build/ox_modules/module-web/commands/isExist.js +1 -3
  171. package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
  172. package/build/ox_modules/module-web/commands/isSelected.js +1 -2
  173. package/build/ox_modules/module-web/commands/isVisible.js +1 -3
  174. package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
  177. package/build/ox_modules/module-web/commands/newWindow.js +1 -2
  178. package/build/ox_modules/module-web/commands/open.js +1 -4
  179. package/build/ox_modules/module-web/commands/pause.js +1 -2
  180. package/build/ox_modules/module-web/commands/point.js +1 -2
  181. package/build/ox_modules/module-web/commands/pointJS.js +2 -8
  182. package/build/ox_modules/module-web/commands/refresh.js +1 -2
  183. package/build/ox_modules/module-web/commands/rightClick.js +3 -8
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
  186. package/build/ox_modules/module-web/commands/select.js +1 -5
  187. package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
  188. package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
  189. package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
  194. package/build/ox_modules/module-web/commands/type.js +1 -5
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
  196. package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -5
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
  205. package/build/ox_modules/module-web.js +86 -192
  206. package/build/ox_modules/module-win/commands/assertText.js +1 -3
  207. package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
  208. package/build/ox_modules/module-win/commands/assertValue.js +9 -15
  209. package/build/ox_modules/module-win/commands/back.js +1 -2
  210. package/build/ox_modules/module-win/commands/clear.js +1 -4
  211. package/build/ox_modules/module-win/commands/click.js +1 -2
  212. package/build/ox_modules/module-win/commands/clickLong.js +1 -2
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
  214. package/build/ox_modules/module-win/commands/findElement.js +1 -3
  215. package/build/ox_modules/module-win/commands/findElements.js +1 -4
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
  218. package/build/ox_modules/module-win/commands/getLocation.js +1 -2
  219. package/build/ox_modules/module-win/commands/getSource.js +1 -2
  220. package/build/ox_modules/module-win/commands/getText.js +1 -4
  221. package/build/ox_modules/module-win/commands/getValue.js +5 -9
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
  223. package/build/ox_modules/module-win/commands/index.js +5 -43
  224. package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
  225. package/build/ox_modules/module-win/commands/isChecked.js +1 -2
  226. package/build/ox_modules/module-win/commands/isClickable.js +1 -2
  227. package/build/ox_modules/module-win/commands/isExist.js +1 -3
  228. package/build/ox_modules/module-win/commands/isSelected.js +1 -2
  229. package/build/ox_modules/module-win/commands/isVisible.js +1 -3
  230. package/build/ox_modules/module-win/commands/open.js +1 -2
  231. package/build/ox_modules/module-win/commands/pause.js +1 -2
  232. package/build/ox_modules/module-win/commands/rightClick.js +1 -2
  233. package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
  234. package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
  235. package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
  237. package/build/ox_modules/module-win/commands/tap.js +1 -2
  238. package/build/ox_modules/module-win/commands/type.js +1 -4
  239. package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
  242. package/build/ox_modules/module-win.js +48 -87
  243. package/build/ox_modules/utils.js +22 -76
  244. package/build/ox_reporters/reporter-excel.js +1 -58
  245. package/build/ox_reporters/reporter-html.js +1 -28
  246. package/build/ox_reporters/reporter-json.js +1 -14
  247. package/build/ox_reporters/reporter-junit.js +1 -24
  248. package/build/ox_reporters/reporter-pdf.js +1 -19
  249. package/build/ox_reporters/reporter-xml.js +1 -17
  250. package/build/ox_services/service-devtools/submodule-network.js +3 -84
  251. package/build/ox_services/service-devtools.js +1 -23
  252. package/build/reporter/FileReporterBase.js +5 -44
  253. package/build/reporter/ReportAggregator.js +1 -65
  254. package/build/reporter/ReporterBase.js +1 -6
  255. package/build/runners/WorkerProcess.js +1 -99
  256. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  257. package/build/runners/cucumber/CucumberReporter.js +1 -56
  258. package/build/runners/cucumber/CucumberWorker.js +1 -66
  259. package/build/runners/cucumber/index.js +1 -30
  260. package/build/runners/cucumber/worker.js +1 -18
  261. package/build/runners/index.js +1 -6
  262. package/build/runners/oxygen/OxygenWorker.js +20 -54
  263. package/build/runners/oxygen/index.js +17 -177
  264. package/build/runners/oxygen/worker.js +2 -25
  265. package/package.json +28 -29
@@ -1,21 +1,15 @@
1
1
  "use strict";
2
2
 
3
3
  require("source-map-support/register");
4
-
5
4
  var _CucumberWorker = _interopRequireDefault(require("./CucumberWorker"));
6
-
7
5
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
6
  const oxutil = require('../../lib/util');
10
-
11
7
  const errorHelper = require('../../errors/helper');
12
-
13
8
  const {
14
9
  LEVELS,
15
10
  DEFAULT_LOGGER_ISSUER,
16
11
  ISSUERS
17
12
  } = require('../../lib/logger');
18
-
19
13
  global.browser = {};
20
14
  const logger = {
21
15
  info: function (message, src = DEFAULT_LOGGER_ISSUER) {
@@ -86,13 +80,10 @@ const reporter = {
86
80
  emitReporterEvent('onLogEntry', args);
87
81
  }
88
82
  };
89
-
90
83
  function stringify(obj) {
91
84
  return typeof obj === 'string' || obj instanceof String ? obj : JSON.stringify(obj, null, 2);
92
85
  }
93
-
94
86
  let _worker = new _CucumberWorker.default(reporter);
95
-
96
87
  oxutil.hookLogs(logger);
97
88
  process.on('uncaughtException', async (err, origin) => {
98
89
  logger.error(err.message, ISSUERS.USER);
@@ -110,7 +101,6 @@ process.on('message', async function (msg) {
110
101
  if (!msg.type) {
111
102
  return;
112
103
  }
113
-
114
104
  if (msg.type === 'invoke' && msg.method) {
115
105
  const {
116
106
  callId,
@@ -132,7 +122,6 @@ process.on('message', async function (msg) {
132
122
  dispose(msg.status || null);
133
123
  }
134
124
  });
135
-
136
125
  function processSend(msg) {
137
126
  try {
138
127
  process.send({
@@ -141,7 +130,6 @@ function processSend(msg) {
141
130
  });
142
131
  } catch (e) {}
143
132
  }
144
-
145
133
  function emitReporterEvent(method, args) {
146
134
  processSend({
147
135
  event: 'reporter',
@@ -149,7 +137,6 @@ function emitReporterEvent(method, args) {
149
137
  args: args
150
138
  });
151
139
  }
152
-
153
140
  async function dispose(status = null) {
154
141
  if (_worker) {
155
142
  try {
@@ -157,10 +144,8 @@ async function dispose(status = null) {
157
144
  } catch (e) {}
158
145
  }
159
146
  }
160
-
161
147
  async function invoke(method, args) {
162
148
  let retval, error;
163
-
164
149
  if (_worker && _worker[method] && typeof _worker[method] === 'function') {
165
150
  try {
166
151
  retval = await _worker[method].apply(_worker, args || []);
@@ -171,14 +156,12 @@ async function invoke(method, args) {
171
156
  } else {
172
157
  error = new Error(`Method "${method}" does not exist`);
173
158
  }
174
-
175
159
  if (error) {
176
160
  error = errorHelper.getFailureFromError(error);
177
161
  }
178
-
179
162
  return {
180
163
  retval,
181
164
  error
182
165
  };
183
166
  }
184
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL3dvcmtlci5qcyJdLCJuYW1lcyI6WyJveHV0aWwiLCJyZXF1aXJlIiwiZXJyb3JIZWxwZXIiLCJMRVZFTFMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJJU1NVRVJTIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJyZXBvcnRlciIsIm9uU3VpdGVTdGFydCIsImFyZ3MiLCJlbWl0UmVwb3J0ZXJFdmVudCIsIm9uU3VpdGVFbmQiLCJvbkNhc2VTdGFydCIsIm9uQ2FzZUVuZCIsIm9uU3RlcFN0YXJ0Iiwib25TdGVwRW5kIiwib25SdW5uZXJFbmQiLCJvbkxvZ0VudHJ5Iiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsIl93b3JrZXIiLCJDdWN1bWJlcldvcmtlciIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiVVNFUiIsImVyck1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZGlzcG9zZSIsImV4aXQiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwicmV0dmFsIiwiaW52b2tlIiwic3RhdHVzIiwic2VuZCIsImUiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBOzs7O0FBSEEsTUFBTUEsTUFBTSxHQUFHQyxPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHRCxPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBQ0EsTUFBTTtBQUFFRSxFQUFBQSxNQUFGO0FBQVVDLEVBQUFBLHFCQUFWO0FBQWlDQyxFQUFBQTtBQUFqQyxJ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LE1BQU8sV0FBeEMsRUFBb0RNLENBQXBEO0FBQ0F0QyxNQUFBQSxLQUFLLEdBQUdzQyxDQUFSO0FBQ0g7QUFDSixHQVJELE1BU0s7QUFDRHRDLElBQUFBLEtBQUssR0FBRyxJQUFJd0MsS0FBSixDQUFXLFdBQVVSLE1BQU8sa0JBQTVCLENBQVI7QUFDSDs7QUFFRCxNQUFJaEMsS0FBSixFQUFXO0FBQ1BBLElBQUFBLEtBQUssR0FBR3JCLFdBQVcsQ0FBQzhELG1CQUFaLENBQWdDekMsS0FBaEMsQ0FBUjtBQUNIOztBQUNELFNBQU87QUFBRWtDLElBQUFBLE1BQUY7QUFBVWxDLElBQUFBO0FBQVYsR0FBUDtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgb3h1dGlsID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKTtcclxuY29uc3QgZXJyb3JIZWxwZXIgPSByZXF1aXJlKCcuLi8uLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHsgTEVWRUxTLCBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSA9IHJlcXVpcmUoJy4uLy4uL2xpYi9sb2dnZXInKTtcclxuaW1wb3J0IEN1Y3VtYmVyV29ya2VyICBmcm9tICcuL0N1Y3VtYmVyV29ya2VyJztcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5jb25zdCBsb2dnZXIgPSB7XHJcbiAgICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuSU5GTywgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYyB9KTtcclxuICAgIH0sXHJcbiAgICBkZWJ1ZzogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLkRFQlVHLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIGVyciA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuRVJST1IsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMsIGVycjogZXJyIH0pO1xyXG4gICAgfSxcclxuICAgIHdhcm46IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5XQVJOLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgcmVwb3J0ZXIgPSB7XHJcbiAgICBvblN1aXRlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdWl0ZVN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdWl0ZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25DYXNlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdGVwU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25SdW5uZXJFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25SdW5uZXJFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkxvZ0VudHJ5OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uTG9nRW50cnknLCBhcmdzKTtcclxuICAgIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcclxuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqIGluc3RhbmNlb2YgU3RyaW5nID8gb2JqIDogSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKSk7XHJcbn1cclxuXHJcbi8vIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBsb2dnZXJcclxuLy9wcm9jZXNzLnN0ZG91dC53cml0ZSA9IGxvZ2dlci5kZWJ1ZztcclxuLy9wcm9jZXNzLnN0ZGVyci53cml0ZSA9IGxvZ2dlci5lcnJvcjtcclxuXHJcbmxldCBfd29ya2VyID0gbmV3IEN1Y3VtYmVyV29ya2VyKHJlcG9ydGVyKTtcclxuXHJcbm94dXRpbC5ob29rTG9ncyhsb2dnZXIpO1xyXG5cclxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBhc3luYyhlcnIsIG9yaWdpbikgPT4ge1xyXG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLCBJU1NVRVJTLlVTRVIpO1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAnd29ya2VyRXJyb3InLFxyXG4gICAgICAgIGVyck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbignU0lHSU5UJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zb2xlLmxvZygnU0lHSU5UIHJlY2VpdmVkJyk7XHJcbiAgICBhd2FpdCBkaXNwb3NlKCdDQU5DRUxFRCcpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDApO1xyXG59KTtcclxuXHJcbnByb2Nlc3Mub24oJ21lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAobXNnKSB7XHJcbiAgICBpZiAoIW1zZy50eXBlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG1zZy50eXBlID09PSAnaW52b2tlJyAmJiBtc2cubWV0aG9kKSB7XHJcbiAgICAgICAgY29uc3QgeyBjYWxsSWQsIG1ldGhvZCwgYXJncyB9ID0gbXNnO1xyXG4gICAgICAgIGNvbnN0IHsgcmV0dmFsLCBlcnJvciB9ID0gYXdhaXQgaW52b2tlKG1ldGhvZCwgYXJncyk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ2ludm9rZTpyZXN1bHQnLFxyXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICAgICAgcmV0dmFsOiByZXR2YWxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG1zZy50eXBlID09PSAnZXhpdCcpIHtcclxuICAgICAgICBkaXNwb3NlKG1zZy5zdGF0dXMgfHwgbnVsbCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1NlbmQobXNnKSB7XHJcbiAgICAvLyB3cmFwIHByb2Nlc3Muc2VuZCB3aXRoIHRyeS9jYXRjaCBhcyBzb21ldGltZXMgd2UgbWlnaHQgY2FsbCBwcm9jZXNzLnNlbmQgXHJcbiAgICAvLyB3aGVuIHBhcmVudCBwcm9jZXNzIGlzIGFscmVhZHkgZGlzY29ubmVjdGVkICh3aGVuIHVzZSBraWxscyB0aGUgbWFpbiBwcm9jZXNzKVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBhZGQgdXRjIHRpbWVzdGFtcFxyXG4gICAgICAgIHByb2Nlc3Muc2VuZCh7IHRpbWU6IG94dXRpbC5nZXRUaW1lU3RhbXAoKSwgLi4ubXNnIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZW1pdFJlcG9ydGVyRXZlbnQobWV0aG9kLCBhcmdzKSB7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICdyZXBvcnRlcicsXHJcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgYXJnczogYXJnc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2Uoc3RhdHVzPSBudWxsKSB7XHJcbiAgICBpZiAoX3dvcmtlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF93b3JrZXIuZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZ3MpIHtcclxuICAgIGxldCByZXR2YWwsIGVycm9yO1xyXG4gICAgaWYgKF93b3JrZXIgJiYgX3dvcmtlclttZXRob2RdICYmIHR5cGVvZiBfd29ya2VyW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR2YWwgPSBhd2FpdCBfd29ya2VyW21ldGhvZF0uYXBwbHkoX3dvcmtlciwgYXJncyB8fCBbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gaW52b2tlIFwiJHttZXRob2R9XCIgbWV0aG9kOmAsIGUpO1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYE1ldGhvZCBcIiR7bWV0aG9kfVwiIGRvZXMgbm90IGV4aXN0YCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb252ZXJ0IEpTIGVycm9yIHRvIE94eWdlbiBGYWlsdXJlIG9iamVjdFxyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHJldHZhbCwgZXJyb3IgfTtcclxufSJdfQ==
167
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJveHV0aWwiLCJyZXF1aXJlIiwiZXJyb3JIZWxwZXIiLCJMRVZFTFMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJJU1NVRVJTIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJyZXBvcnRlciIsIm9uU3VpdGVTdGFydCIsImFyZ3MiLCJlbWl0UmVwb3J0ZXJFdmVudCIsIm9uU3VpdGVFbmQiLCJvbkNhc2VTdGFydCIsIm9uQ2FzZUVuZCIsIm9uU3RlcFN0YXJ0Iiwib25TdGVwRW5kIiwib25SdW5uZXJFbmQiLCJvbkxvZ0VudHJ5Iiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsIl93b3JrZXIiLCJDdWN1bWJlcldvcmtlciIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiVVNFUiIsImVyck1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZGlzcG9zZSIsImV4aXQiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwicmV0dmFsIiwiaW52b2tlIiwic3RhdHVzIiwic2VuZCIsImUiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL3dvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuY29uc3QgeyBMRVZFTFMsIERFRkFVTFRfTE9HR0VSX0lTU1VFUiwgSVNTVUVSUyB9ID0gcmVxdWlyZSgnLi4vLi4vbGliL2xvZ2dlcicpO1xyXG5pbXBvcnQgQ3VjdW1iZXJXb3JrZXIgIGZyb20gJy4vQ3VjdW1iZXJXb3JrZXInO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmNvbnN0IGxvZ2dlciA9IHtcclxuICAgIGluZm86IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5JTkZPLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGRlYnVnOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuREVCVUcsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUiwgZXJyID0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5FUlJPUiwgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYywgZXJyOiBlcnIgfSk7XHJcbiAgICB9LFxyXG4gICAgd2FybjogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLldBUk4sIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCByZXBvcnRlciA9IHtcclxuICAgIG9uU3VpdGVTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN1aXRlRW5kOiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uU3VpdGVFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvbkNhc2VTdGFydCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uQ2FzZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvbkNhc2VFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN0ZXBTdGFydCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uU3RlcEVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN0ZXBFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblJ1bm5lckVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblJ1bm5lckVuZCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uTG9nRW50cnk6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25Mb2dFbnRyeScsIGFyZ3MpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmcgPyBvYmogOiBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpKTtcclxufVxyXG5cclxuLy8gcmVkaXJlY3Qgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIGxvZ2dlclxyXG4vL3Byb2Nlc3Muc3Rkb3V0LndyaXRlID0gbG9nZ2VyLmRlYnVnO1xyXG4vL3Byb2Nlc3Muc3RkZXJyLndyaXRlID0gbG9nZ2VyLmVycm9yO1xyXG5cclxubGV0IF93b3JrZXIgPSBuZXcgQ3VjdW1iZXJXb3JrZXIocmVwb3J0ZXIpO1xyXG5cclxub3h1dGlsLmhvb2tMb2dzKGxvZ2dlcik7XHJcblxyXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGFzeW5jKGVyciwgb3JpZ2luKSA9PiB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UsIElTU1VFUlMuVVNFUik7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICd3b3JrZXJFcnJvcicsXHJcbiAgICAgICAgZXJyTWVzc2FnZTogZXJyLm1lc3NhZ2UsXHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKCdTSUdJTlQgcmVjZWl2ZWQnKTtcclxuICAgIGF3YWl0IGRpc3Bvc2UoJ0NBTkNFTEVEJyk7XHJcbiAgICBwcm9jZXNzLmV4aXQoMCk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbignbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uIChtc2cpIHtcclxuICAgIGlmICghbXNnLnR5cGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAobXNnLnR5cGUgPT09ICdpbnZva2UnICYmIG1zZy5tZXRob2QpIHtcclxuICAgICAgICBjb25zdCB7IGNhbGxJZCwgbWV0aG9kLCBhcmdzIH0gPSBtc2c7XHJcbiAgICAgICAgY29uc3QgeyByZXR2YWwsIGVycm9yIH0gPSBhd2FpdCBpbnZva2UobWV0aG9kLCBhcmdzKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAnaW52b2tlOnJlc3VsdCcsXHJcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICBjYWxsSWQ6IGNhbGxJZCxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxyXG4gICAgICAgICAgICByZXR2YWw6IHJldHZhbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobXNnLnR5cGUgPT09ICdleGl0Jykge1xyXG4gICAgICAgIGRpc3Bvc2UobXNnLnN0YXR1cyB8fCBudWxsKTtcclxuICAgIH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzU2VuZChtc2cpIHtcclxuICAgIC8vIHdyYXAgcHJvY2Vzcy5zZW5kIHdpdGggdHJ5L2NhdGNoIGFzIHNvbWV0aW1lcyB3ZSBtaWdodCBjYWxsIHByb2Nlc3Muc2VuZCBcclxuICAgIC8vIHdoZW4gcGFyZW50IHByb2Nlc3MgaXMgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKHdoZW4gdXNlIGtpbGxzIHRoZSBtYWluIHByb2Nlc3MpXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIGFkZCB1dGMgdGltZXN0YW1wXHJcbiAgICAgICAgcHJvY2Vzcy5zZW5kKHsgdGltZTogb3h1dGlsLmdldFRpbWVTdGFtcCgpLCAuLi5tc2cgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIGlnbm9yZVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBlbWl0UmVwb3J0ZXJFdmVudChtZXRob2QsIGFyZ3MpIHtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ3JlcG9ydGVyJyxcclxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICB9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZGlzcG9zZShzdGF0dXM9IG51bGwpIHtcclxuICAgIGlmIChfd29ya2VyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgX3dvcmtlci5kaXNwb3NlKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJncykge1xyXG4gICAgbGV0IHJldHZhbCwgZXJyb3I7XHJcbiAgICBpZiAoX3dvcmtlciAmJiBfd29ya2VyW21ldGhvZF0gJiYgdHlwZW9mIF93b3JrZXJbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHZhbCA9IGF3YWl0IF93b3JrZXJbbWV0aG9kXS5hcHBseShfd29ya2VyLCBhcmdzIHx8IFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBpbnZva2UgXCIke21ldGhvZH1cIiBtZXRob2Q6YCwgZSk7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgTWV0aG9kIFwiJHttZXRob2R9XCIgZG9lcyBub3QgZXhpc3RgKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnZlcnQgSlMgZXJyb3IgdG8gT3h5Z2VuIEZhaWx1cmUgb2JqZWN0XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmV0dmFsLCBlcnJvciB9O1xyXG59Il0sIm1hcHBpbmdzIjoiOzs7QUFHQTtBQUErQztBQUgvQyxNQUFNQSxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN4QyxNQUFNQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUNsRCxNQUFNO0VBQUVFLE1BQU07RUFBRUMscUJBQXFCO0VBQUVDO0FBQVEsQ0FBQyxHQUFHSixPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFJOUVLLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVuQixNQUFNQyxNQUFNLEdBQUc7RUFDWEMsSUFBSSxFQUFFLFVBQVNDLE9BQU8sRUFBRUMsR0FBRyxHQUFHUCxxQkFBcUIsRUFBRTtJQUNqRCxNQUFNUSxFQUFFLEdBQUdaLE1BQU0sQ0FBQ2EsWUFBWSxFQUFFO0lBQ2hDQyxXQUFXLENBQUM7TUFBRUMsSUFBSSxFQUFFSCxFQUFFO01BQUVJLEtBQUssRUFBRSxLQUFLO01BQUVDLEtBQUssRUFBRWQsTUFBTSxDQUFDZSxJQUFJO01BQUVDLEdBQUcsRUFBRUMsU0FBUyxDQUFDVixPQUFPLENBQUM7TUFBRUM7SUFBSSxDQUFDLENBQUM7RUFDN0YsQ0FBQztFQUNEVSxLQUFLLEVBQUUsVUFBU1gsT0FBTyxFQUFFQyxHQUFHLEdBQUdQLHFCQUFxQixFQUFFO0lBQ2xELE1BQU1RLEVBQUUsR0FBR1osTUFBTSxDQUFDYSxZQUFZLEVBQUU7SUFDaENDLFdBQVcsQ0FBQztNQUFFQyxJQUFJLEVBQUVILEVBQUU7TUFBRUksS0FBSyxFQUFFLEtBQUs7TUFBRUMsS0FBSyxFQUFFZCxNQUFNLENBQUNtQixLQUFLO01BQUVILEdB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
@@ -4,17 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.oxygen = exports.cucumber = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _cucumber = _interopRequireDefault(require("./cucumber"));
11
-
12
9
  var _oxygen = _interopRequireDefault(require("./oxygen"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  const cucumber = _cucumber.default;
17
12
  exports.cucumber = cucumber;
18
13
  const oxygen = _oxygen.default;
19
14
  exports.oxygen = oxygen;
20
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL2luZGV4LmpzIl0sIm5hbWVzIjpbImN1Y3VtYmVyIiwiQ3VjdW1iZXJSdW5uZXIiLCJveHlnZW4iLCJPeHlnZW5SdW5uZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0FBRU8sTUFBTUEsUUFBUSxHQUFHQyxpQkFBakI7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHQyxlQUFmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEN1Y3VtYmVyUnVubmVyIGZyb20gJy4vY3VjdW1iZXInO1xyXG5pbXBvcnQgT3h5Z2VuUnVubmVyIGZyb20gJy4vb3h5Z2VuJztcclxuXHJcbmV4cG9ydCBjb25zdCBjdWN1bWJlciA9IEN1Y3VtYmVyUnVubmVyO1xyXG5leHBvcnQgY29uc3Qgb3h5Z2VuID0gT3h5Z2VuUnVubmVyO1xyXG4iXX0=
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjdWN1bWJlciIsIkN1Y3VtYmVyUnVubmVyIiwib3h5Z2VuIiwiT3h5Z2VuUnVubmVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lcnMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEN1Y3VtYmVyUnVubmVyIGZyb20gJy4vY3VjdW1iZXInO1xyXG5pbXBvcnQgT3h5Z2VuUnVubmVyIGZyb20gJy4vb3h5Z2VuJztcclxuXHJcbmV4cG9ydCBjb25zdCBjdWN1bWJlciA9IEN1Y3VtYmVyUnVubmVyO1xyXG5leHBvcnQgY29uc3Qgb3h5Z2VuID0gT3h5Z2VuUnVubmVyO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQW9DO0FBRTdCLE1BQU1BLFFBQVEsR0FBR0MsaUJBQWM7QUFBQztBQUNoQyxNQUFNQyxNQUFNLEdBQUdDLGVBQVk7QUFBQyJ9
@@ -4,26 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  const Fiber = require('fibers');
11
-
12
9
  const path = require('path');
13
-
10
+ const fs = require('fs');
14
11
  const {
15
12
  EventEmitter
16
13
  } = require('events');
17
-
18
14
  const Oxygen = require('../../core/OxygenCore').default;
19
-
20
15
  const oxutil = require('../../lib/util');
21
-
22
16
  const errorHelper = require('../../errors/helper');
23
-
24
17
  require = require('esm')(module);
25
18
  global.browser = {};
26
-
27
19
  class OxygenWorker extends EventEmitter {
28
20
  constructor(reporter, logger) {
29
21
  super();
@@ -34,34 +26,25 @@ class OxygenWorker extends EventEmitter {
34
26
  this._reporter = reporter;
35
27
  this._runId = null;
36
28
  }
37
-
38
29
  async init(runId, options, caps) {
39
30
  this._runId = runId;
40
31
  this._opts = options;
41
32
  this._cwd = this._opts.cwd || process.cwd();
42
-
43
33
  if (!this._oxygen) {
44
34
  try {
45
35
  this._oxygen = new Oxygen();
46
-
47
36
  this._oxygen.on('command:before', this._handleBeforeCommand.bind(this));
48
-
49
37
  this._oxygen.on('command:after', this._handleAfterCommand.bind(this));
50
-
51
38
  this._oxygen.on('log', this._handleLogEntry.bind(this));
52
-
53
39
  await this._oxygen.init(options, caps);
54
40
  this._testHooks = oxutil.loadTestHooks(options);
55
-
56
41
  this._logger.debug('Oxygen initialization completed');
57
42
  } catch (e) {
58
43
  this._logger.debug(`Oxygen initialization failed: ${e.toString()}`);
59
-
60
44
  throw e;
61
45
  }
62
46
  }
63
47
  }
64
-
65
48
  async run({
66
49
  scriptPath,
67
50
  context,
@@ -70,25 +53,34 @@ class OxygenWorker extends EventEmitter {
70
53
  if (!this._oxygen) {
71
54
  throw Error('Oxygen is not initialized');
72
55
  }
73
-
74
56
  this._oxygen.context = context;
75
-
76
57
  this._oxygen.loadPageObjectFile(poFile);
77
-
78
58
  this._steps = [];
79
-
80
59
  if (this._cwd && !path.isAbsolute(scriptPath)) {
81
60
  scriptPath = path.resolve(this._cwd, scriptPath);
82
61
  }
83
-
84
62
  let error = null;
85
-
63
+ let cwd = fs.realpathSync(this._cwd);
86
64
  try {
87
65
  this._oxygen && this._oxygen.onBeforeCase && (await this._oxygen.onBeforeCase(context));
88
66
  await this._runFnInFiberContext(() => {
89
67
  try {
90
68
  require.cache[require.resolve(scriptPath)] && delete require.cache[require.resolve(scriptPath)];
91
-
69
+ const Module = require('module');
70
+ const originalRequire = Module.prototype.require;
71
+ Module.prototype.require = function () {
72
+ const script = arguments['0'];
73
+ if (script && script.startsWith('.')) {
74
+ for (const key in require.cache) {
75
+ if (key.startsWith && key.startsWith(cwd)) {
76
+ try {
77
+ delete require.cache[key];
78
+ } catch (exi) {}
79
+ }
80
+ }
81
+ }
82
+ return originalRequire.apply(this, arguments);
83
+ };
92
84
  require(scriptPath);
93
85
  } catch (e) {
94
86
  if (e && e.type && e.type === errorHelper.errorCode.ASSERT_PASSED) {} else {
@@ -99,38 +91,29 @@ class OxygenWorker extends EventEmitter {
99
91
  } catch (e) {
100
92
  error = e;
101
93
  }
102
-
103
94
  await this._oxygen._waitStepResult();
104
-
105
95
  if (error) {
106
96
  error = errorHelper.getFailureFromError(error);
107
97
  }
108
-
109
98
  let moduleCaps = {};
110
-
111
99
  if (this._oxygen && this._oxygen.getModulesCapabilities) {
112
100
  moduleCaps = this._oxygen.getModulesCapabilities();
113
101
  }
114
-
115
102
  this._oxygen && this._oxygen.onAfterCase && (await this._oxygen.onAfterCase(error));
116
103
  let resultStore = {};
117
-
118
104
  if (this._oxygen && this._oxygen.results) {
119
- resultStore = { ...this._oxygen.results
105
+ resultStore = {
106
+ ...this._oxygen.results
120
107
  };
121
108
  }
122
-
123
109
  if (this._oxygen && this._oxygen.resetResults) {
124
110
  this._oxygen.resetResults();
125
111
  }
126
-
127
112
  this._steps = null;
128
113
  let oxContext = {};
129
-
130
114
  if (this._oxygen && this._oxygen.context) {
131
115
  oxContext = this._oxygen.context;
132
116
  }
133
-
134
117
  oxContext.vars = global.vars;
135
118
  return {
136
119
  error,
@@ -139,7 +122,6 @@ class OxygenWorker extends EventEmitter {
139
122
  context: oxContext
140
123
  };
141
124
  }
142
-
143
125
  async dispose(status = null) {
144
126
  if (this._oxygen) {
145
127
  try {
@@ -151,7 +133,6 @@ class OxygenWorker extends EventEmitter {
151
133
  }
152
134
  }
153
135
  }
154
-
155
136
  async disposeModules(status = null) {
156
137
  if (this._oxygen) {
157
138
  try {
@@ -163,15 +144,12 @@ class OxygenWorker extends EventEmitter {
163
144
  }
164
145
  }
165
146
  }
166
-
167
147
  async callTestHook(hookName, hookArgs) {
168
148
  if (!this._testHooks || !this._testHooks[hookName] || typeof this._testHooks[hookName] !== 'function') {
169
149
  throw new Error(`Hook does not exist: ${hookName}`);
170
150
  }
171
-
172
151
  await oxutil.executeTestHook(this._testHooks, hookName, hookArgs);
173
152
  }
174
-
175
153
  async _runFnInFiberContext(fn) {
176
154
  return new Promise((resolve, reject) => Fiber(() => {
177
155
  try {
@@ -182,22 +160,18 @@ class OxygenWorker extends EventEmitter {
182
160
  }
183
161
  }).run());
184
162
  }
185
-
186
163
  async replStart() {
187
164
  let commandResolve = () => {};
188
-
189
165
  setTimeout(async () => {
190
166
  if (this._oxygen && this._oxygen.modules) {
191
167
  const keys = Object.keys(this._oxygen.modules);
192
168
  let debug;
193
169
  keys.map(item => {
194
170
  const driver = this._oxygen.modules[item]['getDriver'] && this._oxygen.modules[item]['getDriver']();
195
-
196
171
  if (driver) {
197
172
  debug = this._oxygen.modules[item]['debug'];
198
173
  }
199
174
  });
200
-
201
175
  if (debug) {
202
176
  await debug();
203
177
  commandResolve();
@@ -210,37 +184,29 @@ class OxygenWorker extends EventEmitter {
210
184
  }, 10);
211
185
  return new Promise(resolve => commandResolve = resolve);
212
186
  }
213
-
214
187
  _handleBeforeCommand(e) {
215
188
  if (!e) {
216
189
  return;
217
190
  }
218
-
219
191
  this.emit('command:before', e);
220
192
  }
221
-
222
193
  _handleAfterCommand(e) {
223
194
  if (!e || !e.result) {
224
195
  return;
225
196
  }
226
-
227
197
  this._steps && this._steps.push(e.result);
228
198
  this.emit('command:after', e);
229
199
  }
230
-
231
200
  _handleLogEntry(e) {
232
201
  if (!e || !e.level || !e.message) {
233
202
  return;
234
203
  }
235
-
236
204
  if (e && e.level && e.level === 'error') {
237
205
  this._logger[e.level](e.message, e.src, e.err);
238
206
  } else {
239
207
  this._logger[e.level](e.message, e.src);
240
208
  }
241
209
  }
242
-
243
210
  }
244
-
245
211
  exports.default = OxygenWorker;
246
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9PeHlnZW5Xb3JrZXIuanMiXSwibmFtZXMiOlsiRmliZXIiLCJyZXF1aXJlIiwicGF0aCIsIkV2ZW50RW1pdHRlciIsIk94eWdlbiIsImRlZmF1bHQiLCJveHV0aWwiLCJlcnJvckhlbHBlciIsIm1vZHVsZSIsImdsb2JhbCIsImJyb3dzZXIiLCJPeHlnZW5Xb3JrZXIiLCJjb25zdHJ1Y3RvciIsInJlcG9ydGVyIiwibG9nZ2VyIiwiX294eWdlbiIsIl9vcHRzIiwiX2xvZ2dlciIsIl90ZXN0SG9va3MiLCJfcmVwb3J0ZXIiLCJfcnVuSWQiLCJpbml0IiwicnVuSWQiLCJvcHRpb25zIiwiY2FwcyIsIl9jd2QiLCJjd2QiLCJwcm9jZXNzIiwib24iLCJfaGFuZGxlQmVmb3JlQ29tbWFuZCIsImJpbmQiLCJfaGFuZGxlQWZ0ZXJDb21tYW5kIiwiX2hhbmRsZUxvZ0VudHJ5IiwibG9hZFRlc3RIb29rcyIsImRlYnVnIiwiZSIsInRvU3RyaW5nIiwicnVuIiwic2NyaXB0UGF0aCIsImNvbnRleHQiLCJwb0ZpbGUiLCJFcnJvciIsImxvYWRQYWdlT2JqZWN0RmlsZSIsIl9zdGVwcyIsImlzQWJzb2x1dGUiLCJyZXNvbHZlIiwiZXJyb3IiLCJvbkJlZm9yZUNhc2UiLCJfcnVuRm5JbkZpYmVyQ29udGV4dCIsImNhY2hlIiwidHlwZSIsImVycm9yQ29kZSIsIkFTU0VSVF9QQVNTRUQiLCJfd2FpdFN0ZXBSZXN1bHQiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwibW9kdWxlQ2FwcyIsImdldE1vZHVsZXNDYXBhYmlsaXRpZXMiLCJvbkFmdGVyQ2FzZSIsInJlc3VsdFN0b3JlIiwicmVzdWx0cyIsInJlc2V0UmVzdWx0cyIsIm94Q29udGV4dCIsInZhcnMiLCJkaXNwb3NlIiwic3RhdHVzIiwiZGlzcG9zZU1vZHVsZXMiLCJjYWxsVGVzdEhvb2siLCJob29rTmFtZSIsImhvb2tBcmdzIiwiZXhlY3V0ZVRlc3RIb29rIiwiZm4iLCJQcm9taXNlIiwicmVqZWN0IiwicmVzdWx0IiwiYXBwbHkiLCJlcnIiLCJyZXBsU3RhcnQiLCJjb21tYW5kUmVzb2x2ZSIsInNldFRpbWVvdXQiLCJtb2R1bGVzIiwia2V5cyIsIk9iamVjdCIsIm1hcCIsIml0ZW0iLCJkcml2ZXIiLCJlbWl0IiwicHVzaCIsImxldmVsIiwibWVzc2FnZSIsInNyYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBWUEsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsUUFBRCxDQUFyQjs7QUFDQSxNQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU07QUFBRUUsRUFBQUE7QUFBRixJQUFtQkYsT0FBTyxDQUFDLFFBQUQsQ0FBaEM7O0FBRUEsTUFBTUcsTUFBTSxHQUFHSCxPQUFPLENBQUMsdUJBQUQsQ0FBUCxDQUFpQ0ksT0FBaEQ7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHTCxPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTU0sV0FBVyxHQUFHTixPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBR0FBLE9BQU8sR0FBR0EsT0FBTyxDQUFDLEtBQUQsQ0FBUCxDQUFlTyxNQUFmLENBQVY7QUFHQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLEVBQWpCOztBQUVlLE1BQU1DLFlBQU4sU0FBMkJSLFlBQTNCLENBQXdDO0FBQ25EUyxFQUFBQSxXQUFXLENBQUVDLFFBQUYsRUFBWUMsTUFBWixFQUFvQjtBQUMzQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWVILE1BQWY7QUFDQSxTQUFLSSxVQUFMLEdBQWtCLEVBQWxCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQk4sUUFBakI7QUFDQSxTQUFLTyxNQUFMLEdBQWMsSUFBZDtBQUNIOztBQUVTLFFBQUpDLElBQUksQ0FBQ0MsS0FBRCxFQUFRQyxPQUFSLEVBQWlCQyxJQUFqQixFQUF1QjtBQUM3QixTQUFLSixN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RCxDQUFDLENBQUNxRCxPQUF4QixFQUFpQ3JELENBQUMsQ0FBQ3NELEdBQW5DLEVBQXdDdEQsQ0FBQyxDQUFDd0MsR0FBMUM7QUFDSCxLQUZELE1BRU87QUFDSCxXQUFLMUQsT0FBTCxDQUFha0IsQ0FBQyxDQUFDb0QsS0FBZixFQUFzQnBELENBQUMsQ0FBQ3FELE9BQXhCLEVBQWlDckQsQ0FBQyxDQUFDc0QsR0FBbkM7QUFDSDtBQUNKOztBQTlNa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuY29uc3QgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xyXG5cclxuY29uc3QgT3h5Z2VuID0gcmVxdWlyZSgnLi4vLi4vY29yZS9PeHlnZW5Db3JlJykuZGVmYXVsdDtcclxuY29uc3Qgb3h1dGlsID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKTtcclxuY29uc3QgZXJyb3JIZWxwZXIgPSByZXF1aXJlKCcuLi8uLi9lcnJvcnMvaGVscGVyJyk7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxyXG5yZXF1aXJlID0gcmVxdWlyZSgnZXNtJykobW9kdWxlKTtcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW5Xb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IgKHJlcG9ydGVyLCBsb2dnZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX294eWdlbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RIb29rcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5fcnVuSWQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQocnVuSWQsIG9wdGlvbnMsIGNhcHMpIHtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IHJ1bklkO1xyXG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMuX2N3ZCA9IHRoaXMuX29wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9veHlnZW4gPSBuZXcgT3h5Z2VuKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9veHlnZW4ub24oJ2NvbW1hbmQ6YmVmb3JlJywgdGhpcy5faGFuZGxlQmVmb3JlQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignbG9nJywgdGhpcy5faGFuZGxlTG9nRW50cnkuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uaW5pdChvcHRpb25zLCBjYXBzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlc3RIb29rcyA9IG94dXRpbC5sb2FkVGVzdEhvb2tzKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgLy9tYWtlTW9kdWxlc0dsb2JhbChvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnT3h5Z2VuIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYE94eWdlbiBpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICR7ZS50b1N0cmluZygpfWApO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oeyBzY3JpcHRQYXRoLCBjb250ZXh0LCBwb0ZpbGUgPSBudWxsIH0pIHtcclxuICAgICAgICAvLyBhc3NpZ24gdXAgdG8gZGF0ZSBjb250ZXh0IHRvIE94eWdlbiBDb3JlIHRvIHJlZmxlY3QgbmV3IHBhcmFtZXRlcnMgYW5kIG90aGVyIGNvbnRleHQgZGF0YVxyXG4gICAgICAgIGlmICghdGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yICgnT3h5Z2VuIGlzIG5vdCBpbml0aWFsaXplZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9veHlnZW4uY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuLmxvYWRQYWdlT2JqZWN0RmlsZShwb0ZpbGUpO1xyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuX2N3ZCAmJiAhcGF0aC5pc0Fic29sdXRlKHNjcmlwdFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHNjcmlwdFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5fY3dkLCBzY3JpcHRQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICAvLyBsb2FkIGFuZCBydW4gdGhlIHRlc3Qgc2NyaXB0XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgdGhpcy5fb3h5Z2VuLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcnVuRm5JbkZpYmVyQ29udGV4dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciByZXF1aXJlIGNhY2hlIHNvIHRoZSBzY3JpcHQgd2lsbCBiZSBleGVjdXRlZCBvbiBlYWNoIGl0ZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHNjcmlwdFBhdGgpXSAmJiBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoc2NyaXB0UGF0aCldO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoc2NyaXB0UGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yID0gZS5jb2RlICYmIGUuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnID8gbmV3IFNjcmlwdE5vdEZvdW5kRXJyb3Ioc2NyaXB0UGF0aCkgOiBlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnR5cGUgJiYgZS50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyBzdGVwIHJlc3VsdCBnZW5lcmF0aW9uIHRha2VzIHNvbWUgdGltZSB0byBtYWtlIHNjcmVlbnNob3RcclxuICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uX3dhaXRTdGVwUmVzdWx0KCk7XHJcblxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1vZHVsZUNhcHMgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4uZ2V0TW9kdWxlc0NhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICBtb2R1bGVDYXBzID0gdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ub25BZnRlckNhc2UgJiYgYXdhaXQgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlKGVycm9yKTtcclxuXHJcbiAgICAgICAgLy8gY2xvbmUgdGhlIHJlc3VsdHMsIG90aGVyd2lzZSByZXN1bHRTdG9yZSB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoZSBmb2xsb3dpbmcgdGhpcy5fb3h5Z2VuLnJlc2V0UmVzdWx0cygpIGNhbGxcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdFN0b3JlID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLnJlc3VsdHMpIHtcclxuICAgICAgICAgICAgcmVzdWx0U3RvcmUgPSB7IC4uLnRoaXMuX294eWdlbi5yZXN1bHRzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMpIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RlcHMgYW5kIG90aGVyIHJlc3VsdCBkYXRhXHJcbiAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgb3hDb250ZXh0ID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4uY29udGV4dCkge1xyXG4gICAgICAgICAgICBveENvbnRleHQgPSB0aGlzLl9veHlnZW4uY29udGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3hDb250ZXh0LnZhcnMgPSBnbG9iYWwudmFycztcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZXJyb3IsIG1vZHVsZUNhcHMsIHJlc3VsdFN0b3JlLCBjb250ZXh0OiBveENvbnRleHQgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIE94eWdlbicsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RlcHMgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9veHlnZW4uZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4gbW9kdWxlcycsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLnJlc2V0UmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNhbGxUZXN0SG9vayhob29rTmFtZSwgaG9va0FyZ3MpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Rlc3RIb29rcyB8fCAhdGhpcy5fdGVzdEhvb2tzW2hvb2tOYW1lXSB8fCB0eXBlb2YgdGhpcy5fdGVzdEhvb2tzW2hvb2tOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhvb2sgZG9lcyBub3QgZXhpc3Q6ICR7aG9va05hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IG94dXRpbC5leGVjdXRlVGVzdEhvb2sodGhpcy5fdGVzdEhvb2tzLCBob29rTmFtZSwgaG9va0FyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9ydW5GbkluRmliZXJDb250ZXh0IChmbikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBGaWJlcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbi5hcHBseSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkucnVuKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBsZXQgY29tbWFuZFJlc29sdmUgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9veHlnZW4ubW9kdWxlcyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVidWc7XHJcbiAgICAgICAgICAgICAgICBrZXlzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydnZXREcml2ZXInXSAmJiB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnID0gdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2RlYnVnJ107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVidWcoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kUmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kUmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiAoY29tbWFuZFJlc29sdmUgPSByZXNvbHZlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUJlZm9yZUNvbW1hbmQoZSkge1xyXG4gICAgICAgIGlmICghZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDpiZWZvcmUnLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQWZ0ZXJDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUgfHwgIWUucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3N0ZXBzICYmIHRoaXMuX3N0ZXBzLnB1c2goZS5yZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDphZnRlcicsIGUpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVMb2dFbnRyeShlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLmxldmVsIHx8ICFlLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZSAmJiBlLmxldmVsICYmIGUubGV2ZWwgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMsIGUuZXJyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dnZXJbZS5sZXZlbF0oZS5tZXNzYWdlLCBlLnNyYyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
212
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWJlciIsInJlcXVpcmUiLCJwYXRoIiwiZnMiLCJFdmVudEVtaXR0ZXIiLCJPeHlnZW4iLCJkZWZhdWx0Iiwib3h1dGlsIiwiZXJyb3JIZWxwZXIiLCJtb2R1bGUiLCJnbG9iYWwiLCJicm93c2VyIiwiT3h5Z2VuV29ya2VyIiwiY29uc3RydWN0b3IiLCJyZXBvcnRlciIsImxvZ2dlciIsIl9veHlnZW4iLCJfb3B0cyIsIl9sb2dnZXIiLCJfdGVzdEhvb2tzIiwiX3JlcG9ydGVyIiwiX3J1bklkIiwiaW5pdCIsInJ1bklkIiwib3B0aW9ucyIsImNhcHMiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIm9uIiwiX2hhbmRsZUJlZm9yZUNvbW1hbmQiLCJiaW5kIiwiX2hhbmRsZUFmdGVyQ29tbWFuZCIsIl9oYW5kbGVMb2dFbnRyeSIsImxvYWRUZXN0SG9va3MiLCJkZWJ1ZyIsImUiLCJ0b1N0cmluZyIsInJ1biIsInNjcmlwdFBhdGgiLCJjb250ZXh0IiwicG9GaWxlIiwiRXJyb3IiLCJsb2FkUGFnZU9iamVjdEZpbGUiLCJfc3RlcHMiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsImVycm9yIiwicmVhbHBhdGhTeW5jIiwib25CZWZvcmVDYXNlIiwiX3J1bkZuSW5GaWJlckNvbnRleHQiLCJjYWNoZSIsIk1vZHVsZSIsIm9yaWdpbmFsUmVxdWlyZSIsInByb3RvdHlwZSIsInNjcmlwdCIsImFyZ3VtZW50cyIsInN0YXJ0c1dpdGgiLCJrZXkiLCJleGkiLCJhcHBseSIsInR5cGUiLCJlcnJvckNvZGUiLCJBU1NFUlRfUEFTU0VEIiwiX3dhaXRTdGVwUmVzdWx0IiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIm1vZHVsZUNhcHMiLCJnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzIiwib25BZnRlckNhc2UiLCJyZXN1bHRTdG9yZSIsInJlc3VsdHMiLCJyZXNldFJlc3VsdHMiLCJveENvbnRleHQiLCJ2YXJzIiwiZGlzcG9zZSIsInN0YXR1cyIsImRpc3Bvc2VNb2R1bGVzIiwiY2FsbFRlc3RIb29rIiwiaG9va05hbWUiLCJob29rQXJncyIsImV4ZWN1dGVUZXN0SG9vayIsImZuIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc3VsdCIsImVyciIsInJlcGxTdGFydCIsImNvbW1hbmRSZXNvbHZlIiwic2V0VGltZW91dCIsIm1vZHVsZXMiLCJrZXlzIiwiT2JqZWN0IiwibWFwIiwiaXRlbSIsImRyaXZlciIsImVtaXQiLCJwdXNoIiwibGV2ZWwiLCJtZXNzYWdlIiwic3JjIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bm5lcnMvb3h5Z2VuL094eWdlbldvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuY29uc3QgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xyXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XHJcblxyXG5jb25zdCBPeHlnZW4gPSByZXF1aXJlKCcuLi8uLi9jb3JlL094eWdlbkNvcmUnKS5kZWZhdWx0O1xyXG5jb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXHJcbnJlcXVpcmUgPSByZXF1aXJlKCdlc20nKShtb2R1bGUpO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbldvcmtlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAocmVwb3J0ZXIsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0ge307XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChydW5JZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIHRoaXMuX3J1bklkID0gcnVuSWQ7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fY3dkID0gdGhpcy5fb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbiA9IG5ldyBPeHlnZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdjb21tYW5kOmFmdGVyJywgdGhpcy5faGFuZGxlQWZ0ZXJDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdsb2cnLCB0aGlzLl9oYW5kbGVMb2dFbnRyeS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX294eWdlbi5pbml0KG9wdGlvbnMsIGNhcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0gb3h1dGlsLmxvYWRUZXN0SG9va3Mob3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAvL21ha2VNb2R1bGVzR2xvYmFsKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdPeHlnZW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgT3h5Z2VuIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJHtlLnRvU3RyaW5nKCl9YCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bih7IHNjcmlwdFBhdGgsIGNvbnRleHQsIHBvRmlsZSA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGFzc2lnbiB1cCB0byBkYXRlIGNvbnRleHQgdG8gT3h5Z2VuIENvcmUgdG8gcmVmbGVjdCBuZXcgcGFyYW1ldGVycyBhbmQgb3RoZXIgY29udGV4dCBkYXRhXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IgKCdPeHlnZW4gaXMgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX294eWdlbi5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICB0aGlzLl9veHlnZW4ubG9hZFBhZ2VPYmplY3RGaWxlKHBvRmlsZSk7XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5fY3dkICYmICFwYXRoLmlzQWJzb2x1dGUoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgICAgICAgc2NyaXB0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QsIHNjcmlwdFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBvbiBPU1ggY3dkIHdpbGwgYmUgYSBzeW1saW5rOiBcIi92YXIvZm9sZGVycy8uLlwiIGluc3RlYWQgb2YgXCIvcHJpdmF0ZS92YXIvZm9sZGVycy8uLlwiICh0aGlzIGNvdWxkIGFsc28gaGFwcGVuIG9uIG90aGVyIHBsYXRmb3JtcyB0b28pXHJcbiAgICAgICAgLy8gc28gd2UgbmVlZCB0byByZXNvbHZlIGl0IHRvIHJlYWwgcGF0aFxyXG4gICAgICAgIGxldCBjd2QgPSBmcy5yZWFscGF0aFN5bmModGhpcy5fY3dkKTtcclxuXHJcbiAgICAgICAgLy8gbG9hZCBhbmQgcnVuIHRoZSB0ZXN0IHNjcmlwdFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ub25CZWZvcmVDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkJlZm9yZUNhc2UoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bkZuSW5GaWJlckNvbnRleHQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgcmVxdWlyZSBjYWNoZSBzbyB0aGUgc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQgb24gZWFjaCBpdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShzY3JpcHRQYXRoKV0gJiYgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHNjcmlwdFBhdGgpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB1c2VzIHJlcXVpcmUoJy4vc29tZXNjcmlwdC5qcycpIGluIG11bHRpcGxlIHRlc3Qgc2NyaXB0cyAoY2FzZXMpLCBhbmQgc29tZXNjcmlwdC5qcyBjb250YWlucyB3ZWIvbW9iLmluaXRcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVuLCB3aGVuIHRob3NlIHNjcmlwdHMgYXJlIGV4ZWN1dGVkIGluIGEgc3VpdGUsIG9ubHkgZmlyc3QgY2FzZSB3aWxsIHBhc3MsIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIE1PRFVMRV9OT1RfSU5JVElBTElaRUQgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlICdyZXF1aXJlJyBpcyBjYWNoZWQsIGFuZCB3aGVuIHRoZSBmaXJzdCBjYXNlIGlzIGZpbmlzaGVkLCB0aGUgbW9kdWxlIGlzIG1hcmtlZCBhcyBpc0luaXRpYWxpemVkID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm90IHJlLWluaXRpYWxpemVkIGJhY2sgb24gbmV4dCBjYXNlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgY2xlYW4gdXNlciBsZXZlbCBzY3JpcHRzIGZyb20gJ3JlcXVpcmUnIGNhY2hlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZWIuaW5pdCBhbmQgb3RoZXIgbW9kdWxlcyBzaG91bGQgYmUgcHJvYmFibHkgZml4ZWQgKHByb3Blcmx5IGRpc3Bvc2VkKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgb2J2aW91c2x5IHJlbGF0ZXMgbm90IG9ubHkgdG8gd2ViLCBldGMgbW9kdWxlLiB0aGlzIGlzIGEgZ2VuZXJhbCBpc3N1ZS5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKCdtb2R1bGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBNb2R1bGUucHJvdG90eXBlLnJlcXVpcmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE1vZHVsZS5wcm90b3R5cGUucmVxdWlyZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhcmd1bWVudHNbJzAnXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgY2FjaGUgb25seSB3aGVuIHdlIHRyeSB0byBsb2FkIHVzZXItbGV2ZWwgc2NyaXB0cyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAnLi8nIG9yICcuLi8nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0ICYmIHNjcmlwdC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBldmVyeXRoaW5nIHVzZXIgcmVsYXRlZCBmcm9tIHRoZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVxdWlyZS5jYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCAmJiBrZXkuc3RhcnRzV2l0aChjd2QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShzY3JpcHRQYXRoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciA9IGUuY29kZSAmJiBlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJyA/IG5ldyBTY3JpcHROb3RGb3VuZEVycm9yKHNjcmlwdFBhdGgpIDogZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS50eXBlICYmIGUudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIHNvbWUgY2FzZXMgc3RlcCByZXN1bHQgZ2VuZXJhdGlvbiB0YWtlcyBzb21lIHRpbWUgdG8gbWFrZSBzY3JlZW5zaG90XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLl93YWl0U3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtb2R1bGVDYXBzID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgbW9kdWxlQ2FwcyA9IHRoaXMuX294eWdlbi5nZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkFmdGVyQ2FzZShlcnJvcik7XHJcblxyXG4gICAgICAgIC8vIGNsb25lIHRoZSByZXN1bHRzLCBvdGhlcndpc2UgcmVzdWx0U3RvcmUgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGUgZm9sbG93aW5nIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKSBjYWxsXHJcblxyXG4gICAgICAgIGxldCByZXN1bHRTdG9yZSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFN0b3JlID0geyAuLi50aGlzLl9veHlnZW4ucmVzdWx0cyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHN0ZXBzIGFuZCBvdGhlciByZXN1bHQgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IG94Q29udGV4dCA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgb3hDb250ZXh0ID0gdGhpcy5fb3h5Z2VuLmNvbnRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG94Q29udGV4dC52YXJzID0gZ2xvYmFsLnZhcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGVycm9yLCBtb2R1bGVDYXBzLCByZXN1bHRTdG9yZSwgY29udGV4dDogb3hDb250ZXh0IH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4nLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2UgT3h5Z2VuIG1vZHVsZXMnLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYWxsVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90ZXN0SG9va3MgfHwgIXRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gfHwgdHlwZW9mIHRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIb29rIGRvZXMgbm90IGV4aXN0OiAke2hvb2tOYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBveHV0aWwuZXhlY3V0ZVRlc3RIb29rKHRoaXMuX3Rlc3RIb29rcywgaG9va05hbWUsIGhvb2tBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuRm5JbkZpYmVyQ29udGV4dCAoZm4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gRmliZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLnJ1bigpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmRSZXNvbHZlID0gKCkgPT4geyB9O1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fb3h5Z2VuLm1vZHVsZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlYnVnO1xyXG4gICAgICAgICAgICAgICAga2V5cy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2dldERyaXZlciddKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydkZWJ1ZyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlYnVnKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmRSZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gKGNvbW1hbmRSZXNvbHZlID0gcmVzb2x2ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YmVmb3JlJywgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLnJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zdGVwcyAmJiB0aGlzLl9zdGVwcy5wdXNoKGUucmVzdWx0KTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YWZ0ZXInLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTG9nRW50cnkoZSkge1xyXG4gICAgICAgIGlmICghZSB8fCAhZS5sZXZlbCB8fCAhZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUgJiYgZS5sZXZlbCAmJiBlLmxldmVsID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlcltlLmxldmVsXShlLm1lc3NhZ2UsIGUuc3JjLCBlLmVycik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4i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