oxygen-cli 1.37.8 → 1.37.9

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 (303) hide show
  1. package/CHANGELOG.md +1687 -1687
  2. package/LICENSE +672 -672
  3. package/README.md +37 -37
  4. package/build/core/OxygenCore.js +8 -2
  5. package/build/core/OxygenEvents.js +4 -2
  6. package/build/core/OxygenModule.js +1 -1
  7. package/build/core/OxygenService.js +1 -1
  8. package/build/core/OxygenSubModule.js +1 -1
  9. package/build/core/WebDriverModule.js +1 -1
  10. package/build/core/utils.js +1 -1
  11. package/build/errors/HookError.js +1 -1
  12. package/build/errors/ModuleError.js +1 -1
  13. package/build/errors/ModuleUnavailableError.js +1 -1
  14. package/build/errors/OxygenError.js +1 -1
  15. package/build/errors/ScriptNotFound.js +1 -1
  16. package/build/errors/helper.js +1 -1
  17. package/build/index.js +1 -1
  18. package/build/lib/cli-util.js +25 -6
  19. package/build/lib/cli.js +2 -2
  20. package/build/lib/debugger.js +1 -1
  21. package/build/lib/img-merge.js +1 -1
  22. package/build/lib/launcher.js +1 -1
  23. package/build/lib/logger.js +43 -43
  24. package/build/lib/moduleRequire.js +1 -1
  25. package/build/lib/parallel-launcher.js +1 -1
  26. package/build/lib/param-manager.js +1 -1
  27. package/build/lib/param-reader-csv.js +1 -1
  28. package/build/lib/param-reader-excel.js +1 -1
  29. package/build/lib/param-reader-json.js +1 -1
  30. package/build/lib/text-to-image.js +1 -1
  31. package/build/lib/util.js +2 -2
  32. package/build/model/case-result.js +1 -1
  33. package/build/model/failure.js +1 -1
  34. package/build/model/status.js +1 -1
  35. package/build/model/step-result.js +1 -1
  36. package/build/model/suite-result.js +2 -1
  37. package/build/model/test-result.js +1 -1
  38. package/build/model/testcase.js +1 -1
  39. package/build/model/testsuite.js +1 -1
  40. package/build/ox_modules/index.js +1 -1
  41. package/build/ox_modules/module-assert.js +37 -37
  42. package/build/ox_modules/module-date.js +24 -24
  43. package/build/ox_modules/module-db.js +52 -52
  44. package/build/ox_modules/module-email.js +59 -59
  45. package/build/ox_modules/module-eyes.js +34 -34
  46. package/build/ox_modules/module-http/ntlm-util.js +10 -10
  47. package/build/ox_modules/module-http/ntlm.js +15 -15
  48. package/build/ox_modules/module-http.js +132 -132
  49. package/build/ox_modules/module-log.js +27 -27
  50. package/build/ox_modules/module-mailinator.js +87 -87
  51. package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
  52. package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
  53. package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
  54. package/build/ox_modules/module-mob/commands/assertText.js +21 -21
  55. package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
  56. package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
  57. package/build/ox_modules/module-mob/commands/back.js +16 -16
  58. package/build/ox_modules/module-mob/commands/clear.js +19 -19
  59. package/build/ox_modules/module-mob/commands/click.js +17 -17
  60. package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
  61. package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
  62. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
  63. package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
  64. package/build/ox_modules/module-mob/commands/debug.js +16 -16
  65. package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
  66. package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
  67. package/build/ox_modules/module-mob/commands/execute.js +21 -21
  68. package/build/ox_modules/module-mob/commands/findElement.js +20 -20
  69. package/build/ox_modules/module-mob/commands/findElements.js +23 -23
  70. package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
  71. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
  72. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
  73. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
  74. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
  75. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
  76. package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
  77. package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
  78. package/build/ox_modules/module-mob/commands/getSource.js +16 -16
  79. package/build/ox_modules/module-mob/commands/getText.js +18 -18
  80. package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
  81. package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
  82. package/build/ox_modules/module-mob/commands/getValue.js +18 -18
  83. package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
  84. package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
  85. package/build/ox_modules/module-mob/commands/index.js +1 -1
  86. package/build/ox_modules/module-mob/commands/installApp.js +16 -16
  87. package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
  88. package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
  89. package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
  90. package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
  91. package/build/ox_modules/module-mob/commands/isExist.js +19 -19
  92. package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
  93. package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
  94. package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
  95. package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
  96. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
  97. package/build/ox_modules/module-mob/commands/open.js +17 -17
  98. package/build/ox_modules/module-mob/commands/pause.js +16 -16
  99. package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
  100. package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
  101. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
  102. package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
  103. package/build/ox_modules/module-mob/commands/select.js +24 -24
  104. package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
  105. package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
  106. package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
  107. package/build/ox_modules/module-mob/commands/setContext.js +16 -16
  108. package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
  109. package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
  110. package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
  111. package/build/ox_modules/module-mob/commands/shake.js +16 -16
  112. package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
  113. package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
  114. package/build/ox_modules/module-mob/commands/swipe.js +20 -20
  115. package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
  116. package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
  117. package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
  118. package/build/ox_modules/module-mob/commands/tap.js +17 -17
  119. package/build/ox_modules/module-mob/commands/type.js +20 -20
  120. package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
  121. package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
  122. package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
  123. package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
  124. package/build/ox_modules/module-mob.js +74 -74
  125. package/build/ox_modules/module-pdf.js +35 -35
  126. package/build/ox_modules/module-proxy.js +77 -77
  127. package/build/ox_modules/module-serial.js +55 -55
  128. package/build/ox_modules/module-shell.js +25 -25
  129. package/build/ox_modules/module-soap.js +72 -72
  130. package/build/ox_modules/module-twilio.js +41 -41
  131. package/build/ox_modules/module-utils.js +91 -91
  132. package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
  133. package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
  134. package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
  135. package/build/ox_modules/module-web/commands/assertExist.js +17 -17
  136. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
  137. package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
  138. package/build/ox_modules/module-web/commands/assertText.js +21 -21
  139. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
  140. package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
  141. package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
  142. package/build/ox_modules/module-web/commands/assertValue.js +20 -20
  143. package/build/ox_modules/module-web/commands/back.js +16 -16
  144. package/build/ox_modules/module-web/commands/clear.js +18 -18
  145. package/build/ox_modules/module-web/commands/click.js +25 -25
  146. package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
  147. package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
  148. package/build/ox_modules/module-web/commands/debug.js +15 -15
  149. package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
  150. package/build/ox_modules/module-web/commands/deselect.js +22 -22
  151. package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
  152. package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
  153. package/build/ox_modules/module-web/commands/execute.js +24 -24
  154. package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
  155. package/build/ox_modules/module-web/commands/findElement.js +19 -19
  156. package/build/ox_modules/module-web/commands/findElements.js +22 -22
  157. package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
  158. package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
  159. package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
  160. package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
  161. package/build/ox_modules/module-web/commands/getCookies.js +13 -13
  162. package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
  163. package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
  164. package/build/ox_modules/module-web/commands/getHTML.js +17 -17
  165. package/build/ox_modules/module-web/commands/getSource.js +16 -16
  166. package/build/ox_modules/module-web/commands/getText.js +18 -18
  167. package/build/ox_modules/module-web/commands/getTitle.js +12 -12
  168. package/build/ox_modules/module-web/commands/getUrl.js +16 -16
  169. package/build/ox_modules/module-web/commands/getValue.js +18 -18
  170. package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
  171. package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
  172. package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
  173. package/build/ox_modules/module-web/commands/index.js +1 -1
  174. package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
  175. package/build/ox_modules/module-web/commands/isChecked.js +18 -18
  176. package/build/ox_modules/module-web/commands/isExist.js +19 -19
  177. package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
  178. package/build/ox_modules/module-web/commands/isSelected.js +23 -23
  179. package/build/ox_modules/module-web/commands/isVisible.js +19 -19
  180. package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
  181. package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
  182. package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
  183. package/build/ox_modules/module-web/commands/mock.js +20 -20
  184. package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
  185. package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
  186. package/build/ox_modules/module-web/commands/newWindow.js +16 -16
  187. package/build/ox_modules/module-web/commands/open.js +16 -16
  188. package/build/ox_modules/module-web/commands/pause.js +15 -15
  189. package/build/ox_modules/module-web/commands/point.js +21 -21
  190. package/build/ox_modules/module-web/commands/pointJS.js +15 -15
  191. package/build/ox_modules/module-web/commands/refresh.js +15 -15
  192. package/build/ox_modules/module-web/commands/rightClick.js +17 -17
  193. package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
  194. package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
  195. package/build/ox_modules/module-web/commands/select.js +23 -23
  196. package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
  197. package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
  198. package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
  199. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
  200. package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
  201. package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
  202. package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
  203. package/build/ox_modules/module-web/commands/type.js +20 -20
  204. package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
  205. package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
  206. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
  207. package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
  208. package/build/ox_modules/module-web/commands/verifyText.js +21 -21
  209. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
  210. package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
  211. package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
  212. package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
  213. package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
  214. package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
  215. package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
  216. package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
  217. package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
  218. package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
  219. package/build/ox_modules/module-web/commands/waitForText.js +20 -20
  220. package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
  221. package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
  222. package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
  223. package/build/ox_modules/module-web.js +105 -100
  224. package/build/ox_modules/module-win/commands/assertText.js +17 -17
  225. package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
  226. package/build/ox_modules/module-win/commands/assertValue.js +14 -14
  227. package/build/ox_modules/module-win/commands/back.js +11 -11
  228. package/build/ox_modules/module-win/commands/clear.js +13 -13
  229. package/build/ox_modules/module-win/commands/click.js +13 -13
  230. package/build/ox_modules/module-win/commands/clickLong.js +14 -14
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
  232. package/build/ox_modules/module-win/commands/findElement.js +15 -15
  233. package/build/ox_modules/module-win/commands/findElements.js +15 -15
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
  236. package/build/ox_modules/module-win/commands/getLocation.js +14 -14
  237. package/build/ox_modules/module-win/commands/getSource.js +12 -12
  238. package/build/ox_modules/module-win/commands/getText.js +14 -14
  239. package/build/ox_modules/module-win/commands/getValue.js +14 -14
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
  241. package/build/ox_modules/module-win/commands/index.js +1 -1
  242. package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
  243. package/build/ox_modules/module-win/commands/isChecked.js +14 -14
  244. package/build/ox_modules/module-win/commands/isClickable.js +14 -14
  245. package/build/ox_modules/module-win/commands/isExist.js +15 -15
  246. package/build/ox_modules/module-win/commands/isSelected.js +14 -14
  247. package/build/ox_modules/module-win/commands/isVisible.js +15 -15
  248. package/build/ox_modules/module-win/commands/open.js +13 -13
  249. package/build/ox_modules/module-win/commands/pause.js +12 -12
  250. package/build/ox_modules/module-win/commands/rightClick.js +13 -13
  251. package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
  252. package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
  253. package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
  255. package/build/ox_modules/module-win/commands/tap.js +13 -13
  256. package/build/ox_modules/module-win/commands/type.js +16 -16
  257. package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
  260. package/build/ox_modules/module-win.js +47 -47
  261. package/build/ox_modules/utils.js +8 -8
  262. package/build/ox_reporters/excel/template.json +48 -48
  263. package/build/ox_reporters/html/index.ejs +163 -163
  264. package/build/ox_reporters/html/summary.ejs +77 -77
  265. package/build/ox_reporters/html/tests-details.ejs +134 -134
  266. package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
  267. package/build/ox_reporters/reporter-excel.js +1 -1
  268. package/build/ox_reporters/reporter-html.js +1 -1
  269. package/build/ox_reporters/reporter-json.js +1 -1
  270. package/build/ox_reporters/reporter-junit.js +1 -1
  271. package/build/ox_reporters/reporter-pdf.js +1 -1
  272. package/build/ox_reporters/reporter-rp.js +376 -0
  273. package/build/ox_reporters/reporter-xml.js +1 -1
  274. package/build/ox_services/service-devtools/submodule-network.js +1 -1
  275. package/build/ox_services/service-devtools.js +1 -1
  276. package/build/reporter/FileReporterBase.js +1 -1
  277. package/build/reporter/ReportAggregator.js +110 -43
  278. package/build/reporter/ReporterBase.js +2 -2
  279. package/build/runners/WorkerProcess.js +1 -1
  280. package/build/runners/cucumber/CucumberEventListener.js +1 -1
  281. package/build/runners/cucumber/CucumberReporter.js +1 -1
  282. package/build/runners/cucumber/CucumberWorker.js +1 -1
  283. package/build/runners/cucumber/index.js +1 -1
  284. package/build/runners/cucumber/worker.js +1 -1
  285. package/build/runners/index.js +1 -1
  286. package/build/runners/oxygen/OxygenWorker.js +1 -1
  287. package/build/runners/oxygen/index.js +37 -22
  288. package/build/runners/oxygen/worker.js +1 -1
  289. package/config/default.json +6 -6
  290. package/log.txt +1614 -0
  291. package/package.json +136 -135
  292. package/types/index.d.ts +70 -70
  293. package/types/module-eyes.d.ts +39 -39
  294. package/types/module-http.d.ts +163 -163
  295. package/types/module-log.d.ts +34 -34
  296. package/types/module-mob.d.ts +966 -966
  297. package/types/module-pdf.d.ts +40 -40
  298. package/types/module-proxy.d.ts +100 -100
  299. package/types/module-shell.d.ts +24 -24
  300. package/types/module-utils.d.ts +99 -99
  301. package/types/module-web.d.ts +1053 -1053
  302. package/types/module-win.d.ts +352 -352
  303. package/types/oxygen.d.ts +53 -53
