obsidian-integration-testing 9.2.2 → 10.0.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 (253) hide show
  1. package/README.md +45 -45
  2. package/dist/lib/cjs/appium-dependencies.cjs +5 -5
  3. package/dist/lib/cjs/appium-dependencies.d.cts +4 -2
  4. package/dist/lib/cjs/appium-session-config.cjs +1 -1
  5. package/dist/lib/cjs/asar-fallback-detection.cjs +4 -4
  6. package/dist/lib/cjs/asar-fallback-detection.d.cts +15 -7
  7. package/dist/lib/cjs/avd-list.cjs +1 -1
  8. package/dist/lib/cjs/avd-list.d.cts +6 -2
  9. package/dist/lib/cjs/cli.cjs +4 -4
  10. package/dist/lib/cjs/compatibility-options.cjs +13 -13
  11. package/dist/lib/cjs/compatibility-options.d.cts +24 -12
  12. package/dist/lib/cjs/connect-to-cdp.cjs +4 -4
  13. package/dist/lib/cjs/connect-to-cdp.d.cts +6 -6
  14. package/dist/lib/cjs/context-id.cjs +5 -5
  15. package/dist/lib/cjs/context-id.d.cts +1 -1
  16. package/dist/lib/cjs/context-provider.cjs +5 -5
  17. package/dist/lib/cjs/context-provider.d.cts +4 -4
  18. package/dist/lib/cjs/demo-vault-populate.cjs +5 -5
  19. package/dist/lib/cjs/demo-vault-populate.d.cts +4 -4
  20. package/dist/lib/cjs/demo-vault-tree.cjs +4 -4
  21. package/dist/lib/cjs/demo-vault-tree.d.cts +3 -3
  22. package/dist/lib/cjs/device-readiness.cjs +3 -3
  23. package/dist/lib/cjs/device-readiness.d.cts +7 -3
  24. package/dist/lib/cjs/ecmascript-version.cjs +1 -1
  25. package/dist/lib/cjs/electron-compatibility.cjs +4 -4
  26. package/dist/lib/cjs/electron-compatibility.d.cts +33 -17
  27. package/dist/lib/cjs/emulator-arguments.cjs +36 -0
  28. package/dist/lib/{esm/emulator-args.d.mts → cjs/emulator-arguments.d.cts} +6 -4
  29. package/dist/lib/cjs/enable-plugin.cjs +29 -29
  30. package/dist/lib/cjs/enable-plugin.d.cts +6 -6
  31. package/dist/lib/cjs/eval-in-obsidian.cjs +9 -9
  32. package/dist/lib/cjs/eval-in-obsidian.d.cts +23 -23
  33. package/dist/lib/cjs/exec.cjs +49 -53
  34. package/dist/lib/cjs/exec.d.cts +9 -9
  35. package/dist/lib/cjs/function-expression.cjs +8 -8
  36. package/dist/lib/cjs/function-expression.d.cts +4 -4
  37. package/dist/lib/cjs/generate-function-call.cjs +6 -6
  38. package/dist/lib/cjs/generate-function-call.d.cts +15 -9
  39. package/dist/lib/cjs/global-setup-core.cjs +43 -43
  40. package/dist/lib/cjs/global-setup-core.d.cts +19 -9
  41. package/dist/lib/cjs/incompatible-installer-version-error.cjs +10 -4
  42. package/dist/lib/cjs/incompatible-installer-version-error.d.cts +18 -6
  43. package/dist/lib/cjs/index.cjs +10 -10
  44. package/dist/lib/cjs/index.d.cts +8 -8
  45. package/dist/lib/cjs/installer-asset.cjs +4 -4
  46. package/dist/lib/cjs/installer-asset.d.cts +21 -7
  47. package/dist/lib/cjs/installer-compatibility.cjs +4 -4
  48. package/dist/lib/cjs/installer-compatibility.d.cts +36 -18
  49. package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +3 -3
  50. package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +1 -1
  51. package/dist/lib/cjs/jest/global-setup.cjs +11 -11
  52. package/dist/lib/cjs/jest/global-setup.d.cts +12 -8
  53. package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +2 -3
  54. package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +1 -2
  55. package/dist/lib/cjs/jest/global-teardown.cjs +2 -3
  56. package/dist/lib/cjs/jest/global-teardown.d.cts +1 -2
  57. package/dist/lib/cjs/jest/setup.cjs +2 -2
  58. package/dist/lib/cjs/jest/setup.d.cts +1 -1
  59. package/dist/lib/cjs/json-with-functions.cjs +7 -7
  60. package/dist/lib/cjs/leftover-cleanup.cjs +14 -14
  61. package/dist/lib/cjs/leftover-cleanup.d.cts +42 -20
  62. package/dist/lib/cjs/library.cjs +2 -2
  63. package/dist/lib/cjs/namespace-bootstrap.cjs +46 -40
  64. package/dist/lib/cjs/native-dialog-monitor.cjs +15 -13
  65. package/dist/lib/cjs/normalize-optional-properties.cjs +3 -3
  66. package/dist/lib/cjs/normalize-optional-properties.d.cts +2 -2
  67. package/dist/lib/cjs/obsidian-config.cjs +30 -31
  68. package/dist/lib/cjs/obsidian-config.d.cts +8 -8
  69. package/dist/lib/cjs/obsidian-executable.cjs +2 -2
  70. package/dist/lib/cjs/obsidian-installer.cjs +37 -37
  71. package/dist/lib/cjs/obsidian-installer.d.cts +7 -3
  72. package/dist/lib/cjs/obsidian-instance.cjs +3 -3
  73. package/dist/lib/cjs/obsidian-instance.d.cts +18 -8
  74. package/dist/lib/cjs/obsidian-metadata.cjs +1 -1
  75. package/dist/lib/cjs/obsidian-metadata.d.cts +36 -12
  76. package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
  77. package/dist/lib/cjs/obsidian-namespace.d.cts +25 -11
  78. package/dist/lib/cjs/obsidian-version-switch.cjs +9 -9
  79. package/dist/lib/cjs/obsidian-version-switch.d.cts +14 -10
  80. package/dist/lib/cjs/obsidian-version.cjs +3 -3
  81. package/dist/lib/cjs/obsidian-version.d.cts +15 -5
  82. package/dist/lib/cjs/owned-vault-seed.cjs +1 -1
  83. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -8
  84. package/dist/lib/cjs/parent-liveness.cjs +4 -4
  85. package/dist/lib/cjs/parent-liveness.d.cts +7 -3
  86. package/dist/lib/cjs/poll-in-obsidian.cjs +5 -5
  87. package/dist/lib/cjs/poll-in-obsidian.d.cts +12 -12
  88. package/dist/lib/cjs/poll-until.cjs +1 -1
  89. package/dist/lib/cjs/poll-until.d.cts +21 -7
  90. package/dist/lib/cjs/process-exit-message.cjs +1 -1
  91. package/dist/lib/cjs/process-exit-message.d.cts +21 -7
  92. package/dist/lib/cjs/renderer-boot-detection.cjs +9 -9
  93. package/dist/lib/cjs/renderer-boot-detection.d.cts +31 -27
  94. package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +1 -1
  95. package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +1 -1
  96. package/dist/lib/cjs/setup-lock.cjs +26 -26
  97. package/dist/lib/cjs/setup-lock.d.cts +6 -2
  98. package/dist/lib/cjs/silent-asar-fallback-error.cjs +7 -3
  99. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +12 -4
  100. package/dist/lib/cjs/spawn-options.cjs +1 -1
  101. package/dist/lib/cjs/spawn-options.d.cts +3 -1
  102. package/dist/lib/cjs/strict-proxy.cjs +25 -25
  103. package/dist/lib/cjs/strict-proxy.d.cts +3 -3
  104. package/dist/lib/cjs/temporary-vault.cjs +166 -0
  105. package/dist/lib/cjs/{temp-vault.d.cts → temporary-vault.d.cts} +3 -3
  106. package/dist/lib/cjs/transport-appium.cjs +7 -7
  107. package/dist/lib/cjs/transport-appium.d.cts +7 -3
  108. package/dist/lib/cjs/transport-desktop-cdp.cjs +57 -57
  109. package/dist/lib/cjs/transport-desktop-cdp.d.cts +29 -17
  110. package/dist/lib/cjs/transport-factory.cjs +62 -63
  111. package/dist/lib/cjs/type-guards.cjs +3 -3
  112. package/dist/lib/cjs/type-guards.d.cts +2 -2
  113. package/dist/lib/cjs/vault-path-match.cjs +9 -9
  114. package/dist/lib/cjs/vault-path-match.d.cts +11 -11
  115. package/dist/lib/cjs/version-matrix.cjs +1 -1
  116. package/dist/lib/cjs/version-matrix.d.cts +51 -17
  117. package/dist/lib/cjs/visibility.cjs +7 -7
  118. package/dist/lib/cjs/visibility.d.cts +5 -5
  119. package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +3 -3
  120. package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +2 -2
  121. package/dist/lib/cjs/vitest/global-setup.cjs +9 -9
  122. package/dist/lib/cjs/vitest/global-setup.d.cts +4 -4
  123. package/dist/lib/cjs/vitest/setup.cjs +2 -2
  124. package/dist/lib/cjs/vitest/typings.d.cts +2 -2
  125. package/dist/lib/esm/appium-dependencies.d.mts +4 -2
  126. package/dist/lib/esm/appium-dependencies.mjs +4 -4
  127. package/dist/lib/esm/appium-session-config.mjs +1 -1
  128. package/dist/lib/esm/asar-fallback-detection.d.mts +15 -7
  129. package/dist/lib/esm/asar-fallback-detection.mjs +3 -3
  130. package/dist/lib/esm/avd-list.d.mts +6 -2
  131. package/dist/lib/esm/avd-list.mjs +1 -1
  132. package/dist/lib/esm/cli.mjs +4 -4
  133. package/dist/lib/esm/compatibility-options.d.mts +24 -12
  134. package/dist/lib/esm/compatibility-options.mjs +10 -10
  135. package/dist/lib/esm/connect-to-cdp.d.mts +6 -6
  136. package/dist/lib/esm/connect-to-cdp.mjs +6 -6
  137. package/dist/lib/esm/context-id.d.mts +1 -1
  138. package/dist/lib/esm/context-id.mjs +5 -5
  139. package/dist/lib/esm/context-provider.d.mts +4 -4
  140. package/dist/lib/esm/context-provider.mjs +5 -5
  141. package/dist/lib/esm/demo-vault-populate.d.mts +4 -4
  142. package/dist/lib/esm/demo-vault-populate.mjs +5 -5
  143. package/dist/lib/esm/demo-vault-tree.d.mts +3 -3
  144. package/dist/lib/esm/demo-vault-tree.mjs +4 -4
  145. package/dist/lib/esm/device-readiness.d.mts +7 -3
  146. package/dist/lib/esm/device-readiness.mjs +3 -3
  147. package/dist/lib/esm/ecmascript-version.mjs +1 -1
  148. package/dist/lib/esm/electron-compatibility.d.mts +33 -17
  149. package/dist/lib/esm/electron-compatibility.mjs +3 -3
  150. package/dist/lib/{cjs/emulator-args.d.cts → esm/emulator-arguments.d.mts} +6 -4
  151. package/dist/lib/esm/emulator-arguments.mjs +12 -0
  152. package/dist/lib/esm/enable-plugin.d.mts +6 -6
  153. package/dist/lib/esm/enable-plugin.mjs +29 -29
  154. package/dist/lib/esm/eval-in-obsidian.d.mts +23 -23
  155. package/dist/lib/esm/eval-in-obsidian.mjs +9 -9
  156. package/dist/lib/esm/exec.d.mts +9 -9
  157. package/dist/lib/esm/exec.mjs +49 -53
  158. package/dist/lib/esm/function-expression.d.mts +4 -4
  159. package/dist/lib/esm/function-expression.mjs +8 -8
  160. package/dist/lib/esm/generate-function-call.d.mts +15 -9
  161. package/dist/lib/esm/generate-function-call.mjs +6 -6
  162. package/dist/lib/esm/global-setup-core.d.mts +19 -9
  163. package/dist/lib/esm/global-setup-core.mjs +45 -45
  164. package/dist/lib/esm/incompatible-installer-version-error.d.mts +18 -6
  165. package/dist/lib/esm/incompatible-installer-version-error.mjs +10 -4
  166. package/dist/lib/esm/index.d.mts +8 -8
  167. package/dist/lib/esm/index.mjs +9 -9
  168. package/dist/lib/esm/installer-asset.d.mts +21 -7
  169. package/dist/lib/esm/installer-asset.mjs +4 -4
  170. package/dist/lib/esm/installer-compatibility.d.mts +36 -18
  171. package/dist/lib/esm/installer-compatibility.mjs +3 -3
  172. package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +1 -1
  173. package/dist/lib/esm/jest/global-setup-no-plugin.mjs +3 -3
  174. package/dist/lib/esm/jest/global-setup.d.mts +12 -8
  175. package/dist/lib/esm/jest/global-setup.mjs +10 -10
  176. package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +1 -2
  177. package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +2 -3
  178. package/dist/lib/esm/jest/global-teardown.d.mts +1 -2
  179. package/dist/lib/esm/jest/global-teardown.mjs +2 -3
  180. package/dist/lib/esm/jest/setup.d.mts +1 -1
  181. package/dist/lib/esm/jest/setup.mjs +2 -2
  182. package/dist/lib/esm/json-with-functions.mjs +7 -7
  183. package/dist/lib/esm/leftover-cleanup.d.mts +42 -20
  184. package/dist/lib/esm/leftover-cleanup.mjs +12 -12
  185. package/dist/lib/esm/library.mjs +2 -2
  186. package/dist/lib/esm/namespace-bootstrap.mjs +46 -40
  187. package/dist/lib/esm/native-dialog-monitor.mjs +15 -13
  188. package/dist/lib/esm/normalize-optional-properties.d.mts +2 -2
  189. package/dist/lib/esm/normalize-optional-properties.mjs +3 -3
  190. package/dist/lib/esm/obsidian-config.d.mts +8 -8
  191. package/dist/lib/esm/obsidian-config.mjs +27 -28
  192. package/dist/lib/esm/obsidian-executable.mjs +2 -2
  193. package/dist/lib/esm/obsidian-installer.d.mts +7 -3
  194. package/dist/lib/esm/obsidian-installer.mjs +36 -36
  195. package/dist/lib/esm/obsidian-instance.d.mts +18 -8
  196. package/dist/lib/esm/obsidian-instance.mjs +3 -3
  197. package/dist/lib/esm/obsidian-metadata.d.mts +36 -12
  198. package/dist/lib/esm/obsidian-metadata.mjs +1 -1
  199. package/dist/lib/esm/obsidian-namespace.d.mts +25 -11
  200. package/dist/lib/esm/obsidian-version-switch.d.mts +14 -10
  201. package/dist/lib/esm/obsidian-version-switch.mjs +9 -9
  202. package/dist/lib/esm/obsidian-version.d.mts +15 -5
  203. package/dist/lib/esm/obsidian-version.mjs +3 -3
  204. package/dist/lib/esm/owned-vault-seed.d.mts +24 -8
  205. package/dist/lib/esm/owned-vault-seed.mjs +1 -1
  206. package/dist/lib/esm/parent-liveness.d.mts +7 -3
  207. package/dist/lib/esm/parent-liveness.mjs +3 -3
  208. package/dist/lib/esm/poll-in-obsidian.d.mts +12 -12
  209. package/dist/lib/esm/poll-in-obsidian.mjs +5 -5
  210. package/dist/lib/esm/poll-until.d.mts +21 -7
  211. package/dist/lib/esm/poll-until.mjs +1 -1
  212. package/dist/lib/esm/process-exit-message.d.mts +21 -7
  213. package/dist/lib/esm/process-exit-message.mjs +1 -1
  214. package/dist/lib/esm/renderer-boot-detection.d.mts +31 -27
  215. package/dist/lib/esm/renderer-boot-detection.mjs +7 -7
  216. package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +1 -1
  217. package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +1 -1
  218. package/dist/lib/esm/setup-lock.d.mts +6 -2
  219. package/dist/lib/esm/setup-lock.mjs +26 -26
  220. package/dist/lib/esm/silent-asar-fallback-error.d.mts +12 -4
  221. package/dist/lib/esm/silent-asar-fallback-error.mjs +7 -3
  222. package/dist/lib/esm/spawn-options.d.mts +3 -1
  223. package/dist/lib/esm/spawn-options.mjs +1 -1
  224. package/dist/lib/esm/strict-proxy.d.mts +3 -3
  225. package/dist/lib/esm/strict-proxy.mjs +25 -25
  226. package/dist/lib/esm/{temp-vault.d.mts → temporary-vault.d.mts} +3 -3
  227. package/dist/lib/esm/temporary-vault.mjs +157 -0
  228. package/dist/lib/esm/transport-appium.d.mts +7 -3
  229. package/dist/lib/esm/transport-appium.mjs +7 -7
  230. package/dist/lib/esm/transport-desktop-cdp.d.mts +29 -17
  231. package/dist/lib/esm/transport-desktop-cdp.mjs +67 -67
  232. package/dist/lib/esm/transport-factory.mjs +71 -72
  233. package/dist/lib/esm/type-guards.d.mts +2 -2
  234. package/dist/lib/esm/type-guards.mjs +3 -3
  235. package/dist/lib/esm/vault-path-match.d.mts +11 -11
  236. package/dist/lib/esm/vault-path-match.mjs +7 -7
  237. package/dist/lib/esm/version-matrix.d.mts +51 -17
  238. package/dist/lib/esm/version-matrix.mjs +1 -1
  239. package/dist/lib/esm/visibility.d.mts +5 -5
  240. package/dist/lib/esm/visibility.mjs +5 -5
  241. package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +2 -2
  242. package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +3 -3
  243. package/dist/lib/esm/vitest/global-setup.d.mts +4 -4
  244. package/dist/lib/esm/vitest/global-setup.mjs +8 -8
  245. package/dist/lib/esm/vitest/setup.mjs +2 -2
  246. package/dist/lib/esm/vitest/typings.d.mts +2 -2
  247. package/dist/obsidian-integration-testing-10.0.0.tgz +0 -0
  248. package/package.json +15 -13
  249. package/dist/lib/cjs/emulator-args.cjs +0 -36
  250. package/dist/lib/cjs/temp-vault.cjs +0 -166
  251. package/dist/lib/esm/emulator-args.mjs +0 -12
  252. package/dist/lib/esm/temp-vault.mjs +0 -157
  253. package/dist/obsidian-integration-testing-9.2.2.tgz +0 -0
