oxygen-cli 1.25.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/util.js +58 -3
  27. package/build/model/case-result.js +4 -2
  28. package/build/model/failure.js +2 -1
  29. package/build/model/status.js +2 -1
  30. package/build/model/step-result.js +2 -1
  31. package/build/model/suite-result.js +2 -1
  32. package/build/model/test-result.js +2 -1
  33. package/build/model/testcase.js +2 -1
  34. package/build/model/testsuite.js +2 -1
  35. package/build/ox_modules/index.js +33 -13
  36. package/build/ox_modules/module-assert.js +24 -8
  37. package/build/ox_modules/module-date.js +8 -3
  38. package/build/ox_modules/module-db.js +28 -7
  39. package/build/ox_modules/module-email.js +36 -10
  40. package/build/ox_modules/module-eyes.js +46 -5
  41. package/build/ox_modules/module-http.js +102 -41
  42. package/build/ox_modules/module-log.js +22 -5
  43. package/build/ox_modules/module-mailinator.js +32 -10
  44. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  45. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  46. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  47. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  48. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  49. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  50. package/build/ox_modules/module-mob/commands/back.js +2 -1
  51. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  52. package/build/ox_modules/module-mob/commands/click.js +4 -3
  53. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  54. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  55. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  56. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  57. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  58. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  59. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  60. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  61. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  62. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  63. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  64. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  66. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  70. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  73. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  74. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  76. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  77. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  78. package/build/ox_modules/module-mob/commands/index.js +94 -19
  79. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  80. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  85. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  86. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  87. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  88. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  89. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  90. package/build/ox_modules/module-mob/commands/open.js +3 -1
  91. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  92. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  93. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  96. package/build/ox_modules/module-mob/commands/select.js +4 -1
  97. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  99. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  100. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  101. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  104. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  105. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  107. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  108. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  110. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  111. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  112. package/build/ox_modules/module-mob/commands/type.js +7 -3
  113. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  114. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  115. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  116. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  117. package/build/ox_modules/module-mob.js +139 -67
  118. package/build/ox_modules/module-pdf.js +62 -23
  119. package/build/ox_modules/module-proxy.js +68 -8
  120. package/build/ox_modules/module-serial.js +32 -7
  121. package/build/ox_modules/module-shell.js +27 -8
  122. package/build/ox_modules/module-soap.js +47 -14
  123. package/build/ox_modules/module-twilio.js +53 -10
  124. package/build/ox_modules/module-utils.js +51 -16
  125. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  126. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  127. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  128. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  129. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  131. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  133. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  135. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  136. package/build/ox_modules/module-web/commands/back.js +2 -1
  137. package/build/ox_modules/module-web/commands/clear.js +5 -1
  138. package/build/ox_modules/module-web/commands/click.js +13 -4
  139. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  140. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  141. package/build/ox_modules/module-web/commands/debug.js +2 -2
  142. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  143. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  144. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  145. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  146. package/build/ox_modules/module-web/commands/execute.js +2 -1
  147. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  148. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  149. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  150. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  151. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  153. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  154. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  155. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  156. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  157. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  158. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  159. package/build/ox_modules/module-web/commands/getText.js +4 -1
  160. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  161. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  162. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  163. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  164. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  165. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  166. package/build/ox_modules/module-web/commands/index.js +100 -19
  167. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  168. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  169. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  170. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  171. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  172. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  173. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  174. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  175. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/open.js +4 -1
  178. package/build/ox_modules/module-web/commands/pause.js +2 -1
  179. package/build/ox_modules/module-web/commands/point.js +2 -1
  180. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  181. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  182. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  183. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  184. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  185. package/build/ox_modules/module-web/commands/select.js +5 -1
  186. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  187. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  188. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  189. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  190. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  191. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  192. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  193. package/build/ox_modules/module-web/commands/type.js +5 -1
  194. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  195. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  196. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  198. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  199. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  203. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  204. package/build/ox_modules/module-web.js +179 -77
  205. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  206. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  207. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  208. package/build/ox_modules/module-win/commands/back.js +2 -1
  209. package/build/ox_modules/module-win/commands/clear.js +4 -1
  210. package/build/ox_modules/module-win/commands/click.js +2 -1
  211. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  213. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  214. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  215. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  216. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  217. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  218. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  219. package/build/ox_modules/module-win/commands/getText.js +4 -1
  220. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  221. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  222. package/build/ox_modules/module-win/commands/index.js +43 -5
  223. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  224. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  225. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  226. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  227. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  228. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  229. package/build/ox_modules/module-win/commands/open.js +2 -1
  230. package/build/ox_modules/module-win/commands/pause.js +2 -1
  231. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  232. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  233. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  234. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  235. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  236. package/build/ox_modules/module-win/commands/tap.js +2 -1
  237. package/build/ox_modules/module-win/commands/type.js +4 -1
  238. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  239. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  240. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  241. package/build/ox_modules/module-win.js +87 -48
  242. package/build/ox_modules/utils.js +76 -22
  243. package/build/ox_reporters/reporter-excel.js +58 -1
  244. package/build/ox_reporters/reporter-html.js +28 -1
  245. package/build/ox_reporters/reporter-json.js +14 -1
  246. package/build/ox_reporters/reporter-junit.js +24 -1
  247. package/build/ox_reporters/reporter-pdf.js +19 -1
  248. package/build/ox_reporters/reporter-xml.js +17 -1
  249. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  250. package/build/ox_services/service-devtools.js +23 -1
  251. package/build/reporter/FileReporterBase.js +44 -5
  252. package/build/reporter/ReportAggregator.js +65 -1
  253. package/build/reporter/ReporterBase.js +6 -1
  254. package/build/runners/WorkerProcess.js +99 -1
  255. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  256. package/build/runners/cucumber/CucumberReporter.js +56 -1
  257. package/build/runners/cucumber/CucumberWorker.js +66 -1
  258. package/build/runners/cucumber/index.js +30 -1
  259. package/build/runners/cucumber/worker.js +18 -1
  260. package/build/runners/index.js +6 -1
  261. package/build/runners/oxygen/OxygenWorker.js +60 -3
  262. package/build/runners/oxygen/index.js +178 -17
  263. package/build/runners/oxygen/worker.js +25 -2
  264. package/package.json +1 -1
@@ -4,28 +4,39 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  var _logger = _interopRequireDefault(require("../lib/logger"));
11
+
9
12
  var _url = _interopRequireDefault(require("url"));
13
+
10
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
11
16
  const log = (0, _logger.default)('Debugger');
17
+
12
18
  const {
13
19
  EventEmitter
14
20
  } = require('events');
21
+
15
22
  const CDP = require('@oxygenhq/chrome-remote-interface');
23
+
16
24
  const CONNECT_RETRIES = 4;
17
25
  const CONNECT_SNOOZE_INTERVAL_MULT = 2;
18
26
  const MAX_DEPTH = 5;
19
27
  const IGNORE_SCOPE_CHAIN_VARIABLES = ['exports', 'require', 'module', '__filename', '__dirname'];
20
28
  let maxFindedDepth = 0;