@@ -6,18 +6,18 @@ var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
6
 
7
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
8
 
9
- /*
10
- * Copyright (C) 2019-present CloudBeat Limited
11
- *
12
- * This program is free software: you can redistribute it and/or modify
13
- * it under the terms of the GNU General Public License as published by
14
- * the Free Software Foundation, either version 3 of the License, or
15
- * (at your option) any later version.
9
+ /*
10
+ * Copyright (C) 2019-present CloudBeat Limited
11
+ *
12
+ * This program is free software: you can redistribute it and/or modify
13
+ * it under the terms of the GNU General Public License as published by
14
+ * the Free Software Foundation, either version 3 of the License, or
15
+ * (at your option) any later version.
16
16
  */
17
17
 
18
- /**
19
- * @name pdf
20
- * @description Provides generic methods for working with PDF files.
18
+ /**
19
+ * @name pdf
20
+ * @description Provides generic methods for working with PDF files.
21
21
  */
22
22
  const errHelper = require('../errors/helper');
23
23
 
@@ -220,14 +220,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
220
220
  module.isInitialized = function () {
221
221
  return true;
222
222
  };
223
- /**
224
- * @summary Asserts that text is present in a PDF file
225
- * @function assert
226
- * @param {String} pdfFilePath - Relative or absolute path to the PDF file.
227
- * @param {String} text - Text to assert.
228
- * @param {Number=} pageNum - Page number.
229
- * @param {String=} message - Message to throw if assertion fails.
230
- * @param {Boolean=} reverse - Check also reverse variant of string.
223
+ /**
224
+ * @summary Asserts that text is present in a PDF file
225
+ * @function assert
226
+ * @param {String} pdfFilePath - Relative or absolute path to the PDF file.
227
+ * @param {String} text - Text to assert.
228
+ * @param {Number=} pageNum - Page number.
229
+ * @param {String=} message - Message to throw if assertion fails.
230
+ * @param {Boolean=} reverse - Check also reverse variant of string.
231
231
  */
232
232
 
233
233
 
@@ -259,14 +259,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
259
259
  throw error;
260
260
  }
261
261
  };
262
- /**
263
- * @summary Asserts that text is not present in a PDF file
264
- * @function assertNot
265
- * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
266
- * @param {String} text - Text to assert.
267
- * @param {Number=} pageNum - Page number.
268
- * @param {String=} message - Message to throw if assertion fails.
269
- * @param {Boolean=} reverse - Check also reverse variant of string.
262
+ /**
263
+ * @summary Asserts that text is not present in a PDF file
264
+ * @function assertNot
265
+ * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
266
+ * @param {String} text - Text to assert.
267
+ * @param {Number=} pageNum - Page number.
268
+ * @param {String=} message - Message to throw if assertion fails.
269
+ * @param {Boolean=} reverse - Check also reverse variant of string.
270
270
  */
271
271
 
272
272
 
@@ -298,14 +298,14 @@ module.exports = function (options, context, rs, logger, modules, services) {
298
298
  throw error;
299
299
  }
300
300
  };
301
- /**
302
- * @summary Count the number of times specified text is present in a PDF file.
303
- * @function count
304
- * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
305
- * @param {String} text - Text to count.
306
- * @param {Number=} pageNum - Page number.
307
- * @param {Boolean=} reverse - Check also reverse variant of string.
308
- * @return {Number} Number of times the specified text was found.
301
+ /**
302
+ * @summary Count the number of times specified text is present in a PDF file.
303
+ * @function count
304
+ * @param {String} pdfFilePath - Relative or absolute path to the pdf file.
305
+ * @param {String} text - Text to count.
306
+ * @param {Number=} pageNum - Page number.
307
+ * @param {Boolean=} reverse - Check also reverse variant of string.
308
+ * @return {Number} Number of times the specified text was found.
309
309
  */
310
310
 
311
311
 
@@ -325,4 +325,4 @@ module.exports = function (options, context, rs, logger, modules, services) {
325
325
 
326
326
  return module;
327
327
  };