@@ -302,7 +302,7 @@ class AppiumTransport {
302
302
  `[appium-transport] Could not deregister ${deviceVaultPath} from localStorage (${String(error)}); removing its files anyway.`
303
303
  );
304
304
  }
305
- await this.removeDeviceVaultDir(deviceVaultPath);
305
+ await this.removeDeviceVaultDirectory(deviceVaultPath);
306
306
  }
307
307
  /**
308
308
  * Switches the driver to the `WEBVIEW_md.obsidian` context.
@@ -323,7 +323,7 @@ class AppiumTransport {
323
323
  log(`[appium-transport] Waiting for ${WEBVIEW_CONTEXT_PREFIX} context (timeout=${String(this.webviewTimeoutInMilliseconds)}ms)...`);
324
324
  while (Date.now() < deadline) {
325
325
  const contexts = await this.browser.getContexts();
326
- const obsidianContext = contexts.find((ctx) => typeof ctx === "string" && ctx.startsWith(WEBVIEW_CONTEXT_PREFIX));
326
+ const obsidianContext = contexts.find((context) => typeof context === "string" && context.startsWith(WEBVIEW_CONTEXT_PREFIX));
327
327
  if (obsidianContext) {
328
328
  log(`[appium-transport] Found WebView context: ${obsidianContext}`);
329
329
  try {
@@ -390,7 +390,7 @@ class AppiumTransport {
390
390
  *
391
391
  * @param deviceVaultPath - The device-side vault directory path.
392
392
  */