29
+
21
30
  const transformToIDEStyle = fileName => {
22
31
  try {
23
32
  const uriIndex = fileName.indexOf('file:');
24
33
  const bpData = fileName.substring(0, uriIndex);
25
34
  let uri = fileName.substring(uriIndex);
35
+
26
36
  if (process.platform === 'win32' && uri.startsWith('file:///')) {
27
37
  uri = 'file://' + uri.substring('file:///'.length);
28
38
  }
39
+
29
40
  return bpData + _url.default.fileURLToPath(uri);
30
41
  } catch (e) {
31
42
  console.log('transformToIDEStyle fileName', fileName);
@@ -33,14 +44,18 @@ const transformToIDEStyle = fileName => {
33
44
  throw e;
34
45
  }
35
46
  };
47
+
36
48
  const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
49
+
37
50
  const deleteValues = (arr, depth) => {
38
51
  if (depth > maxFindedDepth) {
39
52
  maxFindedDepth = depth;
40
53
  }
54
+
41
55
  if (depth > MAX_DEPTH) {
42
56
  return [];
43
57
  }
58
+
44
59
  let result = arr.map(item => {
45
60
  if (item && item.value && item.value.className && item.value.className === 'Function') {
46
61
  const cloneValue = Object.assign(item.value);
@@ -56,10 +71,12 @@ const deleteValues = (arr, depth) => {
56
71
  });
57
72
  return result;
58
73
  };
74
+
59
75
  function extractBreakpointData(bpStr) {
60
76
  if (!bpStr || typeof bpStr !== 'string') {
61
77
  return null;
62
78
  }
79
+
63
80
  try {
64
81
  bpStr = transformToIDEStyle(bpStr);
65
82
  const parts = bpStr.split(':');
@@ -75,14 +92,17 @@ function extractBreakpointData(bpStr) {
75
92
  return null;
76
93
  }
77
94
  }
95
+
78
96
  function validateBreakpoint(breakpoint) {
79
97
  const brObj = extractBreakpointData(breakpoint.breakpointId);
80
98
  const brLineNumber = brObj.lineNumber + 1;
99
+
81
100
  if (breakpoint && breakpoint.locations && Array.isArray(breakpoint.locations) && breakpoint.locations.length > 0) {
82
101
  let result = null;
83
102
  breakpoint.locations.map(item => {
84
103
  const brFileName = brObj.fileName;
85
104
  const itemLineNumber = item.lineNumber + 1;
105
+
86
106
  if (brLineNumber !== itemLineNumber) {
87
107
  result = {
88
108
  msg: `Breakpoints warning : ${brFileName} Don't have opportunity to have breakpoint at line : `,
@@ -96,6 +116,7 @@ function validateBreakpoint(breakpoint) {
96
116
  return null;
97
117
  }
98
118
  }
119
+
99
120
  class Debugger extends EventEmitter {
100
121
  constructor(pid) {
101
122
  super();
@@ -109,47 +130,60 @@ class Debugger extends EventEmitter {
109
130
  this._fileNameAliases = [];
110
131
  this._breakpointErrors = [];
111
132
  }
133
+
112
134
  async reset() {
113
135
  if (this._client) {
114
136
  await this._client.close();
115
137
  this._client = null;
116
138
  this._paused = false;
117
139
  }
140
+
118
141
  this._breakpoints = [];
119
142
  this._fileNameAliases = [];
120
143
  }
144
+
121
145
  async getPropertiesByObjectId(objectId, depth, elm) {
122
146
  let data = {};
147
+
123
148
  try {
124
149
  data = await this._Runtime.getProperties({
125
150
  objectId: objectId
126
151
  });
127
152
  } catch (e) {}
153
+
128
154
  let clone = Object.assign({}, data);
155
+
129
156
  if (clone && clone && clone.result) {
130
157
  clone = Object.assign({}, clone, {
131
158
  result: deleteValues(clone.result, depth)
132
159
  });
133
160
  }
161
+
134
162
  return clone;
135
163
  }
164
+
136
165
  async getPromiceAllResult(mapResultFiltered) {
137
166
  let promiseAllPromise = await Promise.all(mapResultFiltered).then(value => {
138
167
  return value;
139
168
  });
169
+
140
170
  if (promiseAllPromise && Array.isArray(promiseAllPromise) && promiseAllPromise.length > 0) {
141
171
  promiseAllPromise = promiseAllPromise.filter(item => !!item);
142
172
  }
173
+
143
174
  return promiseAllPromise;
144
175
  }
176
+
145
177
  async getProperties(objectId, depth, elm) {
146
178
  const promises = [];
147
179
  const getPropertiesResult = await this.getPropertiesByObjectId(objectId, depth, elm);
180
+
148
181
  if (getPropertiesResult) {
149
182
  if (getPropertiesResult && getPropertiesResult.result && Array.isArray(getPropertiesResult.result)) {
150
183
  const mapResult = getPropertiesResult.result.map(async item => {
151
184
  if (item && item.value && item.value.objectId) {
152
185
  const getPropertiesInnerResult = await this.getProperties(item.value.objectId, depth + 1, item);
186
+
153
187
  if (item.scopeItem) {
154
188
  return null;
155
189
  } else {
@@ -165,8 +199,10 @@ class Debugger extends EventEmitter {
165
199
  objectId: objectId
166
200
  })
167
201
  };
202
+
168
203
  if (mapResultFiltered && Array.isArray(mapResultFiltered) && mapResultFiltered.length > 0) {
169
204
  const promiseAllPromise = await this.getPromiceAllResult(mapResultFiltered);
205
+
170
206
  if (promiseAllPromise && Array.isArray(promiseAllPromise) && promiseAllPromise.length > 0) {
171
207
  result.child = promiseAllPromise;
172
208
  return result;
@@ -186,6 +222,7 @@ class Debugger extends EventEmitter {
186
222
  };
187
223
  }
188
224
  }
225
+
189
226
  if (promises.length > 0) {
190
227
  return Promise.all(promises).then(values => {
191
228
  return values;
@@ -194,6 +231,7 @@ class Debugger extends EventEmitter {
194
231
  return false;
195
232
  }
196
233
  }
234
+
197
235
  async processScope(scopeChain, depth) {
198
236
  let scopeChainResult = await scopeChain.map(async chain => {
199
237
  if (chain && chain.object && chain.object.objectId) {
@@ -216,6 +254,7 @@ class Debugger extends EventEmitter {
216
254
  }
217
255
  });
218
256
  }
257
+
219
258
  async processCallFrames(callFrames, depth) {
220
259
  let callFramesMapResult = await callFrames.map(async callFrame => {
221
260
  if (callFrame && callFrame.scopeChain && Array.isArray(callFrame.scopeChain)) {
@@ -230,8 +269,10 @@ class Debugger extends EventEmitter {
230
269
  return values;
231
270
  });
232
271
  }
272
+
233
273
  inBreakpoints(itemUrl) {
234
274
  let result = false;
275
+
235
276
  if (this._breakpoints && Array.isArray(this._breakpoints) && this._breakpoints.length > 0) {
236
277
  this._breakpoints.map(bp => {
237
278
  if (itemUrl && itemUrl.toLowerCase && bp.origin && bp.origin.scriptPath && bp.origin.scriptPath.toLowerCase && itemUrl.toLowerCase() === bp.origin.scriptPath.toLowerCase()) {
@@ -239,10 +280,13 @@ class Debugger extends EventEmitter {
239
280
  }
240
281
  });
241
282
  }
283
+
242
284
  return result;
243
285
  }
286
+
244
287
  inFileNameAliases(fileName) {
245
288
  let result = false;
289
+
246
290
  if (this._fileNameAliases && Array.isArray(this._fileNameAliases) && this._fileNameAliases.length > 0) {
247
291
  this._fileNameAliases.map(alias => {
248
292
  if (alias && alias.toLowerCase && fileName && fileName.toLowerCase && alias.toLowerCase() === fileName.toLowerCase()) {
@@ -250,23 +294,30 @@ class Debugger extends EventEmitter {
250
294
  }
251
295
  });
252
296
  }
297
+
253
298
  return result;
254
299
  }
300
+
255
301
  async continueConnect() {
256
302
  this._client.on('Debugger.scriptParsed', async m => {
257
303
  if (m && m.url) {
258
304
  if (m.url.toLowerCase) {
259
305
  const filelc = m.url.toLowerCase();
260
306
  let breakpointForChange;
307
+
261
308
  const findResult = this._breakpoints.find(item => {
262
309
  if (item.origin && item.origin.scriptPath && item.origin.scriptPath.toLowerCase) {
263
310
  const breakpointlc = item.origin.scriptPath.toLowerCase();
311
+
264
312
  if (breakpointlc === filelc && item.origin.scriptPath !== m.url) {
265
313
  if (this._fileNameAliases.includes(m.url)) {} else {
266
314
  this._fileNameAliases.push(m.url);
267
315
  }
316
+
268
317
  this._paused = true;
318
+
269
319
  this._Debugger.pause();
320
+
270
321
  breakpointForChange = {
271
322
  breakpoint: item,
272
323
  mUrl: m.url
@@ -279,8 +330,10 @@ class Debugger extends EventEmitter {
279
330
  return false;
280
331
  }
281
332
  });
333
+
282
334
  if (findResult) {
283
335
  const breakpointsFromOldLocation = [];
336
+
284
337
  this._breakpoints.map(bp => {
285
338
  if (bp && bp.origin && bp.origin.scriptPath && breakpointForChange && breakpointForChange.mUrl && breakpointForChange.breakpoint && breakpointForChange.breakpoint.origin && breakpointForChange.breakpoint.origin.scriptPath && bp.origin.scriptPath === breakpointForChange.breakpoint.origin.scriptPath) {
286
339
  breakpointsFromOldLocation.push({
@@ -289,6 +342,7 @@ class Debugger extends EventEmitter {
289
342
  });
290
343
  }
291
344
  });
345
+
292
346
  if (breakpointsFromOldLocation && Array.isArray(breakpointsFromOldLocation) && breakpointsFromOldLocation.length > 0) {
293
347
  let breakpointsFromOldLocationResult = breakpointsFromOldLocation.map(async bp => {
294
348
  return await this.setBreakpoint(bp.scriptPath, bp.lineNumber);
@@ -304,13 +358,16 @@ class Debugger extends EventEmitter {
304
358
  }
305
359
  }
306
360
  });
361
+
307
362
  this._client.on('Debugger.paused', e => {
308
363
  this._paused = true;
364
+
309
365
  if (e.reason === 'Break on start') {
310
366
  this._brokeOnStart = true;
311
367
  } else {
312
368
  const possibleBreakpointsData = [];
313
369
  let eCallFrames = [];
370
+
314
371
  if (e && e.callFrames && Array.isArray(e.callFrames) && e.callFrames.length > 0) {
315
372
  e.callFrames.map(item => {
316
373
  if (item && item.url && this.inBreakpoints(item.url)) {
@@ -318,20 +375,25 @@ class Debugger extends EventEmitter {
318
375
  }
319
376
  });
320
377
  }
378
+
321
379
  let breakpointsMapResult = this._breakpoints.map(async bp => {
322
380
  if (bp && bp.locations && eCallFrames && eCallFrames[0] && bp.locations.length > 0 && bp.locations[0].scriptId === eCallFrames[0].location.scriptId && bp.locations[0].lineNumber === eCallFrames[0].location.lineNumber) {
323
381
  const initialDepth = 1;
382
+
324
383
  if (e && e.callFrames && Array.isArray(e.callFrames) && e.callFrames.length > 0) {
325
384
  const uniqueScriptIdArr = [];
326
385
  const callFrames = e.callFrames.filter(item => {
327
386
  if (item && item.url) {
328
387
  const finded = this._breakpoints.find(breakpoint => {
329
388
  let result = false;
389
+
330
390
  if (breakpoint.breakpointId.endsWith(item.url)) {
331
391
  result = true;
332
392
  }
393
+
333
394
  return result;
334
395
  });
396
+
335
397
  if (finded) {
336
398
  if (item.location && item.location.scriptId) {
337
399
  if (uniqueScriptIdArr.includes(item.location.scriptId)) {
@@ -350,15 +412,18 @@ class Debugger extends EventEmitter {
350
412
  return false;
351
413
  }
352
414
  });
415
+
353
416
  try {
354
417
  callFrames.map(async item => {
355
418
  let possibleBreakpoints = await this.getPossibleBreakpoints(item.location);
356
419
  const scriptSource = await this.getScriptSource(item.location.scriptId);
357
420
  const scriptSourceSplit = scriptSource.scriptSource.split('\n');
358
421
  let fileLineNumbersLength = 0;
422
+
359
423
  if (scriptSourceSplit && Array.isArray(scriptSourceSplit) && scriptSourceSplit.length > 0) {
360
424
  fileLineNumbersLength = scriptSourceSplit.length;
361
425
  }
426
+
362
427
  possibleBreakpointsData.push({
363
428
  breakpoints: possibleBreakpoints,
364
429
  file: item.url,
@@ -368,6 +433,7 @@ class Debugger extends EventEmitter {
368
433
  } catch (e) {
369
434
  console.log('getScriptSource e', e);
370
435
  }
436
+
371
437
  let callFramesMapResult = await this.processCallFrames(callFrames, initialDepth);
372
438
  callFramesMapResult = callFramesMapResult.filter(el => !!el);
373
439
  return callFramesMapResult;
@@ -378,11 +444,13 @@ class Debugger extends EventEmitter {
378
444
  return null;
379
445
  }
380
446
  });
447
+
381
448
  breakpointsMapResult = breakpointsMapResult.filter(el => !!el);
382
449
  Promise.all(breakpointsMapResult).then(async scopeChainTree => {
383
450
  if (scopeChainTree && Array.isArray(scopeChainTree) && scopeChainTree.length > 0) {
384
451
  scopeChainTree = scopeChainTree.filter(el => !!el);
385
452
  let breakpointData = null;
453
+
386
454
  if (eCallFrames && eCallFrames.length > 0) {
387
455
  breakpointData = {
388
456
  lineNumber: eCallFrames[0].location.lineNumber,
@@ -392,6 +460,7 @@ class Debugger extends EventEmitter {
392
460
  await this.addVariablesFromScopeChainTree(breakpointData.variables, scopeChainTree);
393
461
  await this.addOxygenVariablesFromGlobalScope(breakpointData.variables);
394
462
  }
463
+
395
464
  if (this._breakpointErrors && Array.isArray(this._breakpointErrors) && this._breakpointErrors.length > 0) {
396
465
  const isset = this._breakpoints.find(item => {
397
466
  if (item && item.origin && item.origin.lineNumber && parseInt(item.origin.lineNumber) + 1 === parseInt(breakpointData.lineNumber)) {
@@ -404,55 +473,70 @@ class Debugger extends EventEmitter {
404
473
  return false;
405
474
  }
406
475
  });
476
+
407
477
  if (isset) {
408
478
  let realBrfinded = false;
479
+
409
480
  this._breakpointErrors.map(breakpointError => {
410
481
  if (this._breakpoints && Array.isArray(this._breakpoints) && this._breakpoints.length > 0) {
411
482
  this._breakpoints.map(br => {
412
483
  const brFileName = transformToIDEStyle(br.origin.scriptPath);
413
484
  let possibleBreakpointData;
485
+
414
486
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
415
487
  possibleBreakpointData = possibleBreakpointsData.find(item => item.file === eCallFrames[0].url);
416
488
  }
489
+
417
490
  if (brFileName === breakpointData.fileName && possibleBreakpointData && typeof possibleBreakpointData.fileLineNumbersLength !== 'undefined' && (breakpointData.lineNumber + 1 === br.origin.lineNumber || br.origin.lineNumber + 1 === possibleBreakpointData.fileLineNumbersLength)) {
418
491
  realBrfinded = true;
419
492
  }
420
493
  });
421
494
  }
422
495
  });
496
+
423
497
  if (!realBrfinded) {
424
498
  breakpointData.resolved = true;
425
499
  }
426
500
  }
427
501
  }
502
+
428
503
  let possibleBreakpointData;
504
+
429
505
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
430
506
  possibleBreakpointData = possibleBreakpointsData.find(item => item.file === eCallFrames[0].url);
431
507
  }
508
+
432
509
  if (possibleBreakpointData && typeof possibleBreakpointData.fileLineNumbersLength !== 'undefined' && breakpointData.lineNumber + 1 >= possibleBreakpointData.fileLineNumbersLength) {
433
510
  breakpointData.lineNumber = possibleBreakpointData.fileLineNumbersLength - 2;
434
511
  }
512
+
435
513
  this.emit('break', breakpointData);
514
+
436
515
  if (this._breakpointErrors && Array.isArray(this._breakpointErrors) && this._breakpointErrors.length > 0) {
437
516
  this._breakpointErrors.map(breakpointError => {
438
517
  if (breakpointError && breakpointError.msg && breakpointError.fileName && breakpointError.line) {
439
518
  let msg;
440
519
  let ignore = false;
520
+
441
521
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
442
522
  possibleBreakpointsData.map(item => {
443
523
  item.file = transformToIDEStyle(item.file);
524
+
444
525
  if (item && item.file === breakpointError.fileName && possibleBreakpointData && typeof item.fileLineNumbersLength !== 'undefined') {
445
526
  let line;
527
+
446
528
  if (breakpointError.line >= item.fileLineNumbersLength) {
447
529
  line = breakpointError.line - 2;
448
530
  } else {
449
531
  line = breakpointError.line;
450
532
  }
533
+
451
534
  if (item.breakpoints && Array.isArray(item.breakpoints) && item.breakpoints.length > 0) {
452
535
  if (breakpointError && breakpointError.msg && breakpointError.msg.includes('Possible breakpoint lines')) {} else {
453
536
  if (item.breakpoints.includes(line)) {
454
537
  ignore = true;
455
538
  }
539
+
456
540
  msg = breakpointError.msg;
457
541
  msg += `${line}. `;
458
542
  msg += ` Possible breakpoint lines : ${item.breakpoints.map(line => line).join(', ')}`;
@@ -467,6 +551,7 @@ class Debugger extends EventEmitter {
467
551
  }
468
552
  });
469
553
  }
554
+
470
555
  if (!ignore) {
471
556
  this.emit('breakError', {
472
557
  message: msg,
@@ -485,9 +570,11 @@ class Debugger extends EventEmitter {
485
570
  }, reason => {});
486
571
  }
487
572
  });
573
+
488
574
  this._client.on('Debugger.breakpointResolved', e => {
489
575
  this.onBreakpointResolved(e);
490
576
  });
577
+
491
578
  const {
492
579
  Debugger,
493
580
  Runtime
@@ -509,27 +596,32 @@ class Debugger extends EventEmitter {
509
596
  await this._Debugger.paused();
510
597
  this.emit('ready');
511
598
  }
599
+
512
600
  onBreakpointResolved(e) {
513
601
  for (var bp of this._breakpoints) {
514
602
  if (bp && e && bp.breakpointId === e.breakpointId) {
515
603
  let validateResult;
604
+
516
605
  if (e.location) {
517
606
  bp.locations = [e.location];
518
607
  validateResult = validateBreakpoint(bp);
519
608
  } else if (e.locations) {
520
609
  validateResult = validateBreakpoint(bp);
521
610
  }
611
+
522
612
  if (validateResult) {
523
613
  this._breakpointErrors.push(validateResult);
524
614
  }
525
615
  }
526
616
  }
527
617
  }
618
+
528
619
  async connect(port, host) {
529
620
  this._port = port;
530
621
  this._host = host || 'localhost';
531
622
  let snoozeTime = 1000;
532
623
  let lastError = null;
624
+
533
625
  for (let retries = 0; retries < CONNECT_RETRIES; retries++) {
534
626
  try {
535
627
  this._client = await CDP({
@@ -541,22 +633,28 @@ class Debugger extends EventEmitter {
541
633
  } catch (e) {
542
634
  lastError = e;
543
635
  }
636
+
544
637
  log.warn(`Debugger connection failed. Will retry in ${snoozeTime / 1000}s. Error: `, lastError);
545
638
  await snooze(snoozeTime);
546
639
  snoozeTime *= CONNECT_SNOOZE_INTERVAL_MULT;
547
640
  }
641
+
548
642
  if (lastError) {
549
643
  log.error('Failed to connect to the debugger: ', lastError);
550
644
  throw lastError;
551
645
  }
646
+
552
647
  await this.continueConnect();
553
648
  }
649
+
554
650
  async setBreakpoint(scriptPath, lineNumber) {
555
651
  let fileName = scriptPath;
556
652
  const aliasResult = this.inFileNameAliases(fileName);
653
+
557
654
  if (aliasResult) {
558
655
  fileName = aliasResult;
559
656
  }
657
+
560
658
  fileName = _url.default.pathToFileURL(fileName).toString();
561
659
  let err = null;
562
660
  let breakpoint = await this._Debugger.setBreakpointByUrl({
@@ -565,22 +663,28 @@ class Debugger extends EventEmitter {
565
663
  columnNumber: 0
566
664
  }).catch(e => {
567
665
  err = e;
666
+
568
667
  if (!e.response || e.response.message !== 'Breakpoint at specified location already exists.') {
569
668
  throw e;
570
669
  }
571
670
  });
671
+
572
672
  if (err) {} else {
573
673
  breakpoint.origin = {
574
674
  scriptPath: fileName,
575
675
  lineNumber: lineNumber
576
676
  };
677
+
577
678
  this._breakpoints.push(breakpoint);
679
+
578
680
  if (breakpoint) {
579
681
  this.onBreakpointResolved(breakpoint);
580
682
  }
581
683
  }
684
+
582
685
  return breakpoint;
583
686
  }
687
+
584
688
  async setBreakpointsActive(active) {
585
689
  if (this._Debugger && this._Debugger.setBreakpointsActive) {
586
690
  return await this._Debugger.setBreakpointsActive({
@@ -591,6 +695,7 @@ class Debugger extends EventEmitter {
591
695
  return await this.setBreakpointsActive(active);
592
696
  }
593
697
  }
698
+
594
699
  async removeBreakpoint(breakpointId) {
595
700
  this._breakpoints = this._breakpoints.filter(bp => {
596
701
  return bp.breakpointId !== breakpointId;
@@ -600,34 +705,40 @@ class Debugger extends EventEmitter {
600
705
  };
601
706
  return await this._Debugger.removeBreakpoint(removeBr);
602
707
  }
708
+
603
709
  async continue() {
604
710
  if (this._paused) {
605
711
  this._paused = false;
606
712
  return await this._Debugger.resume();
607
713
  }
608
714
  }
715
+
609
716
  async resume() {
610
717
  if (this._paused) {
611
718
  this._paused = false;
612
719
  return await this._Debugger.resume();
613
720
  }
614
721
  }
722
+
615
723
  async resumeTerminate() {
616
724
  if (this._paused) {
617
725
  this._paused = false;
618
726
  await this._Debugger.resume(true);
619
727
  }
620
728
  }
729
+
621
730
  async disable() {
622
731
  if (this._paused) {
623
732
  this._paused = false;
624
733
  await this._Debugger.disable(true);
625
734
  }
626
735
  }
736
+
627
737
  async removeBreakpointByValue(filePath, inputLine) {
628
738
  const filePathAlias = this.inFileNameAliases(filePath);
629
739
  const line = inputLine - 1;
630
740
  const self = this;
741
+
631
742
  if (this._breakpoints) {
632
743
  for (let b of this._breakpoints) {
633
744
  try {
@@ -635,6 +746,7 @@ class Debugger extends EventEmitter {
635
746
  const parts = b.breakpointId.split(':');
636
747
  let fileName;
637
748
  let lineNumber;
749
+
638
750
  if (process.platform === 'win32') {
639
751
  fileName = parts[parts.length - 2] + ':' + parts[parts.length - 1];
640
752
  lineNumber = parseInt(parts[1]);
@@ -642,6 +754,7 @@ class Debugger extends EventEmitter {
642
754
  fileName = parts[parts.length - 1];
643
755
  lineNumber = parseInt(parts[1]);
644
756
  }
757
+
645
758
  if ((fileName === filePath || fileName === filePathAlias) && lineNumber === line) {
646
759
  await self.removeBreakpoint(b.breakpointId);
647
760
  }
@@ -653,14 +766,17 @@ class Debugger extends EventEmitter {
653
766
  }
654
767
  }
655
768
  }
769
+
656
770
  async clearBreakpoints() {
657
771
  const self = this;
772
+
658
773
  if (this._breakpoints) {
659
774
  for (let b of this._breakpoints) {
660
775
  await self.removeBreakpoint(b.breakpointId);
661
776
  }
662
777
  }
663
778
  }
779
+
664
780
  async getPossibleBreakpoints(startLocation) {
665
781
  const result = [];
666
782
  const possibleBreakpoints = await this._Debugger.getPossibleBreakpoints({
@@ -670,56 +786,69 @@ class Debugger extends EventEmitter {
670
786
  columnNumber: 0
671
787
  }
672
788
  });
789
+
673
790
  if (possibleBreakpoints && possibleBreakpoints.locations && Array.isArray(possibleBreakpoints.locations) && possibleBreakpoints.locations.length > 0) {
674
791
  possibleBreakpoints.locations.map(item => {
675
792
  if (item && typeof item.lineNumber !== 'undefined') {
676
793
  const lineNumber = item.lineNumber + 1;
794
+
677
795
  if (result.includes(lineNumber)) {} else {
678
796
  result.push(lineNumber);
679
797
  }
680
798
  }
681
799
  });
682
800
  }
801
+
683
802
  if (result && Array.isArray(result) && result.length > 0) {
684
803
  let p = result.pop();
804
+
685
805
  if (result.includes(p - 1)) {} else {
686
806
  if (p - 1 > 1) {
687
807
  result.push(p - 1);
688
808
  }
689
809
  }
690
810
  }
811
+
691
812
  return result;
692
813
  }
814
+
693
815
  async getScriptSource(scriptId) {
694
816
  return await this._Debugger.getScriptSource({
695
817
  scriptId: scriptId
696
818
  });
697
819
  }
820
+
698
821
  async close() {
699
822
  await this.reset();
700
823
  }
824
+
701
825
  async addVariablesFromScopeChainTree(variables, scopeChainTree) {
702
826
  if (!Array.isArray(scopeChainTree) || scopeChainTree.length == 0 || !Array.isArray(scopeChainTree[0]) || scopeChainTree[0].length == 0 || !Array.isArray(scopeChainTree[0][0]) || scopeChainTree[0][0].length == 0) {
703
827
  return;
704
828
  }
829
+
705
830
  const {
706
831
  objectIdResponse
707
832
  } = scopeChainTree[0][0][0];
708
833
  const {
709
834
  result
710
835
  } = objectIdResponse;
836
+
711
837
  for (const scopeVar of result) {
712
838
  if (!IGNORE_SCOPE_CHAIN_VARIABLES.includes(scopeVar.name)) {
713
839
  var value;
714
840
  var type;
841
+
715
842
  if (scopeVar && scopeVar.value) {
716
843
  type = scopeVar.value.type;
844
+
717
845
  if (scopeVar.value.value) {
718
846
  value = scopeVar.value.value;
719
847
  } else {
720
848
  value = await this.tryToRetrieveObjectValue(scopeVar.value.objectId);
721
849
  }
722
850
  }
851
+
723
852
  variables.push({
724
853
  name: scopeVar.name,
725
854
  type: type || 'undefined',
@@ -728,16 +857,19 @@ class Debugger extends EventEmitter {
728
857
  }
729
858
  }
730
859
  }
860
+
731
861
  async tryToRetrieveObjectValue(objectId) {
732
862
  if (!objectId) {
733
863
  return undefined;
734
864
  }
865
+
735
866
  try {
736
867
  const {
737
868
  result
738
869
  } = await this._Runtime.getProperties({
739
870
  objectId
740
871
  });
872
+
741
873
  if (Array.isArray(result) && result.length > 0) {
742
874
  const objValue = {};
743
875
  result.forEach(propDesc => {
@@ -750,8 +882,10 @@ class Debugger extends EventEmitter {
750
882
  } catch (e) {
751
883
  console.error('Runtime.getProperties call failed', e);
752
884
  }
885
+
753
886
  return undefined;
754
887
  }
888
+
755
889
  async addOxygenVariablesFromGlobalScope(variables) {
756
890
  const {
757
891
  result: poEvalResult
@@ -785,6 +919,7 @@ class Debugger extends EventEmitter {
785
919
  };
786
920
  Object.keys(results).forEach(key => {
787
921
  const result = results[key];
922
+
788
923
  if (result.value) {
789
924
  variables.push({
790
925
  name: key,
@@ -794,12 +929,15 @@ class Debugger extends EventEmitter {
794
929
  }
795
930
  });
796
931
  }
932
+
797
933
  getBreakpoints(filePath) {
798
934
  var bps = [];
935
+
799
936
  for (let b of this._breakpoints) {
800
937
  const parts = b.breakpointId.split(':');
801
938
  let fileName;
802
939
  let lineNumber;
940
+
803
941
  if (process.platform === 'win32') {
804
942
  fileName = parts[parts.length - 2] + ':' + parts[parts.length - 1];
805
943
  lineNumber = parseInt(parts[1]) + 1;
@@ -807,17 +945,22 @@ class Debugger extends EventEmitter {
807
945
  fileName = parts[parts.length - 1];
808
946
  lineNumber = parseInt(parts[1]) + 1;
809
947
  }
948
+
810
949
  if (fileName === filePath) {
811
950
  bps.push(lineNumber);
812
951
  } else {
813
952
  const filePathAlias = this.inFileNameAliases(filePath);
953
+
814
954
  if (filePathAlias) {
815
955
  bps.push(lineNumber);
816
956
  }
817
957
  }
818
958
  }
959
+
819
960
  return bps;
820
961
  }
962
+
821
963
  }
964
+
822
965
  exports.default = Debugger;
823
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiQ0RQIiwiQ09OTkVDVF9SRVRSSUVTIiwiQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVCIsIk1BWF9ERVBUSCIsIklHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMiLCJtYXhGaW5kZWREZXB0aCIsInRyYW5zZm9ybVRvSURFU3R5bGUiLCJmaWxlTmFtZSIsInVyaUluZGV4IiwiaW5kZXhPZiIsImJwRGF0YSIsInN1YnN0cmluZyIsInVyaSIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN0YXJ0c1dpdGgiLCJsZW5ndGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZGVsZXRlVmFsdWVzIiwiYXJyIiwiZGVwdGgiLCJyZXN1bHQiLCJtYXAiLCJpdGVtIiwidmFsdWUiLCJjbGFzc05hbWUiLCJjbG9uZVZhbHVlIiwiT2JqZWN0IiwiYXNzaWduIiwib2JqZWN0SWQiLCJjbG9uZSIsImV4dHJhY3RCcmVha3BvaW50RGF0YSIsImJwU3RyIiwicGFydHMiLCJzcGxpdCIsImxpbmVOdW1iZXIiLCJwYXJzZUludCIsInNwbGljZSIsImpvaW4iLCJ2YWxpZGF0ZUJyZWFrcG9pbnQiLCJicmVha3BvaW50IiwiYnJPYmoiLCJicmVha3BvaW50SWQiLCJickxpbmVOdW1iZXIiLCJsb2NhdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJickZpbGVOYW1lIiwiaXRlbUxpbmVOdW1iZXIiLCJtc2ciLCJsaW5lIiwiRGVidWdnZXIiLCJjb25zdHJ1Y3RvciIsInBpZCIsIl9waWQiLCJfcG9ydCIsInVuZGVmaW5lZCIsIl9ob3N0IiwiX2JyZWFrcG9pbnRzIiwiX3BlbmRpbmdCUCIsIl9wYXVzZWQiLCJfY2xpZW50IiwiX2ZpbGVOYW1lQWxpYXNlcyIsIl9icmVha3BvaW50RXJyb3JzIiwicmVzZXQiLCJjbG9zZSIsImdldFByb3BlcnRpZXNCeU9iamVjdElkIiwiZWxtIiwiZGF0YSIsIl9SdW50aW1lIiwiZ2V0UHJvcGVydGllcyIsImdldFByb21pY2VBbGxSZXN1bHQiLCJtYXBSZXN1bHRGaWx0ZXJlZCIsInByb21pc2VBbGxQcm9taXNlIiwiYWxsIiwidGhlbiIsImZpbHRlciIsInByb21pc2VzIiwiZ2V0UHJvcGVydGllc1Jlc3VsdCIsIm1hcFJlc3VsdCIsImdldFByb3BlcnRpZXNJbm5lclJlc3VsdCIsInNjb3BlSXRlbSIsIm9iamVjdElkUmVzcG9uc2UiLCJjaGlsZCIsInZhbHVlcyIsInByb2Nlc3NTY29wZSIsInNjb3BlQ2hhaW4iLCJzY29wZUNoYWluUmVzdWx0IiwiY2hhaW4iLCJvYmplY3QiLCJ0eXBlIiwiZWwiLCJwcm9jZXNzQ2FsbEZyYW1lcyIsImNhbGxGcmFtZXMiLCJjYWxsRnJhbWVzTWFwUmVzdWx0IiwiY2FsbEZyYW1lIiwicHJvY2Vzc1Njb3BlUmVzdWx0IiwiaW5CcmVha3BvaW50cyIsIml0ZW1VcmwiLCJicCIsInRvTG93ZXJDYXNlIiwib3JpZ2luIiwic2NyaXB0UGF0aCIsImluRmlsZU5hbWVBbGlhc2VzIiwiYWxpYXMiLCJjb250aW51ZUNvbm5lY3QiLCJvbiIsIm0iLCJmaWxlbGMiLCJicmVha3BvaW50Rm9yQ2hhbmdlIiwiZmluZFJlc3VsdCIsImZpbmQiLCJicmVha3BvaW50bGMiLCJpbmNsdWRlcyIsInB1c2giLCJfRGVidWdnZXIiLCJwYXVzZSIsIm1VcmwiLCJicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbiIsImJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0Iiwic2V0QnJlYWtwb2ludCIsInJlc3VtZSIsInJlYXNvbiIsIl9icm9rZU9uU3RhcnQiLCJwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSIsImVDYWxsRnJhbWVzIiwiYnJlYWtwb2ludHNNYXBSZXN1bHQiLCJzY3JpcHRJZCIsImxvY2F0aW9uIiwiaW5pdGlhbERlcHRoIiwidW5pcXVlU2NyaXB0SWRBcnIiLCJmaW5kZWQiLCJlbmRzV2l0aCIsInBvc3NpYmxlQnJlYWtwb2ludHMiLCJnZXRQb3NzaWJsZUJyZWFrcG9pbnRzIiwic2NyaXB0U291cmNlIiwiZ2V0U2NyaXB0U291cmNlIiwic2NyaXB0U291cmNlU3BsaXQiLCJmaWxlTGluZU51bWJlcnNMZW5ndGgiLCJicmVha3BvaW50cyIsImZpbGUiLCJzY29wZUNoYWluVHJlZSIsImJyZWFrcG9pbnREYXRhIiwidmFyaWFibGVzIiwiYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlIiwiYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlIiwiaXNzZXQiLCJsb2MiLCJyZWFsQnJmaW5kZWQiLCJicmVha3BvaW50RXJyb3IiLCJiciIsInBvc3NpYmxlQnJlYWtwb2ludERhdGEiLCJyZXNvbHZlZCIsImVtaXQiLCJpZ25vcmUiLCJtZXNzYWdlIiwiY29udGludWUiLCJvbkJyZWFrcG9pbnRSZXNvbHZlZCIsIlJ1bnRpbWUiLCJlbmFibGUiLCJzZXRQYXVzZU9uRXhjZXB0aW9ucyIsInN0YXRlIiwic2V0QXN5bmNDYWxsU3RhY2tEZXB0aCIsIm1heERlcHRoIiwic2V0QmxhY2tib3hQYXR0ZXJucyIsInBhdHRlcm5zIiwicnVuSWZXYWl0aW5nRm9yRGVidWdnZXIiLCJwYXVzZWQiLCJ2YWxpZGF0ZVJlc3VsdCIsImNvbm5lY3QiLCJwb3J0IiwiaG9zdCIsInNub296ZVRpbWUiLCJsYXN0RXJyb3IiLCJyZXRyaWVzIiwid2FybiIsImFsaWFzUmVzdWx0IiwicGF0aFRvRmlsZVVSTCIsInRvU3RyaW5nIiwiZXJyIiwic2V0QnJlYWtwb2ludEJ5VXJsIiwiY29sdW1uTnVtYmVyIiwiY2F0Y2giLCJyZXNwb25zZSIsInNldEJyZWFrcG9pbnRzQWN0aXZlIiwiYWN0aXZlIiwicmVtb3ZlQnJlYWtwb2ludCIsInJlbW92ZUJyIiwicmVzdW1lVGVybWluYXRlIiwiZGlzYWJsZSIsInJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlIiwiZmlsZVBhdGgiLCJpbnB1dExpbmUiLCJmaWxlUGF0aEFsaWFzIiwic2VsZiIsImIiLCJjbGVhckJyZWFrcG9pbnRzIiwic3RhcnRMb2NhdGlvbiIsInN0YXJ0IiwicCIsInBvcCIsInNjb3BlVmFyIiwibmFtZSIsInRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZSIsIm9ialZhbHVlIiwiZm9yRWFjaCIsInByb3BEZXNjIiwicG9FdmFsUmVzdWx0IiwiZXZhbHVhdGUiLCJleHByZXNzaW9uIiwicmV0dXJuQnlWYWx1ZSIsImVudkV2YWxSZXN1bHQiLCJ2YXJzRXZhbFJlc3VsdCIsInBhcmFtc0V2YWxSZXN1bHQiLCJyZXN1bHRzIiwicG8iLCJlbnYiLCJ2YXJzIiwicGFyYW1zIiwia2V5cyIsImtleSIsImdldEJyZWFrcG9pbnRzIiwiYnBzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9kZWJ1Z2dlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIFY4IGRlYnVnZ2VyIGNsaWVudC5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ0RlYnVnZ2VyJyk7XHJcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcclxuY29uc3QgQ0RQID0gcmVxdWlyZSgnQG94eWdlbmhxL2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJyk7XHJcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcclxuXHJcbmNvbnN0IENPTk5FQ1RfUkVUUklFUyA9IDQ7XHJcbmNvbnN0IENPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQgPSAyO1xyXG5jb25zdCBNQVhfREVQVEggPSA1O1xyXG5jb25zdCBJR05PUkVfU0NPUEVfQ0hBSU5fVkFSSUFCTEVTID0gW1xyXG4gICAgJ2V4cG9ydHMnLFxyXG4gICAgJ3JlcXVpcmUnLFxyXG4gICAgJ21vZHVsZScsXHJcbiAgICAnX19maWxlbmFtZScsXHJcbiAgICAnX19kaXJuYW1lJ1xyXG5dO1xyXG5sZXQgbWF4RmluZGVkRGVwdGggPSAwO1xyXG5cclxuY29uc3QgdHJhbnNmb3JtVG9JREVTdHlsZSA9IChmaWxlTmFtZSkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB1cmlJbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoJ2ZpbGU6Jyk7XHJcbiAgICAgICAgY29uc3QgYnBEYXRhID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIHVyaUluZGV4KTtcclxuICAgICAgICBsZXQgdXJpID0gZmlsZU5hbWUuc3Vic3RyaW5nKHVyaUluZGV4KTtcclxuICAgICAgICAvLyBmaXggVU5DIHBhdGhzXHJcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgdXJpLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8vJykpIHtcclxuICAgICAgICAgICAgdXJpID0gJ2ZpbGU6Ly8nICsgdXJpLnN1YnN0cmluZygnZmlsZTovLy8nLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBicERhdGEgKyB1cmwuZmlsZVVSTFRvUGF0aCh1cmkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0cmFuc2Zvcm1Ub0lERVN0eWxlIGZpbGVOYW1lJywgZmlsZU5hbWUpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zZm9ybVRvSURFU3R5bGUgZXJyb3InLCBlKTtcclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbmNvbnN0IGRlbGV0ZVZhbHVlcyA9IChhcnIsIGRlcHRoKSA9PiB7XHJcblxyXG4gICAgaWYgKGRlcHRoID4gbWF4RmluZGVkRGVwdGgpIHtcclxuICAgICAgICBtYXhGaW5kZWREZXB0aCA9IGRlcHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0ID0gYXJyLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZS5jbGFzc05hbWUgJiYgaXRlbS52YWx1ZS5jbGFzc05hbWUgPT09ICdGdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvbmVWYWx1ZSA9IE9iamVjdC5hc3NpZ24oaXRlbS52YWx1ZSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVZhbHVlLm9iamVjdElkO1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5hc3NpZ24oaXRlbSwge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNsb25lVmFsdWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZS5vYmplY3RJZDtcclxuICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0QnJlYWtwb2ludERhdGEoYnBTdHIpIHtcclxuICAgIGlmICghYnBTdHIgfHwgdHlwZW9mIGJwU3RyICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgYnBTdHIgPSB0cmFuc2Zvcm1Ub0lERVN0eWxlKGJwU3RyKTtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IGJwU3RyLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSk7XHJcblxyXG4gICAgICAgIC8vIHJvbW92ZSBmaWxlIG51bWJlciwgbGluZSBudW1iZXIsIGNvbHVtbiBudW1iZXJcclxuICAgICAgICBwYXJ0cy5zcGxpY2UoMCwgMyk7XHJcblxyXG4gICAgICAgIC8vIGxvb2tzIGxpbmUgbmVlZCBvbmx5IGZvciB3aW5kb3dzIHBhdGggd2hpdGggZGlzaywgbGlrZSBDOi8vXHJcbiAgICAgICAgLy8gZm9yIHdpbmRvd3MgbmV0d29yayBmb2xkZXJzIGFuZCBtYWMgbm90IG5lZWRcclxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhcnRzLmpvaW4oJzonKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBicmVha3BvaW50IGRhdGE6ICR7YnBTdHJ9YCk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlQnJlYWtwb2ludChicmVha3BvaW50KSB7XHJcbiAgICBjb25zdCBick9iaiA9IGV4dHJhY3RCcmVha3BvaW50RGF0YShicmVha3BvaW50LmJyZWFrcG9pbnRJZCk7XHJcblxyXG4gICAgY29uc3QgYnJMaW5lTnVtYmVyID0gYnJPYmoubGluZU51bWJlciArIDE7IC8vIGZyb20gMC1iYXNlIHRvIDEgYmFzZTtcclxuXHJcbiAgICBpZiAoYnJlYWtwb2ludCAmJiBicmVha3BvaW50LmxvY2F0aW9ucyAmJiBBcnJheS5pc0FycmF5KGJyZWFrcG9pbnQubG9jYXRpb25zKSAmJiBicmVha3BvaW50LmxvY2F0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWtwb2ludC5sb2NhdGlvbnMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJyRmlsZU5hbWUgPSBick9iai5maWxlTmFtZTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUxpbmVOdW1iZXIgPSBpdGVtLmxpbmVOdW1iZXIgKyAxOyAvLyBmcm9tIDAtYmFzZSB0byAxIGJhc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJMaW5lTnVtYmVyICE9PSBpdGVtTGluZU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1zZzogYEJyZWFrcG9pbnRzIHdhcm5pbmcgOiAke2JyRmlsZU5hbWV9IERvbid0IGhhdmUgb3Bwb3J0dW5pdHkgdG8gaGF2ZSBicmVha3BvaW50IGF0IGxpbmUgOiBgLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBickZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGJyTGluZU51bWJlclxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVidWdnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocGlkKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX3BvcnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5faG9zdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdCUCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jbGllbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXNldCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGllbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgPSBbXTtcclxuICAgICAgICB0aGlzLl9maWxlTmFtZUFsaWFzZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzQnlPYmplY3RJZChvYmplY3RJZCwgZGVwdGgsIGVsbSkge1xyXG4gICAgICAgIGxldCBkYXRhID0ge307XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9SdW50aW1lLmdldFByb3BlcnRpZXMoe1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQgOiBvYmplY3RJZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdnZXRQcm9wZXJ0aWVzIGVsbScsIGVsbSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdnZXRQcm9wZXJ0aWVzIGUnLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjbG9uZSAmJiBjbG9uZSAmJiBjbG9uZS5yZXN1bHQpIHtcclxuICAgICAgICAgICAgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBjbG9uZSwge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBkZWxldGVWYWx1ZXMoY2xvbmUucmVzdWx0LCBkZXB0aClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UHJvbWljZUFsbFJlc3VsdChtYXBSZXN1bHRGaWx0ZXJlZCkge1xyXG4gICAgICAgIGxldCBwcm9taXNlQWxsUHJvbWlzZSA9IGF3YWl0IFByb21pc2UuYWxsKG1hcFJlc3VsdEZpbHRlcmVkKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocHJvbWlzZUFsbFByb21pc2UgJiYgQXJyYXkuaXNBcnJheShwcm9taXNlQWxsUHJvbWlzZSkgJiYgcHJvbWlzZUFsbFByb21pc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9taXNlQWxsUHJvbWlzZSA9IHByb21pc2VBbGxQcm9taXNlLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9taXNlQWxsUHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKG9iamVjdElkLCBkZXB0aCwgZWxtKSB7XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgZ2V0UHJvcGVydGllc1Jlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllc0J5T2JqZWN0SWQob2JqZWN0SWQsIGRlcHRoLCBlbG0pO1xyXG5cclxuICAgICAgICBpZiAoZ2V0UHJvcGVydGllc1Jlc3VsdCkge1xyXG4gICAgICAgICAgICBpZiAoZ2V0UHJvcGVydGllc1Jlc3VsdCAmJiBnZXRQcm9wZXJ0aWVzUmVzdWx0LnJlc3VsdCAmJiBBcnJheS5pc0FycmF5KGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcFJlc3VsdCA9IGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0Lm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZS5vYmplY3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzSW5uZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoaXRlbS52YWx1ZS5vYmplY3RJZCwgZGVwdGgrMSwgaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zY29wZUl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnRpZXNJbm5lclJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcFJlc3VsdEZpbHRlcmVkID0gbWFwUmVzdWx0LmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RJZFJlc3BvbnNlOiBPYmplY3QuYXNzaWduKHt9LCBnZXRQcm9wZXJ0aWVzUmVzdWx0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtYXBSZXN1bHRGaWx0ZXJlZCAmJiBBcnJheS5pc0FycmF5KG1hcFJlc3VsdEZpbHRlcmVkKSAmJiBtYXBSZXN1bHRGaWx0ZXJlZC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgdGhpcy5nZXRQcm9taWNlQWxsUmVzdWx0KG1hcFJlc3VsdEZpbHRlcmVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2VBbGxQcm9taXNlICYmIEFycmF5LmlzQXJyYXkocHJvbWlzZUFsbFByb21pc2UpICYmIHByb21pc2VBbGxQcm9taXNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNoaWxkID0gcHJvbWlzZUFsbFByb21pc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RJZFJlc3BvbnNlOiBPYmplY3QuYXNzaWduKHt9LCBnZXRQcm9wZXJ0aWVzUmVzdWx0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3NTY29wZShzY29wZUNoYWluLCBkZXB0aCkge1xyXG4gICAgICAgIGxldCBzY29wZUNoYWluUmVzdWx0ID0gYXdhaXQgc2NvcGVDaGFpbi5tYXAoYXN5bmMgKGNoYWluKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFpbiAmJiBjaGFpbi5vYmplY3QgJiYgY2hhaW4ub2JqZWN0Lm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoYWluLm9iamVjdC5vYmplY3RJZCA9PT0gJ3N0cmluZycgJiYgY2hhaW4udHlwZSAhPT0gJ2dsb2JhbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzKGNoYWluLm9iamVjdC5vYmplY3RJZCwgZGVwdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzY29wZUNoYWluUmVzdWx0ID0gc2NvcGVDaGFpblJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHNjb3BlQ2hhaW5SZXN1bHQpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzQ2FsbEZyYW1lcyhjYWxsRnJhbWVzLCBkZXB0aCkge1xyXG4gICAgICAgIGxldCBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gYXdhaXQgY2FsbEZyYW1lcy5tYXAoYXN5bmMoY2FsbEZyYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsRnJhbWUgJiYgY2FsbEZyYW1lLnNjb3BlQ2hhaW4gJiYgQXJyYXkuaXNBcnJheShjYWxsRnJhbWUuc2NvcGVDaGFpbikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NTY29wZVJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc1Njb3BlKGNhbGxGcmFtZS5zY29wZUNoYWluLCBkZXB0aCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Njb3BlUmVzdWx0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY2FsbEZyYW1lc01hcFJlc3VsdCA9IGNhbGxGcmFtZXNNYXBSZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChjYWxsRnJhbWVzTWFwUmVzdWx0KS50aGVuKHZhbHVlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5CcmVha3BvaW50cyhpdGVtVXJsKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cyAmJiBBcnJheS5pc0FycmF5KHRoaXMuX2JyZWFrcG9pbnRzKSAmJiB0aGlzLl9icmVha3BvaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVVybC50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGgudG9Mb3dlckNhc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsLnRvTG93ZXJDYXNlKCkgPT09IGJwLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGluRmlsZU5hbWVBbGlhc2VzKGZpbGVOYW1lKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9maWxlTmFtZUFsaWFzZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLl9maWxlTmFtZUFsaWFzZXMpICYmIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5tYXAoKGFsaWFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMgJiZcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcy50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUudG9Mb3dlckNhc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGlhcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29udGludWVDb25uZWN0KCkge1xyXG5cclxuICAgICAgICB0aGlzLl9jbGllbnQub24oJ0RlYnVnZ2VyLnNjcmlwdFBhcnNlZCcsIGFzeW5jKG0pID0+IHtcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS51cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLnVybC50b0xvd2VyQ2FzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVsYyA9IG0udXJsLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRGb3JDaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZFJlc3VsdCA9IHRoaXMuX2JyZWFrcG9pbnRzLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3JpZ2luICYmIGl0ZW0ub3JpZ2luLnNjcmlwdFBhdGggJiYgaXRlbS5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJlYWtwb2ludGxjID0gaXRlbS5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50bGMgPT09IGZpbGVsYyAmJiBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoICE9PSBtLnVybCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsZU5hbWVBbGlhc2VzLmluY2x1ZGVzKG0udXJsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWxlTmFtZUFsaWFzZXMucHVzaChtLnVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0RlYnVnZ2VyLnBhdXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vcmw6IG0udXJsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5tYXAoKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLm1VcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZS5icmVha3BvaW50Lm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGggPT09IGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludC5vcmlnaW4uc2NyaXB0UGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFBhdGg6IGJyZWFrcG9pbnRGb3JDaGFuZ2UubVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogYnAub3JpZ2luLmxpbmVOdW1iZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheShicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbikgJiYgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0ID0gYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ubWFwKGFzeW5jKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0QnJlYWtwb2ludChicC5zY3JpcHRQYXRoLCBicC5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0ID0gYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQpLnRoZW4oYXN5bmModmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZXN1bWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnBhdXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xpZW50Lm9uKCdEZWJ1Z2dlci5wYXVzZWQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZS5yZWFzb24gPT09ICdCcmVhayBvbiBzdGFydCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Jyb2tlT25TdGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgZGVidWdnZXIgZG9lc24ndCBzZWVtIHRvIHJlbW92ZSBicmVha3BvaW50cyB3aGVuIHVzaW5nIHJlbW92ZUJyZWFrcG9pbnRcclxuICAgICAgICAgICAgICAgIC8vIGFuZCAnc29tZXRoaW5nJyBpcyBzdGlsbCBnZXR0aW5nIGhpdC4gbm90IGNsZWFyIHdoeSB0aGlzIGlzIGhhcHBlbmluZy5cclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHdlIGVtaXQgYnJlYWsgZXZlbnQgb25seSBpZiBtYXRjaGluZyBicmVha3BvaW50IHN0aWxsIGV4aXN0cyBpbiB0aGlzLl9icmVha3BvaW50c1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgZUNhbGxGcmFtZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmNhbGxGcmFtZXMgJiYgQXJyYXkuaXNBcnJheShlLmNhbGxGcmFtZXMpICYmIGUuY2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5jYWxsRnJhbWVzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnVybCAmJiB0aGlzLmluQnJlYWtwb2ludHMoaXRlbS51cmwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRzTWFwUmVzdWx0ID0gdGhpcy5fYnJlYWtwb2ludHMubWFwKGFzeW5jKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9ucyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lc1swXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnNbMF0uc2NyaXB0SWQgPT09IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLnNjcmlwdElkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9uc1swXS5saW5lTnVtYmVyID09PSBlQ2FsbEZyYW1lc1swXS5sb2NhdGlvbi5saW5lTnVtYmVyKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsRGVwdGggPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5jYWxsRnJhbWVzICYmIEFycmF5LmlzQXJyYXkoZS5jYWxsRnJhbWVzKSAmJiBlLmNhbGxGcmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlU2NyaXB0SWRBcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxGcmFtZXMgPSBlLmNhbGxGcmFtZXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZGVkID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoYnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50LmJyZWFrcG9pbnRJZC5lbmRzV2l0aChpdGVtLnVybCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubG9jYXRpb24gJiYgaXRlbS5sb2NhdGlvbi5zY3JpcHRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTY3JpcHRJZEFyci5pbmNsdWRlcyhpdGVtLmxvY2F0aW9uLnNjcmlwdElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlU2NyaXB0SWRBcnIucHVzaChpdGVtLmxvY2F0aW9uLnNjcmlwdElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxGcmFtZXMubWFwKGFzeW5jKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludHMgPSBhd2FpdCB0aGlzLmdldFBvc3NpYmxlQnJlYWtwb2ludHMoaXRlbS5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdFNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0U2NyaXB0U291cmNlKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0U291cmNlU3BsaXQgPSBzY3JpcHRTb3VyY2Uuc2NyaXB0U291cmNlLnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTGluZU51bWJlcnNMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0U291cmNlU3BsaXQgJiYgQXJyYXkuaXNBcnJheShzY3JpcHRTb3VyY2VTcGxpdCkgJiYgc2NyaXB0U291cmNlU3BsaXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUxpbmVOdW1iZXJzTGVuZ3RoID0gc2NyaXB0U291cmNlU3BsaXQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlIGhvdyBkZWJidWdlciBzZWUgc2NyaXB0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0U291cmNlU3BsaXQubWFwKChzY3JpcHRTb3VyY2VJdGVtLCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygoaWR4KSArICcgJyArIHNjcmlwdFNvdXJjZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHM6IHBvc3NpYmxlQnJlYWtwb2ludHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBpdGVtLnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaW5lTnVtYmVyc0xlbmd0aDogZmlsZUxpbmVOdW1iZXJzTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0U2NyaXB0U291cmNlIGUnLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbEZyYW1lc01hcFJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc0NhbGxGcmFtZXMoY2FsbEZyYW1lcywgaW5pdGlhbERlcHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gY2FsbEZyYW1lc01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbEZyYW1lc01hcFJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzTWFwUmVzdWx0ID0gYnJlYWtwb2ludHNNYXBSZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoYnJlYWtwb2ludHNNYXBSZXN1bHQpLnRoZW4oYXN5bmMgKHNjb3BlQ2hhaW5UcmVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlQ2hhaW5UcmVlICYmIEFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWUpICYmIHNjb3BlQ2hhaW5UcmVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVDaGFpblRyZWUgPSBzY29wZUNoYWluVHJlZS5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnREYXRhID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB3ZSBhbHdheXMgc2VuZCBicmVha3BvaW50IG9mIHRoZSB0b3AgY2FsbCBmcmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZUNhbGxGcmFtZXMgJiYgZUNhbGxGcmFtZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnREYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLmxpbmVOdW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRyYW5zZm9ybVRvSURFU3R5bGUoZUNhbGxGcmFtZXNbMF0udXJsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFZhcmlhYmxlc0Zyb21TY29wZUNoYWluVHJlZShicmVha3BvaW50RGF0YS52YXJpYWJsZXMsIHNjb3BlQ2hhaW5UcmVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlKGJyZWFrcG9pbnREYXRhLnZhcmlhYmxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludEVycm9ycykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzc2V0ID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9yaWdpbi5saW5lTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGl0ZW0ub3JpZ2luLmxpbmVOdW1iZXIpKzEgPT09IHBhcnNlSW50KGJyZWFrcG9pbnREYXRhLmxpbmVOdW1iZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sb2NhdGlvbnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLmxvY2F0aW9ucykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sb2NhdGlvbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucy5maW5kKGxvYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQobG9jLmxpbmVOdW1iZXIpID09PSBwYXJzZUludChicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaXRlbS5vcmlnaW4ubGluZU51bWJlcikgIT09IDEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYnJlYWtwb2ludERhdGEubGluZU51bWJlcikgIT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFsQnJmaW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzLm1hcCgoYnJlYWtwb2ludEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2JyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBickZpbGVOYW1lID0gdHJhbnNmb3JtVG9JREVTdHlsZShici5vcmlnaW4uc2NyaXB0UGF0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NzaWJsZUJyZWFrcG9pbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhID0gcG9zc2libGVCcmVha3BvaW50c0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5maWxlID09PSBlQ2FsbEZyYW1lc1swXS51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBickZpbGVOYW1lID09PSBicmVha3BvaW50RGF0YS5maWxlTmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZUJyZWFrcG9pbnREYXRhLmZpbGVMaW5lTnVtYmVyc0xlbmd0aCAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlcisxID09PSBici5vcmlnaW4ubGluZU51bWJlciB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnIub3JpZ2luLmxpbmVOdW1iZXIrMSA9PT0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsQnJmaW5kZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVhbEJyZmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnREYXRhLnJlc29sdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NzaWJsZUJyZWFrcG9pbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocG9zc2libGVCcmVha3BvaW50c0RhdGEpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSA9IHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZmlsZSA9PT0gZUNhbGxGcmFtZXNbMF0udXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlcisxID49IHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlciA9IHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludEVycm9ycykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubWFwKChicmVha3BvaW50RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lICYmIGJyZWFrcG9pbnRFcnJvci5saW5lKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWdub3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVCcmVha3BvaW50c0RhdGEgJiYgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiYgcG9zc2libGVCcmVha3BvaW50c0RhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEubWFwKChpdGVtKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmlsZSA9IHRyYW5zZm9ybVRvSURFU3R5bGUoaXRlbS5maWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmlsZSA9PT0gYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbS5maWxlTGluZU51bWJlcnNMZW5ndGggIT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRFcnJvci5saW5lID49IGl0ZW0uZmlsZUxpbmVOdW1iZXJzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gYnJlYWtwb2ludEVycm9yLmxpbmUgLSAyOyAvLyAvLyMgc291cmNlTWFwcGluZ1VSTCBhbmQgfS5jYWxsKHRoaXMsIGV4cG9ydHMsIHJlcXVpcmUsIG1vZHVsZSwgX19maWxlbmFtZSwgX19kaXJuYW1lKTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gYnJlYWtwb2ludEVycm9yLmxpbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJyZWFrcG9pbnRzICYmIEFycmF5LmlzQXJyYXkoaXRlbS5icmVha3BvaW50cykgJiYgaXRlbS5icmVha3BvaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLm1zZy5pbmNsdWRlcygnUG9zc2libGUgYnJlYWtwb2ludCBsaW5lcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJyZWFrcG9pbnRzLmluY2x1ZGVzKGxpbmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBicmVha3BvaW50RXJyb3IubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgJHtsaW5lfS4gYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBQb3NzaWJsZSBicmVha3BvaW50IGxpbmVzIDogJHtpdGVtLmJyZWFrcG9pbnRzLm1hcCgobGluZSkgPT4gbGluZSkuam9pbignLCAnKX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRFcnJvciAmJiBicmVha3BvaW50RXJyb3IubXNnICYmIGJyZWFrcG9pbnRFcnJvci5tc2cuaW5jbHVkZXMoJ3Bvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBicmVha3BvaW50RXJyb3IubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgJHtsaW5lfS4gYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gJyBGaWxlIGRvblxcJ3QgaGF2ZSBwb3NzaWJsZSBicmVha3BvaW50IGxpbmVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha0Vycm9yJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1zZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBicmVha3BvaW50RXJyb3IubGluZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucmVhc29uID09PSAnT09NJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0IG9mIG1lbW9yeSBsZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSwgcmVhc29uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYnJlYWtwb2ludHNNYXBSZXN1bHQgcmVzIHJlYXNvbicgLCByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudC5vbignRGVidWdnZXIuYnJlYWtwb2ludFJlc29sdmVkJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkJyZWFrcG9pbnRSZXNvbHZlZChlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBEZWJ1Z2dlciwgUnVudGltZSB9ID0gdGhpcy5fY2xpZW50O1xyXG4gICAgICAgIHRoaXMuX0RlYnVnZ2VyID0gRGVidWdnZXI7XHJcbiAgICAgICAgdGhpcy5fUnVudGltZSA9IFJ1bnRpbWU7XHJcbiAgICAgICAgUnVudGltZS5lbmFibGUoKTtcclxuICAgICAgICBEZWJ1Z2dlci5lbmFibGUoKTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyh7IHN0YXRlOiAnbm9uZScgfSk7XHJcbiAgICAgICAgRGVidWdnZXIuc2V0QXN5bmNDYWxsU3RhY2tEZXB0aCh7IG1heERlcHRoOiAzMiB9KTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRCbGFja2JveFBhdHRlcm5zKHsgcGF0dGVybnM6IFtdIH0pO1xyXG4gICAgICAgIC8vIG9ubHkgdXNlICdhd2FpdCcgZm9yIHRoZSBsYXN0IGNhbGwsIGFsbCBwcmV2aW91cyBjYWxsIHRvIERlYnVnZ2VyIG9yIFJ1bnRpbWUgd2lsbCBzdGFjayBvdGhlcndpc2VcclxuICAgICAgICBhd2FpdCBSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7XHJcbiAgICAgICAgLy8gYXdhaXQgZm9yIHRoZSBmaXJzdCBicmVha3BvaW50IHdoaWNoIGlzIHBsYWNlZCBieSB0aGUgZGVidWdnZXIgYXV0b21hdGljYWxseSBcclxuICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5wYXVzZWQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3JlYWR5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25CcmVha3BvaW50UmVzb2x2ZWQoZSkge1xyXG4gICAgICAgIC8vIGJyZWFrcG9pbnRzIHNldCBiZWZvcmUgdGhlIHNjcmlwdCB3YXMgbG9hZGVkIHdpbGwgYmUgcmVzb2x2ZWQgb25jZSBpdCBsb2Fkc1xyXG4gICAgICAgIGZvciAodmFyIGJwIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGJwICYmXHJcbiAgICAgICAgICAgICAgICBlICYmXHJcbiAgICAgICAgICAgICAgICBicC5icmVha3BvaW50SWQgPT09IGUuYnJlYWtwb2ludElkXHJcbiAgICAgICAgICAgICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0ZVJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGlmICggZS5sb2NhdGlvbiApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlZCBvbiBydW50aW1lXHJcbiAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zID0gW2UubG9jYXRpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVCcmVha3BvaW50KGJwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGUubG9jYXRpb25zICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIG9uIHBhdXNlXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUJyZWFrcG9pbnQoYnApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaCh2YWxpZGF0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0byBhIGRlYnVnZ2VyLiBEb2VzIG5vdGhpbmcgaWYgYWxyZWFkeSBjb25uZWN0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERlYnVnZ2VyIHBvcnQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNvbm5lY3QocG9ydCwgaG9zdCkge1xyXG4gICAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xyXG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG5cclxuICAgICAgICBsZXQgc25vb3plVGltZSA9IDEwMDA7XHJcbiAgICAgICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgQ09OTkVDVF9SRVRSSUVTOyByZXRyaWVzKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudCA9IGF3YWl0IENEUCh7IHBvcnQ6IHRoaXMuX3BvcnQsIGhvc3Q6IHRoaXMuX2hvc3QgfSk7XHJcbiAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxvZy53YXJuKGBEZWJ1Z2dlciBjb25uZWN0aW9uIGZhaWxlZC4gV2lsbCByZXRyeSBpbiAke3Nub296ZVRpbWUvMTAwMH1zLiBFcnJvcjogYCwgbGFzdEVycm9yKTtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKHNub296ZVRpbWUpO1xyXG4gICAgICAgICAgICBzbm9vemVUaW1lICo9IENPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnLCBsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmNvbnRpbnVlQ29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGJyZWFrcG9pbnQgZm9yIGEgcGFydGljdWxhciBzY3JpcHQuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU2NyaXB0IHBhdGguXHJcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IExpbmUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZXRCcmVha3BvaW50KHNjcmlwdFBhdGgsIGxpbmVOdW1iZXIpIHtcclxuICAgICAgICBsZXQgZmlsZU5hbWUgPSBzY3JpcHRQYXRoO1xyXG5cclxuICAgICAgICBjb25zdCBhbGlhc1Jlc3VsdCA9IHRoaXMuaW5GaWxlTmFtZUFsaWFzZXMoZmlsZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoYWxpYXNSZXN1bHQpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSBhbGlhc1Jlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZpbGVOYW1lID0gdXJsLnBhdGhUb0ZpbGVVUkwoZmlsZU5hbWUpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IGVyciA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBicmVha3BvaW50ID0gYXdhaXQgdGhpcy5fRGVidWdnZXIuc2V0QnJlYWtwb2ludEJ5VXJsKHtcclxuICAgICAgICAgICAgdXJsOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlci0xLCAvLyBmcm9tIDEtYmFzZSB0byAwLWJhc2VcclxuICAgICAgICAgICAgY29sdW1uTnVtYmVyOiAwXHJcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIGVyciA9IGU7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvciB3aGVuIHRyeWluZyB0byBzZXQgYW4gbGFyZWFkeSBleGlzdGluZyBicmVha3BvaW50XHJcbiAgICAgICAgICAgIGlmICghZS5yZXNwb25zZSB8fCBlLnJlc3BvbnNlLm1lc3NhZ2UgIT09ICdCcmVha3BvaW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cy4nKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBicmVha3BvaW50Lm9yaWdpbiA9IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdFBhdGg6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlclxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMucHVzaChicmVha3BvaW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha3BvaW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgYnJlYWNrcG9pbnQgcmVzb2x2ZWQgc3VjY2Vzc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkJyZWFrcG9pbnRSZXNvbHZlZChicmVha3BvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyZWFrcG9pbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0QnJlYWtwb2ludHNBY3RpdmUoYWN0aXZlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX0RlYnVnZ2VyICYmIHRoaXMuX0RlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZSh7J2FjdGl2ZSc6IGFjdGl2ZX0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRCcmVha3BvaW50c0FjdGl2ZShhY3RpdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnRJZCkge1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzID0gdGhpcy5fYnJlYWtwb2ludHMuZmlsdGVyKChicCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYnAuYnJlYWtwb2ludElkICE9PSBicmVha3BvaW50SWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZUJyID0geyBicmVha3BvaW50SWQ6IGJyZWFrcG9pbnRJZCB9O1xyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludChyZW1vdmVCcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXN1bWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXN1bWVUZXJtaW5hdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLmRpc2FibGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlKGZpbGVQYXRoLCBpbnB1dExpbmUpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsZVBhdGhBbGlhcyA9IHRoaXMuaW5GaWxlTmFtZUFsaWFzZXMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5lID0gaW5wdXRMaW5lIC0gMTsgLy8gZnJvbSAxLWJhc2UgdG8gMC1iYXNlXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBiIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIuYnJlYWtwb2ludElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gYi5icmVha3BvaW50SWQuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU51bWJlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7IC8vIHBhdGggbWF5IGNvbnRhaW4gYSBEcml2ZSBsZXR0ZXIgb24gd2luMzJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTJdICsgJzonICsgcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVOYW1lID09PSBmaWxlUGF0aCB8fCBmaWxlTmFtZSA9PT0gZmlsZVBhdGhBbGlhcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxpbmVOdW1iZXIgPT09IGxpbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZWxmLnJlbW92ZUJyZWFrcG9pbnQoYi5icmVha3BvaW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHdoZW4gd29yayB3aXRoIGJyZWFrcG9pbnQgZGF0YTonLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xlYXJCcmVha3BvaW50cygpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgYiBvZiB0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2VsZi5yZW1vdmVCcmVha3BvaW50KGIuYnJlYWtwb2ludElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHN0YXJ0TG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBjb25zdCBwb3NzaWJsZUJyZWFrcG9pbnRzID0gYXdhaXQgdGhpcy5fRGVidWdnZXIuZ2V0UG9zc2libGVCcmVha3BvaW50cyh7XHJcbiAgICAgICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogc3RhcnRMb2NhdGlvbi5zY3JpcHRJZCxcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IDAsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXI6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocG9zc2libGVCcmVha3BvaW50cyAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzLmxvY2F0aW9ucyAmJiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zKSAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzLmxvY2F0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0ubGluZU51bWJlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gaXRlbS5saW5lTnVtYmVyICsgMTsgLy8gZnJvbSAwLWJhc2UgdG8gMS1iYXNlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaW5jbHVkZXMobGluZU51bWJlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsaW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHAgPSByZXN1bHQucG9wKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmluY2x1ZGVzKHAtMSkpIHtcclxuICAgICAgICAgICAgICAgIC8vaW5nb3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocC0xID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHAtMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0U2NyaXB0U291cmNlKHNjcmlwdElkKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZSh7IHNjcmlwdElkOiBzY3JpcHRJZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbG9zZSgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlKHZhcmlhYmxlcywgc2NvcGVDaGFpblRyZWUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjb3BlQ2hhaW5UcmVlKVxyXG4gICAgICAgICAgICB8fCBzY29wZUNoYWluVHJlZS5sZW5ndGggPT0gMFxyXG4gICAgICAgICAgICB8fCAhQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZVswXSlcclxuICAgICAgICAgICAgfHwgc2NvcGVDaGFpblRyZWVbMF0ubGVuZ3RoID09IDBcclxuICAgICAgICAgICAgfHwgIUFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWVbMF1bMF0pXHJcbiAgICAgICAgICAgIHx8IHNjb3BlQ2hhaW5UcmVlWzBdWzBdLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYmplY3RJZFJlc3BvbnNlIH0gPSBzY29wZUNoYWluVHJlZVswXVswXVswXTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gb2JqZWN0SWRSZXNwb25zZTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNjb3BlVmFyIG9mIHJlc3VsdCkge1xyXG4gICAgICAgICAgICBpZiAoIUlHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMuaW5jbHVkZXMoc2NvcGVWYXIubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlVmFyICYmIHNjb3BlVmFyLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHNjb3BlVmFyLnZhbHVlLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlVmFyLnZhbHVlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2NvcGVWYXIudmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLnRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZShzY29wZVZhci52YWx1ZS5vYmplY3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHNjb3BlVmFyLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSB8fCAndW5kZWZpbmVkJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZShvYmplY3RJZCkge1xyXG4gICAgICAgIGlmICghb2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyByZXN1bHQgfSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZ2V0UHJvcGVydGllcyh7IG9iamVjdElkIH0pO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpWYWx1ZSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2gocHJvcERlc2MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wRGVzYy52YWx1ZSAmJiBwcm9wRGVzYy52YWx1ZS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpWYWx1ZVtwcm9wRGVzYy5uYW1lXSA9IHByb3BEZXNjLnZhbHVlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUuZ2V0UHJvcGVydGllcyBjYWxsIGZhaWxlZCcsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFkZE94eWdlblZhcmlhYmxlc0Zyb21HbG9iYWxTY29wZSh2YXJpYWJsZXMpIHtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogcG9FdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3BvJywgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogZW52RXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICdlbnYnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiB2YXJzRXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICd2YXJzJywgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogcGFyYW1zRXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICdwYXJhbXMnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB7XHJcbiAgICAgICAgICAgIHBvOiBwb0V2YWxSZXN1bHQsXHJcbiAgICAgICAgICAgIGVudjogZW52RXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgdmFyczogdmFyc0V2YWxSZXN1bHQsXHJcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zRXZhbFJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1trZXldO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKSB7XHJcbiAgICAgICAgdmFyIGJwcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGIgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBiLmJyZWFrcG9pbnRJZC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGxldCBsaW5lTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHsgLy8gcGF0aCBtYXkgY29udGFpbiBhIERyaXZlIGxldHRlciBvbiB3aW4zMlxyXG4gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMl0gKyAnOicgKyBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pKzE7IC8vZnJvbSAwLWJhc2UgdG8gMS1iYXNlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSkrMTsgLy9mcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSBmaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgYnBzLnB1c2gobGluZU51bWJlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aEFsaWFzID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZVBhdGhBbGlhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJwcy5wdXNoKGxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBicHM7XHJcbiAgICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFhQSxZQUFZOztBQUFDO0VBQUE7QUFBQTtBQUFBO0FBQUE7QUFFYjtBQUlBO0FBQXNCO0FBSHRCLE1BQU1BLEdBQUcsR0FBRyxJQUFBQyxlQUFNLEVBQUMsVUFBVSxDQUFDO0FBQzlCLE1BQU07RUFBRUM7QUFBYSxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDMUMsTUFBTUMsR0FBRyxHQUFHRCxPQUFPLENBQUMsbUNBQW1DLENBQUM7QUFHeEQsTUFBTUUsZUFBZSxHQUFHLENBQUM7QUFDekIsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBQztBQUN0QyxNQUFNQyxT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
966
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGVidWdnZXIuanMiXSwibmFtZXMiOlsibG9nIiwiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsIkNEUCIsIkNPTk5FQ1RfUkVUUklFUyIsIkNPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQiLCJNQVhfREVQVEgiLCJJR05PUkVfU0NPUEVfQ0hBSU5fVkFSSUFCTEVTIiwibWF4RmluZGVkRGVwdGgiLCJ0cmFuc2Zvcm1Ub0lERVN0eWxlIiwiZmlsZU5hbWUiLCJ1cmlJbmRleCIsImluZGV4T2YiLCJicERhdGEiLCJzdWJzdHJpbmciLCJ1cmkiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwidXJsIiwiZmlsZVVSTFRvUGF0aCIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImRlbGV0ZVZhbHVlcyIsImFyciIsImRlcHRoIiwicmVzdWx0IiwibWFwIiwiaXRlbSIsInZhbHVlIiwiY2xhc3NOYW1lIiwiY2xvbmVWYWx1ZSIsIk9iamVjdCIsImFzc2lnbiIsIm9iamVjdElkIiwiY2xvbmUiLCJleHRyYWN0QnJlYWtwb2ludERhdGEiLCJicFN0ciIsInBhcnRzIiwic3BsaXQiLCJsaW5lTnVtYmVyIiwicGFyc2VJbnQiLCJzcGxpY2UiLCJqb2luIiwidmFsaWRhdGVCcmVha3BvaW50IiwiYnJlYWtwb2ludCIsImJyT2JqIiwiYnJlYWtwb2ludElkIiwiYnJMaW5lTnVtYmVyIiwibG9jYXRpb25zIiwiQXJyYXkiLCJpc0FycmF5IiwiYnJGaWxlTmFtZSIsIml0ZW1MaW5lTnVtYmVyIiwibXNnIiwibGluZSIsIkRlYnVnZ2VyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJfcGlkIiwiX3BvcnQiLCJ1bmRlZmluZWQiLCJfaG9zdCIsIl9icmVha3BvaW50cyIsIl9wZW5kaW5nQlAiLCJfcGF1c2VkIiwiX2NsaWVudCIsIl9maWxlTmFtZUFsaWFzZXMiLCJfYnJlYWtwb2ludEVycm9ycyIsInJlc2V0IiwiY2xvc2UiLCJnZXRQcm9wZXJ0aWVzQnlPYmplY3RJZCIsImVsbSIsImRhdGEiLCJfUnVudGltZSIsImdldFByb3BlcnRpZXMiLCJnZXRQcm9taWNlQWxsUmVzdWx0IiwibWFwUmVzdWx0RmlsdGVyZWQiLCJwcm9taXNlQWxsUHJvbWlzZSIsImFsbCIsInRoZW4iLCJmaWx0ZXIiLCJwcm9taXNlcyIsImdldFByb3BlcnRpZXNSZXN1bHQiLCJtYXBSZXN1bHQiLCJnZXRQcm9wZXJ0aWVzSW5uZXJSZXN1bHQiLCJzY29wZUl0ZW0iLCJvYmplY3RJZFJlc3BvbnNlIiwiY2hpbGQiLCJ2YWx1ZXMiLCJwcm9jZXNzU2NvcGUiLCJzY29wZUNoYWluIiwic2NvcGVDaGFpblJlc3VsdCIsImNoYWluIiwib2JqZWN0IiwidHlwZSIsImVsIiwicHJvY2Vzc0NhbGxGcmFtZXMiLCJjYWxsRnJhbWVzIiwiY2FsbEZyYW1lc01hcFJlc3VsdCIsImNhbGxGcmFtZSIsInByb2Nlc3NTY29wZVJlc3VsdCIsImluQnJlYWtwb2ludHMiLCJpdGVtVXJsIiwiYnAiLCJ0b0xvd2VyQ2FzZSIsIm9yaWdpbiIsInNjcmlwdFBhdGgiLCJpbkZpbGVOYW1lQWxpYXNlcyIsImFsaWFzIiwiY29udGludWVDb25uZWN0Iiwib24iLCJtIiwiZmlsZWxjIiwiYnJlYWtwb2ludEZvckNoYW5nZSIsImZpbmRSZXN1bHQiLCJmaW5kIiwiYnJlYWtwb2ludGxjIiwiaW5jbHVkZXMiLCJwdXNoIiwiX0RlYnVnZ2VyIiwicGF1c2UiLCJtVXJsIiwiYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24iLCJicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdCIsInNldEJyZWFrcG9pbnQiLCJyZXN1bWUiLCJyZWFzb24iLCJfYnJva2VPblN0YXJ0IiwicG9zc2libGVCcmVha3BvaW50c0RhdGEiLCJlQ2FsbEZyYW1lcyIsImJyZWFrcG9pbnRzTWFwUmVzdWx0Iiwic2NyaXB0SWQiLCJsb2NhdGlvbiIsImluaXRpYWxEZXB0aCIsInVuaXF1ZVNjcmlwdElkQXJyIiwiZmluZGVkIiwiZW5kc1dpdGgiLCJwb3NzaWJsZUJyZWFrcG9pbnRzIiwiZ2V0UG9zc2libGVCcmVha3BvaW50cyIsInNjcmlwdFNvdXJjZSIsImdldFNjcmlwdFNvdXJjZSIsInNjcmlwdFNvdXJjZVNwbGl0IiwiZmlsZUxpbmVOdW1iZXJzTGVuZ3RoIiwiYnJlYWtwb2ludHMiLCJmaWxlIiwic2NvcGVDaGFpblRyZWUiLCJicmVha3BvaW50RGF0YSIsInZhcmlhYmxlcyIsImFkZFZhcmlhYmxlc0Zyb21TY29wZUNoYWluVHJlZSIsImFkZE94eWdlblZhcmlhYmxlc0Zyb21HbG9iYWxTY29wZSIsImlzc2V0IiwibG9jIiwicmVhbEJyZmluZGVkIiwiYnJlYWtwb2ludEVycm9yIiwiYnIiLCJwb3NzaWJsZUJyZWFrcG9pbnREYXRhIiwicmVzb2x2ZWQiLCJlbWl0IiwiaWdub3JlIiwibWVzc2FnZSIsImNvbnRpbnVlIiwib25CcmVha3BvaW50UmVzb2x2ZWQiLCJSdW50aW1lIiwiZW5hYmxlIiwic2V0UGF1c2VPbkV4Y2VwdGlvbnMiLCJzdGF0ZSIsInNldEFzeW5jQ2FsbFN0YWNrRGVwdGgiLCJtYXhEZXB0aCIsInNldEJsYWNrYm94UGF0dGVybnMiLCJwYXR0ZXJucyIsInJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyIiwicGF1c2VkIiwidmFsaWRhdGVSZXN1bHQiLCJjb25uZWN0IiwicG9ydCIsImhvc3QiLCJzbm9vemVUaW1lIiwibGFzdEVycm9yIiwicmV0cmllcyIsIndhcm4iLCJhbGlhc1Jlc3VsdCIsInBhdGhUb0ZpbGVVUkwiLCJ0b1N0cmluZyIsImVyciIsInNldEJyZWFrcG9pbnRCeVVybCIsImNvbHVtbk51bWJlciIsImNhdGNoIiwicmVzcG9uc2UiLCJzZXRCcmVha3BvaW50c0FjdGl2ZSIsImFjdGl2ZSIsInJlbW92ZUJyZWFrcG9pbnQiLCJyZW1vdmVCciIsInJlc3VtZVRlcm1pbmF0ZSIsImRpc2FibGUiLCJyZW1vdmVCcmVha3BvaW50QnlWYWx1ZSIsImZpbGVQYXRoIiwiaW5wdXRMaW5lIiwiZmlsZVBhdGhBbGlhcyIsInNlbGYiLCJiIiwiY2xlYXJCcmVha3BvaW50cyIsInN0YXJ0TG9jYXRpb24iLCJzdGFydCIsInAiLCJwb3AiLCJzY29wZVZhciIsIm5hbWUiLCJ0cnlUb1JldHJpZXZlT2JqZWN0VmFsdWUiLCJvYmpWYWx1ZSIsImZvckVhY2giLCJwcm9wRGVzYyIsInBvRXZhbFJlc3VsdCIsImV2YWx1YXRlIiwiZXhwcmVzc2lvbiIsInJldHVybkJ5VmFsdWUiLCJlbnZFdmFsUmVzdWx0IiwidmFyc0V2YWxSZXN1bHQiLCJwYXJhbXNFdmFsUmVzdWx0IiwicmVzdWx0cyIsInBvIiwiZW52IiwidmFycyIsInBhcmFtcyIsImtleXMiLCJrZXkiLCJnZXRCcmVha3BvaW50cyIsImJwcyJdLCJtYXBwaW5ncyI6IkFBYUE7Ozs7Ozs7OztBQUVBOztBQUlBOzs7O0FBSEEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLFVBQVAsQ0FBWjs7QUFDQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBbUJDLE9BQU8sQ0FBQyxRQUFELENBQWhDOztBQUNBLE1BQU1DLEdBQUcsR0FBR0QsT0FBTyxDQUFDLG1DQUFELENBQW5COztBQUdBLE1BQU1FLGVBQWUsR0FBRyxDQUF4QjtBQUNBLE1BQU1DLDRCQUE0QixHQUFHLENBQXJDO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLENBQWxCO0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsQ0FDakMsU0FEaUMsRUFFakMsU0FGaUMsRUFHakMsUUFIaUMsRUFJakMsWUFKaUMsRUFLakMsV0FMaUMsQ0FBckM7QUFPQSxJQUFJQyxjQUFjLEdBQUcsQ0FBckI7O0FBRUEsTUFBTUMsbUJBQW1CLEdBQUlDLFFBQUQsSUFBYztBQUN0QyxNQUFJO0FBQ0EsVUFBTUMsUUFBUSxHQUFHRCxRQUFRLENBQUNFLE9BQVQsQ0FBaUIsT0FBakIsQ0FBakI7QUFDQSxVQUFNQyxNQUFNLEdBQUdILFFBQVEsQ0FB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Uy9FLFVBQVQ7QUFDSCxPQUZELE1BRU87QUFDSCxjQUFNOEosYUFBYSxHQUFHLEtBQUsxRixpQkFBTCxDQUF1QndGLFFBQXZCLENBQXRCOztBQUNBLFlBQUlFLGFBQUosRUFBbUI7QUFDZjZCLFVBQUFBLEdBQUcsQ0FBQzVHLElBQUosQ0FBUy9FLFVBQVQ7QUFDSDtBQUNKO0FBQ0o7O0FBQ0QsV0FBTzJMLEdBQVA7QUFDSDs7QUFuN0I4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogVjggZGVidWdnZXIgY2xpZW50LlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignRGVidWdnZXInKTtcclxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xyXG5jb25zdCBDRFAgPSByZXF1aXJlKCdAb3h5Z2VuaHEvY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnKTtcclxuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xyXG5cclxuY29uc3QgQ09OTkVDVF9SRVRSSUVTID0gNDtcclxuY29uc3QgQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVCA9IDI7XHJcbmNvbnN0IE1BWF9ERVBUSCA9IDU7XHJcbmNvbnN0IElHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMgPSBbXHJcbiAgICAnZXhwb3J0cycsXHJcbiAgICAncmVxdWlyZScsXHJcbiAgICAnbW9kdWxlJyxcclxuICAgICdfX2ZpbGVuYW1lJyxcclxuICAgICdfX2Rpcm5hbWUnXHJcbl07XHJcbmxldCBtYXhGaW5kZWREZXB0aCA9IDA7XHJcblxyXG5jb25zdCB0cmFuc2Zvcm1Ub0lERVN0eWxlID0gKGZpbGVOYW1lKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHVyaUluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZignZmlsZTonKTtcclxuICAgICAgICBjb25zdCBicERhdGEgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgdXJpSW5kZXgpO1xyXG4gICAgICAgIGxldCB1cmkgPSBmaWxlTmFtZS5zdWJzdHJpbmcodXJpSW5kZXgpO1xyXG4gICAgICAgIC8vIGZpeCBVTkMgcGF0aHNcclxuICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiB1cmkuc3RhcnRzV2l0aCgnZmlsZTovLy8nKSkge1xyXG4gICAgICAgICAgICB1cmkgPSAnZmlsZTovLycgKyB1cmkuc3Vic3RyaW5nKCdmaWxlOi8vLycubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJwRGF0YSArIHVybC5maWxlVVJMVG9QYXRoKHVyaSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3RyYW5zZm9ybVRvSURFU3R5bGUgZmlsZU5hbWUnLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcigndHJhbnNmb3JtVG9JREVTdHlsZSBlcnJvcicsIGUpO1xyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXHJcbmNvbnN0IHNub296ZSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuY29uc3QgZGVsZXRlVmFsdWVzID0gKGFyciwgZGVwdGgpID0+IHtcclxuXHJcbiAgICBpZiAoZGVwdGggPiBtYXhGaW5kZWREZXB0aCkge1xyXG4gICAgICAgIG1heEZpbmRlZERlcHRoID0gZGVwdGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQgPSBhcnIubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLmNsYXNzTmFtZSAmJiBpdGVtLnZhbHVlLmNsYXNzTmFtZSA9PT0gJ0Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZVZhbHVlID0gT2JqZWN0LmFzc2lnbihpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgZGVsZXRlIGNsb25lVmFsdWUub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmFzc2lnbihpdGVtLCB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY2xvbmVWYWx1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVsZXRlIGNsb25lLm9iamVjdElkO1xyXG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RCcmVha3BvaW50RGF0YShicFN0cikge1xyXG4gICAgaWYgKCFicFN0ciB8fCB0eXBlb2YgYnBTdHIgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBicFN0ciA9IHRyYW5zZm9ybVRvSURFU3R5bGUoYnBTdHIpO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYnBTdHIuc3BsaXQoJzonKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuXHJcbiAgICAgICAgLy8gcm9tb3ZlIGZpbGUgbnVtYmVyLCBsaW5lIG51bWJlciwgY29sdW1uIG51bWJlclxyXG4gICAgICAgIHBhcnRzLnNwbGljZSgwLCAzKTtcclxuXHJcbiAgICAgICAgLy8gbG9va3MgbGluZSBuZWVkIG9ubHkgZm9yIHdpbmRvd3MgcGF0aCB3aGl0aCBkaXNrLCBsaWtlIEM6Ly9cclxuICAgICAgICAvLyBmb3Igd2luZG93cyBuZXR3b3JrIGZvbGRlcnMgYW5kIG1hYyBub3QgbmVlZFxyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGFydHMuam9pbignOicpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXJcclxuICAgICAgICB9O1xyXG5cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IGJyZWFrcG9pbnQgZGF0YTogJHticFN0cn1gKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVCcmVha3BvaW50KGJyZWFrcG9pbnQpIHtcclxuICAgIGNvbnN0IGJyT2JqID0gZXh0cmFjdEJyZWFrcG9pbnREYXRhKGJyZWFrcG9pbnQuYnJlYWtwb2ludElkKTtcclxuXHJcbiAgICBjb25zdCBickxpbmVOdW1iZXIgPSBick9iai5saW5lTnVtYmVyICsgMTsgLy8gZnJvbSAwLWJhc2UgdG8gMSBiYXNlO1xyXG5cclxuICAgIGlmIChicmVha3BvaW50ICYmIGJyZWFrcG9pbnQubG9jYXRpb25zICYmIEFycmF5LmlzQXJyYXkoYnJlYWtwb2ludC5sb2NhdGlvbnMpICYmIGJyZWFrcG9pbnQubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBicmVha3BvaW50LmxvY2F0aW9ucy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYnJGaWxlTmFtZSA9IGJyT2JqLmZpbGVOYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtTGluZU51bWJlciA9IGl0ZW0ubGluZU51bWJlciArIDE7IC8vIGZyb20gMC1iYXNlIHRvIDEgYmFzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChickxpbmVOdW1iZXIgIT09IGl0ZW1MaW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBgQnJlYWtwb2ludHMgd2FybmluZyA6ICR7YnJGaWxlTmFtZX0gRG9uJ3QgaGF2ZSBvcHBvcnR1bml0eSB0byBoYXZlIGJyZWFrcG9pbnQgYXQgbGluZSA6IGAsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGJyRmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZTogYnJMaW5lTnVtYmVyXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxufVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWJ1Z2dlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9waWQgPSBwaWQ7XHJcbiAgICAgICAgdGhpcy5fcG9ydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9ob3N0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0JQID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NsaWVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZmlsZU5hbWVBbGlhc2VzID0gW107XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc2V0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGllbnQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9icmVha3BvaW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFByb3BlcnRpZXNCeU9iamVjdElkKG9iamVjdElkLCBkZXB0aCwgZWxtKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZ2V0UHJvcGVydGllcyh7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZCA6IG9iamVjdElkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2dldFByb3BlcnRpZXMgZWxtJywgZWxtKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2dldFByb3BlcnRpZXMgZScsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKGNsb25lICYmIGNsb25lICYmIGNsb25lLnJlc3VsdCkge1xyXG4gICAgICAgICAgICBjbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIGNsb25lLCB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVZhbHVlcyhjbG9uZS5yZXN1bHQsIGRlcHRoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9taWNlQWxsUmVzdWx0KG1hcFJlc3VsdEZpbHRlcmVkKSB7XHJcbiAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwobWFwUmVzdWx0RmlsdGVyZWQpLnRoZW4odmFsdWUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChwcm9taXNlQWxsUHJvbWlzZSAmJiBBcnJheS5pc0FycmF5KHByb21pc2VBbGxQcm9taXNlKSAmJiBwcm9taXNlQWxsUHJvbWlzZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21pc2VBbGxQcm9taXNlID0gcHJvbWlzZUFsbFByb21pc2UuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb21pc2VBbGxQcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMob2JqZWN0SWQsIGRlcHRoLCBlbG0pIHtcclxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzQnlPYmplY3RJZChvYmplY3RJZCwgZGVwdGgsIGVsbSk7XHJcblxyXG4gICAgICAgIGlmIChnZXRQcm9wZXJ0aWVzUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmIChnZXRQcm9wZXJ0aWVzUmVzdWx0ICYmIGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoZ2V0UHJvcGVydGllc1Jlc3VsdC5yZXN1bHQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwUmVzdWx0ID0gZ2V0UHJvcGVydGllc1Jlc3VsdC5yZXN1bHQubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFByb3BlcnRpZXNJbm5lclJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllcyhpdGVtLnZhbHVlLm9iamVjdElkLCBkZXB0aCsxLCBpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNjb3BlSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllc0lubmVyUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwUmVzdWx0RmlsdGVyZWQgPSBtYXBSZXN1bHQuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkUmVzcG9uc2U6IE9iamVjdC5hc3NpZ24oe30sIGdldFByb3BlcnRpZXNSZXN1bHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1hcFJlc3VsdEZpbHRlcmVkICYmIEFycmF5LmlzQXJyYXkobWFwUmVzdWx0RmlsdGVyZWQpICYmIG1hcFJlc3VsdEZpbHRlcmVkLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZUFsbFByb21pc2UgPSBhd2FpdCB0aGlzLmdldFByb21pY2VBbGxSZXN1bHQobWFwUmVzdWx0RmlsdGVyZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUFsbFByb21pc2UgJiYgQXJyYXkuaXNBcnJheShwcm9taXNlQWxsUHJvbWlzZSkgJiYgcHJvbWlzZUFsbFByb21pc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGQgPSBwcm9taXNlQWxsUHJvbWlzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkUmVzcG9uc2U6IE9iamVjdC5hc3NpZ24oe30sIGdldFByb3BlcnRpZXNSZXN1bHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih2YWx1ZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzc1Njb3BlKHNjb3BlQ2hhaW4sIGRlcHRoKSB7XHJcbiAgICAgICAgbGV0IHNjb3BlQ2hhaW5SZXN1bHQgPSBhd2FpdCBzY29wZUNoYWluLm1hcChhc3luYyAoY2hhaW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYWluICYmIGNoYWluLm9iamVjdCAmJiBjaGFpbi5vYmplY3Qub2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhaW4ub2JqZWN0Lm9iamVjdElkID09PSAnc3RyaW5nJyAmJiBjaGFpbi50eXBlICE9PSAnZ2xvYmFsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFByb3BlcnRpZXNSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoY2hhaW4ub2JqZWN0Lm9iamVjdElkLCBkZXB0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNjb3BlQ2hhaW5SZXN1bHQgPSBzY29wZUNoYWluUmVzdWx0LmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2NvcGVDaGFpblJlc3VsdCkudGhlbih2YWx1ZXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3NDYWxsRnJhbWVzKGNhbGxGcmFtZXMsIGRlcHRoKSB7XHJcbiAgICAgICAgbGV0IGNhbGxGcmFtZXNNYXBSZXN1bHQgPSBhd2FpdCBjYWxsRnJhbWVzLm1hcChhc3luYyhjYWxsRnJhbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNhbGxGcmFtZSAmJiBjYWxsRnJhbWUuc2NvcGVDaGFpbiAmJiBBcnJheS5pc0FycmF5KGNhbGxGcmFtZS5zY29wZUNoYWluKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc1Njb3BlUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9jZXNzU2NvcGUoY2FsbEZyYW1lLnNjb3BlQ2hhaW4sIGRlcHRoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU2NvcGVSZXN1bHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gY2FsbEZyYW1lc01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNhbGxGcmFtZXNNYXBSZXN1bHQpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbkJyZWFrcG9pbnRzKGl0ZW1VcmwpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JyZWFrcG9pbnRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludHMpICYmIHRoaXMuX2JyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubWFwKChicCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1VcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsLnRvTG93ZXJDYXNlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1VcmwudG9Mb3dlckNhc2UoKSA9PT0gYnAub3JpZ2luLnNjcmlwdFBhdGgudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5GaWxlTmFtZUFsaWFzZXMoZmlsZU5hbWUpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyAmJiBBcnJheS5pc0FycmF5KHRoaXMuX2ZpbGVOYW1lQWxpYXNlcykgJiYgdGhpcy5fZmlsZU5hbWVBbGlhc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZU5hbWVBbGlhc2VzLm1hcCgoYWxpYXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLnRvTG93ZXJDYXNlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgJiZcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZS50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGZpbGVOYW1lLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsaWFzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb250aW51ZUNvbm5lY3QoKSB7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudC5vbignRGVidWdnZXIuc2NyaXB0UGFyc2VkJywgYXN5bmMobSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0udXJsLnRvTG93ZXJDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZWxjID0gbS51cmwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludEZvckNoYW5nZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kUmVzdWx0ID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5vcmlnaW4gJiYgaXRlbS5vcmlnaW4uc2NyaXB0UGF0aCAmJiBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50bGMgPSBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRsYyA9PT0gZmlsZWxjICYmIGl0ZW0ub3JpZ2luLnNjcmlwdFBhdGggIT09IG0udXJsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9maWxlTmFtZUFsaWFzZXMuaW5jbHVkZXMobS51cmwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5wdXNoKG0udXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRGVidWdnZXIucGF1c2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludDogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVybDogbS51cmxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UubVVybCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludC5vcmlnaW4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQub3JpZ2luLnNjcmlwdFBhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aCA9PT0gYnJlYWtwb2ludEZvckNoYW5nZS5icmVha3BvaW50Lm9yaWdpbi5zY3JpcHRQYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0UGF0aDogYnJlYWtwb2ludEZvckNoYW5nZS5tVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBicC5vcmlnaW4ubGluZU51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbiAmJiBBcnJheS5pc0FycmF5KGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uKSAmJiBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQgPSBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5tYXAoYXN5bmMoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRCcmVha3BvaW50KGJwLnNjcmlwdFBhdGgsIGJwLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQgPSBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdCkudGhlbihhc3luYyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIucGF1c2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jbGllbnQub24oJ0RlYnVnZ2VyLnBhdXNlZCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChlLnJlYXNvbiA9PT0gJ0JyZWFrIG9uIHN0YXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnJva2VPblN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIENocm9tZSBkZWJ1Z2dlciBkb2Vzbid0IHNlZW0gdG8gcmVtb3ZlIGJyZWFrcG9pbnRzIHdoZW4gdXNpbmcgcmVtb3ZlQnJlYWtwb2ludFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kICdzb21ldGhpbmcnIGlzIHN0aWxsIGdldHRpbmcgaGl0LiBub3QgY2xlYXIgd2h5IHRoaXMgaXMgaGFwcGVuaW5nLlxyXG4gICAgICAgICAgICAgICAgLy8gdGh1cywgd2UgZW1pdCBicmVhayBldmVudCBvbmx5IGlmIG1hdGNoaW5nIGJyZWFrcG9pbnQgc3RpbGwgZXhpc3RzIGluIHRoaXMuX2JyZWFrcG9pbnRzXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zc2libGVCcmVha3BvaW50c0RhdGEgPSBbXTtcclxuICAgICAgICAgICAgICAgIGxldCBlQ2FsbEZyYW1lcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlICYmIGUuY2FsbEZyYW1lcyAmJiBBcnJheS5pc0FycmF5KGUuY2FsbEZyYW1lcykgJiYgZS5jYWxsRnJhbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlLmNhbGxGcmFtZXMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udXJsICYmIHRoaXMuaW5CcmVha3BvaW50cyhpdGVtLnVybCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludHNNYXBSZXN1bHQgPSB0aGlzLl9icmVha3BvaW50cy5tYXAoYXN5bmMoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYnAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9ucy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9uc1swXS5zY3JpcHRJZCA9PT0gZUNhbGxGcmFtZXNbMF0ubG9jYXRpb24uc2NyaXB0SWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zWzBdLmxpbmVOdW1iZXIgPT09IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLmxpbmVOdW1iZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEZXB0aCA9IDE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmNhbGxGcmFtZXMgJiYgQXJyYXkuaXNBcnJheShlLmNhbGxGcmFtZXMpICYmIGUuY2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWVTY3JpcHRJZEFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbEZyYW1lcyA9IGUuY2FsbEZyYW1lcy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kZWQgPSB0aGlzLl9icmVha3BvaW50cy5maW5kKChicmVha3BvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnQuYnJlYWtwb2ludElkLmVuZHNXaXRoKGl0ZW0udXJsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5sb2NhdGlvbiAmJiBpdGVtLmxvY2F0aW9uLnNjcmlwdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVNjcmlwdElkQXJyLmluY2x1ZGVzKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVTY3JpcHRJZEFyci5wdXNoKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEZyYW1lcy5tYXAoYXN5bmMoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zc2libGVCcmVha3BvaW50cyA9IGF3YWl0IHRoaXMuZ2V0UG9zc2libGVCcmVha3BvaW50cyhpdGVtLmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0U291cmNlID0gYXdhaXQgdGhpcy5nZXRTY3JpcHRTb3VyY2UoaXRlbS5sb2NhdGlvbi5zY3JpcHRJZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRTb3VyY2VTcGxpdCA9IHNjcmlwdFNvdXJjZS5zY3JpcHRTb3VyY2Uuc3BsaXQoJ1xcbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVMaW5lTnVtYmVyc0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRTb3VyY2VTcGxpdCAmJiBBcnJheS5pc0FycmF5KHNjcmlwdFNvdXJjZVNwbGl0KSAmJiBzY3JpcHRTb3VyY2VTcGxpdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGluZU51bWJlcnNMZW5ndGggPSBzY3JpcHRTb3VyY2VTcGxpdC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZWUgaG93IGRlYmJ1Z2VyIHNlZSBzY3JpcHRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JpcHRTb3VyY2VTcGxpdC5tYXAoKHNjcmlwdFNvdXJjZUl0ZW0sIGlkeCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKChpZHgpICsgJyAnICsgc2NyaXB0U291cmNlSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50czogcG9zc2libGVCcmVha3BvaW50cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGl0ZW0udXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUxpbmVOdW1iZXJzTGVuZ3RoOiBmaWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXRTY3JpcHRTb3VyY2UgZScsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9jZXNzQ2FsbEZyYW1lcyhjYWxsRnJhbWVzLCBpbml0aWFsRGVwdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxGcmFtZXNNYXBSZXN1bHQgPSBjYWxsRnJhbWVzTWFwUmVzdWx0LmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsRnJhbWVzTWFwUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWtwb2ludHNNYXBSZXN1bHQgPSBicmVha3BvaW50c01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChicmVha3BvaW50c01hcFJlc3VsdCkudGhlbihhc3luYyAoc2NvcGVDaGFpblRyZWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVDaGFpblRyZWUgJiYgQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZSkgJiYgc2NvcGVDaGFpblRyZWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZUNoYWluVHJlZSA9IHNjb3BlQ2hhaW5UcmVlLmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludERhdGEgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHdlIGFsd2F5cyBzZW5kIGJyZWFrcG9pbnQgb2YgdGhlIHRvcCBjYWxsIGZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlQ2FsbEZyYW1lcyAmJiBlQ2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogZUNhbGxGcmFtZXNbMF0ubG9jYXRpb24ubGluZU51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdHJhbnNmb3JtVG9JREVTdHlsZShlQ2FsbEZyYW1lc1swXS51cmwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlKGJyZWFrcG9pbnREYXRhLnZhcmlhYmxlcywgc2NvcGVDaGFpblRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRPeHlnZW5WYXJpYWJsZXNGcm9tR2xvYmFsU2NvcGUoYnJlYWtwb2ludERhdGEudmFyaWFibGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLl9icmVha3BvaW50RXJyb3JzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNzZXQgPSB0aGlzLl9icmVha3BvaW50cy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3JpZ2luLmxpbmVOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaXRlbS5vcmlnaW4ubGluZU51bWJlcikrMSA9PT0gcGFyc2VJbnQoYnJlYWtwb2ludERhdGEubGluZU51bWJlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW0ubG9jYXRpb25zKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubG9jYXRpb25zLmZpbmQobG9jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChsb2MubGluZU51bWJlcikgPT09IHBhcnNlSW50KGJyZWFrcG9pbnREYXRhLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChpdGVtLm9yaWdpbi5saW5lTnVtYmVyKSAhPT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKSAhPT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxCcmZpbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubWFwKChicmVha3BvaW50RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubWFwKChicikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyRmlsZU5hbWUgPSB0cmFuc2Zvcm1Ub0lERVN0eWxlKGJyLm9yaWdpbi5zY3JpcHRQYXRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludERhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludERhdGEgPSBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmZpbGUgPT09IGVDYWxsRnJhbWVzWzBdLnVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyRmlsZU5hbWUgPT09IGJyZWFrcG9pbnREYXRhLmZpbGVOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKzEgPT09IGJyLm9yaWdpbi5saW5lTnVtYmVyIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBici5vcmlnaW4ubGluZU51bWJlcisxID09PSBwb3NzaWJsZUJyZWFrcG9pbnREYXRhLmZpbGVMaW5lTnVtYmVyc0xlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxCcmZpbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFsQnJmaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEucmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludERhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhID0gcG9zc2libGVCcmVha3BvaW50c0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5maWxlID09PSBlQ2FsbEZyYW1lc1swXS51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGggIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKzEgPj0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyID0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGggLSAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrJywgYnJlYWtwb2ludERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLl9icmVha3BvaW50RXJyb3JzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5tYXAoKGJyZWFrcG9pbnRFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50RXJyb3IgJiYgYnJlYWtwb2ludEVycm9yLm1zZyAmJiBicmVha3BvaW50RXJyb3IuZmlsZU5hbWUgJiYgYnJlYWtwb2ludEVycm9yLmxpbmUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZ25vcmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhKSAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5tYXAoKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5maWxlID0gdHJhbnNmb3JtVG9JREVTdHlsZShpdGVtLmZpbGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5maWxlID09PSBicmVha3BvaW50RXJyb3IuZmlsZU5hbWUgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtLmZpbGVMaW5lTnVtYmVyc0xlbmd0aCAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yLmxpbmUgPj0gaXRlbS5maWxlTGluZU51bWJlcnNMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBicmVha3BvaW50RXJyb3IubGluZSAtIDI7IC8vIC8vIyBzb3VyY2VNYXBwaW5nVVJMIGFuZCB9LmNhbGwodGhpcywgZXhwb3J0cywgcmVxdWlyZSwgbW9kdWxlLCBfX2ZpbGVuYW1lLCBfX2Rpcm5hbWUpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBicmVha3BvaW50RXJyb3IubGluZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uYnJlYWtwb2ludHMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmJyZWFrcG9pbnRzKSAmJiBpdGVtLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50RXJyb3IgJiYgYnJlYWtwb2ludEVycm9yLm1zZyAmJiBicmVha3BvaW50RXJyb3IubXNnLmluY2x1ZGVzKCdQb3NzaWJsZSBicmVha3BvaW50IGxpbmVzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uYnJlYWtwb2ludHMuaW5jbHVkZXMobGluZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGJyZWFrcG9pbnRFcnJvci5tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAke2xpbmV9LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIFBvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMgOiAke2l0ZW0uYnJlYWtwb2ludHMubWFwKChsaW5lKSA9PiBsaW5lKS5qb2luKCcsICcpfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLm1zZy5pbmNsdWRlcygncG9zc2libGUgYnJlYWtwb2ludCBsaW5lcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGJyZWFrcG9pbnRFcnJvci5tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAke2xpbmV9LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAnIEZpbGUgZG9uXFwndCBoYXZlIHBvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrRXJyb3InLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbXNnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGJyZWFrcG9pbnRFcnJvci5saW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBicmVha3BvaW50RXJyb3IuZmlsZU5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5yZWFzb24gPT09ICdPT00nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXQgb2YgbWVtb3J5IGxlYWtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdicmVha3BvaW50c01hcFJlc3VsdCByZXMgcmVhc29uJyAsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xpZW50Lm9uKCdEZWJ1Z2dlci5icmVha3BvaW50UmVzb2x2ZWQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQnJlYWtwb2ludFJlc29sdmVkKGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7IERlYnVnZ2VyLCBSdW50aW1lIH0gPSB0aGlzLl9jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5fRGVidWdnZXIgPSBEZWJ1Z2dlcjtcclxuICAgICAgICB0aGlzLl9SdW50aW1lID0gUnVudGltZTtcclxuICAgICAgICBSdW50aW1lLmVuYWJsZSgpO1xyXG4gICAgICAgIERlYnVnZ2VyLmVuYWJsZSgpO1xyXG4gICAgICAgIERlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zKHsgc3RhdGU6ICdub25lJyB9KTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRBc3luY0NhbGxTdGFja0RlcHRoKHsgbWF4RGVwdGg6IDMyIH0pO1xyXG4gICAgICAgIERlYnVnZ2VyLnNldEJsYWNrYm94UGF0dGVybnMoeyBwYXR0ZXJuczogW10gfSk7XHJcbiAgICAgICAgLy8gb25seSB1c2UgJ2F3YWl0JyBmb3IgdGhlIGxhc3QgY2FsbCwgYWxsIHByZXZpb3VzIGNhbGwgdG8gRGVidWdnZXIgb3IgUnVudGltZSB3aWxsIHN0YWNrIG90aGVyd2lzZVxyXG4gICAgICAgIGF3YWl0IFJ1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXIoKTtcclxuICAgICAgICAvLyBhd2FpdCBmb3IgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgcGxhY2VkIGJ5IHRoZSBkZWJ1Z2dlciBhdXRvbWF0aWNhbGx5IFxyXG4gICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnBhdXNlZCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkJyZWFrcG9pbnRSZXNvbHZlZChlKSB7XHJcbiAgICAgICAgLy8gYnJlYWtwb2ludHMgc2V0IGJlZm9yZSB0aGUgc2NyaXB0IHdhcyBsb2FkZWQgd2lsbCBiZSByZXNvbHZlZCBvbmNlIGl0IGxvYWRzXHJcbiAgICAgICAgZm9yICh2YXIgYnAgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgYnAgJiZcclxuICAgICAgICAgICAgICAgIGUgJiZcclxuICAgICAgICAgICAgICAgIGJwLmJyZWFrcG9pbnRJZCA9PT0gZS5icmVha3BvaW50SWRcclxuICAgICAgICAgICAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRlUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgaWYgKCBlLmxvY2F0aW9uICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIG9uIHJ1bnRpbWVcclxuICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnMgPSBbZS5sb2NhdGlvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUJyZWFrcG9pbnQoYnApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggZS5sb2NhdGlvbnMgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZWQgb24gcGF1c2VcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlQnJlYWtwb2ludChicCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5wdXNoKHZhbGlkYXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRvIGEgZGVidWdnZXIuIERvZXMgbm90aGluZyBpZiBhbHJlYWR5IGNvbm5lY3RlZC5cclxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGVidWdnZXIgcG9ydC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgY29ubmVjdChwb3J0LCBob3N0KSB7XHJcbiAgICAgICAgdGhpcy5fcG9ydCA9IHBvcnQ7XHJcbiAgICAgICAgdGhpcy5faG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgICAgIGxldCBzbm9vemVUaW1lID0gMTAwMDtcclxuICAgICAgICBsZXQgbGFzdEVycm9yID0gbnVsbDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCBDT05ORUNUX1JFVFJJRVM7IHJldHJpZXMrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50ID0gYXdhaXQgQ0RQKHsgcG9ydDogdGhpcy5fcG9ydCwgaG9zdDogdGhpcy5faG9zdCB9KTtcclxuICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbG9nLndhcm4oYERlYnVnZ2VyIGNvbm5lY3Rpb24gZmFpbGVkLiBXaWxsIHJldHJ5IGluICR7c25vb3plVGltZS8xMDAwfXMuIEVycm9yOiBgLCBsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoc25vb3plVGltZSk7XHJcbiAgICAgICAgICAgIHNub296ZVRpbWUgKj0gQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29udGludWVDb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYnJlYWtwb2ludCBmb3IgYSBwYXJ0aWN1bGFyIHNjcmlwdC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBTY3JpcHQgcGF0aC5cclxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gTGluZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNldEJyZWFrcG9pbnQoc2NyaXB0UGF0aCwgbGluZU51bWJlcikge1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IHNjcmlwdFBhdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsaWFzUmVzdWx0ID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChhbGlhc1Jlc3VsdCkge1xyXG4gICAgICAgICAgICBmaWxlTmFtZSA9IGFsaWFzUmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmlsZU5hbWUgPSB1cmwucGF0aFRvRmlsZVVSTChmaWxlTmFtZSkudG9TdHJpbmcoKTtcclxuICAgICAgICBsZXQgZXJyID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGJyZWFrcG9pbnQgPSBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5zZXRCcmVha3BvaW50QnlVcmwoe1xyXG4gICAgICAgICAgICB1cmw6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyLTEsIC8vIGZyb20gMS1iYXNlIHRvIDAtYmFzZVxyXG4gICAgICAgICAgICBjb2x1bW5OdW1iZXI6IDBcclxuICAgICAgICB9KS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgZXJyID0gZTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHNldCBhbiBsYXJlYWR5IGV4aXN0aW5nIGJyZWFrcG9pbnRcclxuICAgICAgICAgICAgaWYgKCFlLnJlc3BvbnNlIHx8IGUucmVzcG9uc2UubWVzc2FnZSAhPT0gJ0JyZWFrcG9pbnQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uIGFscmVhZHkgZXhpc3RzLicpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrcG9pbnQub3JpZ2luID0ge1xyXG4gICAgICAgICAgICAgICAgc2NyaXB0UGF0aDogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5wdXNoKGJyZWFrcG9pbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5ldyBicmVhY2twb2ludCByZXNvbHZlZCBzdWNjZXNzXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQnJlYWtwb2ludFJlc29sdmVkKGJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYnJlYWtwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRCcmVha3BvaW50c0FjdGl2ZShhY3RpdmUpIHtcclxuICAgICAgICBpZiAodGhpcy5fRGVidWdnZXIgJiYgdGhpcy5fRGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHsnYWN0aXZlJzogYWN0aXZlfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldEJyZWFrcG9pbnRzQWN0aXZlKGFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludElkKSB7XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgPSB0aGlzLl9icmVha3BvaW50cy5maWx0ZXIoKGJwKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBicC5icmVha3BvaW50SWQgIT09IGJyZWFrcG9pbnRJZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQnIgPSB7IGJyZWFrcG9pbnRJZDogYnJlYWtwb2ludElkIH07XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZW1vdmVCcmVha3BvaW50KHJlbW92ZUJyKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb250aW51ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc3VtZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc3VtZVRlcm1pbmF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZXN1bWUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIuZGlzYWJsZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGlucHV0TGluZSkge1xyXG5cclxuICAgICAgICBjb25zdCBmaWxlUGF0aEFsaWFzID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBpbnB1dExpbmUgLSAxOyAvLyBmcm9tIDEtYmFzZSB0byAwLWJhc2VcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGIgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5icmVha3BvaW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBiLmJyZWFrcG9pbnRJZC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHsgLy8gcGF0aCBtYXkgY29udGFpbiBhIERyaXZlIGxldHRlciBvbiB3aW4zMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMl0gKyAnOicgKyBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZU5hbWUgPT09IGZpbGVQYXRoIHx8IGZpbGVOYW1lID09PSBmaWxlUGF0aEFsaWFzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGluZU51bWJlciA9PT0gbGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGYucmVtb3ZlQnJlYWtwb2ludChiLmJyZWFrcG9pbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgd2hlbiB3b3JrIHdpdGggYnJlYWtwb2ludCBkYXRhOicsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbGVhckJyZWFrcG9pbnRzKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBiIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzZWxmLnJlbW92ZUJyZWFrcG9pbnQoYi5icmVha3BvaW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFBvc3NpYmxlQnJlYWtwb2ludHMoc3RhcnRMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQnJlYWtwb2ludHMgPSBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5nZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHtcclxuICAgICAgICAgICAgc3RhcnQ6IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdElkOiBzdGFydExvY2F0aW9uLnNjcmlwdElkLFxyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogMCxcclxuICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcjogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChwb3NzaWJsZUJyZWFrcG9pbnRzICYmIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zICYmIEFycmF5LmlzQXJyYXkocG9zc2libGVCcmVha3BvaW50cy5sb2NhdGlvbnMpICYmIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50cy5sb2NhdGlvbnMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbS5saW5lTnVtYmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBpdGVtLmxpbmVOdW1iZXIgKyAxOyAvLyBmcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmNsdWRlcyhsaW5lTnVtYmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0ICYmIEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcCA9IHJlc3VsdC5wb3AoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaW5jbHVkZXMocC0xKSkge1xyXG4gICAgICAgICAgICAgICAgLy9pbmdvcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChwLTEgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocC0xKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRTY3JpcHRTb3VyY2Uoc2NyaXB0SWQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIuZ2V0U2NyaXB0U291cmNlKHsgc2NyaXB0SWQ6IHNjcmlwdElkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNsb3NlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBhZGRWYXJpYWJsZXNGcm9tU2NvcGVDaGFpblRyZWUodmFyaWFibGVzLCBzY29wZUNoYWluVHJlZSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWUpXHJcbiAgICAgICAgICAgIHx8IHNjb3BlQ2hhaW5UcmVlLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgIHx8ICFBcnJheS5pc0FycmF5KHNjb3BlQ2hhaW5UcmVlWzBdKVxyXG4gICAgICAgICAgICB8fCBzY29wZUNoYWluVHJlZVswXS5sZW5ndGggPT0gMFxyXG4gICAgICAgICAgICB8fCAhQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZVswXVswXSlcclxuICAgICAgICAgICAgfHwgc2NvcGVDaGFpblRyZWVbMF1bMF0ubGVuZ3RoID09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IG9iamVjdElkUmVzcG9uc2UgfSA9IHNjb3BlQ2hhaW5UcmVlWzBdWzBdWzBdO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSBvYmplY3RJZFJlc3BvbnNlO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVWYXIgb2YgcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICghSUdOT1JFX1NDT1BFX0NIQUlOX1ZBUklBQkxFUy5pbmNsdWRlcyhzY29wZVZhci5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIHR5cGU7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGVWYXIgJiYgc2NvcGVWYXIudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gc2NvcGVWYXIudmFsdWUudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVWYXIudmFsdWUudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzY29wZVZhci52YWx1ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMudHJ5VG9SZXRyaWV2ZU9iamVjdFZhbHVlKHNjb3BlVmFyLnZhbHVlLm9iamVjdElkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2NvcGVWYXIubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlIHx8ICd1bmRlZmluZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdHJ5VG9SZXRyaWV2ZU9iamVjdFZhbHVlKG9iamVjdElkKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5nZXRQcm9wZXJ0aWVzKHsgb2JqZWN0SWQgfSk7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9ialZhbHVlID0ge307XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZm9yRWFjaChwcm9wRGVzYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZXNjLnZhbHVlICYmIHByb3BEZXNjLnZhbHVlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialZhbHVlW3Byb3BEZXNjLm5hbWVdID0gcHJvcERlc2MudmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZS5nZXRQcm9wZXJ0aWVzIGNhbGwgZmFpbGVkJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlKHZhcmlhYmxlcykge1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBwb0V2YWxSZXN1bHQgfSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZXZhbHVhdGUoeyBleHByZXNzaW9uOiAncG8nLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBlbnZFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ2VudicsIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgY29uc3QgeyByZXN1bHQ6IHZhcnNFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3ZhcnMnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBwYXJhbXNFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3BhcmFtcycsIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHtcclxuICAgICAgICAgICAgcG86IHBvRXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgZW52OiBlbnZFdmFsUmVzdWx0LFxyXG4gICAgICAgICAgICB2YXJzOiB2YXJzRXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNFdmFsUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0cykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpIHtcclxuICAgICAgICB2YXIgYnBzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYiBvZiB0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGIuYnJlYWtwb2ludElkLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIGxldCBmaWxlTmFtZTtcclxuICAgICAgICAgICAgbGV0IGxpbmVOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykgeyAvLyBwYXRoIG1heSBjb250YWluIGEgRHJpdmUgbGV0dGVyIG9uIHdpbjMyXHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aC0yXSArICc6JyArIHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSkrMTsgLy9mcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKSsxOyAvL2Zyb20gMC1iYXNlIHRvIDEtYmFzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT09IGZpbGVQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBicHMucHVzaChsaW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoQWxpYXMgPSB0aGlzLmluRmlsZU5hbWVBbGlhc2VzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlUGF0aEFsaWFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnBzLnB1c2gobGluZU51bWJlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJwcztcclxuICAgIH1cclxufVxyXG4iXX0=