oxygen-cli 1.40.1-beta.1 → 1.40.1

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 +1742 -1731
  2. package/LICENSE +672 -672
  3. package/README.md +37 -37
  4. package/build/core/OxygenCore.js +1 -1
  5. package/build/core/OxygenEvents.js +1 -1
  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 +1 -1
  19. package/build/lib/debugger.js +1 -1
  20. package/build/lib/img-merge.js +1 -1
  21. package/build/lib/launcher.js +1 -1
  22. package/build/lib/logger.js +43 -43
  23. package/build/lib/moduleRequire.js +1 -1
  24. package/build/lib/parallel-launcher.js +1 -1
  25. package/build/lib/param-manager.js +1 -1
  26. package/build/lib/param-reader-csv.js +1 -1
  27. package/build/lib/param-reader-excel.js +1 -1
  28. package/build/lib/param-reader-json.js +1 -1
  29. package/build/lib/text-to-image.js +1 -1
  30. package/build/lib/util.js +1 -1
  31. package/build/model/case-result.js +1 -1
  32. package/build/model/failure.js +1 -1
  33. package/build/model/status.js +1 -1
  34. package/build/model/step-result.js +1 -1
  35. package/build/model/suite-result.js +1 -1
  36. package/build/model/test-result.js +1 -1
  37. package/build/model/testcase.js +1 -1
  38. package/build/model/testsuite.js +1 -1
  39. package/build/ox_modules/index.js +1 -1
  40. package/build/ox_modules/module-assert.js +37 -37
  41. package/build/ox_modules/module-date.js +24 -24
  42. package/build/ox_modules/module-db.js +52 -52
  43. package/build/ox_modules/module-email.js +59 -59
  44. package/build/ox_modules/module-eyes.js +34 -34
  45. package/build/ox_modules/module-http/ntlm-util.js +10 -10
  46. package/build/ox_modules/module-http/ntlm.js +15 -15
  47. package/build/ox_modules/module-http.js +132 -132
  48. package/build/ox_modules/module-log.js +27 -27
  49. package/build/ox_modules/module-mailinator.js +87 -87
  50. package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
  51. package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
  52. package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
  53. package/build/ox_modules/module-mob/commands/assertText.js +21 -21
  54. package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
  55. package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
  56. package/build/ox_modules/module-mob/commands/back.js +16 -16
  57. package/build/ox_modules/module-mob/commands/clear.js +19 -19
  58. package/build/ox_modules/module-mob/commands/click.js +17 -17
  59. package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
  60. package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
  61. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
  62. package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
  63. package/build/ox_modules/module-mob/commands/debug.js +16 -16
  64. package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
  65. package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
  66. package/build/ox_modules/module-mob/commands/execute.js +21 -21
  67. package/build/ox_modules/module-mob/commands/findElement.js +20 -20
  68. package/build/ox_modules/module-mob/commands/findElements.js +23 -23
  69. package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
  70. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
  71. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
  72. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
  73. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
  74. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
  75. package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
  76. package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
  77. package/build/ox_modules/module-mob/commands/getSource.js +16 -16
  78. package/build/ox_modules/module-mob/commands/getText.js +18 -18
  79. package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
  80. package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
  81. package/build/ox_modules/module-mob/commands/getValue.js +18 -18
  82. package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
  83. package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
  84. package/build/ox_modules/module-mob/commands/index.js +1 -1
  85. package/build/ox_modules/module-mob/commands/installApp.js +16 -16
  86. package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
  87. package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
  88. package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
  89. package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
  90. package/build/ox_modules/module-mob/commands/isExist.js +19 -19
  91. package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
  92. package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
  93. package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
  94. package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
  95. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
  96. package/build/ox_modules/module-mob/commands/open.js +17 -17
  97. package/build/ox_modules/module-mob/commands/pause.js +16 -16
  98. package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
  99. package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
  100. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
  101. package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
  102. package/build/ox_modules/module-mob/commands/select.js +24 -24
  103. package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
  104. package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
  105. package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
  106. package/build/ox_modules/module-mob/commands/setContext.js +16 -16
  107. package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
  108. package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
  109. package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
  110. package/build/ox_modules/module-mob/commands/shake.js +16 -16
  111. package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
  112. package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
  113. package/build/ox_modules/module-mob/commands/swipe.js +20 -20
  114. package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
  115. package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
  116. package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
  117. package/build/ox_modules/module-mob/commands/tap.js +17 -17
  118. package/build/ox_modules/module-mob/commands/type.js +20 -20
  119. package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
  120. package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
  121. package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
  122. package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
  123. package/build/ox_modules/module-mob.js +74 -74
  124. package/build/ox_modules/module-pdf.js +35 -35
  125. package/build/ox_modules/module-proxy.js +77 -77
  126. package/build/ox_modules/module-serial.js +55 -55
  127. package/build/ox_modules/module-shell.js +25 -25
  128. package/build/ox_modules/module-soap.js +72 -72
  129. package/build/ox_modules/module-twilio.js +41 -41
  130. package/build/ox_modules/module-utils.js +91 -91
  131. package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
  132. package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
  133. package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
  134. package/build/ox_modules/module-web/commands/assertExist.js +17 -17
  135. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
  136. package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
  137. package/build/ox_modules/module-web/commands/assertText.js +21 -21
  138. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
  139. package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
  140. package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
  141. package/build/ox_modules/module-web/commands/assertValue.js +20 -20
  142. package/build/ox_modules/module-web/commands/back.js +16 -16
  143. package/build/ox_modules/module-web/commands/clear.js +18 -18
  144. package/build/ox_modules/module-web/commands/click.js +25 -25
  145. package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
  146. package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
  147. package/build/ox_modules/module-web/commands/debug.js +15 -15
  148. package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
  149. package/build/ox_modules/module-web/commands/deselect.js +22 -22
  150. package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
  151. package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
  152. package/build/ox_modules/module-web/commands/execute.js +24 -24
  153. package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
  154. package/build/ox_modules/module-web/commands/findElement.js +19 -19
  155. package/build/ox_modules/module-web/commands/findElements.js +22 -22
  156. package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
  157. package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
  158. package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
  159. package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
  160. package/build/ox_modules/module-web/commands/getCookies.js +13 -13
  161. package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
  162. package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
  163. package/build/ox_modules/module-web/commands/getHTML.js +17 -17
  164. package/build/ox_modules/module-web/commands/getSource.js +16 -16
  165. package/build/ox_modules/module-web/commands/getText.js +18 -18
  166. package/build/ox_modules/module-web/commands/getTitle.js +12 -12
  167. package/build/ox_modules/module-web/commands/getUrl.js +16 -16
  168. package/build/ox_modules/module-web/commands/getValue.js +18 -18
  169. package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
  170. package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
  171. package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
  172. package/build/ox_modules/module-web/commands/index.js +1 -1
  173. package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
  174. package/build/ox_modules/module-web/commands/isChecked.js +18 -18
  175. package/build/ox_modules/module-web/commands/isExist.js +19 -19
  176. package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
  177. package/build/ox_modules/module-web/commands/isSelected.js +23 -23
  178. package/build/ox_modules/module-web/commands/isVisible.js +19 -19
  179. package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
  180. package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
  181. package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
  182. package/build/ox_modules/module-web/commands/mock.js +20 -20
  183. package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
  184. package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
  185. package/build/ox_modules/module-web/commands/newWindow.js +16 -16
  186. package/build/ox_modules/module-web/commands/open.js +16 -16
  187. package/build/ox_modules/module-web/commands/pause.js +15 -15
  188. package/build/ox_modules/module-web/commands/point.js +21 -21
  189. package/build/ox_modules/module-web/commands/pointJS.js +15 -15
  190. package/build/ox_modules/module-web/commands/refresh.js +15 -15
  191. package/build/ox_modules/module-web/commands/rightClick.js +17 -17
  192. package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
  193. package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
  194. package/build/ox_modules/module-web/commands/select.js +23 -23
  195. package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
  196. package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
  197. package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
  198. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
  199. package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
  200. package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
  201. package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
  202. package/build/ox_modules/module-web/commands/type.js +20 -20
  203. package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
  204. package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
  205. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
  206. package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
  207. package/build/ox_modules/module-web/commands/verifyText.js +21 -21
  208. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
  209. package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
  210. package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
  211. package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
  212. package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
  213. package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
  214. package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
  215. package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
  216. package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
  217. package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
  218. package/build/ox_modules/module-web/commands/waitForText.js +20 -20
  219. package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
  220. package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
  221. package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
  222. package/build/ox_modules/module-web.js +94 -94
  223. package/build/ox_modules/module-win/commands/assertText.js +17 -17
  224. package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
  225. package/build/ox_modules/module-win/commands/assertValue.js +14 -14
  226. package/build/ox_modules/module-win/commands/back.js +11 -11
  227. package/build/ox_modules/module-win/commands/clear.js +13 -13
  228. package/build/ox_modules/module-win/commands/click.js +13 -13
  229. package/build/ox_modules/module-win/commands/clickLong.js +14 -14
  230. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
  231. package/build/ox_modules/module-win/commands/findElement.js +15 -15
  232. package/build/ox_modules/module-win/commands/findElements.js +15 -15
  233. package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
  234. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
  235. package/build/ox_modules/module-win/commands/getLocation.js +14 -14
  236. package/build/ox_modules/module-win/commands/getSource.js +12 -12
  237. package/build/ox_modules/module-win/commands/getText.js +14 -14
  238. package/build/ox_modules/module-win/commands/getValue.js +14 -14
  239. package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
  240. package/build/ox_modules/module-win/commands/index.js +1 -1
  241. package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
  242. package/build/ox_modules/module-win/commands/isChecked.js +14 -14
  243. package/build/ox_modules/module-win/commands/isClickable.js +14 -14
  244. package/build/ox_modules/module-win/commands/isExist.js +15 -15
  245. package/build/ox_modules/module-win/commands/isSelected.js +14 -14
  246. package/build/ox_modules/module-win/commands/isVisible.js +15 -15
  247. package/build/ox_modules/module-win/commands/open.js +13 -13
  248. package/build/ox_modules/module-win/commands/pause.js +12 -12
  249. package/build/ox_modules/module-win/commands/rightClick.js +13 -13
  250. package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
  251. package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
  252. package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
  253. package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
  254. package/build/ox_modules/module-win/commands/tap.js +13 -13
  255. package/build/ox_modules/module-win/commands/type.js +16 -16
  256. package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
  257. package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
  258. package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
  259. package/build/ox_modules/module-win.js +47 -47
  260. package/build/ox_modules/utils.js +8 -8
  261. package/build/ox_reporters/excel/template.json +48 -48
  262. package/build/ox_reporters/html/index.ejs +163 -163
  263. package/build/ox_reporters/html/summary.ejs +77 -77
  264. package/build/ox_reporters/html/tests-details.ejs +134 -134
  265. package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
  266. package/build/ox_reporters/reporter-excel.js +1 -1
  267. package/build/ox_reporters/reporter-html.js +1 -1
  268. package/build/ox_reporters/reporter-json.js +1 -1
  269. package/build/ox_reporters/reporter-junit.js +1 -1
  270. package/build/ox_reporters/reporter-pdf.js +1 -1
  271. package/build/ox_reporters/reporter-rp.js +56 -55
  272. package/build/ox_reporters/reporter-xml.js +1 -1
  273. package/build/ox_services/service-devtools/submodule-network.js +1 -1
  274. package/build/ox_services/service-devtools.js +1 -1
  275. package/build/reporter/FileReporterBase.js +1 -1
  276. package/build/reporter/ReportAggregator.js +1 -1
  277. package/build/reporter/ReporterBase.js +1 -1
  278. package/build/reporter/WebSocketReporter.js +1 -1
  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 +1 -1
  288. package/build/runners/oxygen/worker.js +1 -1
  289. package/config/default.json +6 -6
  290. package/package.json +137 -137
  291. package/types/index.d.ts +70 -70
  292. package/types/module-eyes.d.ts +39 -39
  293. package/types/module-http.d.ts +163 -163
  294. package/types/module-log.d.ts +34 -34
  295. package/types/module-mob.d.ts +966 -966
  296. package/types/module-pdf.d.ts +40 -40
  297. package/types/module-proxy.d.ts +100 -100
  298. package/types/module-shell.d.ts +24 -24
  299. package/types/module-utils.d.ts +99 -99
  300. package/types/module-web.d.ts +1053 -1053
  301. package/types/module-win.d.ts +352 -352
  302. package/types/oxygen.d.ts +53 -53
  303. package/log.txt +0 -1614