393
- async removeDeviceVaultDir(deviceVaultPath) {
393
+ async removeDeviceVaultDirectory(deviceVaultPath) {
394
394
  try {
395
395
  log(`[appium-transport] Removing vault directory from device: ${deviceVaultPath}`);
396
396
  await exec(
@@ -420,7 +420,7 @@ class AppiumTransport {
420
420
  while (Date.now() < deadline) {
421
421
  try {
422
422
  const isReady = await this.browser.execute(() => {
423
- const app = window.app;
423
+ const app = globalThis.app;
424
424
  return !!app?.workspace?.layoutReady;
425
425
  });
426
426
  if (isReady) {
@@ -443,11 +443,11 @@ function delay(ms) {
443
443
  }
444
444
  function extractVaultName(vaultPath) {
445
445
  const normalized = vaultPath.replace(/[\\/]+$/, "");
446
- const lastSep = Math.max(normalized.lastIndexOf("/"), normalized.lastIndexOf("\\"));
447
- return normalized.slice(lastSep + 1);
446
+ const lastSeparator = Math.max(normalized.lastIndexOf("/"), normalized.lastIndexOf("\\"));
447
+ return normalized.slice(lastSeparator + 1);
448
448
  }
449
449
  export {
450
450
  AppiumTransport,
451
451
  DEFAULT_ANDROID_VAULT_BASE_PATH
452
452
  };
453
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc29sZUNhcHR1cmVIYW5kbGUsXG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBURU1QX1ZBVUxUX0RJUl9QUkVGSVggfSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuICovXG4gIGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0vV2ViRHJpdmVyIHNlc3Npb24gSUQuICovXG4gIHNlc3Npb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVRyYW5zcG9ydENvbmZpZyB7XG4gIC8qKlxuICAgKiBBcHAgcGFja2FnZSAoQW5kcm9pZCkgb3IgYnVuZGxlIElEIChpT1MpLlxuICAgKiBEZWZhdWx0cyB0byBgJ21kLm9ic2lkaWFuJ2AuXG4gICAqL1xuICBhcHBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBicm93c2VyL2RyaXZlciBpbnN0YW5jZS5cbiAgICogQ3JlYXRlZCBieSB0aGUgY29uc3VtZXIgdmlhIGUuZy4gV2ViRHJpdmVySU8ncyBgcmVtb3RlKClgLlxuICAgKi9cbiAgYnJvd3NlcjogQnJvd3NlcjtcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICogVXNlZCBmb3IgYGFkYmAgY29tbWFuZHMgd2hlbiBwdXNoaW5nIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IG93bnMgdGhlIEFwcGl1bSBzZXNzaW9uIGFuZCBzaG91bGQgZGVsZXRlIGl0IG9uXG4gICAqIHtAbGluayBBcHBpdW1UcmFuc3BvcnQuZGlzcG9zZX0uXG4gICAqXG4gICAqIGB0cnVlYCBmb3Igc2Vzc2lvbnMgY3JlYXRlZCB2aWEgYHJlbW90ZSgpYCAoZ2xvYmFsIHNldHVwKS5cbiAgICogYGZhbHNlYCBmb3Igc2Vzc2lvbnMgcmVhdHRhY2hlZCB2aWEgYGF0dGFjaCgpYCAodGVzdCB3b3JrZXJzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBpc1Nlc3Npb25Pd25lcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgYWZ0ZXJcbiAgICogdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUYXJnZXQgcGxhdGZvcm0uIERldGVybWluZXMgV2ViVmlldyBjb250ZXh0IG5hbWluZyBhbmQgZGV2aWNlIGZpbGUgcGF0aHMuXG4gICAqL1xuICBwbGF0Zm9ybTogJ2FuZHJvaWQnIHwgJ2lvcyc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVnaXN0ZXJpbmcgYSB2YXVsdCBhbHNvIHBydW5lcyB0aGUgKipvdGhlcioqIGB0ZW1wLXZhdWx0LSpgXG4gICAqIHJlZ2lzdHJhdGlvbnMgZWFybGllciBydW5zIGxlZnQgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWAuXG4gICAqXG4gICAqIFRoZSBkZXZpY2Utc2lkZSBkaXJlY3RvcmllcyBhcmUgc3dlcHQgYmVmb3JlIHRoZSBhcHAgbGF1bmNoZXMgKHNlZSB0aGVcbiAgICogZmFjdG9yeSk7IHRoaXMgcmVtb3ZlcyB0aGVpciBub3ctZGFuZ2xpbmcgcmVnaXN0cnkgZW50cmllcywgd2hpY2ggYXJlIHdoYXRcbiAgICogT2JzaWRpYW4gYWN0dWFsbHkgZW51bWVyYXRlcyBhdCBzdGFydHVwLiBVbnJlZ2lzdGVyaW5nIHRoaXMgcnVuJ3Mgb3duIHZhdWx0XG4gICAqIGlzIHVuYWZmZWN0ZWQgXHUyMDE0IHRoYXQgYWx3YXlzIGhhcHBlbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuY29uc3QgTk9fT1VUUFVUID0gJyhubyBvdXRwdXQpJztcbmNvbnN0IEFQUF9TVEFURV9GT1JFR1JPVU5EID0gNDtcbmNvbnN0IFdFQlZJRVdfQ09OVEVYVF9QUkVGSVggPSAnV0VCVklFV19tZC5vYnNpZGlhbic7XG5jb25zdCBXRUJWSUVXX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgREVGQVVMVF9XRUJWSUVXX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MDAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5cbi8vIC0tLSBDb25zb2xlIGNhcHR1cmUgKExheWVyIDIgb2YgdGhlIHBsdWdpbi1sb2FkIGVycm9yIHN1cmZhY2luZywgc2VlIFQ4OCkgLS0tXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPSVRfQ0FQVFVSRSc7XG5jb25zdCBDT05TT0xFX0NBUFRVUkVfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG4vKipcbiAqIGBhZGIgbG9nY2F0IC12IHRpbWVgIGxpbmVzIGxvb2sgbGlrZSBgTU0tREQgSEg6TU06U1MubW1tIExFVkVML1RBRyggUElEKTogbWVzc2FnZWAuXG4gKiBLZWVwIG9ubHkgdGhlIHRhZ3MgQ2hyb21pdW0vV2ViVmlldyByb3V0ZXMgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZCB1bmNhdWdodFxuICogZXJyb3JzIHRvIChgY2hyb21pdW1gLCB0aGUgQ2FwYWNpdG9yIGNvbnNvbGUgYnJpZGdlLCBhbmQgbmF0aXZlIGBBbmRyb2lkUnVudGltZWApLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfVEFHX1JFID0gL1xcLyg/OmNocm9taXVtfEFuZHJvaWRSdW50aW1lfENhcGFjaXRvclxcL0NvbnNvbGUpXFwoLztcblxuLyoqXG4gKiBCYXNlIHBhdGggb24gYW4gQW5kcm9pZCBkZXZpY2Ugd2hlcmUgT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHRzLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHN3ZWVwcyBsZWZ0b3ZlciB2YXVsdHMgZnJvbSBpdCBiZWZvcmVcbiAqIGEgdHJhbnNwb3J0IGV4aXN0cyAoc2VlIHRoZSByZXBvJ3MgTDMxKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEggPSAnL3NkY2FyZC9Eb2N1bWVudHMvJztcblxuY29uc3QgREVGQVVMVF9WQVVMVF9CQVNFX1BBVEg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGFuZHJvaWQ6IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEgsXG4gIGlvczogJ0BtZC5vYnNpZGlhbjpkb2N1bWVudHMvJ1xufTtcblxuaW50ZXJmYWNlIExvYWRpbmdBcHAge1xuICB3b3Jrc3BhY2U/OiBMb2FkaW5nV29ya3NwYWNlO1xufVxuXG5pbnRlcmZhY2UgTG9hZGluZ1dvcmtzcGFjZSB7XG4gIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBPYnNpZGlhbiBNb2JpbGUgdmlhIEFwcGl1bSBXZWJWaWV3IEpTIGluamVjdGlvbi5cbiAqXG4gKiBFdmFsdWF0ZXMgZXhwcmVzc2lvbnMgYnkgc3dpdGNoaW5nIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBhbmRcbiAqIGNhbGxpbmcgYGV4ZWN1dGUoKWAuIE1hbmFnZXMgdmF1bHRzIGJ5IHdyaXRpbmcgdG8gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYFxuICogKHdoaWNoIE9ic2lkaWFuIHVzZXMgYXMgaXRzIHZhdWx0IHJlZ2lzdHJ5IG9uIG1vYmlsZSkgYW5kIHB1c2hpbmcgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGl1bVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGB0cnVlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogVHJhY2tzIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgc3dpdGNoZWQgdG8gdGhlIFdlYlZpZXcgY29udGV4dC5cbiAgICpcbiAgICogU2V0IHRvIGB0cnVlYCBhZnRlciBhIHN1Y2Nlc3NmdWwgYHN3aXRjaENvbnRleHQoV0VCVklFV19tZC5vYnNpZGlhbilgLlxuICAgKiBSZXNldCB0byBgZmFsc2VgIHdoZW4gdGhlIGNvbnRleHQgaXMga25vd24gdG8gYmUgaW52YWxpZGF0ZWRcbiAgICogKGUuZy4gYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBpbiB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0pLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwge0BsaW5rIGVuc3VyZVdlYlZpZXdDb250ZXh0fSBza2lwcyB0aGUgZXhwZW5zaXZlXG4gICAqIGBnZXRDb250ZXh0cygpYCBjYWxsICh3aGljaCBydW5zIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmRcbiAgICogY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzKS5cbiAgICovXG4gIHByaXZhdGUgaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTZXNzaW9uT3duZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybTogJ2FuZHJvaWQnIHwgJ2lvcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBcHBpdW0gdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBBcHBpdW1UcmFuc3BvcnRDb25maWcpIHtcbiAgICB0aGlzLmJyb3dzZXIgPSBjb25maWcuYnJvd3NlcjtcbiAgICB0aGlzLmRldmljZUlkID0gY29uZmlnLmRldmljZUlkO1xuICAgIHRoaXMuaXNTZXNzaW9uT3duZXIgPSBjb25maWcuaXNTZXNzaW9uT3duZXIgPz8gdHJ1ZTtcbiAgICB0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IGNvbmZpZy5wbGF0Zm9ybTtcbiAgICB0aGlzLmFwcElkID0gY29uZmlnLmFwcElkID8/IERFRkFVTFRfQVBQX0lEO1xuICAgIHRoaXMuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPSBjb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLnZhdWx0QmFzZVBhdGggPSBjb25maWcudmF1bHRCYXNlUGF0aCA/PyBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSFt0aGlzLnBsYXRmb3JtXSA/PyBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIO1xuICAgIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0VCVklFV19QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlZ2lucyBhIGNvbnNvbGUgY2FwdHVyZSBieSBzdGFtcGluZyB0aGUgZGV2aWNlIGxvZyB3aXRoIGEgdW5pcXVlIG1hcmtlci5cbiAgICpcbiAgICogVXNlcyBgYWRiIHNoZWxsIGxvZ2AgdG8gd3JpdGUgYSBtYXJrZXIgaW50byBgbG9nY2F0YCBhdCBjYXB0dXJlIHN0YXJ0IHNvIGFcbiAgICogbGF0ZXIge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0gY2FuIHNsaWNlIG91dFxuICAgKiBldmVyeXRoaW5nIHRoZSBXZWJWaWV3IGxvZ2dlZCBhZnRlcndhcmRzIFx1MjAxNCB3aXRob3V0IHRoZSBpbnZhc2l2ZSBgbG9nY2F0IC1jYFxuICAgKiBidWZmZXIgY2xlYXIuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgaGFuZGxlIGNhcnJ5aW5nIHRoZSB1bmlxdWUgbWFya2VyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJlZ2luQ29uc29sZUNhcHR1cmUoKTogUHJvbWlzZTxDb25zb2xlQ2FwdHVyZUhhbmRsZT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IGAke0NPTlNPTEVfQ0FQVFVSRV9NQVJLRVJfVEFHfV8ke3JhbmRvbVVVSUQoKX1gO1xuICAgIGF3YWl0IGV4ZWMoXG4gICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdsb2cnLCAnLXQnLCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRywgbWFya2VyXSxcbiAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX0xPR19NQVJLRVJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICk7XG4gICAgcmV0dXJuIHsgbWFya2VyIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1Nlc3Npb25Pd25lcikge1xuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBNb2JpbGUncyBXZWJWaWV3LlxuICAgKlxuICAgKiBTd2l0Y2hlcyB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQsIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gX29wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMgKGN3ZCBpcyBub3QgdXNlZCBvbiBtb2JpbGUgXHUyMDE0IHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKS5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIF9vcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQsIFtdPihcbiAgICAgICAgYHJldHVybiAoJHtleHByZXNzaW9ufSlgXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIENvbnRleHQgbWF5IGhhdmUgYmVlbiBsb3N0IG1pZC1leGVjdXRpb24gKGUuZy4gcGFnZSByZWxvYWQpLlxuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGNvbm5lY3Rpb24gaW5mbyBuZWVkZWQgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAqIGZyb20gYW5vdGhlciBwcm9jZXNzIChlLmcuIGEgdGVzdCB3b3JrZXIpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBJRCBhbmQgZGV2aWNlIElELlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JbmZvKCk6IEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuYnJvd3Nlci5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuYWN0aXZhdGVBcHAodGhpcy5hcHBJZCk7XG4gICAgICBhd2FpdCBkZWxheShBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIHZpYSBjb21wcmVzc2VkIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0YXIuZ3ogYXJjaGl2ZSBvZiB0aGUgbG9jYWwgdmF1bHQgZGlyZWN0b3J5LCBwdXNoZXMgaXQgdG8gdGhlXG4gICAqIGRldmljZSBhcyBhIHNpbmdsZSBmaWxlLCBhbmQgZXh0cmFjdHMgaXQgaW4tcGxhY2UuIFRoaXMgYXZvaWRzIHRoZVxuICAgKiB3ZWJkcml2ZXIgYFJhbmdlRXJyb3JgIG9uIGxhcmdlIGJhc2U2NCBwYXlsb2FkcyBhbmQgaXMgc2lnbmlmaWNhbnRseVxuICAgKiBmYXN0ZXIgdGhhbiBwZXItZmlsZSBgYnJvd3Nlci5wdXNoRmlsZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGFzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBvbiBkZXZpY2UpLlxuICAgKiBAcGFyYW0gX2ZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzICh1bnVzZWQgXHUyMDE0IGFkYiBwdXNoZXMgdGhlIGRpcmVjdG9yeSBkaXJlY3RseSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVzaEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBfZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcbiAgICBjb25zdCBhcmNoaXZlTmFtZSA9IGB2YXVsdC0ke3JhbmRvbVVVSUQoKX0udGFyLmd6YDtcbiAgICBjb25zdCBsb2NhbEFyY2hpdmUgPSBqb2luKHRtcGRpcigpLCBhcmNoaXZlTmFtZSk7XG4gICAgY29uc3QgcmVtb3RlQXJjaGl2ZSA9IGAvZGF0YS9sb2NhbC90bXAvJHthcmNoaXZlTmFtZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIENyZWF0aW5nIGFyY2hpdmU6ICR7bG9jYWxBcmNoaXZlfWApO1xuICAgICAgYXdhaXQgZXhlYyhbJ3RhcicsICdjemYnLCBhcmNoaXZlTmFtZSwgJy1DJywgdmF1bHRQYXRoLCAnLiddLCB7IGN3ZDogdG1wZGlyKCksIGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFB1c2hpbmcgYXJjaGl2ZSB0byBkZXZpY2UgJHt0aGlzLmRldmljZUlkfS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxBcmNoaXZlLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBFeHRyYWN0aW5nIGFyY2hpdmUgb24gZGV2aWNlIGF0ICR7ZGV2aWNlVmF1bHRQYXRofS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAndGFyJywgJ3h6ZicsIHJlbW90ZUFyY2hpdmUsICctQycsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gRmx1c2hpbmcgZmlsZXN5c3RlbSBidWZmZXJzLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3N5bmMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBDbGVhbmluZyB1cCByZW1vdGUgYXJjaGl2ZS4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsQXJjaGl2ZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHVtcHMgYGFkYiBsb2djYXRgIGFuZCByZXR1cm5zIHRoZSBXZWJWaWV3IGNvbnNvbGUvZXJyb3Igb3V0cHV0IGxvZ2dlZFxuICAgKiBzaW5jZSB0aGUgbWFya2VyIGZyb20ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlfS5cbiAgICpcbiAgICogRmlsdGVycyB0byB0aGUgQ2hyb21pdW0vV2ViVmlldyB0YWdzIHRoYXQgY2FycnkgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZFxuICAgKiB1bmNhdWdodCBlcnJvcnMsIGFuZCBjYXBzIHRoZSByZXN1bHQgbGVuZ3RoLiBCb3VuZGVkLCBwb3N0LWhvYyxcbiAgICogZmFpbHVyZS1wYXRoLW9ubHkgXHUyMDE0IG5ldmVyIGEgbGl2ZSBtb25pdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gVGhlIGNhcHR1cmUgaGFuZGxlIChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgbmV2ZXIgc3RhcnRlZCkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXB0dXJlZCBjb25zb2xlL2Vycm9yIHRleHQsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgcmVsZXZhbnQgd2FzIGxvZ2dlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkQ29uc29sZUNhcHR1cmVTaW5jZShoYW5kbGU6IENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1wID0gYXdhaXQgZXhlYyhcbiAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2xvZ2NhdCcsICctZCcsICctdicsICd0aW1lJ10sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuXG4gICAgY29uc3QgbWFya2VySW5kZXggPSBkdW1wLmxhc3RJbmRleE9mKGhhbmRsZS5tYXJrZXIpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG1hcmtlckluZGV4ID09PSAtMSA/IGR1bXAgOiBkdW1wLnNsaWNlKG1hcmtlckluZGV4ICsgaGFuZGxlLm1hcmtlci5sZW5ndGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gcmVnaW9uXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBDT05TT0xFX0NBUFRVUkVfVEFHX1JFLnRlc3QobGluZSkpXG4gICAgICAuam9pbignXFxuJylcbiAgICAgIC50cmltKCk7XG5cbiAgICBpZiAoIXJlbGV2YW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiByZWxldmFudC5zbGljZSgtQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHB1c2hpbmcgZmlsZXMgYW5kIGNvbmZpZ3VyaW5nIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogVGhlIHJlZ2lzdHJhdGlvbiBmbG93OlxuICAgKiAxLiBQdXNoIGEgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB0byB0aGUgZGV2aWNlIHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgdGhlIHZhdWx0XG4gICAqIDIuIFN3aXRjaCB0byB0aGUgV2ViVmlldyBjb250ZXh0XG4gICAqIDMuIEFkZCB0aGUgdmF1bHQgdG8gbG9jYWxTdG9yYWdlIChgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AsIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgLFxuICAgKiAgICBgZW5hYmxlLXBsdWdpbi08cGF0aD5gKVxuICAgKiA0LiBUcmlnZ2VyIGBsb2NhdGlvbi5yZWxvYWQoKWAgc28gT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAgICogNS4gV2FpdCBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgXG4gICAqXG4gICAqIEV4aXN0aW5nIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gbG9jYWxTdG9yYWdlIGFyZSBwcmVzZXJ2ZWQgKGFwcGVuZCwgbm90XG4gICAqIG92ZXJ3cml0ZSkgXHUyMDE0IGV4Y2VwdCB0aGUgKipoYXJuZXNzJ3Mgb3duKiogYHRlbXAtdmF1bHQtKmAgcmVnaXN0cmF0aW9ucyBmcm9tXG4gICAqIGVhcmxpZXIgcnVucywgd2hpY2ggYXJlIHBydW5lZCB3aGVuIHtAbGluayBBcHBpdW1UcmFuc3BvcnRDb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIGlzIG9uLiBUaGVpciBkaXJlY3RvcmllcyBhcmUgYWxyZWFkeSBnb25lICh0aGUgZmFjdG9yeSBzd2VlcHMgdGhlbSBiZWZvcmVcbiAgICogdGhlIGFwcCBsYXVuY2hlcyksIGFuZCBpdCBpcyB0aGlzIHJlZ2lzdHJ5IFx1MjAxNCBub3QgdGhlIGZpbGVzeXN0ZW0gXHUyMDE0IHRoYXRcbiAgICogT2JzaWRpYW4gZW51bWVyYXRlcyBhdCBzdGFydHVwLCBzbyBsZWF2aW5nIHRoZW0gaXMgd2hhdCBtYWtlcyBlYWNoIGZhaWxlZFxuICAgKiBydW4gc2xvdyB0aGUgbmV4dCBvbmUgZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGF3YWl0IHRoaXMucHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gV2ViVmlldyBhbmQgY29uZmlndXJlIGxvY2FsU3RvcmFnZS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAvLyBJbnZhbGlkYXRlIGJlZm9yZSByZWxvYWQgXHUyMDE0IHRoZSBwYWdlIHdpbGwgbmF2aWdhdGUgYW5kIHRoZSBXZWJWaWV3XG4gICAgLy8gQ29udGV4dCBtYXkgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgZHVyaW5nIHJlbG9hZC5cbiAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhbGVQcmVmaXggPSB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7VEVNUF9WQVVMVF9ESVJfUFJFRklYfWAgOiAnJztcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKFxuICAgICAgKHBhdGg6IHN0cmluZywgcHJ1bmVQcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG5cbiAgICAgICAgaWYgKHBydW5lUHJlZml4KSB7XG4gICAgICAgICAgY29uc3Qgc3RhbGUgPSBleGlzdGluZy5maWx0ZXIoKHJlZ2lzdGVyZWQpID0+IHJlZ2lzdGVyZWQgIT09IHBhdGggJiYgcmVnaXN0ZXJlZC5zdGFydHNXaXRoKHBydW5lUHJlZml4KSk7XG4gICAgICAgICAgZm9yIChjb25zdCByZWdpc3RlcmVkIG9mIHN0YWxlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3JlZ2lzdGVyZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4aXN0aW5nID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiAhc3RhbGUuaW5jbHVkZXMocmVnaXN0ZXJlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShleGlzdGluZykpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gLCAndHJ1ZScpO1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0sXG4gICAgICBkZXZpY2VWYXVsdFBhdGgsXG4gICAgICBzdGFsZVByZWZpeFxuICAgICk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbi5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogVGhlIHZhdWx0J3MgKipmaWxlcyBhcmUgdGhlbiByZW1vdmVkIGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCB3aGV0aGVyIG9yXG4gICAqIG5vdCB0aGUgYGxvY2FsU3RvcmFnZWAgc3RlcCBzdWNjZWVkZWQqKiBcdTIwMTQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIHRoZVxuICAgKiBgbG9jYWxTdG9yYWdlYCBzdGVwIGdvZXMgdGhyb3VnaCB0aGUgV2ViVmlldyBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgZXhhY3RseVxuICAgKiB3aGF0IG1vc3QgQW5kcm9pZCBmYWlsdXJlcyBhcmUuIFJvdXRpbmcgdGhlIHJlbW92YWwgdGhyb3VnaCB0aGUgYXBwIHdhcyB3aGF0XG4gICAqIG1hZGUgZXZlcnkgZmFpbGVkIHJ1biBsZWFrIGl0cyB2YXVsdCAoYFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6IG5vXG4gICAqIHN1Y2ggd2luZG93YCksIHNvIHRoZSBmaWxlc3lzdGVtLWxldmVsIHJlbW92YWwgbXVzdCBub3QgZGVwZW5kIG9uIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIGZpbHRlcmVkWzBdID8/ICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZGV2aWNlVmF1bHRQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIENvdWxkIG5vdCBkZXJlZ2lzdGVyICR7ZGV2aWNlVmF1bHRQYXRofSBmcm9tIGxvY2FsU3RvcmFnZSBgXG4gICAgICAgICAgKyBgKCR7U3RyaW5nKGVycm9yKX0pOyByZW1vdmluZyBpdHMgZmlsZXMgYW55d2F5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVEZXZpY2VWYXVsdERpcihkZXZpY2VWYXVsdFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRoZSBkcml2ZXIgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0LlxuICAgKlxuICAgKiBJZiB0aGUgY29udGV4dCB3YXMgYWxyZWFkeSB2ZXJpZmllZCAoY2FjaGVkIHZpYSB7QGxpbmsgaXNJbldlYlZpZXdDb250ZXh0fSksXG4gICAqIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBjYWxsaW5nIGBnZXRDb250ZXh0cygpYCBcdTIwMTQgd2hpY2ggcnVuc1xuICAgKiBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycy5cbiAgICpcbiAgICogUG9sbHMgdW50aWwgdGhlIGNvbnRleHQgYmVjb21lcyBhdmFpbGFibGUgKHRoZSBhcHAgbWF5IHN0aWxsIGJlIGxvYWRpbmcpLlxuICAgKiBVc2VzIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBzcGVjaWZpY2FsbHkgdG8gYXZvaWQgY29ubmVjdGluZ1xuICAgKiB0byBDaHJvbWUgb3Igb3RoZXIgV2ViVmlld3Mgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViVmlld0NvbnRleHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbldlYlZpZXdDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yICR7V0VCVklFV19DT05URVhUX1BSRUZJWH0gY29udGV4dCAodGltZW91dD0ke1N0cmluZyh0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY29udGV4dHMgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q29udGV4dHMoKTtcbiAgICAgIGNvbnN0IG9ic2lkaWFuQ29udGV4dCA9IGNvbnRleHRzLmZpbmQoKGN0eCk6IGN0eCBpcyBzdHJpbmcgPT4gdHlwZW9mIGN0eCA9PT0gJ3N0cmluZycgJiYgY3R4LnN0YXJ0c1dpdGgoV0VCVklFV19DT05URVhUX1BSRUZJWCkpO1xuXG4gICAgICBpZiAob2JzaWRpYW5Db250ZXh0KSB7XG4gICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEZvdW5kIFdlYlZpZXcgY29udGV4dDogJHtvYnNpZGlhbkNvbnRleHR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQob2JzaWRpYW5Db250ZXh0KTtcbiAgICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXNldHRpbmcgdG8gTkFUSVZFX0FQUCBiZWZvcmUgcmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQoJ05BVElWRV9BUFAnKTtcbiAgICAgICAgICB9IGNhdGNoIChyZXNldEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBOQVRJVkVfQVBQIHJlc2V0IGFsc28gZmFpbGVkOiAke1N0cmluZyhyZXNldEVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2ViVmlldyBub3QgcmVhZHksIGF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeShjb250ZXh0cyl9LiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoV0VCVklFV19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgZm91bmQgd2l0aGluICR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuIElzIHRoZSBPYnNpZGlhbiBhcHAgZnVsbHkgbG9hZGVkP2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGggdG8gdGhlIGRldmljZS1zaWRlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqIEByZXR1cm5zIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnZhdWx0QmFzZVBhdGh9JHtleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoZXMgdGhlIG1pbmltYWwgYC5vYnNpZGlhbi9hcHAuanNvbmAgdmF1bHQgbWFya2VyIHZpYSBgYWRiIHB1c2hgLlxuICAgKlxuICAgKiBgYnJvd3Nlci5wdXNoRmlsZWAgKFdlYkRyaXZlciBiYXNlNjQpIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBzbG93ZXIgb24gYVxuICAgKiBjb2xkIG9yIGxvYWRlZCBlbXVsYXRvciBcdTIwMTQgbWVhc3VyZWQgYXQgOVx1MjAxMzIxcyBwZXIgY2FsbCBmb3IgdGhpcyAyLWJ5dGUgbWFya2VyLFxuICAgKiB2ZXJzdXMgc3ViLXNlY29uZCBvdmVyIGBhZGJgLiBUaGlzIG1pcnJvcnMge0BsaW5rIHB1c2hGaWxlc30sIHdoaWNoIHN3aXRjaGVkXG4gICAqIHRvIGBhZGJgIGZvciB0aGUgc2FtZSByZWFzb24uIGBta2RpciAtcGAgZ3VhcmFudGVlcyB0aGUgcGFyZW50IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZVZhdWx0UGF0aCAtIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBkaXJlY3RvcnkgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9jYWxNYXJrZXIgPSBqb2luKHRtcGRpcigpLCBgb2JzaWRpYW4tbWFya2VyLSR7cmFuZG9tVVVJRCgpfS5qc29uYCk7XG4gICAgY29uc3QgcmVtb3RlTWFya2VyID0gYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW4vYXBwLmpzb25gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShsb2NhbE1hcmtlciwgJ3t9JywgJ3V0Zi04Jyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW5gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxNYXJrZXIsIHJlbW90ZU1hcmtlcl0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxNYXJrZXIsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSB2YXVsdCBkaXJlY3RvcnkgZnJvbSB0aGUgZGV2aWNlIG92ZXIgYGFkYmAsIGFuZCBDSEVDS1MgdGhhdCBpdCBpc1xuICAgKiBhY3R1YWxseSBnb25lLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydDogYSBmYWlsdXJlIGlzIGxvZ2dlZCwgbm90IHRocm93biwgc28gYSB0ZWFyZG93biBwcm9ibGVtIG5ldmVyXG4gICAqIG1hc2tzIHRoZSB0ZXN0IHJlc3VsdC4gVGhlIG5leHQgcnVuJ3Mgc3RhcnQtb2YtcnVuIHN3ZWVwIHBpY2tzIHVwIHdoYXRldmVyXG4gICAqIHRoaXMgY291bGQgbm90IHJlbW92ZS5cbiAgICpcbiAgICogVGhlIGNoZWNrIGlzIHRoZSBwb2ludC4gYHJtIC1yZmAgcnVucyB3aXRoIGBzaG91bGRJZ25vcmVFeGl0Q29kZWAsIHNvIGFuXG4gICAqIHVucmVtb3ZlZCBkaXJlY3RvcnkgdXNlZCB0byBsZWF2ZSBubyB0cmFjZSBhdCBhbGwgXHUyMDE0IHdoaWNoIGlzIGhvdyBydW5zIHRoYXRcbiAgICogcGFzc2VkIGVuZCB0byBlbmQgd2VyZSBzdGlsbCBmb3VuZCB0byBiZSBsZWFraW5nIGEgdmF1bHQgYXBpZWNlLCBpbnZpc2libHksXG4gICAqIHVudGlsIHNvbWVvbmUgY291bnRlZCB0aGUgZGlyZWN0b3JpZXMgb24gdGhlIGRldmljZSBieSBoYW5kLiBBIGxlYWsgaXMgbm93XG4gICAqIG5hbWVkIGluIHRoZSBsb2cgYXQgdGhlIG1vbWVudCBpdCBoYXBwZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlVmF1bHRQYXRoIC0gVGhlIGRldmljZS1zaWRlIHZhdWx0IGRpcmVjdG9yeSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVEZXZpY2VWYXVsdERpcihkZXZpY2VWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZW1vdmluZyB2YXVsdCBkaXJlY3RvcnkgZnJvbSBkZXZpY2U6ICR7ZGV2aWNlVmF1bHRQYXRofWApO1xuICAgICAgYXdhaXQgZXhlYyhcbiAgICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAncm0nLCAnLXJmJywgZGV2aWNlVmF1bHRQYXRoXSxcbiAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBleGVjKFxuICAgICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdscycsICctZCcsIGRldmljZVZhdWx0UGF0aF0sXG4gICAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICApO1xuXG4gICAgICBpZiAobGlzdGluZy5pbmNsdWRlcyhkZXZpY2VWYXVsdFBhdGgpKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIFdhcm5pbmc6ICR7ZGV2aWNlVmF1bHRQYXRofSBzdXJ2aXZlZCByZW1vdmFsIGFuZCBpcyBub3cgbGVha2VkIHJlc2lkdWUuIGBcbiAgICAgICAgICAgICsgJ1RoZSBuZXh0IHJ1blxcJ3Mgc3RhcnQtb2YtcnVuIHN3ZWVwIHdpbGwgcmV0cnkgaXQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBWYXVsdCBkaXJlY3RvcnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGlzIGB0cnVlYCBpbiB0aGUgV2ViVmlldy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IHN0YXJ0ICsgdGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBsYXlvdXQgcmVhZHkgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc1JlYWR5ID0gYXdhaXQgdGhpcy5icm93c2VyLmV4ZWN1dGUoKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBXZSBuZWVkIGdsb2JhbCBgYXBwYCB2YXJpYWJsZS5cbiAgICAgICAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwIGFzIExvYWRpbmdBcHAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuICEhYXBwPy53b3Jrc3BhY2U/LmxheW91dFJlYWR5O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzUmVhZHkpIHtcbiAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBMYXlvdXQgaXMgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQXBwIG5vdCByZWFkeSB5ZXQgKHBhZ2UgbWF5IGJlIHJlbG9hZGluZykuXG4gICAgICB9XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIExheW91dCBub3QgcmVhZHkgeWV0IChlbGFwc2VkPSR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGxheW91dCBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXNgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGguXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAqIEByZXR1cm5zIFRoZSBsYXN0IHBhdGggc2VnbWVudCAodmF1bHQgZGlyZWN0b3J5IG5hbWUpLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhdWx0UGF0aC5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyk7XG4gIGNvbnN0IGxhc3RTZXAgPSBNYXRoLm1heChub3JtYWxpemVkLmxhc3RJbmRleE9mKCcvJyksIG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJ1xcXFwnKSk7XG4gIHJldHVybiBub3JtYWxpemVkLnNsaWNlKGxhc3RTZXAgKyAxKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQTRDQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFRckIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsV0FBVztBQTBGcEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sd0NBQXdDO0FBQzlDLE1BQU0sK0NBQStDO0FBQ3JELE1BQU0sNkNBQTZDO0FBQ25ELE1BQU0sb0RBQW9EO0FBQzFELE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sMkNBQTJDO0FBR2pE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
453
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc29sZUNhcHR1cmVIYW5kbGUsXG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBURU1QX1ZBVUxUX0RJUl9QUkVGSVggfSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQXBwaXVtIGJyb3dzZXIvZHJpdmVyIGluc3RhbmNlLlxuICAgKiBDcmVhdGVkIGJ5IHRoZSBjb25zdW1lciB2aWEgZS5nLiBXZWJEcml2ZXJJTydzIGByZW1vdGUoKWAuXG4gICAqL1xuICBicm93c2VyOiBCcm93c2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIFVESUQgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICAgKiBVc2VkIGZvciBgYWRiYCBjb21tYW5kcyB3aGVuIHB1c2hpbmcgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICovXG4gIGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgb3ducyB0aGUgQXBwaXVtIHNlc3Npb24gYW5kIHNob3VsZCBkZWxldGUgaXQgb25cbiAgICoge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfS5cbiAgICpcbiAgICogYHRydWVgIGZvciBzZXNzaW9ucyBjcmVhdGVkIHZpYSBgcmVtb3RlKClgIChnbG9iYWwgc2V0dXApLlxuICAgKiBgZmFsc2VgIGZvciBzZXNzaW9ucyByZWF0dGFjaGVkIHZpYSBgYXR0YWNoKClgICh0ZXN0IHdvcmtlcnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzU2Vzc2lvbk93bmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YCBhZnRlclxuICAgKiB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRhcmdldCBwbGF0Zm9ybS4gRGV0ZXJtaW5lcyBXZWJWaWV3IGNvbnRleHQgbmFtaW5nIGFuZCBkZXZpY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgREVGQVVMVF9BUFBfSUQgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nLCBzZWUgVDg4KSAtLS1cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9NQVJLRVJfVEFHID0gJ09JVF9DQVBUVVJFJztcbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgQURCX0xPR19NQVJLRVJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgTE9HQ0FUX0RVTVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG4vKipcbiAqIGBhZGIgbG9nY2F0IC12IHRpbWVgIGxpbmVzIGxvb2sgbGlrZSBgTU0tREQgSEg6TU06U1MubW1tIExFVkVML1RBRyggUElEKTogbWVzc2FnZWAuXG4gKiBLZWVwIG9ubHkgdGhlIHRhZ3MgQ2hyb21pdW0vV2ViVmlldyByb3V0ZXMgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZCB1bmNhdWdodFxuICogZXJyb3JzIHRvIChgY2hyb21pdW1gLCB0aGUgQ2FwYWNpdG9yIGNvbnNvbGUgYnJpZGdlLCBhbmQgbmF0aXZlIGBBbmRyb2lkUnVudGltZWApLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfVEFHX1JFID0gL1xcLyg/OmNocm9taXVtfEFuZHJvaWRSdW50aW1lfENhcGFjaXRvclxcL0NvbnNvbGUpXFwoLztcblxuLyoqXG4gKiBCYXNlIHBhdGggb24gYW4gQW5kcm9pZCBkZXZpY2Ugd2hlcmUgT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHRzLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHN3ZWVwcyBsZWZ0b3ZlciB2YXVsdHMgZnJvbSBpdCBiZWZvcmVcbiAqIGEgdHJhbnNwb3J0IGV4aXN0cyAoc2VlIHRoZSByZXBvJ3MgTDMxKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEggPSAnL3NkY2FyZC9Eb2N1bWVudHMvJztcblxuY29uc3QgREVGQVVMVF9WQVVMVF9CQVNFX1BBVEg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGFuZHJvaWQ6IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEgsXG4gIGlvczogJ0BtZC5vYnNpZGlhbjpkb2N1bWVudHMvJ1xufTtcblxuaW50ZXJmYWNlIExvYWRpbmdBcHAge1xuICB3b3Jrc3BhY2U/OiBMb2FkaW5nV29ya3NwYWNlO1xufVxuXG5pbnRlcmZhY2UgTG9hZGluZ1dvcmtzcGFjZSB7XG4gIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBPYnNpZGlhbiBNb2JpbGUgdmlhIEFwcGl1bSBXZWJWaWV3IEpTIGluamVjdGlvbi5cbiAqXG4gKiBFdmFsdWF0ZXMgZXhwcmVzc2lvbnMgYnkgc3dpdGNoaW5nIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBhbmRcbiAqIGNhbGxpbmcgYGV4ZWN1dGUoKWAuIE1hbmFnZXMgdmF1bHRzIGJ5IHdyaXRpbmcgdG8gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYFxuICogKHdoaWNoIE9ic2lkaWFuIHVzZXMgYXMgaXRzIHZhdWx0IHJlZ2lzdHJ5IG9uIG1vYmlsZSkgYW5kIHB1c2hpbmcgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGl1bVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGB0cnVlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogVHJhY2tzIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgc3dpdGNoZWQgdG8gdGhlIFdlYlZpZXcgY29udGV4dC5cbiAgICpcbiAgICogU2V0IHRvIGB0cnVlYCBhZnRlciBhIHN1Y2Nlc3NmdWwgYHN3aXRjaENvbnRleHQoV0VCVklFV19tZC5vYnNpZGlhbilgLlxuICAgKiBSZXNldCB0byBgZmFsc2VgIHdoZW4gdGhlIGNvbnRleHQgaXMga25vd24gdG8gYmUgaW52YWxpZGF0ZWRcbiAgICogKGUuZy4gYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBpbiB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0pLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwge0BsaW5rIGVuc3VyZVdlYlZpZXdDb250ZXh0fSBza2lwcyB0aGUgZXhwZW5zaXZlXG4gICAqIGBnZXRDb250ZXh0cygpYCBjYWxsICh3aGljaCBydW5zIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmRcbiAgICogY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzKS5cbiAgICovXG4gIHByaXZhdGUgaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTZXNzaW9uT3duZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybTogJ2FuZHJvaWQnIHwgJ2lvcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBcHBpdW0gdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBBcHBpdW1UcmFuc3BvcnRDb25maWcpIHtcbiAgICB0aGlzLmJyb3dzZXIgPSBjb25maWcuYnJvd3NlcjtcbiAgICB0aGlzLmRldmljZUlkID0gY29uZmlnLmRldmljZUlkO1xuICAgIHRoaXMuaXNTZXNzaW9uT3duZXIgPSBjb25maWcuaXNTZXNzaW9uT3duZXIgPz8gdHJ1ZTtcbiAgICB0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IGNvbmZpZy5wbGF0Zm9ybTtcbiAgICB0aGlzLmFwcElkID0gY29uZmlnLmFwcElkID8/IERFRkFVTFRfQVBQX0lEO1xuICAgIHRoaXMuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPSBjb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLnZhdWx0QmFzZVBhdGggPSBjb25maWcudmF1bHRCYXNlUGF0aCA/PyBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSFt0aGlzLnBsYXRmb3JtXSA/PyBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIO1xuICAgIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0VCVklFV19QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlZ2lucyBhIGNvbnNvbGUgY2FwdHVyZSBieSBzdGFtcGluZyB0aGUgZGV2aWNlIGxvZyB3aXRoIGEgdW5pcXVlIG1hcmtlci5cbiAgICpcbiAgICogVXNlcyBgYWRiIHNoZWxsIGxvZ2AgdG8gd3JpdGUgYSBtYXJrZXIgaW50byBgbG9nY2F0YCBhdCBjYXB0dXJlIHN0YXJ0IHNvIGFcbiAgICogbGF0ZXIge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0gY2FuIHNsaWNlIG91dFxuICAgKiBldmVyeXRoaW5nIHRoZSBXZWJWaWV3IGxvZ2dlZCBhZnRlcndhcmRzIFx1MjAxNCB3aXRob3V0IHRoZSBpbnZhc2l2ZSBgbG9nY2F0IC1jYFxuICAgKiBidWZmZXIgY2xlYXIuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgaGFuZGxlIGNhcnJ5aW5nIHRoZSB1bmlxdWUgbWFya2VyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJlZ2luQ29uc29sZUNhcHR1cmUoKTogUHJvbWlzZTxDb25zb2xlQ2FwdHVyZUhhbmRsZT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IGAke0NPTlNPTEVfQ0FQVFVSRV9NQVJLRVJfVEFHfV8ke3JhbmRvbVVVSUQoKX1gO1xuICAgIGF3YWl0IGV4ZWMoXG4gICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdsb2cnLCAnLXQnLCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRywgbWFya2VyXSxcbiAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX0xPR19NQVJLRVJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICk7XG4gICAgcmV0dXJuIHsgbWFya2VyIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1Nlc3Npb25Pd25lcikge1xuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBNb2JpbGUncyBXZWJWaWV3LlxuICAgKlxuICAgKiBTd2l0Y2hlcyB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQsIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gX29wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMgKGN3ZCBpcyBub3QgdXNlZCBvbiBtb2JpbGUgXHUyMDE0IHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKS5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIF9vcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQsIFtdPihcbiAgICAgICAgYHJldHVybiAoJHtleHByZXNzaW9ufSlgXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIENvbnRleHQgbWF5IGhhdmUgYmVlbiBsb3N0IG1pZC1leGVjdXRpb24gKGUuZy4gcGFnZSByZWxvYWQpLlxuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGNvbm5lY3Rpb24gaW5mbyBuZWVkZWQgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAqIGZyb20gYW5vdGhlciBwcm9jZXNzIChlLmcuIGEgdGVzdCB3b3JrZXIpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBJRCBhbmQgZGV2aWNlIElELlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JbmZvKCk6IEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuYnJvd3Nlci5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuYWN0aXZhdGVBcHAodGhpcy5hcHBJZCk7XG4gICAgICBhd2FpdCBkZWxheShBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIHZpYSBjb21wcmVzc2VkIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0YXIuZ3ogYXJjaGl2ZSBvZiB0aGUgbG9jYWwgdmF1bHQgZGlyZWN0b3J5LCBwdXNoZXMgaXQgdG8gdGhlXG4gICAqIGRldmljZSBhcyBhIHNpbmdsZSBmaWxlLCBhbmQgZXh0cmFjdHMgaXQgaW4tcGxhY2UuIFRoaXMgYXZvaWRzIHRoZVxuICAgKiB3ZWJkcml2ZXIgYFJhbmdlRXJyb3JgIG9uIGxhcmdlIGJhc2U2NCBwYXlsb2FkcyBhbmQgaXMgc2lnbmlmaWNhbnRseVxuICAgKiBmYXN0ZXIgdGhhbiBwZXItZmlsZSBgYnJvd3Nlci5wdXNoRmlsZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGFzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBvbiBkZXZpY2UpLlxuICAgKiBAcGFyYW0gX2ZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzICh1bnVzZWQgXHUyMDE0IGFkYiBwdXNoZXMgdGhlIGRpcmVjdG9yeSBkaXJlY3RseSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVzaEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBfZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcbiAgICBjb25zdCBhcmNoaXZlTmFtZSA9IGB2YXVsdC0ke3JhbmRvbVVVSUQoKX0udGFyLmd6YDtcbiAgICBjb25zdCBsb2NhbEFyY2hpdmUgPSBqb2luKHRtcGRpcigpLCBhcmNoaXZlTmFtZSk7XG4gICAgY29uc3QgcmVtb3RlQXJjaGl2ZSA9IGAvZGF0YS9sb2NhbC90bXAvJHthcmNoaXZlTmFtZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIENyZWF0aW5nIGFyY2hpdmU6ICR7bG9jYWxBcmNoaXZlfWApO1xuICAgICAgYXdhaXQgZXhlYyhbJ3RhcicsICdjemYnLCBhcmNoaXZlTmFtZSwgJy1DJywgdmF1bHRQYXRoLCAnLiddLCB7IGN3ZDogdG1wZGlyKCksIGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFB1c2hpbmcgYXJjaGl2ZSB0byBkZXZpY2UgJHt0aGlzLmRldmljZUlkfS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxBcmNoaXZlLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBFeHRyYWN0aW5nIGFyY2hpdmUgb24gZGV2aWNlIGF0ICR7ZGV2aWNlVmF1bHRQYXRofS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAndGFyJywgJ3h6ZicsIHJlbW90ZUFyY2hpdmUsICctQycsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gRmx1c2hpbmcgZmlsZXN5c3RlbSBidWZmZXJzLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3N5bmMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBDbGVhbmluZyB1cCByZW1vdGUgYXJjaGl2ZS4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsQXJjaGl2ZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHVtcHMgYGFkYiBsb2djYXRgIGFuZCByZXR1cm5zIHRoZSBXZWJWaWV3IGNvbnNvbGUvZXJyb3Igb3V0cHV0IGxvZ2dlZFxuICAgKiBzaW5jZSB0aGUgbWFya2VyIGZyb20ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlfS5cbiAgICpcbiAgICogRmlsdGVycyB0byB0aGUgQ2hyb21pdW0vV2ViVmlldyB0YWdzIHRoYXQgY2FycnkgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZFxuICAgKiB1bmNhdWdodCBlcnJvcnMsIGFuZCBjYXBzIHRoZSByZXN1bHQgbGVuZ3RoLiBCb3VuZGVkLCBwb3N0LWhvYyxcbiAgICogZmFpbHVyZS1wYXRoLW9ubHkgXHUyMDE0IG5ldmVyIGEgbGl2ZSBtb25pdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gVGhlIGNhcHR1cmUgaGFuZGxlIChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgbmV2ZXIgc3RhcnRlZCkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXB0dXJlZCBjb25zb2xlL2Vycm9yIHRleHQsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgcmVsZXZhbnQgd2FzIGxvZ2dlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkQ29uc29sZUNhcHR1cmVTaW5jZShoYW5kbGU6IENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1wID0gYXdhaXQgZXhlYyhcbiAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2xvZ2NhdCcsICctZCcsICctdicsICd0aW1lJ10sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuXG4gICAgY29uc3QgbWFya2VySW5kZXggPSBkdW1wLmxhc3RJbmRleE9mKGhhbmRsZS5tYXJrZXIpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG1hcmtlckluZGV4ID09PSAtMSA/IGR1bXAgOiBkdW1wLnNsaWNlKG1hcmtlckluZGV4ICsgaGFuZGxlLm1hcmtlci5sZW5ndGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gcmVnaW9uXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBDT05TT0xFX0NBUFRVUkVfVEFHX1JFLnRlc3QobGluZSkpXG4gICAgICAuam9pbignXFxuJylcbiAgICAgIC50cmltKCk7XG5cbiAgICBpZiAoIXJlbGV2YW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiByZWxldmFudC5zbGljZSgtQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHB1c2hpbmcgZmlsZXMgYW5kIGNvbmZpZ3VyaW5nIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogVGhlIHJlZ2lzdHJhdGlvbiBmbG93OlxuICAgKiAxLiBQdXNoIGEgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB0byB0aGUgZGV2aWNlIHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgdGhlIHZhdWx0XG4gICAqIDIuIFN3aXRjaCB0byB0aGUgV2ViVmlldyBjb250ZXh0XG4gICAqIDMuIEFkZCB0aGUgdmF1bHQgdG8gbG9jYWxTdG9yYWdlIChgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AsIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgLFxuICAgKiAgICBgZW5hYmxlLXBsdWdpbi08cGF0aD5gKVxuICAgKiA0LiBUcmlnZ2VyIGBsb2NhdGlvbi5yZWxvYWQoKWAgc28gT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAgICogNS4gV2FpdCBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgXG4gICAqXG4gICAqIEV4aXN0aW5nIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gbG9jYWxTdG9yYWdlIGFyZSBwcmVzZXJ2ZWQgKGFwcGVuZCwgbm90XG4gICAqIG92ZXJ3cml0ZSkgXHUyMDE0IGV4Y2VwdCB0aGUgKipoYXJuZXNzJ3Mgb3duKiogYHRlbXAtdmF1bHQtKmAgcmVnaXN0cmF0aW9ucyBmcm9tXG4gICAqIGVhcmxpZXIgcnVucywgd2hpY2ggYXJlIHBydW5lZCB3aGVuIHtAbGluayBBcHBpdW1UcmFuc3BvcnRDb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIGlzIG9uLiBUaGVpciBkaXJlY3RvcmllcyBhcmUgYWxyZWFkeSBnb25lICh0aGUgZmFjdG9yeSBzd2VlcHMgdGhlbSBiZWZvcmVcbiAgICogdGhlIGFwcCBsYXVuY2hlcyksIGFuZCBpdCBpcyB0aGlzIHJlZ2lzdHJ5IFx1MjAxNCBub3QgdGhlIGZpbGVzeXN0ZW0gXHUyMDE0IHRoYXRcbiAgICogT2JzaWRpYW4gZW51bWVyYXRlcyBhdCBzdGFydHVwLCBzbyBsZWF2aW5nIHRoZW0gaXMgd2hhdCBtYWtlcyBlYWNoIGZhaWxlZFxuICAgKiBydW4gc2xvdyB0aGUgbmV4dCBvbmUgZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGF3YWl0IHRoaXMucHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gV2ViVmlldyBhbmQgY29uZmlndXJlIGxvY2FsU3RvcmFnZS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAvLyBJbnZhbGlkYXRlIGJlZm9yZSByZWxvYWQgXHUyMDE0IHRoZSBwYWdlIHdpbGwgbmF2aWdhdGUgYW5kIHRoZSBXZWJWaWV3XG4gICAgLy8gQ29udGV4dCBtYXkgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgZHVyaW5nIHJlbG9hZC5cbiAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhbGVQcmVmaXggPSB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7VEVNUF9WQVVMVF9ESVJfUFJFRklYfWAgOiAnJztcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKFxuICAgICAgKHBhdGg6IHN0cmluZywgcHJ1bmVQcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG5cbiAgICAgICAgaWYgKHBydW5lUHJlZml4KSB7XG4gICAgICAgICAgY29uc3Qgc3RhbGUgPSBleGlzdGluZy5maWx0ZXIoKHJlZ2lzdGVyZWQpID0+IHJlZ2lzdGVyZWQgIT09IHBhdGggJiYgcmVnaXN0ZXJlZC5zdGFydHNXaXRoKHBydW5lUHJlZml4KSk7XG4gICAgICAgICAgZm9yIChjb25zdCByZWdpc3RlcmVkIG9mIHN0YWxlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3JlZ2lzdGVyZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4aXN0aW5nID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiAhc3RhbGUuaW5jbHVkZXMocmVnaXN0ZXJlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShleGlzdGluZykpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gLCAndHJ1ZScpO1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0sXG4gICAgICBkZXZpY2VWYXVsdFBhdGgsXG4gICAgICBzdGFsZVByZWZpeFxuICAgICk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbi5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogVGhlIHZhdWx0J3MgKipmaWxlcyBhcmUgdGhlbiByZW1vdmVkIGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCB3aGV0aGVyIG9yXG4gICAqIG5vdCB0aGUgYGxvY2FsU3RvcmFnZWAgc3RlcCBzdWNjZWVkZWQqKiBcdTIwMTQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIHRoZVxuICAgKiBgbG9jYWxTdG9yYWdlYCBzdGVwIGdvZXMgdGhyb3VnaCB0aGUgV2ViVmlldyBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgZXhhY3RseVxuICAgKiB3aGF0IG1vc3QgQW5kcm9pZCBmYWlsdXJlcyBhcmUuIFJvdXRpbmcgdGhlIHJlbW92YWwgdGhyb3VnaCB0aGUgYXBwIHdhcyB3aGF0XG4gICAqIG1hZGUgZXZlcnkgZmFpbGVkIHJ1biBsZWFrIGl0cyB2YXVsdCAoYFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6IG5vXG4gICAqIHN1Y2ggd2luZG93YCksIHNvIHRoZSBmaWxlc3lzdGVtLWxldmVsIHJlbW92YWwgbXVzdCBub3QgZGVwZW5kIG9uIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIGZpbHRlcmVkWzBdID8/ICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZGV2aWNlVmF1bHRQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIENvdWxkIG5vdCBkZXJlZ2lzdGVyICR7ZGV2aWNlVmF1bHRQYXRofSBmcm9tIGxvY2FsU3RvcmFnZSBgXG4gICAgICAgICAgKyBgKCR7U3RyaW5nKGVycm9yKX0pOyByZW1vdmluZyBpdHMgZmlsZXMgYW55d2F5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVEZXZpY2VWYXVsdERpcmVjdG9yeShkZXZpY2VWYXVsdFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRoZSBkcml2ZXIgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0LlxuICAgKlxuICAgKiBJZiB0aGUgY29udGV4dCB3YXMgYWxyZWFkeSB2ZXJpZmllZCAoY2FjaGVkIHZpYSB7QGxpbmsgaXNJbldlYlZpZXdDb250ZXh0fSksXG4gICAqIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBjYWxsaW5nIGBnZXRDb250ZXh0cygpYCBcdTIwMTQgd2hpY2ggcnVuc1xuICAgKiBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycy5cbiAgICpcbiAgICogUG9sbHMgdW50aWwgdGhlIGNvbnRleHQgYmVjb21lcyBhdmFpbGFibGUgKHRoZSBhcHAgbWF5IHN0aWxsIGJlIGxvYWRpbmcpLlxuICAgKiBVc2VzIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBzcGVjaWZpY2FsbHkgdG8gYXZvaWQgY29ubmVjdGluZ1xuICAgKiB0byBDaHJvbWUgb3Igb3RoZXIgV2ViVmlld3Mgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViVmlld0NvbnRleHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbldlYlZpZXdDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yICR7V0VCVklFV19DT05URVhUX1BSRUZJWH0gY29udGV4dCAodGltZW91dD0ke1N0cmluZyh0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY29udGV4dHMgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q29udGV4dHMoKTtcbiAgICAgIGNvbnN0IG9ic2lkaWFuQ29udGV4dCA9IGNvbnRleHRzLmZpbmQoKGNvbnRleHQpOiBjb250ZXh0IGlzIHN0cmluZyA9PiB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycgJiYgY29udGV4dC5zdGFydHNXaXRoKFdFQlZJRVdfQ09OVEVYVF9QUkVGSVgpKTtcblxuICAgICAgaWYgKG9ic2lkaWFuQ29udGV4dCkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBGb3VuZCBXZWJWaWV3IGNvbnRleHQ6ICR7b2JzaWRpYW5Db250ZXh0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KG9ic2lkaWFuQ29udGV4dCk7XG4gICAgICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBzd2l0Y2hDb250ZXh0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfS4gUmVzZXR0aW5nIHRvIE5BVElWRV9BUFAgYmVmb3JlIHJldHJ5aW5nLi4uYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KCdOQVRJVkVfQVBQJyk7XG4gICAgICAgICAgfSBjYXRjaCAocmVzZXRFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gTkFUSVZFX0FQUCByZXNldCBhbHNvIGZhaWxlZDogJHtTdHJpbmcocmVzZXRFcnJvcil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdlYlZpZXcgbm90IHJlYWR5LCBhdmFpbGFibGUgY29udGV4dHM6ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dHMpfS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IGRlbGF5KFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0IGZvdW5kIHdpdGhpbiAke1N0cmluZyh0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLiBJcyB0aGUgT2JzaWRpYW4gYXBwIGZ1bGx5IGxvYWRlZD9gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoIHRvIHRoZSBkZXZpY2Utc2lkZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKiBAcmV0dXJucyBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7ZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGgpfWA7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHRoZSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHZhdWx0IG1hcmtlciB2aWEgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogYGJyb3dzZXIucHVzaEZpbGVgIChXZWJEcml2ZXIgYmFzZTY0KSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyIG9uIGFcbiAgICogY29sZCBvciBsb2FkZWQgZW11bGF0b3IgXHUyMDE0IG1lYXN1cmVkIGF0IDlcdTIwMTMyMXMgcGVyIGNhbGwgZm9yIHRoaXMgMi1ieXRlIG1hcmtlcixcbiAgICogdmVyc3VzIHN1Yi1zZWNvbmQgb3ZlciBgYWRiYC4gVGhpcyBtaXJyb3JzIHtAbGluayBwdXNoRmlsZXN9LCB3aGljaCBzd2l0Y2hlZFxuICAgKiB0byBgYWRiYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgbWtkaXIgLXBgIGd1YXJhbnRlZXMgdGhlIHBhcmVudCBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2FsTWFya2VyID0gam9pbih0bXBkaXIoKSwgYG9ic2lkaWFuLW1hcmtlci0ke3JhbmRvbVVVSUQoKX0uanNvbmApO1xuICAgIGNvbnN0IHJlbW90ZU1hcmtlciA9IGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuL2FwcC5qc29uYDtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUobG9jYWxNYXJrZXIsICd7fScsICd1dGYtOCcpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuYF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAncHVzaCcsIGxvY2FsTWFya2VyLCByZW1vdGVNYXJrZXJdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsTWFya2VyLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgdmF1bHQgZGlyZWN0b3J5IGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCBhbmQgQ0hFQ0tTIHRoYXQgaXQgaXNcbiAgICogYWN0dWFsbHkgZ29uZS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNvIGEgdGVhcmRvd24gcHJvYmxlbSBuZXZlclxuICAgKiBtYXNrcyB0aGUgdGVzdCByZXN1bHQuIFRoZSBuZXh0IHJ1bidzIHN0YXJ0LW9mLXJ1biBzd2VlcCBwaWNrcyB1cCB3aGF0ZXZlclxuICAgKiB0aGlzIGNvdWxkIG5vdCByZW1vdmUuXG4gICAqXG4gICAqIFRoZSBjaGVjayBpcyB0aGUgcG9pbnQuIGBybSAtcmZgIHJ1bnMgd2l0aCBgc2hvdWxkSWdub3JlRXhpdENvZGVgLCBzbyBhblxuICAgKiB1bnJlbW92ZWQgZGlyZWN0b3J5IHVzZWQgdG8gbGVhdmUgbm8gdHJhY2UgYXQgYWxsIFx1MjAxNCB3aGljaCBpcyBob3cgcnVucyB0aGF0XG4gICAqIHBhc3NlZCBlbmQgdG8gZW5kIHdlcmUgc3RpbGwgZm91bmQgdG8gYmUgbGVha2luZyBhIHZhdWx0IGFwaWVjZSwgaW52aXNpYmx5LFxuICAgKiB1bnRpbCBzb21lb25lIGNvdW50ZWQgdGhlIGRpcmVjdG9yaWVzIG9uIHRoZSBkZXZpY2UgYnkgaGFuZC4gQSBsZWFrIGlzIG5vd1xuICAgKiBuYW1lZCBpbiB0aGUgbG9nIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZVZhdWx0UGF0aCAtIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBkaXJlY3RvcnkgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZGlyZWN0b3J5IGZyb20gZGV2aWNlOiAke2RldmljZVZhdWx0UGF0aH1gKTtcbiAgICAgIGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgJy1yZicsIGRldmljZVZhdWx0UGF0aF0sXG4gICAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgZXhlYyhcbiAgICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbHMnLCAnLWQnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgaWYgKGxpc3RpbmcuaW5jbHVkZXMoZGV2aWNlVmF1bHRQYXRoKSkge1xuICAgICAgICBsb2coXG4gICAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBXYXJuaW5nOiAke2RldmljZVZhdWx0UGF0aH0gc3Vydml2ZWQgcmVtb3ZhbCBhbmQgaXMgbm93IGxlYWtlZCByZXNpZHVlLiBgXG4gICAgICAgICAgICArICdUaGUgbmV4dCBydW5cXCdzIHN0YXJ0LW9mLXJ1biBzd2VlcCB3aWxsIHJldHJ5IGl0LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVmF1bHQgZGlyZWN0b3J5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YCBpcyBgdHJ1ZWAgaW4gdGhlIFdlYlZpZXcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JMYXlvdXRSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgbGF5b3V0IHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNSZWFkeSA9IGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKCgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gV2UgbmVlZCBnbG9iYWwgYGFwcGAgdmFyaWFibGUuXG4gICAgICAgICAgY29uc3QgYXBwID0gZ2xvYmFsVGhpcy5hcHAgYXMgTG9hZGluZ0FwcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gISFhcHA/LndvcmtzcGFjZT8ubGF5b3V0UmVhZHk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIExheW91dCBpcyByZWFkeSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBcHAgbm90IHJlYWR5IHlldCAocGFnZSBtYXkgYmUgcmVsb2FkaW5nKS5cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gTGF5b3V0IG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ9JHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBkZWxheShMQVlPVVRfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gbGF5b3V0IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyh0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2ApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIGZyb20gYSBob3N0LXNpZGUgdmF1bHQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICogQHJldHVybnMgVGhlIGxhc3QgcGF0aCBzZWdtZW50ICh2YXVsdCBkaXJlY3RvcnkgbmFtZSkuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gdmF1bHRQYXRoLnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKTtcbiAgY29uc3QgbGFzdFNlcGFyYXRvciA9IE1hdGgubWF4KG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nKSwgbm9ybWFsaXplZC5sYXN0SW5kZXhPZignXFxcXCcpKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQuc2xpY2UobGFzdFNlcGFyYXRvciArIDEpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBNENBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQVFyQixTQUFTLFlBQVk7QUFDckIsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxXQUFXO0FBOEZwQixNQUFNLFlBQVk7QUFDbEIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSwrQ0FBK0M7QUFDckQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSxvREFB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
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * Two modes:
8
8
  * - **Owned (default)**: the transport launches and owns an isolated Obsidian
9
- * instance against a temporary `--user-data-dir` on a free `--remote-debugging-port`,
9
+ * instance against a temporary `--user-data-directory` on a free `--remote-debugging-port`,
10
10
  * never touching the user's Obsidian. Supports version pinning via the user-data asar.
11
11
  * - **Attach**: when an explicit CDP port is configured, the transport connects
12
12
  * to an already-running Obsidian on that port.
@@ -97,22 +97,28 @@ export interface DesktopCdpTransportConfig {
97
97
  shouldWarnOnCompatibilityIssues?: boolean;
98
98
  }
99
99
  /**
100
- * An asar to provision into a harness-owned instance's user-data dir before launch.
100
+ * An asar to provision into a harness-owned instance's user-data directory before launch.
101
101
  */
102
102
  export interface OwnedInstanceAsar {
103
- /** Absolute path to the cached/source asar file. */
103
+ /**
104
+ Absolute path to the cached/source asar file.
105
+ */
104
106
  readonly path: string;
105
- /** The asar's `x.y.z` version. */
107
+ /**
108
+ The asar's `x.y.z` version.
109
+ */
106
110
  readonly version: string;
107
111
  }
108
112
  /**
109
113
  * Configuration for a harness-owned, isolated Obsidian instance.
110
114
  *
111
115
  * When present, the transport launches and owns its own Obsidian process
112
- * against an isolated user-data dir instead of attaching to a running instance.
116
+ * against an isolated user-data directory instead of attaching to a running instance.
113
117
  */
114
118
  export interface OwnedInstanceConfig {
115
- /** Optional asar to provision into {@link userDataDir} before launch. */
119
+ /**
120
+ Optional asar to provision into {@link userDataDirectory} before launch.
121
+ */
116
122
  readonly asar?: OwnedInstanceAsar | undefined;
117
123
  /**
118
124
  * The resolved installer↔app compatibility verdict, when it could be determined
@@ -123,21 +129,27 @@ export interface OwnedInstanceConfig {
123
129
  * `IncompatibleInstallerVersionError` before the config is built.
124
130
  */
125
131
  readonly compatibility?: InstallerCompatibility | undefined;
126
- /** Absolute path to the Obsidian shell executable to launch. */
132
+ /**
133
+ Absolute path to the Obsidian shell executable to launch.
134
+ */
127
135
  readonly exePath: string;
128
136
  /**
129
- * Absolute path to the isolated user-data dir. Created and owned by the
137
+ * Absolute path to the isolated user-data directory. Created and owned by the
130
138
  * transport, and deleted on dispose.
131
139
  */
132
- readonly userDataDir: string;
140
+ readonly userDataDirectory: string;
133
141
  }
134
142
  /**
135
143
  * The CDP endpoint of a launched, harness-owned instance.
136
144
  */
137
145
  interface OwnedInstanceEndpoint {
138
- /** CDP host (e.g. `'localhost'`). */
146
+ /**
147
+ CDP host (e.g. `'localhost'`).
148
+ */
139
149
  readonly host: string;
140
- /** The free CDP port the owned instance was launched on. */
150
+ /**
151
+ The free CDP port the owned instance was launched on.
152
+ */
141
153
  readonly port: number;
142
154
  }
143
155
  /**
@@ -176,7 +188,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
176
188
  constructor(config?: DesktopCdpTransportConfig);
177
189
  /**
178
190
  * Disposes of the active WebSocket connection and, in owned-instance mode,
179
- * kills the owned Obsidian process and removes its isolated user-data dir.
191
+ * kills the owned Obsidian process and removes its isolated user-data directory.
180
192
  *
181
193
  * The removal is retried because Windows briefly holds the just-killed
182
194
  * process's file handles, which would otherwise fail `rmSync` with `EPERM`.
@@ -184,8 +196,8 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
184
196
  dispose(): Promise<void>;
185
197
  /**
186
198
  * Synchronous disposal — kills the owned instance and makes a best-effort
187
- * removal of its user-data dir. Safe to call from a process `exit` handler
188
- * (where async retries are impossible; a leftover temp dir is acceptable).
199
+ * removal of its user-data directory. Safe to call from a process `exit` handler
200
+ * (where async retries are impossible; a leftover temp directory is acceptable).
189
201
  */
190
202
  disposeSync(): void;
191
203
  /**
@@ -368,7 +380,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
368
380
  * Finds the CDP target that has the given vault open.
369
381
  *
370
382
  * Probes every target by evaluating `getBasePath()` and returns the one whose
371
- * base path matches `vaultPath` (via {@link vaultPathsMatch}, tolerant of
383
+ * base path matches `vaultPath` (via {@link areVaultPathsMatching}, tolerant of
372
384
  * separator/case differences). A single target is **not** returned blindly: with
373
385
  * more than one vault open (attach mode's shared instance), the sole-target
374
386
  * shortcut would return whichever window happens to be open regardless of which
@@ -392,7 +404,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
392
404
  * so the next launch gets a pristine single-window instance.
393
405
  *
394
406
  * Relaunching over a live instance is forwarded by Electron's single-instance
395
- * lock on the shared user-data dir and surfaces the vault picker, and opening a
407
+ * lock on the shared user-data directory and surfaces the vault picker, and opening a
396
408
  * second window via IPC leaves stale windows that break vault-target routing —
397
409
  * hence a full kill + wait-for-exit (releasing the lock) between launches. A
398
410
  * no-op on the first attempt, when no instance is running yet.
@@ -467,7 +479,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
467
479
  /**
468
480
  * Polls a killed owned instance's CDP endpoint until it stops responding,
469
481
  * confirming the process has exited and released Electron's single-instance
470
- * lock on the shared user-data dir before a fresh instance is launched into it.
482
+ * lock on the shared user-data directory before a fresh instance is launched into it.
471
483
  *
472
484
  * @param cdpUrl - The CDP URL of the instance that was just killed.
473
485
  */