328
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wZGYuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsInBhdGgiLCJQREZQYXJzZXIiLCJjb3VudFJvd3MiLCJzZWFyY2hTdHIiLCJyb3dzIiwicmV2ZXJzZSIsInJlc3VsdCIsInN0clJlZ2V4IiwiUmVnRXhwIiwicmV2ZXJzZVN0clJlZ2V4Iiwic3BsaXQiLCJqb2luIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJ5MSIsInkyIiwicGFyc2VGbG9hdCIsInNvbWUiLCJ5IiwibGluZSIsInJlcGxhY2UiLCJjb3VudCIsIm1hdGNoIiwibGVuZ3RoIiwiY2hlY2tSb3dzIiwiaW5sdWRlcyIsInJldmVyc2VTZWFyY2hTdHIiLCJpbmNsdWRlcyIsImFzc2VydGlvbiIsInBkZkZpbGVQYXRoIiwidGV4dCIsInBhZ2VOdW0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInBkZlBhcnNlciIsIm9uIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VyRXJyb3IiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiQVNTRVJUX0VSUk9SIiwicGRmRGF0YSIsInRvdGFsUGFnZXMiLCJmb3JtSW1hZ2UiLCJQYWdlcyIsIlNDUklQVF9FUlJPUiIsInByb2Nlc3NUZXh0IiwiVGV4dHMiLCJpc0ZvdW5kIiwicCIsImxvYWRQREYiLCJ0ZXh0cyIsInQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUiIsIlQiLCJwdXNoIiwidG90YWxDb3VudCIsInZhbGlkYXRlU3RyaW5nIiwiYXJnIiwibmFtZSIsInRyaW0iLCJ2YWxpZGF0ZVBhZ2VOdW0iLCJ2YWxpZGF0ZU1lc3NhZ2UiLCJ2YWxpZGF0ZVJldmVyc2UiLCJyZXNvbHZlUGF0aCIsIm9wdGlvbnMiLCJtYXAiLCJpZHgiLCJjaGFyQ29kZUF0IiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJzbGljZSIsImN3ZCIsInJvb3RQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3NlcnQiLCJtZXNzYWdlIiwiZXJyb3IiLCJyZXQiLCJtc2ciLCJlIiwiYXNzZXJ0Tm90IiwiUERGX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBY0E7Ozs7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFFQSxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsSUFBOUIsRUFBb0NDLE9BQXBDLEVBQTZDO0FBQ3pDLE1BQUlDLE1BQU0sR0FBRyxDQUFiO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLElBQUlDLE1BQUosQ0FBV0wsU0FBWCxFQUFzQixHQUF0QixDQUFmO0FBQ0EsTUFBSU0sZUFBZSxHQUFHSixPQUFPLEdBQUcsSUFBSUcsTUFBSixDQUFXTCxTQUFTLENBQUNPLEtBQVYsQ0FBZ0IsRUFBaEIsRUFBb0JMLE9BQXBCLEdBQThCTSxJQUE5QixDQUFtQyxFQUFuQyxDQUFYLEVBQW1ELEdBQW5ELENBQUgsR0FBNkQsSUFBMUY7QUFFQUMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlULElBQVosRUFBa0I7QUFBbEIsR0FDS1UsSUFETCxDQUNVLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxLQUFZQyxVQUFVLENBQUNGLEVBQUQsQ0FBVixHQUFpQkUsVUFBVSxDQUFDRCxFQUFELENBRGpELEVBQ3VEO0FBRHZELEdBRUtFLElBRkwsQ0FFVUMsQ0FBQyxJQUFJO0FBQ1AsUUFBSUMsSUFBSSxHQUFHLENBQUNoQixJQUFJLENBQUNlLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JS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QUEsTUFBTSxDQUFDMUQsS0FBUCxHQUFlLGdCQUFlUSxXQUFmLEVBQTRCQyxJQUE1QixFQUFrQ0MsT0FBTyxHQUFHLElBQTVDLEVBQWtEM0IsT0FBTyxHQUFHLEtBQTVELEVBQW1FO0FBQzlFeUQsSUFBQUEsY0FBYyxDQUFDaEMsV0FBRCxFQUFjLGFBQWQsQ0FBZDtBQUNBZ0MsSUFBQUEsY0FBYyxDQUFDL0IsSUFBRCxFQUFPLE1BQVAsQ0FBZDtBQUNBbUMsSUFBQUEsZUFBZSxDQUFDbEMsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUNBb0MsSUFBQUEsZUFBZSxDQUFDL0QsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUVBeUIsSUFBQUEsV0FBVyxHQUFHdUMsV0FBVyxDQUFDdkMsV0FBRCxFQUFjd0MsT0FBZCxDQUF6Qjs7QUFFQSxRQUFJO0FBQ0EsYUFBTyxNQUFNaEQsS0FBSyxDQUFDUSxXQUFELEVBQWNDLElBQWQsRUFBb0JDLE9BQXBCLEVBQTZCM0IsT0FBN0IsQ0FBbEI7QUFDSCxLQUZELENBR0EsT0FBT3dGLENBQVAsRUFBVTtBQUNOLFlBQU0sSUFBSXBELG9CQUFKLENBQVkzQyxTQUFTLENBQUM0QyxTQUFWLENBQW9CcUQsU0FBaEMsRUFBMkNGLENBQUMsQ0FBQ0osT0FBRixJQUFhSSxDQUF4RCxDQUFOO0FBQ0g7QUFDSixHQWREOztBQWdCQSxTQUFPYixNQUFQO0FBQ0gsQ0FqSEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBwZGZcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGdlbmVyaWMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIFBERiBmaWxlcy5cclxuICovXHJcblxyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBQREZQYXJzZXIgPSByZXF1aXJlKCdwZGYyanNvbi9wZGZwYXJzZXInKTtcclxuXHJcbmZ1bmN0aW9uIGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgdmFyIHN0clJlZ2V4ID0gbmV3IFJlZ0V4cChzZWFyY2hTdHIsICdnJyk7XHJcbiAgICB2YXIgcmV2ZXJzZVN0clJlZ2V4ID0gcmV2ZXJzZSA/IG5ldyBSZWdFeHAoc2VhcmNoU3RyLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksICdnJykgOiBudWxsO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHJvd3MpIC8vID0+IGFycmF5IG9mIHktcG9zaXRpb25zICh0eXBlOiBmbG9hdClcclxuICAgICAgICAuc29ydCgoeTEsIHkyKSA9PiBwYXJzZUZsb2F0KHkxKSAtIHBhcnNlRmxvYXQoeTIpKSAvLyBzb3J0IGZsb2F0IHBvc2l0aW9uc1xyXG4gICAgICAgIC5zb21lKHkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gKGxpbmUubWF0Y2goc3RyUmVnZXgpIHx8IFtdKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCAmJiByZXZlcnNlU3RyUmVnZXgpIHtcclxuICAgICAgICAgICAgICAgIGNvdW50ID0gKGxpbmUubWF0Y2gocmV2ZXJzZVN0clJlZ2V4KSB8fCBbXSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb3VudDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxyXG4gICAgICAgIC5zb3J0KCh5MSwgeTIpID0+IHBhcnNlRmxvYXQoeTEpIC0gcGFyc2VGbG9hdCh5MikpIC8vIHNvcnQgZmxvYXQgcG9zaXRpb25zXHJcbiAgICAgICAgLnNvbWUoeSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlubHVkZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZVNlYXJjaFN0ciA9IHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKSB8fCBsaW5lLmluY2x1ZGVzKHJldmVyc2VTZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlubHVkZXMpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFN0ciA9IHRleHQucmVwbGFjZSgvXFxzL2csICcnKTtcclxuXHJcbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhRXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVyci5wYXJzZXJFcnJvciA/IGVyci5wYXJzZXJFcnJvciA6ICdFcnJvciBwYXJzaW5nIHRoZSBQREYuJztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0b3RhbFBhZ2VzID0gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAocGFnZU51bSAmJiB0b3RhbFBhZ2VzIDwgcGFnZU51bSAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBsb2NhdGUgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCEhaXNGb3VuZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGxvY2F0ZSBvbiBhbnkgcGFnZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNGb3VuZCA9IGNoZWNrUm93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NUZXh0KHJvd3MsIHRleHRzKSB7XHJcbiAgICBmb3IgKHZhciB0IGluIHRleHRzKSB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0ZXh0c1t0XTtcclxuICAgICAgICB2YXIgdGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtLlJbMF0uVCk7XHJcbiAgICAgICAgLy8gYWNjdW11bGF0ZSB0ZXh0IGl0ZW1zIGludG8gcm93cyBvYmplY3QsIHBlciBsaW5lXHJcbiAgICAgICAgKHJvd3NbaXRlbS55XSA9IHJvd3NbaXRlbS55XSB8fCBbXSkucHVzaCh0ZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY291bnQocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0gPSAwLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgIGxldCByb3dzID0ge307IC8vIGluZGV4ZWQgYnkgeS1wb3NpdGlvblxyXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgICAgIGxldCBwZGZQYXJzZXIgPSBuZXcgUERGUGFyc2VyKCk7XHJcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnIucGFyc2VyRXJyb3IgPyBlcnIucGFyc2VyRXJyb3IgOiAnRXJyb3IgcGFyc2luZyB0aGUgUERGLic7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwZGZQYXJzZXIub24oJ3BkZlBhcnNlcl9kYXRhUmVhZHknLCBmdW5jdGlvbiAocGRmRGF0YSkge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gJiYgdG90YWxQYWdlcyA8IHBhZ2VOdW0gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYEludmFsaWQgYXJndW1lbnQgLSAncGFnZU51bScgaXMgJHtwYWdlTnVtfSwgYnV0IFBERiBjb250YWlucyBvbmx5ICR7dG90YWxQYWdlc30gcGFnZXNgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY291bnQgb24gYSBzcGVjaWZpYyBwYWdlXHJcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twYWdlTnVtLTFdLlRleHRzKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNvdW50Um93cyhzZWFyY2hTdHIsIHJvd3MsIHJldmVyc2UpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvdW50IG9uIGFsbCBwYWdlc1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBjb3VudFJvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cyA9IHt9OyAvLyBjbGVhciByb3dzIGZvciBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZSh0b3RhbENvdW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwZGZQYXJzZXIubG9hZFBERihwZGZGaWxlUGF0aCwgMCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRleHQgaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVQYWdlTnVtKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdudW1iZXInICYmIGFyZyA+IDApKSB7XHJcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UoYXJnLCBuYW1lKSB7XHJcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgJiYgYXJnLnRyaW0oKS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlcnNlKGFyZywgbmFtZSkge1xyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICAgIC8vIHBhZ2VOdW0gaXMgY29ycmVjdFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBib29sZWFuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucykge1xyXG5cclxuICAgIHBkZkZpbGVQYXRoID0gcGRmRmlsZVBhdGgudHJpbSgpLnNwbGl0KCcnKS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhWzgyMDYsIDgyOTZdLmluY2x1ZGVzKHBkZkZpbGVQYXRoLmNoYXJDb2RlQXQoaWR4KSkgPyBpdGVtIDogbnVsbDtcclxuICAgIH0pLmpvaW4oJycpO1xyXG5cclxuICAgIGlmIChwZGZGaWxlUGF0aFswXSA9PT0gJ34nKSB7XHJcbiAgICAgICAgLy8gcmVzb2x2ZSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5XHJcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBwZGZGaWxlUGF0aC5zbGljZSgxKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmN3ZCkge1xyXG4gICAgICAgICAgICBjd2QgPSBvcHRpb25zLmN3ZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucm9vdFBhdGgpIHtcclxuICAgICAgICAgICAgY3dkID0gb3B0aW9ucy5yb290UGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN3ZCA9IGN3ZC50cmltKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBwZGZGaWxlUGF0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydHMgdGhhdCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgUERGIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZXQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgXCIke3RleHR9XCIgaXMgbm90IGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgbm90IHByZXNlbnQgaW4gYSBQREYgZmlsZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydE5vdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwYWdlTnVtIC0gUGFnZSBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5hc3NlcnROb3QgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XHJcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodGV4dCwgJ3RleHQnKTtcclxuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcclxuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcclxuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcclxuXHJcbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlcnRpb24ocGRmRmlsZVBhdGgsIHRleHQsIHBhZ2VOdW0sIHJldmVyc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBcIiR7dGV4dH1cIiBpcyBmb3VuZCBpbiB0aGUgUERGICR7cGFnZU51bSA/ICdvbiBwYWdlICcgKyBwYWdlTnVtIDogJyd9YDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCB0ZXh0IGlzIHByZXNlbnQgaW4gYSBQREYgZmlsZS5cclxuICAgICAqIEBmdW5jdGlvbiBjb3VudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gY291bnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IE51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIHRleHQgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuY291bnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBkZkZpbGVQYXRoLCAncGRmRmlsZVBhdGgnKTtcclxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xyXG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xyXG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xyXG5cclxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QREZfRVJST1IsIGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBtb2R1bGU7XHJcbn07XHJcbiJdfQ==
328
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wZGYuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsInBhdGgiLCJQREZQYXJzZXIiLCJjb3VudFJvd3MiLCJzZWFyY2hTdHIiLCJyb3dzIiwicmV2ZXJzZSIsInJlc3VsdCIsInN0clJlZ2V4IiwiUmVnRXhwIiwicmV2ZXJzZVN0clJlZ2V4Iiwic3BsaXQiLCJqb2luIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJ5MSIsInkyIiwicGFyc2VGbG9hdCIsInNvbWUiLCJ5IiwibGluZSIsInJlcGxhY2UiLCJjb3VudCIsIm1hdGNoIiwibGVuZ3RoIiwiY2hlY2tSb3dzIiwiaW5sdWRlcyIsInJldmVyc2VTZWFyY2hTdHIiLCJpbmNsdWRlcyIsImFzc2VydGlvbiIsInBkZkZpbGVQYXRoIiwidGV4dCIsInBhZ2VOdW0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInBkZlBhcnNlciIsIm9uIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VyRXJyb3IiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiQVNTRVJUX0VSUk9SIiwicGRmRGF0YSIsInRvdGFsUGFnZXMiLCJmb3JtSW1hZ2UiLCJQYWdlcyIsIlNDUklQVF9FUlJPUiIsInByb2Nlc3NUZXh0IiwiVGV4dHMiLCJpc0ZvdW5kIiwicCIsImxvYWRQREYiLCJ0ZXh0cyIsInQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUiIsIlQiLCJwdXNoIiwidG90YWxDb3VudCIsInZhbGlkYXRlU3RyaW5nIiwiYXJnIiwibmFtZSIsInRyaW0iLCJ2YWxpZGF0ZVBhZ2VOdW0iLCJ2YWxpZGF0ZU1lc3NhZ2UiLCJ2YWxpZGF0ZVJldmVyc2UiLCJyZXNvbHZlUGF0aCIsIm9wdGlvbnMiLCJtYXAiLCJpZHgiLCJjaGFyQ29kZUF0IiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJzbGljZSIsImN3ZCIsInJvb3RQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3NlcnQiLCJtZXNzYWdlIiwiZXJyb3IiLCJyZXQiLCJtc2ciLCJlIiwiYXNzZXJ0Tm90IiwiUERGX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBY0E7Ozs7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFFQSxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsSUFBOUIsRUFBb0NDLE9BQXBDLEVBQTZDO0FBQ3pDLE1BQUlDLE1BQU0sR0FBRyxDQUFiO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLElBQUlDLE1BQUosQ0FBV0wsU0FBWCxFQUFzQixHQUF0QixDQUFmO0FBQ0EsTUFBSU0sZUFBZSxHQUFHSixPQUFPLEdBQUcsSUFBSUcsTUFBSixDQUFXTCxTQUFTLENBQUNPLEtBQVYsQ0FBZ0IsRUFBaEIsRUFBb0JMLE9BQXBCLEdBQThCTSxJQUE5QixDQUFtQyxFQUFuQyxDQUFYLEVBQW1ELEdBQW5ELENBQUgsR0FBNkQsSUFBMUY7QUFFQUMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlULElBQVosRUFBa0I7QUFBbEIsR0FDS1UsSUFETCxDQUNVLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxLQUFZQyxVQUFVLENBQUNGLEVBQUQsQ0FBVixHQUFpQkUsVUFBVSxDQUFDRCxFQUFELENBRGpELEVBQ3VEO0FBRHZELEdBRUtFLElBRkwsQ0FFVUMsQ0FBQyxJQUFJO0FBQ1AsUUFBSUMsSUFBSSxHQUFHLENBQUNoQixJQUFJLENBQUNlLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JS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QUEsTUFBTSxDQUFDMUQsS0FBUCxHQUFlLGdCQUFlUSxXQUFmLEVBQTRCQyxJQUE1QixFQUFrQ0MsT0FBTyxHQUFHLElBQTVDLEVBQWtEM0IsT0FBTyxHQUFHLEtBQTVELEVBQW1FO0FBQzlFeUQsSUFBQUEsY0FBYyxDQUFDaEMsV0FBRCxFQUFjLGFBQWQsQ0FBZDtBQUNBZ0MsSUFBQUEsY0FBYyxDQUFDL0IsSUFBRCxFQUFPLE1BQVAsQ0FBZDtBQUNBbUMsSUFBQUEsZUFBZSxDQUFDbEMsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUNBb0MsSUFBQUEsZUFBZSxDQUFDL0QsT0FBRCxFQUFVLFNBQVYsQ0FBZjtBQUVBeUIsSUFBQUEsV0FBVyxHQUFHdUMsV0FBVyxDQUFDdkMsV0FBRCxFQUFjd0MsT0FBZCxDQUF6Qjs7QUFFQSxRQUFJO0FBQ0EsYUFBTyxNQUFNaEQsS0FBSyxDQUFDUSxXQUFELEVBQWNDLElBQWQsRUFBb0JDLE9BQXBCLEVBQTZCM0IsT0FBN0IsQ0FBbEI7QUFDSCxLQUZELENBR0EsT0FBT3dGLENBQVAsRUFBVTtBQUNOLFlBQU0sSUFBSXBELG9CQUFKLENBQVkzQyxTQUFTLENBQUM0QyxTQUFWLENBQW9CcUQsU0FBaEMsRUFBMkNGLENBQUMsQ0FBQ0osT0FBRixJQUFhSSxDQUF4RCxDQUFOO0FBQ0g7QUFDSixHQWREOztBQWdCQSxTQUFPYixNQUFQO0FBQ0gsQ0FqSEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICovXG5cbi8qKlxuICogQG5hbWUgcGRmXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgZ2VuZXJpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggUERGIGZpbGVzLlxuICovXG5cbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIFBERlBhcnNlciA9IHJlcXVpcmUoJ3BkZjJqc29uL3BkZnBhcnNlcicpO1xuXG5mdW5jdGlvbiBjb3VudFJvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgdmFyIHN0clJlZ2V4ID0gbmV3IFJlZ0V4cChzZWFyY2hTdHIsICdnJyk7XG4gICAgdmFyIHJldmVyc2VTdHJSZWdleCA9IHJldmVyc2UgPyBuZXcgUmVnRXhwKHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpLCAnZycpIDogbnVsbDtcblxuICAgIE9iamVjdC5rZXlzKHJvd3MpIC8vID0+IGFycmF5IG9mIHktcG9zaXRpb25zICh0eXBlOiBmbG9hdClcbiAgICAgICAgLnNvcnQoKHkxLCB5MikgPT4gcGFyc2VGbG9hdCh5MSkgLSBwYXJzZUZsb2F0KHkyKSkgLy8gc29ydCBmbG9hdCBwb3NpdGlvbnNcbiAgICAgICAgLnNvbWUoeSA9PiB7XG4gICAgICAgICAgICB2YXIgbGluZSA9IChyb3dzW3ldIHx8IFtdKS5qb2luKCcnKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgICAgICAgICB2YXIgY291bnQgPSAobGluZS5tYXRjaChzdHJSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCAmJiByZXZlcnNlU3RyUmVnZXgpIHtcbiAgICAgICAgICAgICAgICBjb3VudCA9IChsaW5lLm1hdGNoKHJldmVyc2VTdHJSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBjb3VudDtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjaGVja1Jvd3Moc2VhcmNoU3RyLCByb3dzLCByZXZlcnNlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgT2JqZWN0LmtleXMocm93cykgLy8gPT4gYXJyYXkgb2YgeS1wb3NpdGlvbnMgKHR5cGU6IGZsb2F0KVxuICAgICAgICAuc29ydCgoeTEsIHkyKSA9PiBwYXJzZUZsb2F0KHkxKSAtIHBhcnNlRmxvYXQoeTIpKSAvLyBzb3J0IGZsb2F0IHBvc2l0aW9uc1xuICAgICAgICAuc29tZSh5ID0+IHtcblxuICAgICAgICAgICAgdmFyIGxpbmUgPSAocm93c1t5XSB8fCBbXSkuam9pbignJykucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgICAgICAgICAgbGV0IGlubHVkZXM7XG5cbiAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZVNlYXJjaFN0ciA9IHNlYXJjaFN0ci5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIGlubHVkZXMgPSBsaW5lLmluY2x1ZGVzKHNlYXJjaFN0cikgfHwgbGluZS5pbmNsdWRlcyhyZXZlcnNlU2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5sdWRlcyA9IGxpbmUuaW5jbHVkZXMoc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlubHVkZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IDAsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgIGxldCByb3dzID0ge307IC8vIGluZGV4ZWQgYnkgeS1wb3NpdGlvblxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLnBhcnNlckVycm9yID8gZXJyLnBhcnNlckVycm9yIDogJ0Vycm9yIHBhcnNpbmcgdGhlIFBERi4nO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XG4gICAgICAgICAgICB2YXIgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwYWdlTnVtICYmIHRvdGFsUGFnZXMgPCBwYWdlTnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb2NhdGUgb24gYSBzcGVjaWZpYyBwYWdlXG4gICAgICAgICAgICBpZiAocGFnZU51bSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KHJvd3MsIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzW3BhZ2VOdW0tMV0uVGV4dHMpO1xuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSghIWlzRm91bmQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9jYXRlIG9uIGFueSBwYWdlXG4gICAgICAgICAgICBmb3IgKGxldCBwIGluIHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1RleHQocm93cywgcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXNbcF0uVGV4dHMpO1xuICAgICAgICAgICAgICAgIGxldCBpc0ZvdW5kID0gY2hlY2tSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJvd3MgPSB7fTsgLy8gY2xlYXIgcm93cyBmb3IgbmV4dCBwYWdlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVGV4dChyb3dzLCB0ZXh0cykge1xuICAgIGZvciAodmFyIHQgaW4gdGV4dHMpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0ZXh0c1t0XTtcbiAgICAgICAgdmFyIHRleHQgPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5SWzBdLlQpO1xuICAgICAgICAvLyBhY2N1bXVsYXRlIHRleHQgaXRlbXMgaW50byByb3dzIG9iamVjdCwgcGVyIGxpbmVcbiAgICAgICAgKHJvd3NbaXRlbS55XSA9IHJvd3NbaXRlbS55XSB8fCBbXSkucHVzaCh0ZXh0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gMCwgcmV2ZXJzZSA9IGZhbHNlKSB7XG4gICAgbGV0IHJvd3MgPSB7fTsgLy8gaW5kZXhlZCBieSB5LXBvc2l0aW9uXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAgICAgbGV0IHBkZlBhcnNlciA9IG5ldyBQREZQYXJzZXIoKTtcbiAgICAgICAgcGRmUGFyc2VyLm9uKCdwZGZQYXJzZXJfZGF0YUVycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLnBhcnNlckVycm9yID8gZXJyLnBhcnNlckVycm9yIDogJ0Vycm9yIHBhcnNpbmcgdGhlIFBERi4nO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBkZlBhcnNlci5vbigncGRmUGFyc2VyX2RhdGFSZWFkeScsIGZ1bmN0aW9uIChwZGZEYXRhKSB7XG4gICAgICAgICAgICBsZXQgdG90YWxQYWdlcyA9IHBkZkRhdGEuZm9ybUltYWdlLlBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwYWdlTnVtICYmIHRvdGFsUGFnZXMgPCBwYWdlTnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdwYWdlTnVtJyBpcyAke3BhZ2VOdW19LCBidXQgUERGIGNvbnRhaW5zIG9ubHkgJHt0b3RhbFBhZ2VzfSBwYWdlc2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb3VudCBvbiBhIHNwZWNpZmljIHBhZ2VcbiAgICAgICAgICAgIGlmIChwYWdlTnVtKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1RleHQocm93cywgcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXNbcGFnZU51bS0xXS5UZXh0cyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb3VudCBvbiBhbGwgcGFnZXNcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcGRmRGF0YS5mb3JtSW1hZ2UuUGFnZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzVGV4dChyb3dzLCBwZGZEYXRhLmZvcm1JbWFnZS5QYWdlc1twXS5UZXh0cyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY291bnRSb3dzKHNlYXJjaFN0ciwgcm93cywgcmV2ZXJzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dzID0ge307IC8vIGNsZWFyIHJvd3MgZm9yIG5leHQgcGFnZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRvdGFsQ291bnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGRmUGFyc2VyLmxvYWRQREYocGRmRmlsZVBhdGgsIDApO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhhcmcsIG5hbWUpIHtcbiAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyB0ZXh0IGlzIGNvcnJlY3RcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGFnZU51bShhcmcsIG5hbWUpIHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgJiYgYXJnID4gMCkpIHtcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UoYXJnLCBuYW1lKSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGFyZy50cmltKCkubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgLy8gcGFnZU51bSBpcyBjb3JyZWN0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVyc2UoYXJnLCBuYW1lKSB7XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgICAgICAvLyBwYWdlTnVtIGlzIGNvcnJlY3RcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBib29sZWFuXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGRmRmlsZVBhdGgsIG9wdGlvbnMpIHtcblxuICAgIHBkZkZpbGVQYXRoID0gcGRmRmlsZVBhdGgudHJpbSgpLnNwbGl0KCcnKS5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICByZXR1cm4gIVs4MjA2LCA4Mjk2XS5pbmNsdWRlcyhwZGZGaWxlUGF0aC5jaGFyQ29kZUF0KGlkeCkpID8gaXRlbSA6IG51bGw7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBpZiAocGRmRmlsZVBhdGhbMF0gPT09ICd+Jykge1xuICAgICAgICAvLyByZXNvbHZlIHBhdGggcmVsYXRpdmUgdG8gaG9tZSBkaXJlY3RvcnlcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBwZGZGaWxlUGF0aC5zbGljZSgxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jd2QpIHtcbiAgICAgICAgICAgIGN3ZCA9IG9wdGlvbnMuY3dkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yb290UGF0aCkge1xuICAgICAgICAgICAgY3dkID0gb3B0aW9ucy5yb290UGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGN3ZCA9IGN3ZC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIHBkZkZpbGVQYXRoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcblxuICAgIG1vZHVsZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnRzIHRoYXQgdGV4dCBpcyBwcmVzZW50IGluIGEgUERGIGZpbGVcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgUERGIGZpbGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0IHRvIGFzc2VydC5cbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHBhZ2VOdW0gLSBQYWdlIG51bWJlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRocm93IGlmIGFzc2VydGlvbiBmYWlscy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSByZXZlcnNlIC0gQ2hlY2sgYWxzbyByZXZlcnNlIHZhcmlhbnQgb2Ygc3RyaW5nLlxuICAgICAqL1xuICAgIG1vZHVsZS5hc3NlcnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIG1lc3NhZ2UgPSBudWxsLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGRmRmlsZVBhdGgsICdwZGZGaWxlUGF0aCcpO1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0LCAndGV4dCcpO1xuICAgICAgICB2YWxpZGF0ZVBhZ2VOdW0ocGFnZU51bSwgJ3BhZ2VOdW0nKTtcbiAgICAgICAgdmFsaWRhdGVNZXNzYWdlKG1lc3NhZ2UsICdtZXNzYWdlJyk7XG4gICAgICAgIHZhbGlkYXRlUmV2ZXJzZShyZXZlcnNlLCAncmV2ZXJzZScpO1xuXG4gICAgICAgIHBkZkZpbGVQYXRoID0gcmVzb2x2ZVBhdGgocGRmRmlsZVBhdGgsIG9wdGlvbnMpO1xuXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VydGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSwgcmV2ZXJzZSk7XG5cbiAgICAgICAgICAgIGlmICghcmV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgXCIke3RleHR9XCIgaXMgbm90IGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGUubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0cyB0aGF0IHRleHQgaXMgbm90IHByZXNlbnQgaW4gYSBQREYgZmlsZVxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnROb3RcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGRmRmlsZVBhdGggLSBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwZGYgZmlsZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gYXNzZXJ0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gcGFnZU51bSAtIFBhZ2UgbnVtYmVyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gdGhyb3cgaWYgYXNzZXJ0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXG4gICAgICovXG4gICAgbW9kdWxlLmFzc2VydE5vdCA9IGFzeW5jIGZ1bmN0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtID0gbnVsbCwgbWVzc2FnZSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQsICd0ZXh0Jyk7XG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSwgJ21lc3NhZ2UnKTtcbiAgICAgICAgdmFsaWRhdGVSZXZlcnNlKHJldmVyc2UsICdyZXZlcnNlJyk7XG5cbiAgICAgICAgcGRmRmlsZVBhdGggPSByZXNvbHZlUGF0aChwZGZGaWxlUGF0aCwgb3B0aW9ucyk7XG5cbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgYXNzZXJ0aW9uKHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcblxuICAgICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYFwiJHt0ZXh0fVwiIGlzIGZvdW5kIGluIHRoZSBQREYgJHtwYWdlTnVtID8gJ29uIHBhZ2UgJyArIHBhZ2VOdW0gOiAnJ31gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgdGV4dCBpcyBwcmVzZW50IGluIGEgUERGIGZpbGUuXG4gICAgICogQGZ1bmN0aW9uIGNvdW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBkZkZpbGVQYXRoIC0gUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGRmIGZpbGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0IHRvIGNvdW50LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gcGFnZU51bSAtIFBhZ2UgbnVtYmVyLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHJldmVyc2UgLSBDaGVjayBhbHNvIHJldmVyc2UgdmFyaWFudCBvZiBzdHJpbmcuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBOdW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZCB0ZXh0IHdhcyBmb3VuZC5cbiAgICAgKi9cbiAgICBtb2R1bGUuY291bnQgPSBhc3luYyBmdW5jdGlvbihwZGZGaWxlUGF0aCwgdGV4dCwgcGFnZU51bSA9IG51bGwsIHJldmVyc2UgPSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwZGZGaWxlUGF0aCwgJ3BkZkZpbGVQYXRoJyk7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQsICd0ZXh0Jyk7XG4gICAgICAgIHZhbGlkYXRlUGFnZU51bShwYWdlTnVtLCAncGFnZU51bScpO1xuICAgICAgICB2YWxpZGF0ZVJldmVyc2UocmV2ZXJzZSwgJ3JldmVyc2UnKTtcblxuICAgICAgICBwZGZGaWxlUGF0aCA9IHJlc29sdmVQYXRoKHBkZkZpbGVQYXRoLCBvcHRpb25zKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvdW50KHBkZkZpbGVQYXRoLCB0ZXh0LCBwYWdlTnVtLCByZXZlcnNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QREZfRVJST1IsIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbW9kdWxlO1xufTtcbiJdfQ==
@@ -1,15 +1,15 @@
1
- /*
2
- * Copyright (C) 2015-present CloudBeat Limited
3
- *
4
- * This program is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
1
+ /*
2
+ * Copyright (C) 2015-present CloudBeat Limited
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
8
  */