@@ -373,4 +373,4 @@ function processTargetPath(targetPath, userCwd) {
373
373
  extension: _path.default.extname(targetPath)
374
374
  };
375
375
  }
376
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwibmFtZXMiOlsiT1hZR0VOX0NPTkZJR19GSUxFX05BTUUiLCJPWFlHRU5fRU5WX0ZJTEVfTkFNRSIsIk9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUiLCJERUZBVUxUX1JFUE9SVEVSIiwiZ2VuZXJhdGVUZXN0T3B0aW9ucyIsImNvbmZpZyIsImFyZ3YiLCJvcHRpb25zIiwiZW52IiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzIiwicG8iLCJnZXRQYWdlT2JqZWN0RmlsZVBhdGgiLCJzdWl0ZXMiLCJsb2FkU3VpdGVzIiwiZnJhbWV3b3JrIiwidG9Mb3dlckNhc2UiLCJ0YXJnZXQiLCJpc0NvbmZpZ0ZpbGUiLCJuYW1lIiwiaW5kZXhPZiIsImV4dGVuc2lvbiIsImNvbmZpZ1BhdGgiLCJwdXNoIiwib3h1dGlsIiwiZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSlNGaWxlIiwicGF0aCIsInBhcmFtZXRlcnMiLCJmaWxlIiwibW9kZSIsIml0ZXJhdGlvbnMiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uRmlsZSIsInN1aXRlRGVmcyIsIkFycmF5IiwiaXNBcnJheSIsInN1aXRlc0ZvbGRlciIsImpvaW4iLCJjd2QiLCJmcyIsImV4aXN0c1N5bmMiLCJsb2FkU3VpdGVEZWZpbml0aW9uc0Zyb21Gb2xkZXIiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwic3VpdGVEZWYiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uIiwic2VsZWN0ZWRTdWl0ZU5hbWVzIiwic3BsaXQiLCJmaWx0ZXIiLCJ4IiwiaW5jbHVkZXMiLCJmb2xkZXJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImV4dG5hbWUiLCJmdWxsUGF0aCIsInBvRmlsZU5hbWUiLCJwcm9jZXNzIiwicG9GaWxlUGF0aCIsInJlc29sdmUiLCJlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZGlybmFtZSIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsImZ1bGxOYW1lIiwiYmFzZW5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRU8sTUFBTUEsdUJBQXVCLEdBQUcsYUFBaEM7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsWUFBN0I7O0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsV0FBckM7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsTUFBekI7OztBQUVBLGVBQWVDLG1CQUFmLENBQW1DQyxNQUFuQyxFQUEyQ0MsSUFBM0MsRUFBaUQ7QUFDcEQsUUFBTUMsT0FBTyxHQUFHLEVBQUUsR0FBR0Y7QUFBTCxHQUFoQjtBQUNBRSxFQUFBQSxPQUFPLENBQUNDLEdBQVIsR0FBY0Msd0JBQXdCLENBQUNKLE1BQUQsRUFBU0MsSUFBVCxDQUF0QztBQUNBQyxFQUFBQSxPQUFPLENBQUNHLEVBQVIsR0FBYUMscUJBQXFCLENBQUNOLE1BQUQsRUFBU0MsSUFBVCxDQUFsQztBQUNBQyxFQUFBQSxPQUFPLENBQUNLLE1BQVIsR0FBaUIsTUFBTUMsVUFBVSxDQUFDUixNQUFELEVBQVNDLElBQVQsQ0FBakM7QUFDQSxTQUFPQyxPQUFQO0FBQ0g7O0FBRU0sZUFBZU0sVUFBZixDQUEwQlIsTUFBMUIsRUFBa0NDLElBQWxDLEVBQXdDO0FBQzNDLE1BQUlELE1BQU0sQ0FBQ1MsU0FBUCxJQUFvQixPQUFPVCxNQUFNLENBQUNTLFNBQWQsS0FBNEIsUUFBaEQsSUFBNERULE1BQU0sQ0FBQ1MsU0FBUCxDQUFpQkMsV0FBakIsT0FBbUMsUUFBbkcsRUFBNkc7QUFDekc7QUFDSDs7QUFDRCxRQUFNO0FBQUVDLElBQUFBO0FBQUYsTUFBYVgsTUFBbkI7QUFDQSxRQUFNWSxZQUFZLEdBQUdELE1BQU0sS0FDdEJBLE1BQU0sQ0FBQ0UsSUFBUCxJQUFlRixNQUFNLENBQUNFLElBQVAsQ0FBWUMsT0FBWixDQUFvQm5CLHVCQUFwQixNQUFpRCxDQUFqRSxJQUNJZ0IsTUFBTSxDQUFDSSxTQUFQLEtBQXFCLEVBQXJCLElBQTJCSixNQUFNLENBQUNLLFVBQWxDLElBQWdETCxNQUFNLENBQUNLLFVBQVAsQ0FBa0JGLE9BQWxCLENBQTBCbkIsdUJBQTFCLElBQXFELENBQUMsQ0FGbkYsQ0FBM0I7QUFJQSxNQUFJWSxNQUFNLEdBQUcsRUFBYjs7QUFFQSxNQUFJLENBQUNLLFlBQUwsRUFBbUI7QUFDZixRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksU0FBUCxLQUFxQixLQUFuQyxFQUEwQztBQUN0Q1IsTUFBQUEsTUFBTSxDQUFDVSxJQUFQLENBQVksTUFBTUMsY0FBT0MsMkJBQVAsQ0FBbUNSLE1BQU0sQ0FBQ1MsSUFBMUMsRUFBZ0RwQixNQUFNLENBQUNxQixVQUFQLENBQWtCQyxJQUFsRSxFQUF3RXRCLE1BQU0sQ0FBQ3FCLFVBQVAsQ0FBa0JFLElBQTFGLEVBQWdHLEtBQWhHLEVBQXVHdkIsTUFBTSxDQUFDd0IsVUFBUCxJQUFxQixDQUE1SCxDQUFsQjtBQUNILEtBRkQsTUFHSyxJQUFJYixNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksU0FBUCxLQUFxQixPQUFuQyxFQUE0QztBQUM3Q1IsTUFBQUEsTUFBTSxDQUFDVSxJQUFQLENBQVksTUFBTUMsY0FBT08sNkJBQVAsQ0FBcUNkLE1BQU0sQ0FBQ1MsSUFBNUMsRUFBa0RwQixNQUFNLENBQUNxQixVQUFQLENBQWtCQyxJQUFwRSxFQUEwRXRCLE1BQU0sQ0FBQ3FCLFVBQVAsQ0FBa0JFLElBQTVGLEVBQWtHdkIsTUFBbEcsQ0FBbEI7QUFDSDtBQUNKLEdBUEQsTUFTSztBQUNELFVBQUkwQixTQUFTLEdBQUcsRUFBaEI7O0FBQ0EsVUFBSTFCLE1BQU0sQ0FBQ08sTUFBUCxJQUFpQm9CLEtBQUssQ0FBQ0MsT0FBTixDQUFjNUIsTUFBTSxDQUFDTyxNQUFyQixDQUFyQixFQUFtRDtBQUMvQ21CLFFBQUFBLFNBQVMsR0FBRzFCLE1BQU0sQ0FBQ08sTUFBbkI7QUFDSDs7QUFFRCxZQUFNc0IsWUFBWSxHQUFHVCxjQUFLVSxJQUFMLENBQVVuQixNQUFNLENBQUNvQixHQUFqQixFQUFzQixRQUF0QixDQUFyQjs7QUFDQSxVQUFJQyxZQUFHQyxVQUFILENBQWNKLFlBQWQsQ0FBSixFQUFpQztBQUM3QkgsUUFBQUEsU0FBUyxHQUFHLENBQ1IsR0FBR0EsU0FESyxFQUVSLEdBQUdRLDhCQUE4QixDQUFDTCxZQUFELENBRnpCLENBQVo7QUFJSDs7QUFFRHRCLE1BQUFBLE1BQU0sR0FBRyxNQUFNNEIsT0FBTyxDQUFDQyxHQUFSLENBQVlWLFNBQVMsQ0FBQ1csR0FBVixDQUFjLE1BQU9DLFFBQVAsSUFBb0IsTUFBTXBCLGNBQU9xQix5QkFBUCxDQUFpQ0QsUUFBakMsRUFBMkN0QyxNQUEzQyxDQUF4QyxDQUFaLENBQWY7QUFDSDs7QUFFRCxNQUFJQyxJQUFJLENBQUNNLE1BQUwsSUFBZSxPQUFPTixJQUFJLENBQUNNLE1BQVosS0FBdUIsUUFBMUMsRUFBb0Q7QUFDaEQsVUFBTWlDLGtCQUFrQixHQUFHdkMsSUFBSSxDQUFDTSxNQUFMLENBQVlrQyxLQUFaLENBQWtCLEdBQWxCLENBQTNCO0FBQ0FsQyxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ21DLE1BQVAsQ0FBY0MsQ0FBQyxJQUFJSCxrQkFBa0IsQ0FBQ0ksUUFBbkIsQ0FBNEJELENBQUMsQ0FBQzlCLElBQTlCLENBQW5CLENBQVQ7QUFDSDs7QUFDRCxTQUFPTixNQUFQO0FBQ0g7O0FBRU0sU0FBUzJCLDhCQUFULENBQXdDVyxVQUF4QyxFQUFvRDtBQUN2RCxRQUFNQyxLQUFLLEdBQUdkLFlBQUdlLFdBQUgsQ0FBZUYsVUFBZixDQUFkOztBQUNBLE1BQUluQixTQUFTLEdBQUcsRUFBaEI7QUFDQSxzQkFBUW9CLEtBQVIsRUFBZXhCLElBQUksSUFBSTtBQUNuQixRQUFJRixjQUFLNEIsT0FBTCxDQUFhMUIsSUFBYixNQUF1QixPQUEzQixFQUFvQztBQUNoQyxZQUFNMkIsUUFBUSxHQUFHN0IsY0FBS1UsSUFBTCxDQUFVZSxVQUFWLEVBQXNCdkIsSUFBdEIsQ0FBakI7O0FBQ0FJLE1BQUFBLFNBQVMsQ0FBQ1QsSUFBVixDQUFlLDRCQUFjZ0MsUUFBZCxDQUFmO0FBQ0g7QUFDSixHQUxEO0FBTUEsU0FBT3ZCLFNBQVA7QUFDSDs7QUFFTSxTQUFTcEIscUJBQVQsQ0FBK0JOLE1BQS9CLEVBQXVDQyxJQUFJLEdBQUcsRUFBOUMsRUFBa0Q7QUFDckQsUUFBTVUsTUFBTSxHQUFHWCxNQUFNLENBQUNXLE1BQVAsSUFBaUIsRUFBaEM7QUFDQSxRQUFNdUMsVUFBVSxHQUFHakQsSUFBSSxDQUFDSSxFQUFMLElBQVksR0FBRVIsNEJBQTZCLEtBQTlEO0FBQ0EsUUFBTWtDLEdBQUcsR0FBR3BCLE1BQU0sQ0FBQ29CLEdBQVAsSUFBY29CLE9BQU8sQ0FBQ3BCLEdBQVIsRUFBMUI7O0FBQ0EsTUFBSXFCLFVBQVUsR0FBR2hDLGNBQUtpQyxPQUFMLENBQWF0QixHQUFiLEVBQWtCbUIsVUFBbEIsQ0FBakI7O0FBQ0FFLEVBQUFBLFVBQVUsR0FBR3BCLFlBQUdDLFVBQUgsQ0FBY21CLFVBQWQsSUFBNEJBLFVBQTVCLEdBQXlDLElBQXREOztBQUVBLE1BQUlBLFVBQUosRUFBZ0I7QUFDWixRQUFJO0FBQ0Esa0NBQWNBLFVBQWQ7QUFDQSxhQUFPQSxVQUFQO0FBQ0gsS0FIRCxDQUdFLE9BQU9FLENBQVAsRUFBVTtBQUNSLFlBQU1DLEdBQUcsR0FBRyxJQUFJQyxLQUFKLENBQVcsd0JBQXVCSixVQUFXLGFBQVlFLENBQUMsQ0FBQ0csT0FBUSxJQUFHSCxDQUFDLENBQUNJLEtBQU0sRUFBOUUsQ0FBWjtBQUNBLFlBQU1ILEdBQU47QUFDSDtBQUNKLEdBUkQsTUFRTztBQUNILFdBQU8sSUFBUDtBQUNIO0FBQ0o7O0FBRU0sU0FBU25ELHdCQUFULENBQWtDSixNQUFsQyxFQUEwQ0MsSUFBMUMsRUFBZ0Q7QUFDbkQsUUFBTVUsTUFBTSxHQUFHWCxNQUFNLENBQUNXLE1BQVAsSUFBaUIsRUFBaEM7QUFDQSxRQUFNZ0QsT0FBTyxHQUFHMUQsSUFBSSxDQUFDRSxHQUFMLElBQVlILE1BQU0sQ0FBQzRELFdBQW5CLElBQWtDLFNBQWxEO0FBQ0EsUUFBTTdCLEdBQUcsR0FBR3BCLE1BQU0sQ0FBQ29CLEdBQVAsSUFBY29CLE9BQU8sQ0FBQ3BCLEdBQVIsRUFBMUI7O0FBQ0EsUUFBTThCLGNBQWMsR0FBR3pDLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFnQixHQUFFbkMsb0JBQXFCLEtBQXZDLENBQXZCOztBQUNBLE1BQUlvQyxZQUFHQyxVQUFILENBQWM0QixjQUFkLENBQUosRUFBbUM7QUFDL0IsVUFBTTFELEdBQUcsR0FBRyw0QkFBYzBELGNBQWQsQ0FBWjs7QUFDQSxRQUFJMUQsR0FBRyxJQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUF0QixJQUFrQzJELE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDOUQsR0FBckMsRUFBMEN3RCxPQUExQyxDQUF0QyxFQUEwRjtBQUN0RixhQUFPeEQsR0FBRyxDQUFDd0QsT0FBRCxDQUFWO0FBQ0g7QUFDSjs7QUFFRCxRQUFNTyxrQkFBa0IsR0FBRzlDLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFlLEtBQWYsRUFBdUIsR0FBRTRCLE9BQVEsS0FBakMsQ0FBM0I7O0FBQ0EsUUFBTVEsb0JBQW9CLEdBQUcvQyxjQUFLVSxJQUFMLENBQVVDLEdBQVYsRUFBZSxLQUFmLEVBQXVCLEdBQUU0QixPQUFRLE9BQWpDLENBQTdCOztBQUNBLE1BQUkzQixZQUFHQyxVQUFILENBQWNpQyxrQkFBZCxDQUFKLEVBQXVDO0FBQ25DLFdBQU8sNEJBQWNBLGtCQUFkLENBQVA7QUFDSCxHQUZELE1BR0ssSUFBSWxDLFlBQUdDLFVBQUgsQ0FBY2tDLG9CQUFkLENBQUosRUFBeUM7QUFDMUMsV0FBTyw0QkFBY0Esb0JBQWQsQ0FBUDtBQUNIOztBQUNELFNBQU8sRUFBUDtBQUNIOztBQUVNLFNBQVNDLGVBQVQsQ0FBeUJ6RCxNQUF6QixFQUFpQztBQUNwQyxNQUFJMEQsU0FBUyxHQUFHLElBQWhCOztBQUVBLE1BQUkxRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ29CLEdBQXJCLEVBQTBCO0FBQ3RCc0MsSUFBQUEsU0FBUyxHQUFHMUQsTUFBTSxDQUFDb0IsR0FBbkI7QUFDSDs7QUFFRCxRQUFNQSxHQUFHLEdBQUdzQyxTQUFTLElBQUlsQixPQUFPLENBQUNwQixHQUFSLEVBQXpCOztBQUNBLFFBQU04QixjQUFjLEdBQUd6QyxjQUFLVSxJQUFMLENBQVVDLEdBQVYsRUFBZ0IsR0FBRW5DLG9CQUFxQixLQUF2QyxDQUF2Qjs7QUFDQSxNQUFJb0MsWUFBR0MsVUFBSCxDQUFjNEIsY0FBZCxDQUFKLEVBQW1DO0FBQy9CLFFBQUk7QUFDQSxhQUFPLDRCQUFjQSxjQUFkLENBQVA7QUFDSCxLQUZELENBRUUsT0FBT1AsQ0FBUCxFQUFVO0FBQ1IsWUFBTUMsR0FBRyxHQUFHLElBQUlDLEtBQUosQ0FBVyx3QkFBdUJLLGNBQWUsYUFBWVAsQ0FBQyxDQUFDRyxPQUFRLElBQUdILENBQUMsQ0FBQ0ksS0FBTSxFQUFsRixDQUFaO0FBQ0EsWUFBTUgsR0FBTjtBQUNIO0FBQ0o7O0FBQ0QsU0FBTyxFQUFQO0FBQ0g7O0FBRU0sU0FBU2UsaUJBQVQsQ0FBMkIzRCxNQUEzQixFQUFtQ1YsSUFBbkMsRUFBeUM7QUFFNUMsTUFBSW9FLFNBQVMsR0FBRyxJQUFoQjs7QUFFQSxNQUFJMUQsTUFBTSxJQUFJQSxNQUFNLENBQUNvQixHQUFyQixFQUEwQjtBQUN0QnNDLElBQUFBLFNBQVMsR0FBRzFELE1BQU0sQ0FBQ29CLEdBQW5CO0FBQ0g7O0FBQ0QsUUFBTXdDLFlBQVksR0FBRztBQUNqQnhDLElBQUFBLEdBQUcsRUFBRXBCLE1BQU0sR0FBSTBELFNBQVMsSUFBSWxCLE9BQU8sQ0FBQ3BCLEdBQVIsRUFBakIsR0FBa0NvQixPQUFPLENBQUNwQixHQUFSLEVBRDVCO0FBRWpCcEIsSUFBQUEsTUFBTSxFQUFFQSxNQUZTO0FBR2pCNkQsSUFBQUEsV0FBVyxFQUFFLFFBSEk7QUFJakJDLElBQUFBLFdBQVcsRUFBRyw4QkFKRztBQUtqQkMsSUFBQUEsU0FBUyxFQUFHLDhCQUxLO0FBTWpCQyxJQUFBQSxhQUFhLEVBQUUsS0FORTtBQU9qQkMsSUFBQUEsYUFBYSxFQUFFLEtBUEU7QUFRakJwRCxJQUFBQSxVQUFVLEVBQUcsQ0FSSTtBQVNqQnFELElBQUFBLFNBQVMsRUFBRSxJQVRNO0FBVWpCQyxJQUFBQSxLQUFLLEVBQUUsSUFWVTtBQVdqQkMsSUFBQUEsaUJBQWlCLEVBQUUsS0FYRjtBQVlqQkMsSUFBQUEsaUJBQWlCLEVBQUUsS0FaRjtBQWFqQkMsSUFBQUEsa0JBQWtCLEVBQUUsS0FiSDtBQWNqQkMsSUFBQUEsU0FBUyxFQUFFO0FBQ1BDLE1BQUFBLFNBQVMsRUFBRSxDQUFDckYsZ0JBQUQ7QUFESixLQWRNO0FBaUJqQnVCLElBQUFBLFVBQVUsRUFBRztBQUNUQyxNQUFBQSxJQUFJLEVBQUUsSUFERztBQUVUQyxNQUFBQSxJQUFJLEVBQUU7QUFGRztBQWpCSSxHQUFyQjtBQXVCQSxRQUFNNkQsT0FBTyxHQUFHQyxxQkFBcUIsQ0FBQ3BGLElBQUQsQ0FBckM7QUFFQSxNQUFJcUYsY0FBYyxHQUFHLEVBQXJCOztBQUNBLE1BQUkzRSxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBUCxLQUFnQmxCLHVCQUExQixLQUFzRGdCLE1BQU0sQ0FBQ0ksU0FBUCxLQUFxQixLQUFyQixJQUE4QkosTUFBTSxDQUFDSSxTQUFQLEtBQXFCLE9BQXpHLENBQUosRUFBdUg7QUFDbkgsUUFBSTtBQUNBdUUsTUFBQUEsY0FBYyxHQUFHLDRCQUFjM0UsTUFBTSxDQUFDUyxJQUFyQixDQUFqQjtBQUNILEtBRkQsQ0FFRSxPQUFPa0MsQ0FBUCxFQUFVO0FBQ1IsWUFBTUMsR0FBRyxHQUFHLElBQUlDLEtBQUosQ0FBVyx3QkFBdUI3QyxNQUFNLENBQUNTLElBQUssYUFBWWtDLENBQUMsQ0FBQ0csT0FBUSxJQUFHSCxDQUFDLENBQUNJLEtBQU0sRUFBL0UsQ0FBWjtBQUNBLFlBQU1ILEdBQU47QUFDSDtBQUNKLEdBUEQsTUFRSyxJQUFJNUMsTUFBTSxJQUFJQSxNQUFNLENBQUNLLFVBQXJCLEVBQWlDO0FBQ2xDLFFBQUk7QUFDQXNFLE1BQUFBLGNBQWMsR0FBRyw0QkFBYzNFLE1BQU0sQ0FBQ0ssVUFBckIsQ0FBakI7QUFDSCxLQUZELENBRUUsT0FBT3NDLENBQVAsRUFBVTtBQUNSLFlBQU1DLEdBQUcsR0FBRyxJQUFJQyxLQUFKLENBQVcsd0JBQXVCN0MsTUFBTSxDQUFDSyxVQUFXLGFBQVlzQyxDQUFDLENBQUNHLE9BQVEsSUFBR0gsQ0FBQyxDQUFDSSxLQUFNLEVBQXJGLENBQVo7QUFDQSxZQUFNSCxHQUFOO0FBQ0g7QUFDSjs7QUFDRCxRQUFNZ0MsSUFBSSxHQUFHbkIsZUFBZSxDQUFDekQsTUFBRCxDQUE1Qjs7QUFFQSxNQUFJMkUsY0FBYyxDQUFDQyxJQUFuQixFQUF5QjtBQUVyQkQsSUFBQUEsY0FBYyxDQUFDQyxJQUFmLEdBQXNCLEVBQUUsR0FBR0QsY0FBYyxDQUFDQyxJQUFwQjtBQUEwQixTQUFHQTtBQUE3QixLQUF0QjtBQUNILEdBSEQsTUFJSztBQUNERCxJQUFBQSxjQUFjLEdBQUcsRUFBRSxHQUFHQSxjQUFMO0FBQXFCQyxNQUFBQSxJQUFJLEVBQUVBO0FBQTNCLEtBQWpCO0FBQ0g7O0FBRUQsUUFBTUMscUJBQXFCLEdBQUdKLE9BQU8sQ0FBQ0YsU0FBUixJQUFxQkUsT0FBTyxDQUFDRixTQUFSLENBQWtCQyxTQUFyRTtBQUNBLFFBQU1NLG9CQUFvQixHQUFHSCxjQUFjLENBQUNKLFNBQWYsSUFBNEJJLGNBQWMsQ0FBQ0osU0FBZixDQUF5QkMsU0FBbEY7O0FBQ0EsTUFBSSxDQUFDSyxxQkFBRCxJQUEwQixDQUFDQyxvQkFBL0IsRUFBcUQ7QUFDakQsUUFBSSxDQUFDSCxjQUFjLENBQUNKLFNBQXBCLEVBQStCO0FBQzNCSSxNQUFBQSxjQUFjLENBQUNKLFNBQWYsR0FBMkIsRUFBM0I7QUFDSDs7QUFDREksSUFBQUEsY0FBYyxDQUFDSixTQUFmLENBQXlCQyxTQUF6QixHQUFxQyxDQUFDckYsZ0JBQUQsQ0FBckM7QUFDSDs7QUFFRCxNQUFJZSxJQUFJLEdBQUd1RSxPQUFPLENBQUN2RSxJQUFSLElBQWdCeUUsY0FBYyxDQUFDekUsSUFBL0IsSUFBdUMsSUFBbEQ7O0FBQ0EsTUFBSSxDQUFDQSxJQUFELElBQVNGLE1BQWIsRUFBcUI7QUFDakJFLElBQUFBLElBQUksR0FBR0YsTUFBTSxDQUFDRSxJQUFQLEtBQWdCbEIsdUJBQWhCLEdBQTBDZ0IsTUFBTSxDQUFDRSxJQUFqRCxHQUF3REYsTUFBTSxDQUFDK0UsUUFBdEU7QUFDSDs7QUFHRCxTQUFPLEVBQUUsR0FBR25CLFlBQUw7QUFBbUIsT0FBR2UsY0FBdEI7QUFBc0MsT0FBR0YsT0FBekM7QUFBa0R2RSxJQUFBQSxJQUFJLEVBQUVBO0FBQXhELEdBQVA7QUFDSDs7QUFFTSxTQUFTd0UscUJBQVQsQ0FBK0JwRixJQUEvQixFQUFxQztBQUN4QyxRQUFNMEYsSUFBSSxHQUFHO0FBRVQ5RSxJQUFBQSxJQUFJLEVBQUVaLElBQUksQ0FBQ1ksSUFBTCxJQUFhLElBRlY7QUFJVDJELElBQUFBLFdBQVcsRUFBR3ZFLElBQUksQ0FBQzJGLENBQUwsSUFBVTNGLElBQUksQ0FBQzRGLE9BQWYsSUFBMEIsSUFKL0I7QUFLVHBCLElBQUFBLFdBQVcsRUFBR3hFLElBQUksQ0FBQzZGLENBQUwsSUFBVTdGLElBQUksQ0FBQzhGLE1BQWYsSUFBeUIsSUFMOUI7QUFNVHJCLElBQUFBLFNBQVMsRUFBR3pFLElBQUksQ0FBQzZGLENBQUwsSUFBVTdGLElBQUksQ0FBQzhGLE1BQWYsSUFBeUIsSUFONUI7QUFPVHBCLElBQUFBLGFBQWEsRUFBRTFFLElBQUksQ0FBQytGLE1BQUwsR0FBYy9GLElBQUksQ0FBQytGLE1BQUwsS0FBZ0IsTUFBOUIsR0FBdUMsSUFQN0M7QUFRVHhFLElBQUFBLFVBQVUsRUFBR3ZCLElBQUksQ0FBQ2dHLENBQUwsR0FBU0MsUUFBUSxDQUFDakcsSUFBSSxDQUFDZ0csQ0FBTixDQUFqQixHQUE2QmhHLElBQUksQ0FBQ2tHLElBQUwsR0FBWUQsUUFBUSxDQUFDakcsSUFBSSxDQUFDa0csSUFBTixDQUFwQixHQUFrQyxJQVJuRTtBQVNUdEIsSUFBQUEsU0FBUyxFQUFFNUUsSUFBSSxDQUFDbUcsT0FBTCxJQUFnQixJQVRsQjtBQVVUQyxJQUFBQSxNQUFNLEVBQUVwRyxJQUFJLENBQUNxRyxNQUFMLElBQWUsSUFWZDtBQVdUeEIsSUFBQUEsS0FBSyxFQUFFN0UsSUFBSSxDQUFDc0csQ0FBTCxJQUFVdEcsSUFBSSxDQUFDNkUsS0FBZixJQUF3QjtBQVh0QixHQUFiOztBQWNBLE1BQUk3RSxJQUFJLENBQUN1RyxFQUFMLElBQVcsT0FBT3ZHLElBQUksQ0FBQ3VHLEVBQVosS0FBbUIsUUFBOUIsSUFBMEN2RyxJQUFJLENBQUN1RyxFQUFMLENBQVFDLE1BQVIsR0FBaUIsQ0FBL0QsRUFBa0U7QUFDOUQsVUFBTUMsYUFBYSxHQUFHekcsSUFBSSxDQUFDdUcsRUFBTCxDQUFRL0QsS0FBUixDQUFjLEdBQWQsQ0FBdEI7QUFDQWtELElBQUFBLElBQUksQ0FBQ1QsU0FBTCxHQUFpQjtBQUNiQyxNQUFBQSxTQUFTLEVBQUV1QjtBQURFLEtBQWpCOztBQUtBLFFBQUl6RyxJQUFJLENBQUMwRyxFQUFMLElBQVcsT0FBTzFHLElBQUksQ0FBQzBHLEVBQVosS0FBbUIsUUFBOUIsSUFBMEMxRyxJQUFJLENBQUMwRyxFQUFMLENBQVFGLE1BQVIsR0FBaUIsQ0FBL0QsRUFBa0U7QUFDOURkLE1BQUFBLElBQUksQ0FBQ1QsU0FBTCxDQUFlMEIsU0FBZixHQUEyQjNHLElBQUksQ0FBQzBHLEVBQWhDO0FBQ0g7QUFDSjs7QUFFRCxNQUFJMUcsSUFBSSxDQUFDNEcsQ0FBTCxJQUFVNUcsSUFBSSxDQUFDNkcsS0FBbkIsRUFBMEI7QUFDdEJuQixJQUFBQSxJQUFJLENBQUN0RSxVQUFMLEdBQWtCO0FBQ2RDLE1BQUFBLElBQUksRUFBRXJCLElBQUksQ0FBQzRHLENBQUwsSUFBVTVHLElBQUksQ0FBQzZHLEtBQWYsSUFBd0IsSUFEaEI7QUFFZHZGLE1BQUFBLElBQUksRUFBRXRCLElBQUksQ0FBQzhHLEVBQUwsSUFBVztBQUZILEtBQWxCO0FBSUg7O0FBR0QsTUFBSTlHLElBQUksQ0FBQytHLEtBQUwsSUFBYyxPQUFPL0csSUFBSSxDQUFDK0csS0FBWixLQUFzQixRQUFwQyxJQUFnRC9HLElBQUksQ0FBQytHLEtBQUwsQ0FBV1AsTUFBWCxHQUFvQixDQUF4RSxFQUEyRTtBQUN2RSxVQUFNTyxLQUFLLEdBQUcvRyxJQUFJLENBQUMrRyxLQUFMLENBQVd2RSxLQUFYLENBQWlCLEdBQWpCLENBQWQ7QUFDQWtELElBQUFBLElBQUksQ0FBQ3FCLEtBQUwsR0FBYUEsS0FBYjtBQUNIOztBQUVELE1BQUkvRyxJQUFJLENBQUNnSCxPQUFMLElBQWdCLE9BQU9oSCxJQUFJLENBQUNnSCxPQUFaLEtBQXdCLFFBQXhDLElBQW9EaEgsSUFBSSxDQUFDZ0gsT0FBTCxDQUFhUixNQUFiLEdBQXNCLENBQTlFLEVBQWlGO0FBQzdFLFVBQU1RLE9BQU8sR0FBR2hILElBQUksQ0FBQ2dILE9BQUwsQ0FBYXhFLEtBQWIsQ0FBbUIsR0FBbkIsQ0FBaEI7QUFDQWtELElBQUFBLElBQUksQ0FBQ3NCLE9BQUwsR0FBZUEsT0FBZjtBQUNIOztBQUVELFNBQU9DLG9CQUFvQixDQUFDdkIsSUFBRCxDQUEzQjtBQUNIOztBQUVELFNBQVN1QixvQkFBVCxDQUE4QkMsR0FBOUIsRUFBbUM7QUFDL0IsTUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDekIsV0FBT0EsR0FBUDtBQUNIOztBQUNELFFBQU1DLEtBQUssR0FBRyxFQUFFLEdBQUdEO0FBQUwsR0FBZDtBQUNBLFFBQU1FLElBQUksR0FBR3ZELE1BQU0sQ0FBQ3VELElBQVAsQ0FBWUYsR0FBWixDQUFiO0FBQ0Esc0JBQVNFLElBQVQsRUFBZUMsR0FBRyxJQUFJO0FBQ2xCLFFBQUl4RCxNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLGNBQWpCLENBQWdDQyxJQUFoQyxDQUFxQ2tELEdBQXJDLEVBQTBDRyxHQUExQyxNQUFtREgsR0FBRyxDQUFDRyxHQUFELENBQUgsSUFBWSxJQUFaLElBQW9CSCxHQUFHLENBQUNHLEdBQUQsQ0FBSCxJQUFZQyxTQUFuRixDQUFKLEVBQW1HO0FBQy9GLGFBQU9ILEtBQUssQ0FBQ0UsR0FBRCxDQUFaO0FBQ0g7QUFDSixHQUpEO0FBS0EsU0FBT0YsS0FBUDtBQUNIOztBQUVNLFNBQVNJLGlCQUFULENBQTJCQyxVQUEzQixFQUF1Q0MsT0FBdkMsRUFBZ0Q7QUFDbkQsTUFBSTNGLEdBQUcsR0FBRzJGLE9BQU8sSUFBSXZFLE9BQU8sQ0FBQ3BCLEdBQVIsRUFBckI7O0FBRUEsTUFBSSxPQUFPMEYsVUFBUCxLQUF1QixXQUEzQixFQUF3QztBQUNwQ0EsSUFBQUEsVUFBVSxHQUFHMUYsR0FBYjtBQUNILEdBRkQsTUFJSztBQUNEMEYsTUFBQUEsVUFBVSxHQUFHdkcsY0FBT3lHLFdBQVAsQ0FBbUJGLFVBQW5CLEVBQStCMUYsR0FBL0IsQ0FBYjtBQUNIOztBQUVELE1BQUksQ0FBQ0MsWUFBR0MsVUFBSCxDQUFjd0YsVUFBZCxDQUFMLEVBQWdDO0FBQzVCLFdBQU8sSUFBUDtBQUNIOztBQUVELFFBQU1HLEtBQUssR0FBRzVGLFlBQUc2RixTQUFILENBQWFKLFVBQWIsQ0FBZDs7QUFDQSxRQUFNSyxVQUFVLEdBQUdGLEtBQUssQ0FBQ0csV0FBTixFQUFuQjtBQUNBLE1BQUlDLGNBQUo7O0FBQ0EsTUFBSUYsVUFBSixFQUFnQjtBQUlaL0YsSUFBQUEsR0FBRyxHQUFHMkYsT0FBTyxJQUFJRCxVQUFqQjtBQUVBTyxJQUFBQSxjQUFjLEdBQUc1RyxjQUFLVSxJQUFMLENBQVUyRixVQUFWLEVBQXNCOUgsdUJBQXVCLEdBQUcsS0FBaEQsQ0FBakI7O0FBQ0EsUUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDQSxNQUFBQSxjQUFjLEdBQUc1RyxjQUFLVSxJQUFMLENBQVUyRixVQUFWLEVBQXNCOUgsdUJBQXVCLEdBQUcsT0FBaEQsQ0FBakI7O0FBQ0EsVUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDLGVBQU8sSUFBUDtBQUNIO0FBQ0o7QUFDSixHQWJELE1BY0s7QUFDREEsSUFBQUEsY0FBYyxHQUFHNUcsY0FBS1UsSUFBTCxDQUFVQyxHQUFWLEVBQWVwQyx1QkFBdUIsR0FBRyxLQUF6QyxDQUFqQjs7QUFDQSxRQUFJLENBQUNxQyxZQUFHQyxVQUFILENBQWMrRixjQUFkLENBQUwsRUFBb0M7QUFDaENBLE1BQUFBLGNBQWMsR0FBRzVHLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFlcEMsdUJBQXVCLEdBQUcsT0FBekMsQ0FBakI7O0FBQ0EsVUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDQSxRQUFBQSxjQUFjLEdBQUdULFNBQWpCO0FBQ0g7QUFDSjtBQUNKOztBQUNELE1BQUksQ0FBQ0UsVUFBTCxFQUFpQjtBQUNiLFdBQU8sSUFBUDtBQUNIOztBQUNELFNBQU87QUFFSHJHLElBQUFBLElBQUksRUFBRXFHLFVBRkg7QUFHSHpHLElBQUFBLFVBQVUsRUFBRWdILGNBSFQ7QUFLSGpHLElBQUFBLEdBQUcsRUFBRUEsR0FBRyxJQUFJWCxjQUFLNkcsT0FBTCxDQUFhUixVQUFiLENBTFQ7QUFPSDVHLElBQUFBLElBQUksRUFBRUssY0FBT2dILHFCQUFQLENBQTZCVCxVQUE3QixDQVBIO0FBU0hVLElBQUFBLFFBQVEsRUFBRS9HLGNBQUtnSCxRQUFMLENBQWNYLFVBQWQsQ0FUUDtBQVdIL0IsSUFBQUEsUUFBUSxFQUFFdEUsY0FBS2dILFFBQUwsQ0FBY2hILGNBQUs2RyxPQUFMLENBQWFSLFVBQWIsQ0FBZCxDQVhQO0FBYUgxRyxJQUFBQSxTQUFTLEVBQUVLLGNBQUs0QixPQUFMLENBQWF5RSxVQUFiO0FBYlIsR0FBUDtBQWVIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG94dXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcbmltcG9ydCBtb2R1bGVSZXF1aXJlIGZyb20gJy4vbW9kdWxlUmVxdWlyZSc7XG5cbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XG5leHBvcnQgY29uc3QgT1hZR0VOX0VOVl9GSUxFX05BTUUgPSAnb3h5Z2VuLmVudic7XG5leHBvcnQgY29uc3QgT1hZR0VOX1BBR0VfT0JKRUNUX0ZJTEVfTkFNRSA9ICdveHlnZW4ucG8nO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRlc3RPcHRpb25zKGNvbmZpZywgYXJndikge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xuICAgIG9wdGlvbnMuZW52ID0gbG9hZEVudmlyb25tZW50VmFyaWFibGVzKGNvbmZpZywgYXJndik7XG4gICAgb3B0aW9ucy5wbyA9IGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YpO1xuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpIHtcbiAgICBpZiAoY29uZmlnLmZyYW1ld29yayAmJiB0eXBlb2YgY29uZmlnLmZyYW1ld29yayA9PT0gJ3N0cmluZycgJiYgY29uZmlnLmZyYW1ld29yay50b0xvd2VyQ2FzZSgpICE9PSAnb3h5Z2VuJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBjb25maWc7XG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcbiAgICAgICAgKHRhcmdldC5uYW1lICYmIHRhcmdldC5uYW1lLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID09PSAwKVxuICAgICAgICB8fCAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJycgJiYgdGFyZ2V0LmNvbmZpZ1BhdGggJiYgdGFyZ2V0LmNvbmZpZ1BhdGguaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPiAtMSlcbiAgICApO1xuICAgIGxldCBzdWl0ZXMgPSBbXTtcbiAgICAvLyBpZiBhbiBpbmRpdmlkdWFsIHNjcmlwdCBvciBzdWl0ZSBmaWxlIHdhcyBwYXNzZWRcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanMnKSB7XG4gICAgICAgICAgICBzdWl0ZXMucHVzaChhd2FpdCBveHV0aWwuZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSlNGaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBmYWxzZSwgY29uZmlnLml0ZXJhdGlvbnMgfHwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQuZXh0ZW5zaW9uID09PSAnLmpzb24nKSB7XG4gICAgICAgICAgICBzdWl0ZXMucHVzaChhd2FpdCBveHV0aWwuZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSnNvbkZpbGUodGFyZ2V0LnBhdGgsIGNvbmZpZy5wYXJhbWV0ZXJzLmZpbGUsIGNvbmZpZy5wYXJhbWV0ZXJzLm1vZGUsIGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIGEgZm9sZGVyIG9yIGEgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBwYXNzZWRcbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xuICAgICAgICBpZiAoY29uZmlnLnN1aXRlcyAmJiBBcnJheS5pc0FycmF5KGNvbmZpZy5zdWl0ZXMpKSB7XG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIG1vcmUgc3VpdGVzIGFyZSBkZWZpbmVkIGluIHRoZSAnc3VpdGVzJyBmb2xkZXJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc3VpdGVzRm9sZGVyKSkge1xuICAgICAgICAgICAgc3VpdGVEZWZzID0gW1xuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcbiAgICAgICAgICAgICAgICAuLi5sb2FkU3VpdGVEZWZpbml0aW9uc0Zyb21Gb2xkZXIoc3VpdGVzRm9sZGVyKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtZXJnZSBzdWl0ZXMgY29uZmlndXJlZCBpbiB0aGUgcHJvamVjdCBjb25maWcgZmlsZSBhbmQgdGhvc2UgZm91bmQgaW4gJ3N1aXRlcycgZm9sZGVyXG4gICAgICAgIHN1aXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKHN1aXRlRGVmcy5tYXAoYXN5bmMgKHN1aXRlRGVmKSA9PiBhd2FpdCBveHV0aWwuZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSnNvbihzdWl0ZURlZiwgY29uZmlnKSkpO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgb3V0IHN1aXRlcyBpZiAnLS1zdWl0ZXMnIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3YXMgc3BlY2lmaWVkXG4gICAgaWYgKGFyZ3Yuc3VpdGVzICYmIHR5cGVvZiBhcmd2LnN1aXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcbiAgICAgICAgc3VpdGVzID0gc3VpdGVzLmZpbHRlcih4ID0+IHNlbGVjdGVkU3VpdGVOYW1lcy5pbmNsdWRlcyh4Lm5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1aXRlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhmb2xkZXJQYXRoKTtcbiAgICBsZXQgc3VpdGVEZWZzID0gW107XG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XG4gICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanNvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGZvbGRlclBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1aXRlRGVmcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQgfHwge307XG4gICAgY29uc3QgcG9GaWxlTmFtZSA9IGFyZ3YucG8gfHwgYCR7T1hZR0VOX1BBR0VfT0JKRUNUX0ZJTEVfTkFNRX0uanNgO1xuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBsZXQgcG9GaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsIHBvRmlsZU5hbWUpO1xuICAgIHBvRmlsZVBhdGggPSBmcy5leGlzdHNTeW5jKHBvRmlsZVBhdGgpID8gcG9GaWxlUGF0aCA6IG51bGw7XG5cbiAgICBpZiAocG9GaWxlUGF0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiBwb0ZpbGVQYXRoO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhjb25maWcsIGFyZ3YpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xuICAgIGNvbnN0IGVudk5hbWUgPSBhcmd2LmVudiB8fCBjb25maWcuZW52aXJvbm1lbnQgfHwgJ2RlZmF1bHQnO1xuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRlZmF1bHRFbnZGaWxlKSkge1xuICAgICAgICBjb25zdCBlbnYgPSBtb2R1bGVSZXF1aXJlKGRlZmF1bHRFbnZGaWxlKTtcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudltlbnZOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB0cnkgdG8gcmVzb2x2ZSBhIGRlZGljYXRlZCBlbnZpcm9ubWVudCBmaWxlIGluICdlbnYnIHN1YiBmb2xkZXJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnMgPSBwYXRoLmpvaW4oY3dkLCAnZW52JywgYCR7ZW52TmFtZX0uanNgKTtcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzKSkge1xuICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWRpY2F0ZWRFbnZGaWxlSnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcy5leGlzdHNTeW5jKGRlZGljYXRlZEVudkZpbGVKc29uKSkge1xuICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWRpY2F0ZWRFbnZGaWxlSnNvbik7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudmlyb25tZW50cyh0YXJnZXQpIHtcbiAgICBsZXQgdGFyZ2V0Q3dkID0gbnVsbDtcblxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmN3ZCkge1xuICAgICAgICB0YXJnZXRDd2QgPSB0YXJnZXQuY3dkO1xuICAgIH1cblxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldEN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHtkZWZhdWx0RW52RmlsZX0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcbiAgICAvLyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAgICBsZXQgdGFyZ2V0Q3dkID0gbnVsbDtcblxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmN3ZCkge1xuICAgICAgICB0YXJnZXRDd2QgPSB0YXJnZXQuY3dkO1xuICAgIH1cbiAgICBjb25zdCBERUZBVUxUX09QVFMgPSB7XG4gICAgICAgIGN3ZDogdGFyZ2V0ID8gKHRhcmdldEN3ZCB8fCBwcm9jZXNzLmN3ZCgpKSA6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBicm93c2VyTmFtZTogJ2Nocm9tZScsXG4gICAgICAgIHNlbGVuaXVtVXJsIDogJ2h0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWInLFxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXG4gICAgICAgIHJlb3BlblNlc3Npb246IGZhbHNlLFxuICAgICAgICByZVJ1bk9uRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXG4gICAgICAgIGRlYnVnUG9ydDogbnVsbCxcbiAgICAgICAgZGVsYXk6IG51bGwsXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcbiAgICAgICAgY29sbGVjdEFwcGl1bUxvZ3M6IGZhbHNlLFxuICAgICAgICBjb2xsZWN0QnJvd3NlckxvZ3M6IGZhbHNlLFxuICAgICAgICByZXBvcnRpbmc6IHtcbiAgICAgICAgICAgIHJlcG9ydGVyczogW0RFRkFVTFRfUkVQT1JURVJdXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XG4gICAgICAgICAgICBmaWxlOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ3NlcSdcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8vIHJldHJpZXZlIG9wdGlvbnMgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xuICAgIC8vIGlmIHRoZSB0YXJnZXQgaXMgb3h5Z2VuIGNvbmZpZyBmaWxlLCBtZXJnZSBpdHMgY29udGVudCB3aXRoIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgICBsZXQgcHJvakNvbmZpZ09wdHMgPSB7fTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzID0gbW9kdWxlUmVxdWlyZSh0YXJnZXQucGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQucGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzID0gbW9kdWxlUmVxdWlyZSh0YXJnZXQuY29uZmlnUGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbnZzID0gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCk7XG5cbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xuICAgICAgICAvLyBtZXJnZSBleHRlcm5hbCBlbnZpcm9ubWVudHMgZGVmaW5pdGlvbiB3aXRoIHRoZSBvbmUgaW4gdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgIHByb2pDb25maWdPcHRzLmVudnMgPSB7IC4uLnByb2pDb25maWdPcHRzLmVudnMsIC4uLmVudnMgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2pDb25maWdPcHRzID0geyAuLi5wcm9qQ29uZmlnT3B0cywgZW52czogZW52cyB9O1xuICAgIH1cbiAgICAvLyBtYWtlIHN1cmUgdG8gc2V0IGRlZmF1bHQgSFRNTCByZXBvcnRlciBpZiByZXBvcnRpbmcgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkIGluIG94eWdlbi5jb25mIGZpbGUgYW5kIHZpYSBjb21tYW5kIGxpbmVcbiAgICBjb25zdCBpc0NtZE9wdHNSZXBvcnRGb3JtYXQgPSBjbWRPcHRzLnJlcG9ydGluZyAmJiBjbWRPcHRzLnJlcG9ydGluZy5yZXBvcnRlcnM7XG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcbiAgICBpZiAoIWlzQ21kT3B0c1JlcG9ydEZvcm1hdCAmJiAhaXNDb25maWdSZXBvcnRGb3JtYXQpIHtcbiAgICAgICAgaWYgKCFwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcpIHtcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZy5yZXBvcnRlcnMgPSBbREVGQVVMVF9SRVBPUlRFUl07XG4gICAgfVxuICAgIC8vIGRldGVybWluZSB0ZXN0IG5hbWVcbiAgICBsZXQgbmFtZSA9IGNtZE9wdHMubmFtZSB8fCBwcm9qQ29uZmlnT3B0cy5uYW1lIHx8IG51bGw7XG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xuICAgICAgICBuYW1lID0gdGFyZ2V0Lm5hbWUgIT09IE9YWUdFTl9DT05GSUdfRklMRV9OQU1FID8gdGFyZ2V0Lm5hbWUgOiB0YXJnZXQuYmFzZU5hbWU7XG4gICAgfVxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XG4gICAgLy8gZGVmYXVsdCBvcHRpb25zLCBwcm9qZWN0IGNvbmZpZyBmaWxlLCBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gICAgcmV0dXJuIHsgLi4uREVGQVVMVF9PUFRTLCAuLi5wcm9qQ29uZmlnT3B0cywgLi4uY21kT3B0cywgbmFtZTogbmFtZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAvLyBzd2l0Y2g6IC0tbmFtZSBcbiAgICAgICAgbmFtZTogYXJndi5uYW1lIHx8IG51bGwsXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXG4gICAgICAgIGJyb3dzZXJOYW1lIDogYXJndi5iIHx8IGFyZ3YuYnJvd3NlciB8fCBudWxsLFxuICAgICAgICBzZWxlbml1bVVybCA6IGFyZ3YucyB8fCBhcmd2LnNlcnZlciB8fCBudWxsLFxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogYXJndi5yZW9wZW4gPyBhcmd2LnJlb3BlbiA9PT0gJ3RydWUnIDogbnVsbCxcbiAgICAgICAgaXRlcmF0aW9ucyA6IGFyZ3YuaSA/IHBhcnNlSW50KGFyZ3YuaSkgOiAoYXJndi5pdGVyID8gcGFyc2VJbnQoYXJndi5pdGVyKSA6IG51bGwpLFxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxuICAgICAgICB3c1BvcnQ6IGFyZ3Yud3Nwb3J0IHx8IG51bGwsXG4gICAgICAgIGRlbGF5OiBhcmd2LmQgfHwgYXJndi5kZWxheSB8fCBudWxsLFxuICAgIH07XG4gICAgLy8gc3dpdGNoOiAtLXJmIGZsYWdcbiAgICBpZiAoYXJndi5yZiAmJiB0eXBlb2YgYXJndi5yZiA9PT0gJ3N0cmluZycgJiYgYXJndi5yZi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlcG9ydEZvcm1hdHMgPSBhcmd2LnJmLnNwbGl0KCcsJyk7XG4gICAgICAgIG9wdHMucmVwb3J0aW5nID0ge1xuICAgICAgICAgICAgcmVwb3J0ZXJzOiByZXBvcnRGb3JtYXRzXG4gICAgICAgIH07XG4gICAgICAgIC8vIHN3aXRjaDogLS1ybyAtIHNldCByZXBvcnRlciBvdXRwdXQgZGlyZWN0b3J5IGlmIHNldCBieSB1c2VyIHRocm91Z2ggY29tbmFuZCBsaW5lXG4gICAgICAgIC8vIE5PVEU6IC0tcm8gc3dpdGNoIG11c3QgYmUgc3BlY2lmaWVkIHRvZ2V0aGVyIHdpdGggLS1yZlxuICAgICAgICBpZiAoYXJndi5ybyAmJiB0eXBlb2YgYXJndi5ybyA9PT0gJ3N0cmluZycgJiYgYXJndi5yby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvcHRzLnJlcG9ydGluZy5vdXRwdXREaXIgPSBhcmd2LnJvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbjogLXAgb3IgLS1wYXJhbSBhbmQgLS1wbVxuICAgIGlmIChhcmd2LnAgfHwgYXJndi5wYXJhbSkge1xuICAgICAgICBvcHRzLnBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBmaWxlOiBhcmd2LnAgfHwgYXJndi5wYXJhbSB8fCBudWxsLFxuICAgICAgICAgICAgbW9kZTogYXJndi5wbSB8fCAnc2VxJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIHN3aXRjaDogLS1zcGVjcyAtIHNldCBzcGVjcyBpZiBzZXQgYnkgdXNlciB0aHJvdWdoIGNvbW5hbmQgbGluZVxuICAgIGlmIChhcmd2LnNwZWNzICYmIHR5cGVvZiBhcmd2LnNwZWNzID09PSAnc3RyaW5nJyAmJiBhcmd2LnNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlY3MgPSBhcmd2LnNwZWNzLnNwbGl0KCcsJyk7XG4gICAgICAgIG9wdHMuc3BlY3MgPSBzcGVjcztcbiAgICB9XG4gICAgLy8gc3dpdGNoOiAtLW1vZHVsZXMgLSBzZXQgYSBsaXN0IG9mIG1vZHVsZXMgdG8gYmUgbG9hZGVkLCBpZiBzZXQgYnkgdXNlciB0aHJvdWdoIGNvbW5hbmQgbGluZVxuICAgIGlmIChhcmd2Lm1vZHVsZXMgJiYgdHlwZW9mIGFyZ3YubW9kdWxlcyA9PT0gJ3N0cmluZycgJiYgYXJndi5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbW9kdWxlcyA9IGFyZ3YubW9kdWxlcy5zcGxpdCgnLCcpO1xuICAgICAgICBvcHRzLm1vZHVsZXMgPSBtb2R1bGVzO1xuICAgIH1cbiAgICAvLyByZW1vdmUgYW55IHByb3BlcnR5IHdpdGggbnVsbCB2YWx1ZSAoc28gaXQgd29uJ3Qgb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMgaWYgaXQncyBudWxsKVxuICAgIHJldHVybiBkZWxldGVOdWxsUHJvcGVydGllcyhvcHRzKTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlTnVsbFByb3BlcnRpZXMob2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBmb3JFYWNoIChrZXlzLCBrZXkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSAmJiAob2JqW2tleV0gPT0gbnVsbCB8fCBvYmpba2V5XSA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBkZWxldGUgY2xvbmVba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUYXJnZXRQYXRoKHRhcmdldFBhdGgsIHVzZXJDd2QpIHtcbiAgICBsZXQgY3dkID0gdXNlckN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIC8vIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBwYXRoXG4gICAgaWYgKHR5cGVvZih0YXJnZXRQYXRoKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGFyZ2V0UGF0aCA9IGN3ZDtcbiAgICB9XG4gICAgLy8gdXNlcidzIHBhdGggbWlnaHQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgLSBtYWtlIHN1cmUgdGhlIHJlbGF0aXZlIHBhdGggd2lsbCB3b3JrXG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldFBhdGggPSBveHV0aWwucmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgY3dkKTtcbiAgICB9XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmModGFyZ2V0UGF0aCk7XG4gICAgY29uc3QgaXNEaXJlY3RvciA9IHN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgbGV0IGNvbmZpZ0ZpbGVQYXRoO1xuICAgIGlmIChpc0RpcmVjdG9yKSB7XG4gICAgICAgIC8vIGlmIFwidGFyZ2V0XCIgcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgYSBkaXJlY3RvcnksXG4gICAgICAgIC8vIHRoZW4gdW5sZXNzIFwiY3dkXCIgaXMgcHJvdmlkZWQgZXhwbGljaXRseSBieSB0aGUgdXNlclxuICAgICAgICAvLyB1c2UgdGFyZ2V0IGRpcmVjdG9yeSBhcyBjd2RcbiAgICAgICAgY3dkID0gdXNlckN3ZCB8fCB0YXJnZXRQYXRoO1xuICAgICAgICAvLyBhcHBlbmQgb3h5Z2VuIGNvbmZpZyBmaWxlIG5hbWUgdG8gdGhlIGRpcmVjdG9yeSwgaWYgbm8gdGVzdCBjYXNlIGZpbGUgd2FzIHByb3ZpZGVkXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHRhcmdldFBhdGgsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbih0YXJnZXRQYXRoLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanNvbicpO1xuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjd2QsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjd2QsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0YXJnZXRQYXRoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBwYXRoIHRvIHRoZSBjb25maWcgb3IgLmpzIGZpbGVcbiAgICAgICAgcGF0aDogdGFyZ2V0UGF0aCxcbiAgICAgICAgY29uZmlnUGF0aDogY29uZmlnRmlsZVBhdGgsXG4gICAgICAgIC8vIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgIGN3ZDogY3dkIHx8IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKSxcbiAgICAgICAgLy8gbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgd2l0aG91dCBleHRlbnNpb25cbiAgICAgICAgbmFtZTogb3h1dGlsLmdldEZpbGVOYW1lV2l0aG91dEV4dCh0YXJnZXRQYXRoKSxcbiAgICAgICAgLy8gbmFtZSBpbmNsdWRpbmcgZXh0ZW5zaW9uXG4gICAgICAgIGZ1bGxOYW1lOiBwYXRoLmJhc2VuYW1lKHRhcmdldFBhdGgpLFxuICAgICAgICAvLyBwYXJlbnQgZm9sZGVyJ3MgbmFtZVxuICAgICAgICBiYXNlTmFtZTogcGF0aC5iYXNlbmFtZShwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCkpLFxuICAgICAgICAvLyB0YXJnZXQgZmlsZSBleHRlbnNpb25cbiAgICAgICAgZXh0ZW5zaW9uOiBwYXRoLmV4dG5hbWUodGFyZ2V0UGF0aClcbiAgICB9O1xufSJdfQ==
376
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwibmFtZXMiOlsiT1hZR0VOX0NPTkZJR19GSUxFX05BTUUiLCJPWFlHRU5fRU5WX0ZJTEVfTkFNRSIsIk9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUiLCJERUZBVUxUX1JFUE9SVEVSIiwiZ2VuZXJhdGVUZXN0T3B0aW9ucyIsImNvbmZpZyIsImFyZ3YiLCJvcHRpb25zIiwiZW52IiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzIiwicG8iLCJnZXRQYWdlT2JqZWN0RmlsZVBhdGgiLCJzdWl0ZXMiLCJsb2FkU3VpdGVzIiwiZnJhbWV3b3JrIiwidG9Mb3dlckNhc2UiLCJ0YXJnZXQiLCJpc0NvbmZpZ0ZpbGUiLCJuYW1lIiwiaW5kZXhPZiIsImV4dGVuc2lvbiIsImNvbmZpZ1BhdGgiLCJwdXNoIiwib3h1dGlsIiwiZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSlNGaWxlIiwicGF0aCIsInBhcmFtZXRlcnMiLCJmaWxlIiwibW9kZSIsIml0ZXJhdGlvbnMiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uRmlsZSIsInN1aXRlRGVmcyIsIkFycmF5IiwiaXNBcnJheSIsInN1aXRlc0ZvbGRlciIsImpvaW4iLCJjd2QiLCJmcyIsImV4aXN0c1N5bmMiLCJsb2FkU3VpdGVEZWZpbml0aW9uc0Zyb21Gb2xkZXIiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwic3VpdGVEZWYiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uIiwic2VsZWN0ZWRTdWl0ZU5hbWVzIiwic3BsaXQiLCJmaWx0ZXIiLCJ4IiwiaW5jbHVkZXMiLCJmb2xkZXJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImV4dG5hbWUiLCJmdWxsUGF0aCIsInBvRmlsZU5hbWUiLCJwcm9jZXNzIiwicG9GaWxlUGF0aCIsInJlc29sdmUiLCJlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZGlybmFtZSIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsImZ1bGxOYW1lIiwiYmFzZW5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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LENBQUNxQyxZQUFHQyxVQUFILENBQWMrRixjQUFkLENBQUwsRUFBb0M7QUFDaENBLE1BQUFBLGNBQWMsR0FBRzVHLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFlcEMsdUJBQXVCLEdBQUcsT0FBekMsQ0FBakI7O0FBQ0EsVUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDQSxRQUFBQSxjQUFjLEdBQUdULFNBQWpCO0FBQ0g7QUFDSjtBQUNKOztBQUNELE1BQUksQ0FBQ0UsVUFBTCxFQUFpQjtBQUNiLFdBQU8sSUFBUDtBQUNIOztBQUNELFNBQU87QUFFSHJHLElBQUFBLElBQUksRUFBRXFHLFVBRkg7QUFHSHpHLElBQUFBLFVBQVUsRUFBRWdILGNBSFQ7QUFLSGpHLElBQUFBLEdBQUcsRUFBRUEsR0FBRyxJQUFJWCxjQUFLNkcsT0FBTCxDQUFhUixVQUFiLENBTFQ7QUFPSDVHLElBQUFBLElBQUksRUFBRUssY0FBT2dILHFCQUFQLENBQTZCVCxVQUE3QixDQVBIO0FBU0hVLElBQUFBLFFBQVEsRUFBRS9HLGNBQUtnSCxRQUFMLENBQWNYLFVBQWQsQ0FUUDtBQVdIL0IsSUFBQUEsUUFBUSxFQUFFdEUsY0FBS2dILFFBQUwsQ0FBY2hILGNBQUs2RyxPQUFMLENBQWFSLFVBQWIsQ0FBZCxDQVhQO0FBYUgxRyxJQUFBQSxTQUFTLEVBQUVLLGNBQUs0QixPQUFMLENBQWF5RSxVQUFiO0FBYlIsR0FBUDtBQWVIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcclxuaW1wb3J0IG1vZHVsZVJlcXVpcmUgZnJvbSAnLi9tb2R1bGVSZXF1aXJlJztcclxuXHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fRU5WX0ZJTEVfTkFNRSA9ICdveHlnZW4uZW52JztcclxuZXhwb3J0IGNvbnN0IE9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUgPSAnb3h5Z2VuLnBvJztcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0T3B0aW9ucyhjb25maWcsIGFyZ3YpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xyXG4gICAgb3B0aW9ucy5lbnYgPSBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMucG8gPSBnZXRQYWdlT2JqZWN0RmlsZVBhdGgoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3VpdGVzKGNvbmZpZywgYXJndikge1xyXG4gICAgaWYgKGNvbmZpZy5mcmFtZXdvcmsgJiYgdHlwZW9mIGNvbmZpZy5mcmFtZXdvcmsgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5mcmFtZXdvcmsudG9Mb3dlckNhc2UoKSAhPT0gJ294eWdlbicpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gY29uZmlnO1xyXG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcclxuICAgICAgICAodGFyZ2V0Lm5hbWUgJiYgdGFyZ2V0Lm5hbWUuaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPT09IDApXHJcbiAgICAgICAgfHwgKHRhcmdldC5leHRlbnNpb24gPT09ICcnICYmIHRhcmdldC5jb25maWdQYXRoICYmIHRhcmdldC5jb25maWdQYXRoLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID4gLTEpXHJcbiAgICApO1xyXG4gICAgbGV0IHN1aXRlcyA9IFtdO1xyXG4gICAgLy8gaWYgYW4gaW5kaXZpZHVhbCBzY3JpcHQgb3Igc3VpdGUgZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpTRmlsZSh0YXJnZXQucGF0aCwgY29uZmlnLnBhcmFtZXRlcnMuZmlsZSwgY29uZmlnLnBhcmFtZXRlcnMubW9kZSwgZmFsc2UsIGNvbmZpZy5pdGVyYXRpb25zIHx8IDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanNvbicpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBjb25maWcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3VpdGVEZWZzID0gW107XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zdWl0ZXMgJiYgQXJyYXkuaXNBcnJheShjb25maWcuc3VpdGVzKSkge1xyXG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBtb3JlIHN1aXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgJ3N1aXRlcycgZm9sZGVyXHJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzdWl0ZXNGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHN1aXRlRGVmcyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcclxuICAgICAgICAgICAgICAgIC4uLmxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihzdWl0ZXNGb2xkZXIpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1lcmdlIHN1aXRlcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGNvbmZpZyBmaWxlIGFuZCB0aG9zZSBmb3VuZCBpbiAnc3VpdGVzJyBmb2xkZXJcclxuICAgICAgICBzdWl0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdWl0ZURlZnMubWFwKGFzeW5jIChzdWl0ZURlZikgPT4gYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24oc3VpdGVEZWYsIGNvbmZpZykpKTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBvdXQgc3VpdGVzIGlmICctLXN1aXRlcycgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWRcclxuICAgIGlmIChhcmd2LnN1aXRlcyAmJiB0eXBlb2YgYXJndi5zdWl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBzdWl0ZXMgPSBzdWl0ZXMuZmlsdGVyKHggPT4gc2VsZWN0ZWRTdWl0ZU5hbWVzLmluY2x1ZGVzKHgubmFtZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1aXRlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGZvbGRlclBhdGgpO1xyXG4gICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xyXG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XHJcbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qc29uJykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcclxuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1aXRlRGVmcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCB7fTtcclxuICAgIGNvbnN0IHBvRmlsZU5hbWUgPSBhcmd2LnBvIHx8IGAke09YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUV9LmpzYDtcclxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGxldCBwb0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcG9GaWxlTmFtZSk7XHJcbiAgICBwb0ZpbGVQYXRoID0gZnMuZXhpc3RzU3luYyhwb0ZpbGVQYXRoKSA/IHBvRmlsZVBhdGggOiBudWxsO1xyXG5cclxuICAgIGlmIChwb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvRmlsZVBhdGg7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xyXG4gICAgY29uc3QgZW52TmFtZSA9IGFyZ3YuZW52IHx8IGNvbmZpZy5lbnZpcm9ubWVudCB8fCAnZGVmYXVsdCc7XHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXQuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRyeSB0byByZXNvbHZlIGEgZGVkaWNhdGVkIGVudmlyb25tZW50IGZpbGUgaW4gJ2Vudicgc3ViIGZvbGRlclxyXG4gICAgY29uc3QgZGVkaWNhdGVkRW52RmlsZUpzID0gcGF0aC5qb2luKGN3ZCwgJ2VudicsIGAke2Vudk5hbWV9LmpzYCk7XHJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWRpY2F0ZWRFbnZGaWxlSnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCkge1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW52RmlsZSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7ZGVmYXVsdEVudkZpbGV9LiBSZWFzb246ICR7ZS5tZXNzYWdlfSAke2Uuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcclxuICAgIC8vIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuICAgIGNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgICAgICBjd2Q6IHRhcmdldCA/ICh0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKSkgOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnY2hyb21lJyxcclxuICAgICAgICBzZWxlbml1bVVybCA6ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJyxcclxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXHJcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgcmVSdW5PbkZhaWxlZDogZmFsc2UsXHJcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXHJcbiAgICAgICAgZGVidWdQb3J0OiBudWxsLFxyXG4gICAgICAgIGRlbGF5OiBudWxsLFxyXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogZmFsc2UsXHJcbiAgICAgICAgY29sbGVjdEJyb3dzZXJMb2dzOiBmYWxzZSxcclxuICAgICAgICByZXBvcnRpbmc6IHtcclxuICAgICAgICAgICAgcmVwb3J0ZXJzOiBbREVGQVVMVF9SRVBPUlRFUl1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6ICdzZXEnXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyByZXRyaWV2ZSBvcHRpb25zIHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXHJcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xyXG4gICAgLy8gaWYgdGhlIHRhcmdldCBpcyBveHlnZW4gY29uZmlnIGZpbGUsIG1lcmdlIGl0cyBjb250ZW50IHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgbGV0IHByb2pDb25maWdPcHRzID0ge307XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IG1vZHVsZVJlcXVpcmUodGFyZ2V0LnBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmaWxlOiAke3RhcmdldC5wYXRofS4gUmVhc29uOiAke2UubWVzc2FnZX0gJHtlLnN0YWNrfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jb25maWdQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvakNvbmZpZ09wdHMgPSBtb2R1bGVSZXF1aXJlKHRhcmdldC5jb25maWdQYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGVudnMgPSBnZXRFbnZpcm9ubWVudHModGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xyXG4gICAgICAgIC8vIG1lcmdlIGV4dGVybmFsIGVudmlyb25tZW50cyBkZWZpbml0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGVcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5lbnZzID0geyAuLi5wcm9qQ29uZmlnT3B0cy5lbnZzLCAuLi5lbnZzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IHsgLi4ucHJvakNvbmZpZ09wdHMsIGVudnM6IGVudnMgfTtcclxuICAgIH1cclxuICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgZGVmYXVsdCBIVE1MIHJlcG9ydGVyIGlmIHJlcG9ydGluZyBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQgaW4gb3h5Z2VuLmNvbmYgZmlsZSBhbmQgdmlhIGNvbW1hbmQgbGluZVxyXG4gICAgY29uc3QgaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ID0gY21kT3B0cy5yZXBvcnRpbmcgJiYgY21kT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzO1xyXG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcclxuICAgIGlmICghaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ICYmICFpc0NvbmZpZ1JlcG9ydEZvcm1hdCkge1xyXG4gICAgICAgIGlmICghcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzID0gW0RFRkFVTFRfUkVQT1JURVJdO1xyXG4gICAgfVxyXG4gICAgLy8gZGV0ZXJtaW5lIHRlc3QgbmFtZVxyXG4gICAgbGV0IG5hbWUgPSBjbWRPcHRzLm5hbWUgfHwgcHJvakNvbmZpZ09wdHMubmFtZSB8fCBudWxsO1xyXG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xyXG4gICAgICAgIG5hbWUgPSB0YXJnZXQubmFtZSAhPT0gT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5iYXNlTmFtZTtcclxuICAgIH1cclxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XHJcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnMsIHByb2plY3QgY29uZmlnIGZpbGUsIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcclxuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfT1BUUywgLi4ucHJvakNvbmZpZ09wdHMsIC4uLmNtZE9wdHMsIG5hbWU6IG5hbWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lT3B0aW9ucyhhcmd2KSB7XHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1uYW1lIFxyXG4gICAgICAgIG5hbWU6IGFyZ3YubmFtZSB8fCBudWxsLFxyXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXHJcbiAgICAgICAgYnJvd3Nlck5hbWUgOiBhcmd2LmIgfHwgYXJndi5icm93c2VyIHx8IG51bGwsXHJcbiAgICAgICAgc2VsZW5pdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICByZW9wZW5TZXNzaW9uOiBhcmd2LnJlb3BlbiA/IGFyZ3YucmVvcGVuID09PSAndHJ1ZScgOiBudWxsLFxyXG4gICAgICAgIGl0ZXJhdGlvbnMgOiBhcmd2LmkgPyBwYXJzZUludChhcmd2LmkpIDogKGFyZ3YuaXRlciA/IHBhcnNlSW50KGFyZ3YuaXRlcikgOiBudWxsKSxcclxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxyXG4gICAgICAgIHdzUG9ydDogYXJndi53c3BvcnQgfHwgbnVsbCxcclxuICAgICAgICBkZWxheTogYXJndi5kIHx8IGFyZ3YuZGVsYXkgfHwgbnVsbCxcclxuICAgIH07XHJcbiAgICAvLyBzd2l0Y2g6IC0tcmYgZmxhZ1xyXG4gICAgaWYgKGFyZ3YucmYgJiYgdHlwZW9mIGFyZ3YucmYgPT09ICdzdHJpbmcnICYmIGFyZ3YucmYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlcG9ydEZvcm1hdHMgPSBhcmd2LnJmLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5yZXBvcnRpbmcgPSB7XHJcbiAgICAgICAgICAgIHJlcG9ydGVyczogcmVwb3J0Rm9ybWF0c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc3dpdGNoOiAtLXJvIC0gc2V0IHJlcG9ydGVyIG91dHB1dCBkaXJlY3RvcnkgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgICAgICAvLyBOT1RFOiAtLXJvIHN3aXRjaCBtdXN0IGJlIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIC0tcmZcclxuICAgICAgICBpZiAoYXJndi5ybyAmJiB0eXBlb2YgYXJndi5ybyA9PT0gJ3N0cmluZycgJiYgYXJndi5yby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdHMucmVwb3J0aW5nLm91dHB1dERpciA9IGFyZ3Yucm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gb3B0aW9uOiAtcCBvciAtLXBhcmFtIGFuZCAtLXBtXHJcbiAgICBpZiAoYXJndi5wIHx8IGFyZ3YucGFyYW0pIHtcclxuICAgICAgICBvcHRzLnBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgIGZpbGU6IGFyZ3YucCB8fCBhcmd2LnBhcmFtIHx8IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6IGFyZ3YucG0gfHwgJ3NlcSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN3aXRjaDogLS1zcGVjcyAtIHNldCBzcGVjcyBpZiBzZXQgYnkgdXNlciB0aHJvdWdoIGNvbW5hbmQgbGluZVxyXG4gICAgaWYgKGFyZ3Yuc3BlY3MgJiYgdHlwZW9mIGFyZ3Yuc3BlY3MgPT09ICdzdHJpbmcnICYmIGFyZ3Yuc3BlY3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHNwZWNzID0gYXJndi5zcGVjcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMuc3BlY3MgPSBzcGVjcztcclxuICAgIH1cclxuICAgIC8vIHN3aXRjaDogLS1tb2R1bGVzIC0gc2V0IGEgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIGxvYWRlZCwgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgIGlmIChhcmd2Lm1vZHVsZXMgJiYgdHlwZW9mIGFyZ3YubW9kdWxlcyA9PT0gJ3N0cmluZycgJiYgYXJndi5tb2R1bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBtb2R1bGVzID0gYXJndi5tb2R1bGVzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5tb2R1bGVzID0gbW9kdWxlcztcclxuICAgIH1cclxuICAgIC8vIHJlbW92ZSBhbnkgcHJvcGVydHkgd2l0aCBudWxsIHZhbHVlIChzbyBpdCB3b24ndCBvdmVycmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBpdCdzIG51bGwpXHJcbiAgICByZXR1cm4gZGVsZXRlTnVsbFByb3BlcnRpZXMob3B0cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlbGV0ZU51bGxQcm9wZXJ0aWVzKG9iaikge1xyXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xyXG4gICAgZm9yRWFjaCAoa2V5cywga2V5ID0+IHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSAmJiAob2JqW2tleV0gPT0gbnVsbCB8fCBvYmpba2V5XSA9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1RhcmdldFBhdGgodGFyZ2V0UGF0aCwgdXNlckN3ZCkge1xyXG4gICAgbGV0IGN3ZCA9IHVzZXJDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIC8vIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBwYXRoXHJcbiAgICBpZiAodHlwZW9mKHRhcmdldFBhdGgpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBjd2Q7XHJcbiAgICB9XHJcbiAgICAvLyB1c2VyJ3MgcGF0aCBtaWdodCBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIG1ha2Ugc3VyZSB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIHdvcmtcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBveHV0aWwucmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgY3dkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0YXJnZXRQYXRoKTtcclxuICAgIGNvbnN0IGlzRGlyZWN0b3IgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xyXG4gICAgbGV0IGNvbmZpZ0ZpbGVQYXRoO1xyXG4gICAgaWYgKGlzRGlyZWN0b3IpIHtcclxuICAgICAgICAvLyBpZiBcInRhcmdldFwiIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGlzIGEgZGlyZWN0b3J5LFxyXG4gICAgICAgIC8vIHRoZW4gdW5sZXNzIFwiY3dkXCIgaXMgcHJvdmlkZWQgZXhwbGljaXRseSBieSB0aGUgdXNlclxyXG4gICAgICAgIC8vIHVzZSB0YXJnZXQgZGlyZWN0b3J5IGFzIGN3ZFxyXG4gICAgICAgIGN3ZCA9IHVzZXJDd2QgfHwgdGFyZ2V0UGF0aDtcclxuICAgICAgICAvLyBhcHBlbmQgb3h5Z2VuIGNvbmZpZyBmaWxlIG5hbWUgdG8gdGhlIGRpcmVjdG9yeSwgaWYgbm8gdGVzdCBjYXNlIGZpbGUgd2FzIHByb3ZpZGVkXHJcbiAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbih0YXJnZXRQYXRoLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanNvbicpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKGN3ZCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjd2QsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qc29uJyk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0YXJnZXRQYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIC8vIHBhdGggdG8gdGhlIGNvbmZpZyBvciAuanMgZmlsZVxyXG4gICAgICAgIHBhdGg6IHRhcmdldFBhdGgsXHJcbiAgICAgICAgY29uZmlnUGF0aDogY29uZmlnRmlsZVBhdGgsXHJcbiAgICAgICAgLy8gd29ya2luZyBkaXJlY3RvcnlcclxuICAgICAgICBjd2Q6IGN3ZCB8fCBwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgd2l0aG91dCBleHRlbnNpb25cclxuICAgICAgICBuYW1lOiBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIG5hbWUgaW5jbHVkaW5nIGV4dGVuc2lvblxyXG4gICAgICAgIGZ1bGxOYW1lOiBwYXRoLmJhc2VuYW1lKHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIHBhcmVudCBmb2xkZXIncyBuYW1lXHJcbiAgICAgICAgYmFzZU5hbWU6IHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKHRhcmdldFBhdGgpKSxcclxuICAgICAgICAvLyB0YXJnZXQgZmlsZSBleHRlbnNpb25cclxuICAgICAgICBleHRlbnNpb246IHBhdGguZXh0bmFtZSh0YXJnZXRQYXRoKVxyXG4gICAgfTtcclxufSJdfQ==