9
9
  'use strict';
10
- /**
11
- * @name proxy
12
- * @description Provides methods for intercepting network traffic via mitmproxy.
10
+ /**
11
+ * @name proxy
12
+ * @description Provides methods for intercepting network traffic via mitmproxy.
13
13
  */
14
14
 
15
15
  Object.defineProperty(exports, "__esModule", {
@@ -50,16 +50,16 @@ class ProxyModule extends _OxygenModule.default {
50
50
  get name() {
51
51
  return MODULE_NAME;
52
52
  }
53
- /**
54
- * @function init
55
- * @summary Initializes proxy.
56
- * @param {Number} proxyPort - Proxy port.
57
- * @param {Number=} proxyCommPort - Port for internal proxy communication. If specified, then mitmproxy should be launched manually.
58
- * Otherwise mitmpoxy will be launched automatically.
59
- * @param {Boolean=} saveRequestBody - Save request bodies.
60
- * @param {Boolean=} saveResponseBody - Save response bodies.
61
- * @example <caption>[shell] Launching mitmproxy manually</caption>
62
- * mitmdump --anticache -s mitmproxy-node\scripts\proxy.py --ssl-insecure --set httpCommPort=8765
53
+ /**
54
+ * @function init
55
+ * @summary Initializes proxy.
56
+ * @param {Number} proxyPort - Proxy port.
57
+ * @param {Number=} proxyCommPort - Port for internal proxy communication. If specified, then mitmproxy should be launched manually.
58
+ * Otherwise mitmpoxy will be launched automatically.
59
+ * @param {Boolean=} saveRequestBody - Save request bodies.
60
+ * @param {Boolean=} saveResponseBody - Save response bodies.
61
+ * @example <caption>[shell] Launching mitmproxy manually</caption>
62
+ * mitmdump --anticache -s mitmproxy-node\scripts\proxy.py --ssl-insecure --set httpCommPort=8765
63
63
  */
64
64
 
65
65
 
@@ -72,9 +72,9 @@ class ProxyModule extends _OxygenModule.default {
72
72
  this._proxyExternalyLaunched = !!proxyCommPort;
73
73
  return true;
74
74
  }
75
- /**
76
- * @function dispose
77
- * @summary Disposes this module.
75
+ /**
76
+ * @function dispose
77
+ * @summary Disposes this module.
78
78
  */
79
79
 
80
80
 
@@ -92,26 +92,26 @@ class ProxyModule extends _OxygenModule.default {
92
92
  this._networkTraffic = [];
93
93
  super.dispose();
94
94
  }
95
- /**
96
- * @summary Begin collecting network requests.
97
- * @description Any previously collected requests will be discarded.
98
- * @function start
99
- * @example <caption>[javascript] Usage example</caption>
100
- * proxy.init(8080);
101
- * proxy.start();
102
- * // print the collected request so far:
103
- * let requests = proxy.getRequests();
104
- * for (let req of requests) {
105
- * log.info(req);
106
- * }
107
- * // wait for a request using a verbatim URL match:
108
- * proxy.waitForUrl('https://www.yourwebsite.com/foo/bar');
109
- * // wait for a request using a regular expression URL match:
110
- * proxy.waitForUrl(/https:\/\/.*\/foo\/bar/);
111
- * // wait for a request using a custom matcher:
112
- * proxy.waitFor(function (request) {
113
- * return request.status === '200' && request.url === 'https://www.yourwebsite.com/foo/bar';
114
- * });
95
+ /**
96
+ * @summary Begin collecting network requests.
97
+ * @description Any previously collected requests will be discarded.
98
+ * @function start
99
+ * @example <caption>[javascript] Usage example</caption>
100
+ * proxy.init(8080);
101
+ * proxy.start();
102
+ * // print the collected request so far:
103
+ * let requests = proxy.getRequests();
104
+ * for (let req of requests) {
105
+ * log.info(req);
106
+ * }
107
+ * // wait for a request using a verbatim URL match:
108
+ * proxy.waitForUrl('https://www.yourwebsite.com/foo/bar');
109
+ * // wait for a request using a regular expression URL match:
110
+ * proxy.waitForUrl(/https:\/\/.*\/foo\/bar/);
111
+ * // wait for a request using a custom matcher:
112
+ * proxy.waitFor(function (request) {
113
+ * return request.status === '200' && request.url === 'https://www.yourwebsite.com/foo/bar';
114
+ * });
115
115
  */
116
116
 
117
117
 
@@ -119,31 +119,31 @@ class ProxyModule extends _OxygenModule.default {
119
119
  this._collectData = true;
120
120
  this._networkTraffic = [];
121
121
  }
122
- /**
123
- * @summary Stop collecting network requests.
124
- * @function stop
122
+ /**
123
+ * @summary Stop collecting network requests.
124
+ * @function stop
125
125
  */
126
126
 
127
127
 
128
128
  stop() {
129
129
  this._collectData = false;
130
130
  }
131
- /**
132
- * @summary Return all the collected network requests so far.
133
- * @function getRequests
134
- * @return {Object[]} Array containing network requests.
131
+ /**
132
+ * @summary Return all the collected network requests so far.
133
+ * @function getRequests
134
+ * @return {Object[]} Array containing network requests.
135
135
  */
136
136
 
137
137
 
138
138
  getRequests() {
139
139
  return this._networkTraffic;
140
140
  }
141
- /**
142
- * @summary Wait for a network request matching the specified URL.
143
- * @function waitForUrl
144
- * @param {String|RegExp} pattern - An URL to match verbatim or a RegExp.
145
- * @param {Number=} timeout - Timeout. Default is 60 seconds.
146
- * @return {Object} Network request details if the network request was found.
141
+ /**
142
+ * @summary Wait for a network request matching the specified URL.
143
+ * @function waitForUrl
144
+ * @param {String|RegExp} pattern - An URL to match verbatim or a RegExp.
145
+ * @param {Number=} timeout - Timeout. Default is 60 seconds.
146
+ * @return {Object} Network request details if the network request was found.
147
147
  */
148
148
 
149
149
 
@@ -174,12 +174,12 @@ class ProxyModule extends _OxygenModule.default {
174
174
 
175
175
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
176
176
  }
177
- /**
178
- * @summary Wait for a network request.
179
- * @function waitFor
180
- * @param {Function} matcher - Matching function. Should return true on match, or false otherwise.
181
- * @param {Number=} timeout - Timeout. Default is 60 seconds.
182
- * @return {Object} Network request details if the network request was found.
177
+ /**
178
+ * @summary Wait for a network request.
179
+ * @function waitFor
180
+ * @param {Function} matcher - Matching function. Should return true on match, or false otherwise.
181
+ * @param {Number=} timeout - Timeout. Default is 60 seconds.
182
+ * @return {Object} Network request details if the network request was found.
183
183
  */
184
184
 
185
185
 
@@ -210,12 +210,12 @@ class ProxyModule extends _OxygenModule.default {
210
210
 
211
211
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
212
212
  }
213
- /**
214
- * @summary Assert if network request matching the specified URL.
215
- * @function assertUrl
216
- * @param {String|RegExp} url - A request URL to match verbatim or a RegExp.
217
- * @param {Number=} timeout - Timeout. Default is 60 seconds.
218
- * @return {Object} Network request details if the network request was found.
213
+ /**
214
+ * @summary Assert if network request matching the specified URL.
215
+ * @function assertUrl
216
+ * @param {String|RegExp} url - A request URL to match verbatim or a RegExp.
217
+ * @param {Number=} timeout - Timeout. Default is 60 seconds.
218
+ * @return {Object} Network request details if the network request was found.
219
219
  */
220
220
 
221
221
 
@@ -246,14 +246,14 @@ class ProxyModule extends _OxygenModule.default {
246
246
 
247
247
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
248
248
  }
249
- /**
250
- * @summary Assert whether HTTP response status code matches the specified value.
251
- * @function assertStatusCode
252
- * @param {String|RegExp} url - A request URL to match verbatim or a RegExp.
253
- * @param {Number} statusCode - A response status code to match verbatim or a RegExp.
254
- * @param {String=} failureMessage - An optional failure message.
255
- * @param {Number=} timeout - Timeout. Default is 60 seconds.
256
- * @return {Object} Network request details if the network request was found.
249
+ /**
250
+ * @summary Assert whether HTTP response status code matches the specified value.
251
+ * @function assertStatusCode
252
+ * @param {String|RegExp} url - A request URL to match verbatim or a RegExp.
253
+ * @param {Number} statusCode - A response status code to match verbatim or a RegExp.
254
+ * @param {String=} failureMessage - An optional failure message.
255
+ * @param {Number=} timeout - Timeout. Default is 60 seconds.
256
+ * @return {Object} Network request details if the network request was found.
257
257
  */
258
258
 
259
259
 
@@ -321,4 +321,4 @@ class ProxyModule extends _OxygenModule.default {
321
321
  }
322
322
 
323
323
  exports.default = ProxyModule;
324
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlByb3h5TW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX25ldHdvcmtUcmFmZmljIiwiX2NvbGxlY3REYXRhIiwiX3NhdmVSZXF1ZXN0Qm9keSIsIl9zYXZlUmVzcG9uc2VCb2R5IiwiX3Byb3h5IiwiX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJpbml0IiwicHJveHlQb3J0IiwicHJveHlDb21tUG9ydCIsInNhdmVSZXF1ZXN0Qm9keSIsInNhdmVSZXNwb25zZUJvZHkiLCJNSVRNUHJveHkiLCJDcmVhdGUiLCJfb25OZXR3b3JrSW50ZXJjZXB0IiwiYmluZCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTWl0bSIsInNodXRkb3duIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLE9BQXBCOztBQUVlLE1BQU1DLFdBQU4sU0FBMEJDLHFCQUExQixDQUF1QztBQUNsREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFBN0M7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsS0FBekI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLHVCQUFMLEdBQStCLElBQS9CO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNIOztBQUVPLE1BQUpDLElBQUksR0FBRztBQUNQLFdBQU9qQixXQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYyxRQUFKa0IsSUFBSSxDQUFDQyxTQUFELEVBQVlDLGFBQWEsR0FBRyxJQUE1QixFQUFrQ0MsZUFBZSxHQUFHLEtBQXBELEVBQTJEQyxnQkFBZ0IsR0FBRyxLQUE5RSxFQUFxRjtBQUMzRixTQUFLVixn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QjtBQUN2QnNELFFBQUFBLEdBQUcsQ0FBQ1EsV0FBSixHQUFrQlQsR0FBRyxDQUFDRSxPQUFKLENBQVlRLElBQTlCO0FBQ0g7O0FBRUQsVUFBSSxLQUFLOUQsaUJBQVQsRUFBNEI7QUFDeEJxRCxRQUFBQSxHQUFHLENBQUNVLFlBQUosR0FBbUJYLEdBQUcsQ0FBQ0ksUUFBSixDQUFhTSxJQUFoQztBQUNIOztBQUVELFdBQUtqRSxlQUFMLENBQXFCbUUsSUFBckIsQ0FBMEJYLEdBQTFCO0FBQ0g7QUFDSjs7QUF4UGlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSBwcm94eVxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgaW50ZXJjZXB0aW5nIG5ldHdvcmsgdHJhZmZpYyB2aWEgbWl0bXByb3h5LlxyXG4gKi9cclxuXHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgaGVscGVycyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IE1JVE1Qcm94eSBmcm9tICdAb3h5Z2VuaHEvbWl0bXByb3h5LW5vZGUnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAncHJveHknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJveHlNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXNwb25zZUJvZHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBwcm94eS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm94eVBvcnQgLSBQcm94eSBwb3J0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwcm94eUNvbW1Qb3J0IC0gUG9ydCBmb3IgaW50ZXJuYWwgcHJveHkgY29tbXVuaWNhdGlvbi4gSWYgc3BlY2lmaWVkLCB0aGVuIG1pdG1wcm94eSBzaG91bGQgYmUgbGF1bmNoZWQgbWFudWFsbHkuXHJcbiAgICAgKiBPdGhlcndpc2UgbWl0bXBveHkgd2lsbCBiZSBsYXVuY2hlZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlcXVlc3RCb2R5IC0gU2F2ZSByZXF1ZXN0IGJvZGllcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHNhdmVSZXNwb25zZUJvZHkgLSBTYXZlIHJlc3BvbnNlIGJvZGllcy5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltzaGVsbF0gTGF1bmNoaW5nIG1pdG1wcm94eSBtYW51YWxseTwvY2FwdGlvbj5cclxuICAgICAqIG1pdG1kdW1wIC0tYW50aWNhY2hlIC1zIG1pdG1wcm94eS1ub2RlXFxzY3JpcHRzXFxwcm94eS5weSAtLXNzbC1pbnNlY3VyZSAtLXNldCBodHRwQ29tbVBvcnQ9ODc2NVxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KHByb3h5UG9ydCwgcHJveHlDb21tUG9ydCA9IG51bGwsIHNhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlLCBzYXZlUmVzcG9uc2VCb2R5ID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLl9zYXZlUmVxdWVzdEJvZHkgPSBzYXZlUmVxdWVzdEJvZHk7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlc3BvbnNlQm9keSA9IHNhdmVSZXNwb25zZUJvZHk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gYXdhaXQgTUlUTVByb3h5LkNyZWF0ZSh0aGlzLl9vbk5ldHdvcmtJbnRlcmNlcHQuYmluZCh0aGlzKSwgcHJveHlQb3J0LCBwcm94eUNvbW1Qb3J0LCBbJy9ldmFsJ10sIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQgPSAhIXByb3h5Q29tbVBvcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRGlzcG9zZXMgdGhpcyBtb2R1bGUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlTWl0bSA9ICF0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJveHkuc2h1dGRvd24oZGlzcG9zZU1pdG0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGRpc3Bvc2UgdGhlIHByb3h5JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEJlZ2luIGNvbGxlY3RpbmcgbmV0d29yayByZXF1ZXN0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBBbnkgcHJldmlvdXNseSBjb2xsZWN0ZWQgcmVxdWVzdHMgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RhcnRcclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogcHJveHkuaW5pdCg4MDgwKTtcclxuICAgICAqIHByb3h5LnN0YXJ0KCk7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gcHJveHkuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogcHJveHkud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gJzIwMCcgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uZXR3b3JrVHJhZmZpYztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHtwYXR0ZXJufVwiIHdhcyBmb3VuZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsICdObyByZXF1ZXN0IGZvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBtYXRjaGVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFVybCh1cmwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9vbk5ldHdvcmtJbnRlcmNlcHQobXNnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IG1zZy5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbXNnLnJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBtc2cucmVzcG9uc2Uuc3RhdHVzX2NvZGUsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogbXNnLnJlcXVlc3QuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogbXNnLnJlc3BvbnNlLmhlYWRlcnNcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVxdWVzdEJvZHkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5yZXF1ZXN0Qm9keSA9IG1zZy5yZXF1ZXN0LmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVzcG9uc2VCb2R5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmoucmVzcG9uc2VCb2R5ID0gbXNnLnJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
324
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlByb3h5TW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX25ldHdvcmtUcmFmZmljIiwiX2NvbGxlY3REYXRhIiwiX3NhdmVSZXF1ZXN0Qm9keSIsIl9zYXZlUmVzcG9uc2VCb2R5IiwiX3Byb3h5IiwiX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJpbml0IiwicHJveHlQb3J0IiwicHJveHlDb21tUG9ydCIsInNhdmVSZXF1ZXN0Qm9keSIsInNhdmVSZXNwb25zZUJvZHkiLCJNSVRNUHJveHkiLCJDcmVhdGUiLCJfb25OZXR3b3JrSW50ZXJjZXB0IiwiYmluZCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTWl0bSIsInNodXRkb3duIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLE9BQXBCOztBQUVlLE1BQU1DLFdBQU4sU0FBMEJDLHFCQUExQixDQUF1QztBQUNsREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFBN0M7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsS0FBekI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLHVCQUFMLEdBQStCLElBQS9CO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNIOztBQUVPLE1BQUpDLElBQUksR0FBRztBQUNQLFdBQU9qQixXQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYyxRQUFKa0IsSUFBSSxDQUFDQyxTQUFELEVBQVlDLGFBQWEsR0FBRyxJQUE1QixFQUFrQ0MsZUFBZSxHQUFHLEtBQXBELEVBQTJEQyxnQkFBZ0IsR0FBRyxLQUE5RSxFQUFxRjtBQUMzRixTQUFLVixn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QjtBQUN2QnNELFFBQUFBLEdBQUcsQ0FBQ1EsV0FBSixHQUFrQlQsR0FBRyxDQUFDRSxPQUFKLENBQVlRLElBQTlCO0FBQ0g7O0FBRUQsVUFBSSxLQUFLOUQsaUJBQVQsRUFBNEI7QUFDeEJxRCxRQUFBQSxHQUFHLENBQUNVLFlBQUosR0FBbUJYLEdBQUcsQ0FBQ0ksUUFBSixDQUFhTSxJQUFoQztBQUNIOztBQUVELFdBQUtqRSxlQUFMLENBQXFCbUUsSUFBckIsQ0FBMEJYLEdBQTFCO0FBQ0g7QUFDSjs7QUF4UGlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG4vKipcbiAqIEBuYW1lIHByb3h5XG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgaW50ZXJjZXB0aW5nIG5ldHdvcmsgdHJhZmZpYyB2aWEgbWl0bXByb3h5LlxuICovXG5cbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgTUlUTVByb3h5IGZyb20gJ0BveHlnZW5ocS9taXRtcHJveHktbm9kZSc7XG5cbmNvbnN0IE1PRFVMRV9OQU1FID0gJ3Byb3h5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJveHlNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2F2ZVJlcXVlc3RCb2R5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NhdmVSZXNwb25zZUJvZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcHJveHkgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGluaXRcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBwcm94eS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcHJveHlQb3J0IC0gUHJveHkgcG9ydC5cbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHByb3h5Q29tbVBvcnQgLSBQb3J0IGZvciBpbnRlcm5hbCBwcm94eSBjb21tdW5pY2F0aW9uLiBJZiBzcGVjaWZpZWQsIHRoZW4gbWl0bXByb3h5IHNob3VsZCBiZSBsYXVuY2hlZCBtYW51YWxseS5cbiAgICAgKiBPdGhlcndpc2UgbWl0bXBveHkgd2lsbCBiZSBsYXVuY2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHNhdmVSZXF1ZXN0Qm9keSAtIFNhdmUgcmVxdWVzdCBib2RpZXMuXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlc3BvbnNlQm9keSAtIFNhdmUgcmVzcG9uc2UgYm9kaWVzLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltzaGVsbF0gTGF1bmNoaW5nIG1pdG1wcm94eSBtYW51YWxseTwvY2FwdGlvbj5cbiAgICAgKiBtaXRtZHVtcCAtLWFudGljYWNoZSAtcyBtaXRtcHJveHktbm9kZVxcc2NyaXB0c1xccHJveHkucHkgLS1zc2wtaW5zZWN1cmUgLS1zZXQgaHR0cENvbW1Qb3J0PTg3NjVcbiAgICAgKi9cbiAgICBhc3luYyBpbml0KHByb3h5UG9ydCwgcHJveHlDb21tUG9ydCA9IG51bGwsIHNhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlLCBzYXZlUmVzcG9uc2VCb2R5ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fc2F2ZVJlcXVlc3RCb2R5ID0gc2F2ZVJlcXVlc3RCb2R5O1xuICAgICAgICB0aGlzLl9zYXZlUmVzcG9uc2VCb2R5ID0gc2F2ZVJlc3BvbnNlQm9keTtcblxuICAgICAgICB0aGlzLl9wcm94eSA9IGF3YWl0IE1JVE1Qcm94eS5DcmVhdGUodGhpcy5fb25OZXR3b3JrSW50ZXJjZXB0LmJpbmQodGhpcyksIHByb3h5UG9ydCwgcHJveHlDb21tUG9ydCwgWycvZXZhbCddLCB0cnVlLCBmYWxzZSk7XG5cbiAgICAgICAgc3VwZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9ICEhcHJveHlDb21tUG9ydDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGRpc3Bvc2VcbiAgICAgKiBAc3VtbWFyeSBEaXNwb3NlcyB0aGlzIG1vZHVsZS5cbiAgICAgKi9cbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcG9zZU1pdG0gPSAhdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZDtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm94eS5zaHV0ZG93bihkaXNwb3NlTWl0bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gZGlzcG9zZSB0aGUgcHJveHknLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBCZWdpbiBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBAZnVuY3Rpb24gc3RhcnRcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cbiAgICAgKiBwcm94eS5pbml0KDgwODApO1xuICAgICAqIHByb3h5LnN0YXJ0KCk7XG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcbiAgICAgKiBsZXQgcmVxdWVzdHMgPSBwcm94eS5nZXRSZXF1ZXN0cygpO1xuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xuICAgICAqICAgbG9nLmluZm8ocmVxKTtcbiAgICAgKiB9XG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxuICAgICAqIHByb3h5LndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uIFVSTCBtYXRjaDpcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxuICAgICAqIHByb3h5LndhaXRGb3IoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gJzIwMCcgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcbiAgICAgKi9cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IGNvbnRhaW5pbmcgbmV0d29yayByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldHdvcmtUcmFmZmljO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBXYWl0IGZvciBhIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cbiAgICAgKi9cbiAgICBhc3luYyB3YWl0Rm9yVXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5LnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYHByb3h5YCBjb21tYW5kcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3IobWF0Y2hlciwgdGltZW91dCA9IDYwKjEwMDApIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eWAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChtYXRjaGVyLCAnbWF0Y2hlcicpO1xuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCAnTm8gcmVxdWVzdCBmb3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgbWF0Y2hlci4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRVcmxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXG4gICAgICovXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eWAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cbiAgICAgKi9cbiAgICBhc3luYyBhc3NlcnRTdGF0dXNDb2RlKHVybCwgc3RhdHVzQ29kZSwgZmFpbHVyZU1lc3NhZ2UgPSBudWxsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5LnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYHByb3h5YCBjb21tYW5kcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgdGhpcy5fbmV0d29ya1RyYWZmaWMpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAhbWF0Y2hlZFJlcSAmJiBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbk5ldHdvcmtJbnRlcmNlcHQobXNnKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb2xsZWN0RGF0YSkge1xuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICB1cmw6IG1zZy5yZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1zZy5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IG1zZy5yZXNwb25zZS5zdGF0dXNfY29kZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogbXNnLnJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IG1zZy5yZXNwb25zZS5oZWFkZXJzXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc2F2ZVJlcXVlc3RCb2R5KSB7XG4gICAgICAgICAgICAgICAgb2JqLnJlcXVlc3RCb2R5ID0gbXNnLnJlcXVlc3QuYm9keTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhdmVSZXNwb25zZUJvZHkpIHtcbiAgICAgICAgICAgICAgICBvYmoucmVzcG9uc2VCb2R5ID0gbXNnLnJlc3BvbnNlLmJvZHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljLnB1c2gob2JqKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIl19