obsidian-integration-testing 11.0.0 → 12.1.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 (234) hide show
  1. package/dist/lib/cjs/adb-device-list.cjs +54 -0
  2. package/dist/lib/cjs/adb-device-list.d.cts +72 -0
  3. package/dist/lib/cjs/android-sdk.cjs +52 -0
  4. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  5. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  6. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  7. package/dist/lib/cjs/appium-server-marker.cjs +112 -0
  8. package/dist/lib/cjs/appium-server-marker.d.cts +103 -0
  9. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  10. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  11. package/dist/lib/cjs/cli.cjs +104 -19
  12. package/dist/lib/cjs/cli.d.cts +16 -8
  13. package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
  14. package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
  15. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  16. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  17. package/dist/lib/cjs/config-directory.cjs +46 -0
  18. package/dist/lib/cjs/config-directory.d.cts +45 -0
  19. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  20. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  21. package/dist/lib/cjs/context-provider.cjs +12 -1
  22. package/dist/lib/cjs/context-provider.d.cts +26 -3
  23. package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
  24. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +114 -0
  25. package/dist/lib/cjs/demo-vault-populate.cjs +38 -10
  26. package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
  27. package/dist/lib/cjs/device-readiness.cjs +38 -3
  28. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  29. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  30. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  31. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  32. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  33. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  34. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  35. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  36. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  37. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  38. package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
  39. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  40. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  41. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  42. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  43. package/dist/lib/cjs/index.cjs +24 -1
  44. package/dist/lib/cjs/index.d.cts +14 -5
  45. package/dist/lib/cjs/installer-asset.cjs +1 -1
  46. package/dist/lib/cjs/installer-asset.d.cts +1 -1
  47. package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
  48. package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
  49. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  50. package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
  51. package/dist/lib/cjs/kill-process-tree.cjs +18 -7
  52. package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
  53. package/dist/lib/cjs/library.cjs +1 -1
  54. package/dist/lib/cjs/mobile-input.cjs +173 -0
  55. package/dist/lib/cjs/mobile-input.d.cts +156 -0
  56. package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
  57. package/dist/lib/cjs/obsidian-installer.cjs +1 -1
  58. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  59. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  60. package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
  61. package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
  62. package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
  63. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  64. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  65. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  66. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  67. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  68. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  69. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  70. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  71. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  72. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  73. package/dist/lib/cjs/port-owner.cjs +61 -0
  74. package/dist/lib/cjs/port-owner.d.cts +47 -0
  75. package/dist/lib/cjs/process-capture.cjs +62 -0
  76. package/dist/lib/cjs/process-capture.d.cts +83 -0
  77. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  78. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  79. package/dist/lib/cjs/process-liveness.cjs +51 -0
  80. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  81. package/dist/lib/cjs/release-catalog.cjs +73 -0
  82. package/dist/lib/cjs/release-catalog.d.cts +125 -0
  83. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  84. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  85. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  86. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  87. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  88. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  89. package/dist/lib/cjs/transport-appium.cjs +223 -17
  90. package/dist/lib/cjs/transport-appium.d.cts +104 -3
  91. package/dist/lib/cjs/transport-desktop-cdp.cjs +201 -6
  92. package/dist/lib/cjs/transport-desktop-cdp.d.cts +100 -0
  93. package/dist/lib/cjs/transport-factory.cjs +1165 -142
  94. package/dist/lib/cjs/transport-factory.d.cts +10 -1
  95. package/dist/lib/cjs/transport-options.cjs +11 -3
  96. package/dist/lib/cjs/transport-options.d.cts +131 -12
  97. package/dist/lib/cjs/transport.cjs +1 -1
  98. package/dist/lib/cjs/transport.d.cts +7 -1
  99. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  100. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  101. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  102. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  103. package/dist/lib/cjs/version-matrix.cjs +1 -1
  104. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  105. package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
  106. package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
  107. package/dist/lib/cjs/vitest/setup.cjs +2 -1
  108. package/dist/lib/cjs/vitest/setup.d.cts +5 -0
  109. package/dist/lib/cjs/vitest/typings.d.cts +6 -4
  110. package/dist/lib/cjs/webview-cdp.cjs +263 -0
  111. package/dist/lib/cjs/webview-cdp.d.cts +156 -0
  112. package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
  113. package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
  114. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  115. package/dist/lib/esm/adb-device-list.mjs +28 -0
  116. package/dist/lib/esm/android-sdk.d.mts +29 -0
  117. package/dist/lib/esm/android-sdk.mjs +18 -0
  118. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  119. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  120. package/dist/lib/esm/appium-server-marker.d.mts +103 -0
  121. package/dist/lib/esm/appium-server-marker.mjs +89 -0
  122. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  123. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  124. package/dist/lib/esm/cli.d.mts +16 -8
  125. package/dist/lib/esm/cli.mjs +110 -19
  126. package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
  127. package/dist/lib/esm/community-plugin-registry.mjs +23 -0
  128. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  129. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  130. package/dist/lib/esm/config-directory.d.mts +45 -0
  131. package/dist/lib/esm/config-directory.mjs +21 -0
  132. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  133. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  134. package/dist/lib/esm/context-provider.d.mts +26 -3
  135. package/dist/lib/esm/context-provider.mjs +10 -1
  136. package/dist/lib/esm/demo-vault-bootstrap.d.mts +114 -0
  137. package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
  138. package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
  139. package/dist/lib/esm/demo-vault-populate.mjs +35 -9
  140. package/dist/lib/esm/device-readiness.d.mts +83 -9
  141. package/dist/lib/esm/device-readiness.mjs +34 -2
  142. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  143. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  144. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  145. package/dist/lib/esm/emulator-backend.mjs +45 -0
  146. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  147. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  148. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  149. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  150. package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
  151. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  152. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  153. package/dist/lib/esm/global-setup-core.mjs +34 -35
  154. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  155. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  156. package/dist/lib/esm/index.d.mts +14 -5
  157. package/dist/lib/esm/index.mjs +26 -2
  158. package/dist/lib/esm/installer-asset.d.mts +1 -1
  159. package/dist/lib/esm/installer-asset.mjs +1 -1
  160. package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
  161. package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
  162. package/dist/lib/esm/jest/global-setup.d.mts +5 -1
  163. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  164. package/dist/lib/esm/kill-process-tree.d.mts +10 -2
  165. package/dist/lib/esm/kill-process-tree.mjs +16 -6
  166. package/dist/lib/esm/library.mjs +1 -1
  167. package/dist/lib/esm/mobile-input.d.mts +156 -0
  168. package/dist/lib/esm/mobile-input.mjs +144 -0
  169. package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
  170. package/dist/lib/esm/obsidian-installer.mjs +1 -1
  171. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  172. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  173. package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
  174. package/dist/lib/esm/obsidian-metadata.mjs +123 -17
  175. package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
  176. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  177. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  178. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  179. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  180. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  181. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  182. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  183. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  184. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  185. package/dist/lib/esm/parent-liveness.mjs +42 -5
  186. package/dist/lib/esm/port-owner.d.mts +47 -0
  187. package/dist/lib/esm/port-owner.mjs +36 -0
  188. package/dist/lib/esm/process-capture.d.mts +83 -0
  189. package/dist/lib/esm/process-capture.mjs +38 -0
  190. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  191. package/dist/lib/esm/process-exit-message.mjs +13 -8
  192. package/dist/lib/esm/process-liveness.d.mts +18 -0
  193. package/dist/lib/esm/process-liveness.mjs +17 -0
  194. package/dist/lib/esm/release-catalog.d.mts +125 -0
  195. package/dist/lib/esm/release-catalog.mjs +46 -0
  196. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  197. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  198. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  199. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  200. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  201. package/dist/lib/esm/temporary-vault.mjs +43 -8
  202. package/dist/lib/esm/transport-appium.d.mts +104 -3
  203. package/dist/lib/esm/transport-appium.mjs +233 -17
  204. package/dist/lib/esm/transport-desktop-cdp.d.mts +100 -0
  205. package/dist/lib/esm/transport-desktop-cdp.mjs +208 -7
  206. package/dist/lib/esm/transport-factory.d.mts +10 -1
  207. package/dist/lib/esm/transport-factory.mjs +1220 -149
  208. package/dist/lib/esm/transport-options.d.mts +131 -12
  209. package/dist/lib/esm/transport-options.mjs +9 -2
  210. package/dist/lib/esm/transport.d.mts +7 -1
  211. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  212. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  213. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  214. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  215. package/dist/lib/esm/version-matrix.d.mts +2 -2
  216. package/dist/lib/esm/version-matrix.mjs +1 -1
  217. package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
  218. package/dist/lib/esm/vitest/global-setup.mjs +14 -7
  219. package/dist/lib/esm/vitest/setup.d.mts +5 -0
  220. package/dist/lib/esm/vitest/setup.mjs +3 -1
  221. package/dist/lib/esm/vitest/typings.d.mts +6 -4
  222. package/dist/lib/esm/webview-cdp.d.mts +156 -0
  223. package/dist/lib/esm/webview-cdp.mjs +235 -0
  224. package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
  225. package/dist/lib/esm/wedged-appium-server.mjs +86 -0
  226. package/package.json +25 -23
  227. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  228. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  229. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  230. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  231. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  232. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  233. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  234. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -17,9 +17,9 @@ import {
17
17
  parseVersionSpec,
18
18
  resolveVersionFromManifest
19
19
  } from "./obsidian-version.mjs";
20
+ import { buildCatalystAsarUrl } from "./release-catalog.mjs";
20
21
  const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
21
22
  const PUBLIC_ASAR_RELEASE_BASE_URL = "https://github.com/obsidianmd/obsidian-releases/releases/download";
22
- const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
23
23
  const CACHE_ROOT = join(tmpdir(), "obsidian-integration-testing");
24
24
  const ASAR_CACHE_DIR = join(CACHE_ROOT, "asar-cache");
25
25
  const ASAR_FILE_PATTERN = /^obsidian-(?<version>\d+\.\d+\.\d+)\.asar$/;
@@ -103,7 +103,7 @@ function getAsarDownloadUrls(version) {
103
103
  const asarGzFileName = `${getVersionAsarFileName(version)}.gz`;
104
104
  const fallbackUrls = [
105
105
  `${PUBLIC_ASAR_RELEASE_BASE_URL}/v${version}/${asarGzFileName}`,
106
- `${CATALYST_ASAR_RELEASE_BASE_URL}/${asarGzFileName}`
106
+ buildCatalystAsarUrl(version)
107
107
  ];
108
108
  const bakedUrl = getVersionMetadata(version)?.downloads?.asar;
109
109
  return bakedUrl ? [bakedUrl, ...fallbackUrls] : fallbackUrls;
@@ -116,4 +116,4 @@ export {
116
116
  getCachedAsarPath,
117
117
  resolveConcreteVersion
118
118
  };
119
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYHgueS56YCB2ZXJzaW9uIHBhcnNlZCBmcm9tIHRoZSBmaWxlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29waWVzIGFuIGFzYXIgZmlsZSBpbnRvIGEgdXNlci1kYXRhIGRpcmVjdG9yeSB1bmRlciBpdHMgY2Fub25pY2FsXG4gKiBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIG5hbWUuXG4gKlxuICogQHBhcmFtIGFzYXJQYXRoIC0gU291cmNlIGFzYXIgcGF0aC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGFzYXIncyB2ZXJzaW9uICh1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lKS5cbiAqIEBwYXJhbSB1c2VyRGF0YURpcmVjdG9yeSAtIERlc3RpbmF0aW9uIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXNhckludG9Vc2VyRGF0YShhc2FyUGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKHVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBqb2luKHVzZXJEYXRhRGlyZWN0b3J5LCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0aW5hdGlvbik7XG4gIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBQcm92aXNpb25lZCAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9IGludG8gJHt1c2VyRGF0YURpcmVjdG9yeX0uYCk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYXNhciBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gdGhlIGxvY2FsIGNhY2hlLFxuICogZG93bmxvYWRpbmcgYW5kIGRlY29tcHJlc3NpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkIGFzYXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFzYXJDYWNoZWQodmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbWtkaXJTeW5jKEFTQVJfQ0FDSEVfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb24pO1xuICBpZiAoZXhpc3RzU3luYyhjYWNoZWRQYXRoKSkge1xuICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBVc2luZyBjYWNoZWQgYXNhciBmb3IgJHt2ZXJzaW9ufS5gKTtcbiAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgfVxuXG4gIC8vIEEgdmVyc2lvbidzIGFzYXIuZ3ogbGl2ZXMgb24gZXhhY3RseSBvbmUgaG9zdCBkZXBlbmRpbmcgb24gaXRzIGNoYW5uZWxcbiAgLy8gKHB1YmxpYyBcdTIxOTIgR2l0SHViIHJlbGVhc2UgYXNzZXRzLCBjYXRhbHlzdCBcdTIxOTIgdGhlIE9ic2lkaWFuIENETikuIFRoZSBjb25jcmV0ZVxuICAvLyBWZXJzaW9uIGFsb25lIGRvZXMgbm90IHRlbGwgdXMgd2hpY2gsIHNvIHRyeSBib3RoIGFuZCB1c2UgdGhlIGZpcnN0IHRoYXRcbiAgLy8gUmV0dXJucyBhIHZhbGlkIGFyY2hpdmUuXG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB1cmwgb2YgZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc2FyID0gYXdhaXQgZG93bmxvYWRBbmREZWNvbXByZXNzQXNhcih1cmwpO1xuICAgICAgd3JpdGVGaWxlU3luYyhjYWNoZWRQYXRoLCBhc2FyKTtcbiAgICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBDYWNoZWQgYXNhciAke3ZlcnNpb259ICgke1N0cmluZyhhc2FyLmxlbmd0aCl9IGJ5dGVzKSAtPiAke2NhY2hlZFBhdGh9YCk7XG4gICAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goYCR7dXJsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgT2JzaWRpYW4gYXNhciAke3ZlcnNpb259LiBBdHRlbXB0czogJHtlcnJvcnMuam9pbignOyAnKX1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbWFuaWZlc3QuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgZmV0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QoKTogUHJvbWlzZTxEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3Q6IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERlc2t0b3BSZWxlYXNlc01hbmlmZXN0O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXdlc3QgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBpbiBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBzY2FuIChlLmcuIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnIGRpcmVjdG9yeSkuXG4gKiBAcmV0dXJucyBUaGUgbmV3ZXN0IGRpc2NvdmVyZWQgYXNhciwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSAvIHRoZSBkaXJlY3RvcnkgaXMgdW5yZWFkYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmROZXdlc3RBc2FyKGRpcmVjdG9yeTogc3RyaW5nKTogRGlzY292ZXJlZEFzYXIgfCB1bmRlZmluZWQge1xuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgbmV3ZXN0OiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBBU0FSX0ZJTEVfUEFUVEVSTi5leGVjKGVudHJ5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbiA9IG1hdGNoLmdyb3Vwcz8uWyd2ZXJzaW9uJ10gPz8gJyc7XG4gICAgaWYgKCFuZXdlc3QgfHwgY29tcGFyZVZlcnNpb25zKHZlcnNpb24sIG5ld2VzdC52ZXJzaW9uKSA+IDApIHtcbiAgICAgIG5ld2VzdCA9IHsgcGF0aDogam9pbihkaXJlY3RvcnksIGVudHJ5KSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3ZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsIGNhY2hlIHBhdGggZm9yIGEgY29uY3JldGUgdmVyc2lvbidzIGFzYXIgKHRoZSBmaWxlIG1heSBub3RcbiAqIHlldCBleGlzdCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRoZSBhc2FyIGlzIGNhY2hlZCBhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKEFTQVJfQ0FDSEVfRElSLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHZlcnNpb24gc3BlY2lmaWVyIChleHBsaWNpdCBvciBjaGFubmVsIGFsaWFzKSB0byBhIGNvbmNyZXRlXG4gKiBgeC55LnpgIHZlcnNpb24sIGZldGNoaW5nIHRoZSBtYW5pZmVzdCBvbmx5IHdoZW4gYSBjaGFubmVsIGFsaWFzIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHNwZWMgLSBUaGUgdmVyc2lvbiBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyBUaGUgY29uY3JldGUgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb25jcmV0ZVZlcnNpb24oc3BlYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpO1xuICByZXR1cm4gcmVzb2x2ZVZlcnNpb25Gcm9tTWFuaWZlc3QobWFuaWZlc3QsIHBhcnNlZC5jaGFubmVsKTtcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgYSBnemlwLWNvbXByZXNzZWQgYXNhciBmcm9tIGEgVVJMIGFuZCBkZWNvbXByZXNzZXMgaXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBgLmFzYXIuZ3pgIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgYXNhciBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMsIHRoZSBib2R5IGlzIGVtcHR5LCBvciBkZWNvbXByZXNzaW9uIGZhaWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIERvd25sb2FkaW5nIGFzYXIgZnJvbSAke3VybH0gLi4uYCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiBET1dOTE9BRF9VU0VSX0FHRU5UIH0gfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGd6ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChnei5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IHJlc3BvbnNlIGJvZHknKTtcbiAgfVxuICByZXR1cm4gZ3VuemlwU3luYyhneik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FuZGlkYXRlIGAuYXNhci5nemAgZG93bmxvYWQgVVJMcyBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uLlxuICpcbiAqIFRoZSB2ZXJzaW9uJ3MgZXhhY3QgVVJMIGJha2VkIGludG8gdGhlIGBtZXRhZGF0YS5qc29uYCBjYXRhbG9nIChmcm9tIHVwc3RyZWFtXG4gKiBgb2JzaWRpYW4tdmVyc2lvbnMuanNvbmApIGlzIHRyaWVkIGZpcnN0IHdoZW4gcHJlc2VudDsgdGhlIGhhbmQtcm9sbGVkIHB1YmxpY1xuICogKEdpdEh1YikgYW5kIGNhdGFseXN0IChDRE4pIGd1ZXNzZXMgZm9sbG93IGFzIGEgZmFsbGJhY2sgZm9yIHZlcnNpb25zIGFic2VudFxuICogZnJvbSB0aGUgY2F0YWxvZyAob3IgYSBzdGFsZSBjYXRhbG9nKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIFVSTHMgdG8gdHJ5LCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzYXJHekZpbGVOYW1lID0gYCR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0uZ3pgO1xuICBjb25zdCBmYWxsYmFja1VybHMgPSBbXG4gICAgYCR7UFVCTElDX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHthc2FyR3pGaWxlTmFtZX1gLFxuICAgIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHthc2FyR3pGaWxlTmFtZX1gXG4gIF07XG5cbiAgY29uc3QgYmFrZWRVcmwgPSBnZXRWZXJzaW9uTWV0YWRhdGEodmVyc2lvbik/LmRvd25sb2Fkcz8uYXNhcjtcbiAgcmV0dXJuIGJha2VkVXJsID8gW2Jha2VkVXJsLCAuLi5mYWxsYmFja1VybHNdIDogZmFsbGJhY2tVcmxzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUkzQixTQUFTLFdBQVc7QUFDcEIsU0FBUywwQkFBMEI7QUFDbkM7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
119
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IGJ1aWxkQ2F0YWx5c3RBc2FyVXJsIH0gZnJvbSAnLi9yZWxlYXNlLWNhdGFsb2cubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gVGhlIHNhbWUgVUEgdGhlIGNhdGFsb2cgcmVmcmVzaCBzZW5kcyB3aGVuIHByb2JpbmcgdGhlIENETi5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBBU0FSX0NBQ0hFX0RJUiA9IGpvaW4oQ0FDSEVfUk9PVCwgJ2FzYXItY2FjaGUnKTtcbmNvbnN0IEFTQVJfRklMRV9QQVRURVJOID0gL15vYnNpZGlhbi0oPzx2ZXJzaW9uPlxcZCtcXC5cXGQrXFwuXFxkKylcXC5hc2FyJC87XG5cbi8qKlxuICogQSBkaXNjb3ZlcmVkIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgYW4gYXNhciBmaWxlIGludG8gYSB1c2VyLWRhdGEgZGlyZWN0b3J5IHVuZGVyIGl0cyBjYW5vbmljYWxcbiAqIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgbmFtZS5cbiAqXG4gKiBAcGFyYW0gYXNhclBhdGggLSBTb3VyY2UgYXNhciBwYXRoLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgYXNhcidzIHZlcnNpb24gKHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUpLlxuICogQHBhcmFtIHVzZXJEYXRhRGlyZWN0b3J5IC0gRGVzdGluYXRpb24gdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBc2FySW50b1VzZXJEYXRhKGFzYXJQYXRoOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBta2RpclN5bmModXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IGpvaW4odXNlckRhdGFEaXJlY3RvcnksIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xuICBjb3B5RmlsZVN5bmMoYXNhclBhdGgsIGRlc3RpbmF0aW9uKTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyZWN0b3J5fS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyZWN0b3J5KS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpcmVjdG9yeSBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyZWN0b3J5OiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpcmVjdG9yeSwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24uXG4gKlxuICogVGhlIHZlcnNpb24ncyBleGFjdCBVUkwgYmFrZWQgaW50byB0aGUgYG1ldGFkYXRhLmpzb25gIGNhdGFsb2cgKGZyb20gdGhlXG4gKiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AgYXNzZXRzKSBpcyB0cmllZCBmaXJzdCB3aGVuIHByZXNlbnQ7IHRoZSBoYW5kLXJvbGxlZCBwdWJsaWNcbiAqIChHaXRIdWIpIGFuZCBjYXRhbHlzdCAoQ0ROKSBndWVzc2VzIGZvbGxvdyBhcyBhIGZhbGxiYWNrIGZvciB2ZXJzaW9ucyBhYnNlbnRcbiAqIGZyb20gdGhlIGNhdGFsb2cgKG9yIGEgc3RhbGUgY2F0YWxvZykuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBVUkxzIHRvIHRyeSwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEFzYXJEb3dubG9hZFVybHModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhc2FyR3pGaWxlTmFtZSA9IGAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9Lmd6YDtcbiAgY29uc3QgZmFsbGJhY2tVcmxzID0gW1xuICAgIGAke1BVQkxJQ19BU0FSX1JFTEVBU0VfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7YXNhckd6RmlsZU5hbWV9YCxcbiAgICBidWlsZENhdGFseXN0QXNhclVybCh2ZXJzaW9uKVxuICBdO1xuXG4gIGNvbnN0IGJha2VkVXJsID0gZ2V0VmVyc2lvbk1ldGFkYXRhKHZlcnNpb24pPy5kb3dubG9hZHM/LmFzYXI7XG4gIHJldHVybiBiYWtlZFVybCA/IFtiYWtlZFVybCwgLi4uZmFsbGJhY2tVcmxzXSA6IGZhbGxiYWNrVXJscztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw0QkFBNEI7QUFPckMsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSwrQkFBK0I7QUFFckMsTUFBTSxhQUFhLEtBQUssT0FBTyxHQUFHLDhCQUE4QjtBQUNoRSxNQUFNLGlCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNwRCxNQUFNLG9CQUFvQjtBQXlCbkIsU0FBUyxxQkFBcUIsVUFBa0IsU0FBaUIsbUJBQWlDO0FBQ3ZHLFlBQVUsbUJBQW1CLEVBQUUsV0FBVyxLQUFL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
@@ -33,8 +33,9 @@ export interface OpenObsidianSettingsTabOptions extends OpenSettingsTabParams {
33
33
  * actually rendered, resolving the transport and vault from the current test
34
34
  * context.
35
35
  *
36
- * See {@link Lib.openSettingsTab} for why simply calling `app.setting.open()`
37
- * renders nothing, and why the container must be attached **before** it.
36
+ * See {@link Lib.openSettingsTab} for why `app.setting.open()` can put the modal
37
+ * in a second Electron window, and why the container is attached **before** it on
38
+ * a vault that lacks the harness's `settingsPopoutWindow: false` default.
38
39
  *
39
40
  * Close it again from a callback with `app.setting.close()`; re-opening works,
40
41
  * because the attach is idempotent.
@@ -24,4 +24,4 @@ async function openObsidianSettingsTab(options) {
24
24
  export {
25
25
  openObsidianSettingsTab
26
26
  };
27
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+O1xuXG4vKipcbiAqIE9wZW5zIE9ic2lkaWFuJ3Mgc2V0dGluZ3MgbW9kYWwgb24gYSBnaXZlbiB0YWIgYW5kIHdhaXRzIHVudGlsIHRoYXQgdGFiIGhhc1xuICogYWN0dWFsbHkgcmVuZGVyZWQsIHJlc29sdmluZyB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBmcm9tIHRoZSBjdXJyZW50IHRlc3RcbiAqIGNvbnRleHQuXG4gKlxuICogU2VlIHtAbGluayBMaWIub3BlblNldHRpbmdzVGFifSBmb3Igd2h5IHNpbXBseSBjYWxsaW5nIGBhcHAuc2V0dGluZy5vcGVuKClgXG4gKiByZW5kZXJzIG5vdGhpbmcsIGFuZCB3aHkgdGhlIGNvbnRhaW5lciBtdXN0IGJlIGF0dGFjaGVkICoqYmVmb3JlKiogaXQuXG4gKlxuICogQ2xvc2UgaXQgYWdhaW4gZnJvbSBhIGNhbGxiYWNrIHdpdGggYGFwcC5zZXR0aW5nLmNsb3NlKClgOyByZS1vcGVuaW5nIHdvcmtzLFxuICogYmVjYXVzZSB0aGUgYXR0YWNoIGlzIGlkZW1wb3RlbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgdGFiIHRvIG9wZW4sIGhvdyBsb25nIHRvIHdhaXQsIGFuZCB0cmFuc3BvcnQgLyB2YXVsdFxuICogICBvdmVycmlkZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIG5hbWVzIG9mIHRoZSBzZXR0aW5nIHJvd3MgdGhlIHRhYlxuICogICByZW5kZXJlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdGFiIGNhcnJpZXMge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtcy50YWJJZH0sIG9yIGlmIHRoZVxuICogICB0YWIgZG9lcyBub3QgcmVuZGVyIHdpdGhpbiB0aGUgdGltZW91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PYnNpZGlhblNldHRpbmdzVGFiKG9wdGlvbnM6IE9wZW5PYnNpZGlhblNldHRpbmdzVGFiT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qge1xuICAgIHRhYklkLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RXZhbEluT2JzaWRpYW5QYXJhbXM8T3BlblNldHRpbmdzVGFiSW5wdXQsIHN0cmluZ1tdPj4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgbGliLCBvcGVuUGFyYW1zIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICByZXR1cm4gYXdhaXQgbGliLm9wZW5TZXR0aW5nc1RhYihvcGVuUGFyYW1zKTtcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBvcGVuUGFyYW1zOiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8T3BlblNldHRpbmdzVGFiUGFyYW1zPih7XG4gICAgICAgIHRhYklkLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgIH0pXG4gICAgfSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0pKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXNCQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG1DQUFtQztBQTJDNUMsZUFBc0Isd0JBQXdCLFNBQTREO0FBQ3hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxNQUFNLGVBQWUsNEJBQWtGO0FBQUEsSUFDNUcsTUFBTSxTQUFTLEVBQUUsS0FBSyxXQUFXLEdBQXNCO0FBQ3JELGFBQU8sTUFBTSxJQUFJLGdCQUFnQixVQUFVO0FBQUEsSUFDN0M7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLFlBQVksNEJBQW1EO0FBQUEsUUFDN0Q7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDLENBQUM7QUFDSjsiLAogICJuYW1lcyI6IFtdCn0K
27
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+O1xuXG4vKipcbiAqIE9wZW5zIE9ic2lkaWFuJ3Mgc2V0dGluZ3MgbW9kYWwgb24gYSBnaXZlbiB0YWIgYW5kIHdhaXRzIHVudGlsIHRoYXQgdGFiIGhhc1xuICogYWN0dWFsbHkgcmVuZGVyZWQsIHJlc29sdmluZyB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBmcm9tIHRoZSBjdXJyZW50IHRlc3RcbiAqIGNvbnRleHQuXG4gKlxuICogU2VlIHtAbGluayBMaWIub3BlblNldHRpbmdzVGFifSBmb3Igd2h5IGBhcHAuc2V0dGluZy5vcGVuKClgIGNhbiBwdXQgdGhlIG1vZGFsXG4gKiBpbiBhIHNlY29uZCBFbGVjdHJvbiB3aW5kb3csIGFuZCB3aHkgdGhlIGNvbnRhaW5lciBpcyBhdHRhY2hlZCAqKmJlZm9yZSoqIGl0IG9uXG4gKiBhIHZhdWx0IHRoYXQgbGFja3MgdGhlIGhhcm5lc3MncyBgc2V0dGluZ3NQb3BvdXRXaW5kb3c6IGZhbHNlYCBkZWZhdWx0LlxuICpcbiAqIENsb3NlIGl0IGFnYWluIGZyb20gYSBjYWxsYmFjayB3aXRoIGBhcHAuc2V0dGluZy5jbG9zZSgpYDsgcmUtb3BlbmluZyB3b3JrcyxcbiAqIGJlY2F1c2UgdGhlIGF0dGFjaCBpcyBpZGVtcG90ZW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRhYiB0byBvcGVuLCBob3cgbG9uZyB0byB3YWl0LCBhbmQgdHJhbnNwb3J0IC8gdmF1bHRcbiAqICAgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBuYW1lcyBvZiB0aGUgc2V0dGluZyByb3dzIHRoZSB0YWJcbiAqICAgcmVuZGVyZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIHRhYiBjYXJyaWVzIHtAbGluayBPcGVuU2V0dGluZ3NUYWJQYXJhbXMudGFiSWR9LCBvciBpZiB0aGVcbiAqICAgdGFiIGRvZXMgbm90IHJlbmRlciB3aXRoaW4gdGhlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYihvcHRpb25zOiBPcGVuT2JzaWRpYW5TZXR0aW5nc1RhYk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHtcbiAgICB0YWJJZCxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEV2YWxJbk9ic2lkaWFuUGFyYW1zPE9wZW5TZXR0aW5nc1RhYklucHV0LCBzdHJpbmdbXT4+KHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGxpYiwgb3BlblBhcmFtcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IGxpYi5vcGVuU2V0dGluZ3NUYWIob3BlblBhcmFtcyk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgb3BlblBhcmFtczogbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPE9wZW5TZXR0aW5nc1RhYlBhcmFtcz4oe1xuICAgICAgICB0YWJJZCxcbiAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICB9KVxuICAgIH0sXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFzQkEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxtQ0FBbUM7QUE0QzVDLGVBQXNCLHdCQUF3QixTQUE0RDtBQUN4RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFNBQU8sTUFBTSxlQUFlLDRCQUFrRjtBQUFBLElBQzVHLE1BQU0sU0FBUyxFQUFFLEtBQUssV0FBVyxHQUFzQjtBQUNyRCxhQUFPLE1BQU0sSUFBSSxnQkFBZ0IsVUFBVTtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxZQUFZLDRCQUFtRDtBQUFBLFFBQzdEO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQyxDQUFDO0FBQ0o7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Records that the harness-owned Obsidian instance on a CDP port died, so a
5
+ * process that did not spawn it can still say **why** it is unreachable.
6
+ *
7
+ * Only the process that launched the instance holds the child handle and sees
8
+ * `exit`; the test workers get nothing but the port (see the repo's L9). So the
9
+ * one fact worth having — the exit code — has to cross a process boundary, and
10
+ * this is the channel: a small JSON sentinel next to the setup lock
11
+ * (`setup-lock.ts`) and the Appium server marker (`appium-server-marker.ts`),
12
+ * keyed by port.
13
+ *
14
+ * Written **only for a death the harness did not order.** A deliberate kill
15
+ * (teardown, or the relaunch loop killing an instance before starting the next)
16
+ * clears the marker instead, because a marker left behind by a clean run would
17
+ * convict the next run's healthy instance of an exit that never happened.
18
+ *
19
+ * Reads are deliberately tolerant, exactly as the Appium marker's are: missing,
20
+ * unreadable, or describing another port all read as "no marker", and the
21
+ * caller falls back to saying only that the instance is gone.
22
+ */
23
+ /**
24
+ * Records the death of the owned instance that was serving CDP on a port.
25
+ */
26
+ export interface OwnedInstanceExitMarker {
27
+ /**
28
+ Exit code, or `null` when terminated by a signal or when it failed to spawn.
29
+ */
30
+ readonly code: null | number;
31
+ /**
32
+ When the instance exited (`Date.now()` epoch milliseconds).
33
+ */
34
+ readonly exitedAtInMilliseconds: number;
35
+ /**
36
+ The tail of everything the instance wrote to stdout/stderr (empty when it wrote nothing).
37
+ */
38
+ readonly outputTail: string;
39
+ /**
40
+ PID of the instance's process, or `undefined` when it never got one.
41
+ */
42
+ readonly pid: number | undefined;
43
+ /**
44
+ The CDP port the dead instance was serving.
45
+ */
46
+ readonly port: number;
47
+ /**
48
+ Terminating signal, or `null` when it exited normally or failed to spawn.
49
+ */
50
+ readonly signal: NodeJS.Signals | null;
51
+ /**
52
+ The spawn-failure message when the instance never started (e.g. `ENOENT`), otherwise absent.
53
+ */
54
+ readonly spawnError?: string | undefined;
55
+ }
56
+ /**
57
+ * Parameters for {@link writeOwnedInstanceExitMarker}.
58
+ */
59
+ export interface WriteOwnedInstanceExitMarkerParams {
60
+ /**
61
+ Exit code, or `null` when terminated by a signal or when it failed to spawn.
62
+ */
63
+ readonly code: null | number;
64
+ /**
65
+ The tail of everything the instance wrote to stdout/stderr.
66
+ */
67
+ readonly outputTail: string;
68
+ /**
69
+ PID of the instance's process, or `undefined` when it never got one.
70
+ */
71
+ readonly pid: number | undefined;
72
+ /**
73
+ The CDP port the dead instance was serving.
74
+ */
75
+ readonly port: number;
76
+ /**
77
+ Terminating signal, or `null` when it exited normally or failed to spawn.
78
+ */
79
+ readonly signal: NodeJS.Signals | null;
80
+ /**
81
+ The spawn-failure message when the instance never started, otherwise absent.
82
+ */
83
+ readonly spawnError?: string | undefined;
84
+ }
85
+ /**
86
+ * Removes the marker for a port. Called when an instance is launched on it (a
87
+ * recycled port must not inherit an older instance's death) and whenever the
88
+ * harness kills an instance on purpose.
89
+ *
90
+ * @param port - The CDP port.
91
+ */
92
+ export declare function clearOwnedInstanceExitMarker(port: number): void;
93
+ /**
94
+ * Reads the marker for a port.
95
+ *
96
+ * @param port - The CDP port.
97
+ * @returns The marker, or `undefined` when there is none, it is unreadable, or it does not describe this port.
98
+ */
99
+ export declare function readOwnedInstanceExitMarker(port: number): OwnedInstanceExitMarker | undefined;
100
+ /**
101
+ * Records that the instance serving a port has died, stamping it with the
102
+ * current time so a reader can report how long ago it happened.
103
+ *
104
+ * @param params - The dead instance's port, exit details, and output tail.
105
+ */
106
+ export declare function writeOwnedInstanceExitMarker(params: WriteOwnedInstanceExitMarkerParams): void;
@@ -0,0 +1,78 @@
1
+ import {
2
+ mkdirSync,
3
+ readFileSync,
4
+ rmSync,
5
+ writeFileSync
6
+ } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { log } from "./log.mjs";
10
+ const MARKER_DIR_NAME = "obsidian-integration-testing";
11
+ const MARKER_FILE_SUFFIX = ".owned-instance-exit.json";
12
+ function clearOwnedInstanceExitMarker(port) {
13
+ try {
14
+ rmSync(getMarkerFilePath(port), { force: true });
15
+ } catch (error) {
16
+ log(`[owned-instance-exit-marker] Could not remove the marker for port ${String(port)}: ${getErrorMessage(error)}`);
17
+ }
18
+ }
19
+ function readOwnedInstanceExitMarker(port) {
20
+ let parsed;
21
+ try {
22
+ parsed = JSON.parse(readFileSync(getMarkerFilePath(port), "utf-8"));
23
+ } catch {
24
+ return void 0;
25
+ }
26
+ return parseMarker(parsed, port);
27
+ }
28
+ function writeOwnedInstanceExitMarker(params) {
29
+ const marker = {
30
+ code: params.code,
31
+ exitedAtInMilliseconds: Date.now(),
32
+ outputTail: params.outputTail,
33
+ pid: params.pid,
34
+ port: params.port,
35
+ signal: params.signal,
36
+ ...params.spawnError !== void 0 && { spawnError: params.spawnError }
37
+ };
38
+ try {
39
+ mkdirSync(getMarkerDirectory(), { recursive: true });
40
+ writeFileSync(getMarkerFilePath(marker.port), JSON.stringify(marker));
41
+ } catch (error) {
42
+ log(`[owned-instance-exit-marker] Could not record the exit on port ${String(marker.port)}: ${getErrorMessage(error)}`);
43
+ }
44
+ }
45
+ function getErrorMessage(error) {
46
+ return error instanceof Error ? error.message : String(error);
47
+ }
48
+ function getMarkerDirectory() {
49
+ return join(tmpdir(), MARKER_DIR_NAME);
50
+ }
51
+ function getMarkerFilePath(port) {
52
+ return join(getMarkerDirectory(), `${String(port)}${MARKER_FILE_SUFFIX}`);
53
+ }
54
+ function parseMarker(parsed, port) {
55
+ if (typeof parsed !== "object" || parsed === null) {
56
+ return void 0;
57
+ }
58
+ const record = parsed;
59
+ const { code, exitedAtInMilliseconds, outputTail, pid, port: markedPort, signal, spawnError } = record;
60
+ if (typeof exitedAtInMilliseconds !== "number" || markedPort !== port) {
61
+ return void 0;
62
+ }
63
+ return {
64
+ code: typeof code === "number" ? code : null,
65
+ exitedAtInMilliseconds,
66
+ outputTail: typeof outputTail === "string" ? outputTail : "",
67
+ pid: typeof pid === "number" ? pid : void 0,
68
+ port,
69
+ signal: typeof signal === "string" ? signal : null,
70
+ ...typeof spawnError === "string" && { spawnError }
71
+ };
72
+ }
73
+ export {
74
+ clearOwnedInstanceExitMarker,
75
+ readOwnedInstanceExitMarker,
76
+ writeOwnedInstanceExitMarker
77
+ };
78
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVjb3JkcyB0aGF0IHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIG9uIGEgQ0RQIHBvcnQgZGllZCwgc28gYVxuICogcHJvY2VzcyB0aGF0IGRpZCBub3Qgc3Bhd24gaXQgY2FuIHN0aWxsIHNheSAqKndoeSoqIGl0IGlzIHVucmVhY2hhYmxlLlxuICpcbiAqIE9ubHkgdGhlIHByb2Nlc3MgdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UgaG9sZHMgdGhlIGNoaWxkIGhhbmRsZSBhbmQgc2Vlc1xuICogYGV4aXRgOyB0aGUgdGVzdCB3b3JrZXJzIGdldCBub3RoaW5nIGJ1dCB0aGUgcG9ydCAoc2VlIHRoZSByZXBvJ3MgTDkpLiBTbyB0aGVcbiAqIG9uZSBmYWN0IHdvcnRoIGhhdmluZyBcdTIwMTQgdGhlIGV4aXQgY29kZSBcdTIwMTQgaGFzIHRvIGNyb3NzIGEgcHJvY2VzcyBib3VuZGFyeSwgYW5kXG4gKiB0aGlzIGlzIHRoZSBjaGFubmVsOiBhIHNtYWxsIEpTT04gc2VudGluZWwgbmV4dCB0byB0aGUgc2V0dXAgbG9ja1xuICogKGBzZXR1cC1sb2NrLnRzYCkgYW5kIHRoZSBBcHBpdW0gc2VydmVyIG1hcmtlciAoYGFwcGl1bS1zZXJ2ZXItbWFya2VyLnRzYCksXG4gKiBrZXllZCBieSBwb3J0LlxuICpcbiAqIFdyaXR0ZW4gKipvbmx5IGZvciBhIGRlYXRoIHRoZSBoYXJuZXNzIGRpZCBub3Qgb3JkZXIuKiogQSBkZWxpYmVyYXRlIGtpbGxcbiAqICh0ZWFyZG93biwgb3IgdGhlIHJlbGF1bmNoIGxvb3Aga2lsbGluZyBhbiBpbnN0YW5jZSBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQpXG4gKiBjbGVhcnMgdGhlIG1hcmtlciBpbnN0ZWFkLCBiZWNhdXNlIGEgbWFya2VyIGxlZnQgYmVoaW5kIGJ5IGEgY2xlYW4gcnVuIHdvdWxkXG4gKiBjb252aWN0IHRoZSBuZXh0IHJ1bidzIGhlYWx0aHkgaW5zdGFuY2Ugb2YgYW4gZXhpdCB0aGF0IG5ldmVyIGhhcHBlbmVkLlxuICpcbiAqIFJlYWRzIGFyZSBkZWxpYmVyYXRlbHkgdG9sZXJhbnQsIGV4YWN0bHkgYXMgdGhlIEFwcGl1bSBtYXJrZXIncyBhcmU6IG1pc3NpbmcsXG4gKiB1bnJlYWRhYmxlLCBvciBkZXNjcmliaW5nIGFub3RoZXIgcG9ydCBhbGwgcmVhZCBhcyBcIm5vIG1hcmtlclwiLCBhbmQgdGhlXG4gKiBjYWxsZXIgZmFsbHMgYmFjayB0byBzYXlpbmcgb25seSB0aGF0IHRoZSBpbnN0YW5jZSBpcyBnb25lLlxuICovXG5cbmltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG5jb25zdCBNQVJLRVJfRElSX05BTUUgPSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5jb25zdCBNQVJLRVJfRklMRV9TVUZGSVggPSAnLm93bmVkLWluc3RhbmNlLWV4aXQuanNvbic7XG5cbi8qKlxuICogUmVjb3JkcyB0aGUgZGVhdGggb2YgdGhlIG93bmVkIGluc3RhbmNlIHRoYXQgd2FzIHNlcnZpbmcgQ0RQIG9uIGEgcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB7XG4gIC8qKlxuICBFeGl0IGNvZGUsIG9yIGBudWxsYCB3aGVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3Igd2hlbiBpdCBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICBXaGVuIHRoZSBpbnN0YW5jZSBleGl0ZWQgKGBEYXRlLm5vdygpYCBlcG9jaCBtaWxsaXNlY29uZHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgdGFpbCBvZiBldmVyeXRoaW5nIHRoZSBpbnN0YW5jZSB3cm90ZSB0byBzdGRvdXQvc3RkZXJyIChlbXB0eSB3aGVuIGl0IHdyb3RlIG5vdGhpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0VGFpbDogc3RyaW5nO1xuXG4gIC8qKlxuICBQSUQgb2YgdGhlIGluc3RhbmNlJ3MgcHJvY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZXZlciBnb3Qgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBDRFAgcG9ydCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCBvciBgbnVsbGAgd2hlbiBpdCBleGl0ZWQgbm9ybWFsbHkgb3IgZmFpbGVkIHRvIHNwYXduLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG5cbiAgLyoqXG4gIFRoZSBzcGF3bi1mYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgaW5zdGFuY2UgbmV2ZXIgc3RhcnRlZCAoZS5nLiBgRU5PRU5UYCksIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3cml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyUGFyYW1zIHtcbiAgLyoqXG4gIEV4aXQgY29kZSwgb3IgYG51bGxgIHdoZW4gdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciB3aGVuIGl0IGZhaWxlZCB0byBzcGF3bi5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIGV2ZXJ5dGhpbmcgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRUYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgaW5zdGFuY2UncyBwcm9jZXNzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IG5ldmVyIGdvdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBwaWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIENEUCBwb3J0IHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCB3aGVuIGl0IGV4aXRlZCBub3JtYWxseSBvciBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgVGhlIHNwYXduLWZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBpbnN0YW5jZSBuZXZlciBzdGFydGVkLCBvdGhlcndpc2UgYWJzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc3Bhd25FcnJvcj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBtYXJrZXIgZm9yIGEgcG9ydC4gQ2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gaXQgKGFcbiAqIHJlY3ljbGVkIHBvcnQgbXVzdCBub3QgaW5oZXJpdCBhbiBvbGRlciBpbnN0YW5jZSdzIGRlYXRoKSBhbmQgd2hlbmV2ZXIgdGhlXG4gKiBoYXJuZXNzIGtpbGxzIGFuIGluc3RhbmNlIG9uIHB1cnBvc2UuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJtU3luYyhnZXRNYXJrZXJGaWxlUGF0aChwb3J0KSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtvd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlcl0gQ291bGQgbm90IHJlbW92ZSB0aGUgbWFya2VyIGZvciBwb3J0ICR7U3RyaW5nKHBvcnQpfTogJHtnZXRFcnJvck1lc3NhZ2UoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIG1hcmtlciBmb3IgYSBwb3J0LlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0LlxuICogQHJldHVybnMgVGhlIG1hcmtlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCBkb2VzIG5vdCBkZXNjcmliZSB0aGlzIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydDogbnVtYmVyKTogT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKHBvcnQpLCAndXRmLTgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcGFyc2VNYXJrZXIocGFyc2VkLCBwb3J0KTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoYXQgdGhlIGluc3RhbmNlIHNlcnZpbmcgYSBwb3J0IGhhcyBkaWVkLCBzdGFtcGluZyBpdCB3aXRoIHRoZVxuICogY3VycmVudCB0aW1lIHNvIGEgcmVhZGVyIGNhbiByZXBvcnQgaG93IGxvbmcgYWdvIGl0IGhhcHBlbmVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVhZCBpbnN0YW5jZSdzIHBvcnQsIGV4aXQgZGV0YWlscywgYW5kIG91dHB1dCB0YWlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPd25lZEluc3RhbmNlRXhpdE1hcmtlcihwYXJhbXM6IFdyaXRlT3duZWRJbnN0YW5jZUV4aXRNYXJrZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciA9IHtcbiAgICBjb2RlOiBwYXJhbXMuY29kZSxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpLFxuICAgIG91dHB1dFRhaWw6IHBhcmFtcy5vdXRwdXRUYWlsLFxuICAgIHBpZDogcGFyYW1zLnBpZCxcbiAgICBwb3J0OiBwYXJhbXMucG9ydCxcbiAgICBzaWduYWw6IHBhcmFtcy5zaWduYWwsXG4gICAgLi4uKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQgJiYgeyBzcGF3bkVycm9yOiBwYXJhbXMuc3Bhd25FcnJvciB9KVxuICB9O1xuXG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGdldE1hcmtlckRpcmVjdG9yeSgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKG1hcmtlci5wb3J0KSwgSlNPTi5zdHJpbmdpZnkobWFya2VyKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXJdIENvdWxkIG5vdCByZWNvcmQgdGhlIGV4aXQgb24gcG9ydCAke1N0cmluZyhtYXJrZXIucG9ydCl9OiAke2dldEVycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFya2VyRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHRtcGRpcigpLCBNQVJLRVJfRElSX05BTUUpO1xufVxuXG5mdW5jdGlvbiBnZXRNYXJrZXJGaWxlUGF0aChwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihnZXRNYXJrZXJEaXJlY3RvcnkoKSwgYCR7U3RyaW5nKHBvcnQpfSR7TUFSS0VSX0ZJTEVfU1VGRklYfWApO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1hcmtlcihwYXJzZWQ6IHVua25vd24sIHBvcnQ6IG51bWJlcik6IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHsgY29kZSwgZXhpdGVkQXRJbk1pbGxpc2Vjb25kcywgb3V0cHV0VGFpbCwgcGlkLCBwb3J0OiBtYXJrZWRQb3J0LCBzaWduYWwsIHNwYXduRXJyb3IgfSA9IHJlY29yZDtcblxuICBpZiAodHlwZW9mIGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgIT09ICdudW1iZXInIHx8IG1hcmtlZFBvcnQgIT09IHBvcnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiB0eXBlb2YgY29kZSA9PT0gJ251bWJlcicgPyBjb2RlIDogbnVsbCxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IHR5cGVvZiBvdXRwdXRUYWlsID09PSAnc3RyaW5nJyA/IG91dHB1dFRhaWwgOiAnJyxcbiAgICBwaWQ6IHR5cGVvZiBwaWQgPT09ICdudW1iZXInID8gcGlkIDogdW5kZWZpbmVkLFxuICAgIHBvcnQsXG4gICAgc2lnbmFsOiB0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyA/IHNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscyA6IG51bGwsXG4gICAgLi4uKHR5cGVvZiBzcGF3bkVycm9yID09PSAnc3RyaW5nJyAmJiB7IHNwYXduRXJyb3IgfSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQXVCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUVyQixTQUFTLFdBQVc7QUFFcEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxxQkFBcUI7QUFvRnBCLFNBQVMsNkJBQTZCLE1BQW9CO0FBQy9ELE1BQUk7QUFDRixXQUFPLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLEVBQ2pELFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSxxRUFBcUUsT0FBTyxJQUFJLENBQUMsS0FBSyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNwSDtBQUNGO0FBUU8sU0FBUyw0QkFBNEIsTUFBbUQ7QUFDN0YsTUFBSTtBQUNKLE1BQUk7QUFDRixhQUFTLEtBQUssTUFBTSxhQUFhLGtCQUFrQixJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQUEsRUFDcEUsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxZQUFZLFFBQVEsSUFBSTtBQUNqQztBQVFPLFNBQVMsNkJBQTZCLFFBQWtEO0FBQzdGLFFBQU0sU0FBa0M7QUFBQSxJQUN0QyxNQUFNLE9BQU87QUFBQSxJQUNiLHdCQUF3QixLQUFLLElBQUk7QUFBQSxJQUNqQyxZQUFZLE9BQU87QUFBQSxJQUNuQixLQUFLLE9BQU87QUFBQSxJQUNaLE1BQU0sT0FBTztBQUFBLElBQ2IsUUFBUSxPQUFPO0FBQUEsSUFDZixHQUFJLE9BQU8sZUFBZSxVQUFhLEVBQUUsWUFBWSxPQUFPLFdBQVc7QUFBQSxFQUN6RTtBQUVBLE1BQUk7QUFDRixjQUFVLG1CQUFtQixHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDbkQsa0JBQWMsa0JBQWtCLE9BQU8sSUFBSSxHQUFHLEtBQUssVUFBVSxNQUFNLENBQUM7QUFBQSxFQUN0RSxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksa0VBQWtFLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUN4SDtBQUNGO0FBRUEsU0FBUyxnQkFBZ0IsT0FBd0I7QUFDL0MsU0FBTyxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQzlEO0FBRUEsU0FBUyxxQkFBNkI7QUFDcEMsU0FBTyxLQUFLLE9BQU8sR0FBRyxlQUFlO0FBQ3ZDO0FBRUEsU0FBUyxrQkFBa0IsTUFBc0I7QUFDL0MsU0FBTyxLQUFLLG1CQUFtQixHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsRUFBRTtBQUMxRTtBQUVBLFNBQVMsWUFBWSxRQUFpQixNQUFtRDtBQUN2RixNQUFJLE9BQU8sV0FBVyxZQUFZLFdBQVcsTUFBTTtBQUNqRCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUztBQUNmLFFBQU0sRUFBRSxNQUFNLHdCQUF3QixZQUFZLEtBQUssTUFBTSxZQUFZLFFBQVEsV0FBVyxJQUFJO0FBRWhHLE1BQUksT0FBTywyQkFBMkIsWUFBWSxlQUFlLE1BQU07QUFDckUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQUEsSUFDTCxNQUFNLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFBQSxJQUN4QztBQUFBLElBQ0EsWUFBWSxPQUFPLGVBQWUsV0FBVyxhQUFhO0FBQUEsSUFDMUQsS0FBSyxPQUFPLFFBQVEsV0FBVyxNQUFNO0FBQUEsSUFDckM7QUFBQSxJQUNBLFFBQVEsT0FBTyxXQUFXLFdBQVcsU0FBMkI7QUFBQSxJQUNoRSxHQUFJLE9BQU8sZUFBZSxZQUFZLEVBQUUsV0FBVztBQUFBLEVBQ3JEO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when the harness-owned Obsidian instance is gone —
5
+ * it exited, and the CDP endpoint it was serving answers nothing.
6
+ *
7
+ * It exists to replace an anonymous cascade with one named cause. Before it,
8
+ * every test file scheduled after a mid-run death failed in ~60–90 ms with
9
+ * `TypeError: fetch failed` wrapping `connect ECONNREFUSED 127.0.0.1:<port>` —
10
+ * measured at **156 such failures across 21 files** in `obsidian-patterns` on
11
+ * 2026-09-05, not one of them a test result. The absence of an app is not a test
12
+ * outcome, and this error says so in the words a reader needs: the instance
13
+ * died, here is its exit code, and these failures are not about your code.
14
+ *
15
+ * Exported so callers can `instanceof`-match it, like `SilentAsarFallbackError`
16
+ * and `RendererFailedToInitializeError`.
17
+ */
18
+ import type { OwnedInstanceExitMarker } from './owned-instance-exit-marker.mjs';
19
+ /**
20
+ * Parameters for the {@link OwnedInstanceExitedError} constructor.
21
+ *
22
+ * Everything but the URL is optional: the exit details come from the process
23
+ * that launched the instance, and a caller in another process has them only
24
+ * when the exit marker survived (see `owned-instance-exit-marker.ts`).
25
+ */
26
+ export interface OwnedInstanceExitedErrorConstructorParams {
27
+ /**
28
+ The CDP URL the dead instance was serving.
29
+ */
30
+ readonly cdpUrl: string;
31
+ /**
32
+ Exit code, when known.
33
+ */
34
+ readonly code?: null | number | undefined;
35
+ /**
36
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
37
+ */
38
+ readonly exitedAtInMilliseconds?: number | undefined;
39
+ /**
40
+ The tail of what the instance wrote to stdout/stderr, when any was captured.
41
+ */
42
+ readonly outputTail?: string | undefined;
43
+ /**
44
+ PID of the dead instance, when known.
45
+ */
46
+ readonly pid?: number | undefined;
47
+ /**
48
+ Terminating signal, when known.
49
+ */
50
+ readonly signal?: NodeJS.Signals | null | undefined;
51
+ /**
52
+ The spawn-failure message when the instance never started, otherwise absent.
53
+ */
54
+ readonly spawnError?: string | undefined;
55
+ }
56
+ /**
57
+ * Thrown when the harness-owned Obsidian instance has exited and its CDP
58
+ * endpoint is therefore unreachable. Carries whatever is known about the death
59
+ * — exit code, signal, when it happened, and the output tail — so the failure
60
+ * names its own cause instead of a refused connection.
61
+ */
62
+ export declare class OwnedInstanceExitedError extends Error {
63
+ /**
64
+ The CDP URL the dead instance was serving.
65
+ */
66
+ readonly cdpUrl: string;
67
+ /**
68
+ Exit code, when known.
69
+ */
70
+ readonly code: null | number | undefined;
71
+ /**
72
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
73
+ */
74
+ readonly exitedAtInMilliseconds: number | undefined;
75
+ /**
76
+ Terminating signal, when known.
77
+ */
78
+ readonly signal: NodeJS.Signals | null | undefined;
79
+ /**
80
+ * Creates the error from whatever is known about the instance's death.
81
+ *
82
+ * @param params - The CDP URL, and the exit details when they are available.
83
+ */
84
+ constructor(params: OwnedInstanceExitedErrorConstructorParams);
85
+ }
86
+ /**
87
+ * Builds the error from an exit marker, for a process that did not launch the
88
+ * instance and so has nothing else to go on.
89
+ *
90
+ * A missing marker is expected rather than exceptional — it is cleared on every
91
+ * deliberate kill, and a hard enough kill records nothing — so the error is
92
+ * still built, naming the instance without claiming to know how it died.
93
+ *
94
+ * @param cdpUrl - The CDP URL the dead instance was serving.
95
+ * @param marker - The exit marker read for its port, or `undefined` when there is none.
96
+ * @returns The error to throw in place of a refused connection.
97
+ */
98
+ export declare function buildOwnedInstanceExitedErrorFromMarker(cdpUrl: string, marker: OwnedInstanceExitMarker | undefined): OwnedInstanceExitedError;
@@ -0,0 +1,81 @@
1
+ import { appendProcessOutputTail } from "./process-exit-message.mjs";
2
+ const MILLISECONDS_PER_SECOND = 1e3;
3
+ class OwnedInstanceExitedError extends Error {
4
+ /**
5
+ The CDP URL the dead instance was serving.
6
+ */
7
+ cdpUrl;
8
+ /**
9
+ Exit code, when known.
10
+ */
11
+ code;
12
+ /**
13
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
14
+ */
15
+ exitedAtInMilliseconds;
16
+ /**
17
+ Terminating signal, when known.
18
+ */
19
+ signal;
20
+ /**
21
+ * Creates the error from whatever is known about the instance's death.
22
+ *
23
+ * @param params - The CDP URL, and the exit details when they are available.
24
+ */
25
+ constructor(params) {
26
+ super(buildMessage(params));
27
+ this.name = "OwnedInstanceExitedError";
28
+ this.cdpUrl = params.cdpUrl;
29
+ this.code = params.code;
30
+ this.exitedAtInMilliseconds = params.exitedAtInMilliseconds;
31
+ this.signal = params.signal;
32
+ }
33
+ }
34
+ function buildOwnedInstanceExitedErrorFromMarker(cdpUrl, marker) {
35
+ if (!marker) {
36
+ return new OwnedInstanceExitedError({ cdpUrl });
37
+ }
38
+ return new OwnedInstanceExitedError({
39
+ cdpUrl,
40
+ code: marker.code,
41
+ exitedAtInMilliseconds: marker.exitedAtInMilliseconds,
42
+ outputTail: marker.outputTail,
43
+ pid: marker.pid,
44
+ signal: marker.signal,
45
+ spawnError: marker.spawnError
46
+ });
47
+ }
48
+ function buildMessage(params) {
49
+ const message = `The harness-owned Obsidian instance at ${params.cdpUrl} is gone: ${describeExit(params)}. Whatever ran after it had no app to talk to, so these failures are not test results \u2014 look for the \`!!! OWNED OBSIDIAN EXITED\` line in the run log for the moment it happened.`;
50
+ return appendProcessOutputTail(message, { output: params.outputTail ?? "", outputLabel: "Obsidian output" });
51
+ }
52
+ function describeExit(params) {
53
+ if (params.spawnError !== void 0) {
54
+ return `it failed to start (${params.spawnError})`;
55
+ }
56
+ if (params.code === void 0 && params.signal === void 0) {
57
+ return "it exited at some point during this run, and the harness recorded nothing about how (the run that owns it logs the exit code; a worker sees only what the exit marker preserved)";
58
+ }
59
+ return `${describeProcess(params)} ${describeReason(params)}${describeWhen(params.exitedAtInMilliseconds)}`;
60
+ }
61
+ function describeProcess(params) {
62
+ return params.pid === void 0 ? "it" : `its process (pid ${String(params.pid)})`;
63
+ }
64
+ function describeReason(params) {
65
+ if (params.signal !== void 0 && params.signal !== null) {
66
+ return `was terminated by signal ${params.signal}`;
67
+ }
68
+ return params.code === void 0 || params.code === null ? "exited with no exit code" : `exited with code ${String(params.code)}`;
69
+ }
70
+ function describeWhen(exitedAtInMilliseconds) {
71
+ if (exitedAtInMilliseconds === void 0) {
72
+ return "";
73
+ }
74
+ const elapsedInSeconds = Math.max(0, Math.round((Date.now() - exitedAtInMilliseconds) / MILLISECONDS_PER_SECOND));
75
+ return ` ${String(elapsedInSeconds)}s ago, at ${new Date(exitedAtInMilliseconds).toISOString()}`;
76
+ }
77
+ export {
78
+ OwnedInstanceExitedError,
79
+ buildOwnedInstanceExitedErrorFromMarker
80
+ };
81
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiB0aGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBnb25lIFx1MjAxNFxuICogaXQgZXhpdGVkLCBhbmQgdGhlIENEUCBlbmRwb2ludCBpdCB3YXMgc2VydmluZyBhbnN3ZXJzIG5vdGhpbmcuXG4gKlxuICogSXQgZXhpc3RzIHRvIHJlcGxhY2UgYW4gYW5vbnltb3VzIGNhc2NhZGUgd2l0aCBvbmUgbmFtZWQgY2F1c2UuIEJlZm9yZSBpdCxcbiAqIGV2ZXJ5IHRlc3QgZmlsZSBzY2hlZHVsZWQgYWZ0ZXIgYSBtaWQtcnVuIGRlYXRoIGZhaWxlZCBpbiB+NjBcdTIwMTM5MCBtcyB3aXRoXG4gKiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgIHdyYXBwaW5nIGBjb25uZWN0IEVDT05OUkVGVVNFRCAxMjcuMC4wLjE6PHBvcnQ+YCBcdTIwMTRcbiAqIG1lYXN1cmVkIGF0ICoqMTU2IHN1Y2ggZmFpbHVyZXMgYWNyb3NzIDIxIGZpbGVzKiogaW4gYG9ic2lkaWFuLXBhdHRlcm5zYCBvblxuICogMjAyNi0wOS0wNSwgbm90IG9uZSBvZiB0aGVtIGEgdGVzdCByZXN1bHQuIFRoZSBhYnNlbmNlIG9mIGFuIGFwcCBpcyBub3QgYSB0ZXN0XG4gKiBvdXRjb21lLCBhbmQgdGhpcyBlcnJvciBzYXlzIHNvIGluIHRoZSB3b3JkcyBhIHJlYWRlciBuZWVkczogdGhlIGluc3RhbmNlXG4gKiBkaWVkLCBoZXJlIGlzIGl0cyBleGl0IGNvZGUsIGFuZCB0aGVzZSBmYWlsdXJlcyBhcmUgbm90IGFib3V0IHlvdXIgY29kZS5cbiAqXG4gKiBFeHBvcnRlZCBzbyBjYWxsZXJzIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggaXQsIGxpa2UgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYFxuICogYW5kIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5tanMnO1xuXG5pbXBvcnQgeyBhcHBlbmRQcm9jZXNzT3V0cHV0VGFpbCB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcblxuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBFdmVyeXRoaW5nIGJ1dCB0aGUgVVJMIGlzIG9wdGlvbmFsOiB0aGUgZXhpdCBkZXRhaWxzIGNvbWUgZnJvbSB0aGUgcHJvY2Vzc1xuICogdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UsIGFuZCBhIGNhbGxlciBpbiBhbm90aGVyIHByb2Nlc3MgaGFzIHRoZW0gb25seVxuICogd2hlbiB0aGUgZXhpdCBtYXJrZXIgc3Vydml2ZWQgKHNlZSBgb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIudHNgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlPzogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRlZEF0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIHdoYXQgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIsIHdoZW4gYW55IHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRhaWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgZGVhZCBpbnN0YW5jZSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IHBpZD86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCB3aGVuIGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogTm9kZUpTLlNpZ25hbHMgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgc3Bhd24tZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIGluc3RhbmNlIG5ldmVyIHN0YXJ0ZWQsIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGhhcyBleGl0ZWQgYW5kIGl0cyBDRFBcbiAqIGVuZHBvaW50IGlzIHRoZXJlZm9yZSB1bnJlYWNoYWJsZS4gQ2FycmllcyB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgZGVhdGhcbiAqIFx1MjAxNCBleGl0IGNvZGUsIHNpZ25hbCwgd2hlbiBpdCBoYXBwZW5lZCwgYW5kIHRoZSBvdXRwdXQgdGFpbCBcdTIwMTQgc28gdGhlIGZhaWx1cmVcbiAqIG5hbWVzIGl0cyBvd24gY2F1c2UgaW5zdGVhZCBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFRoZSBDRFAgVVJMIHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRlcm1pbmF0aW5nIHNpZ25hbCwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgaW5zdGFuY2UncyBkZWF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgVVJMLCBhbmQgdGhlIGV4aXQgZGV0YWlscyB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoYnVpbGRNZXNzYWdlKHBhcmFtcykpO1xuICAgIHRoaXMubmFtZSA9ICdPd25lZEluc3RhbmNlRXhpdGVkRXJyb3InO1xuICAgIHRoaXMuY2RwVXJsID0gcGFyYW1zLmNkcFVybDtcbiAgICB0aGlzLmNvZGUgPSBwYXJhbXMuY29kZTtcbiAgICB0aGlzLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMuZXhpdGVkQXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLnNpZ25hbCA9IHBhcmFtcy5zaWduYWw7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIGZyb20gYW4gZXhpdCBtYXJrZXIsIGZvciBhIHByb2Nlc3MgdGhhdCBkaWQgbm90IGxhdW5jaCB0aGVcbiAqIGluc3RhbmNlIGFuZCBzbyBoYXMgbm90aGluZyBlbHNlIHRvIGdvIG9uLlxuICpcbiAqIEEgbWlzc2luZyBtYXJrZXIgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gZXhjZXB0aW9uYWwgXHUyMDE0IGl0IGlzIGNsZWFyZWQgb24gZXZlcnlcbiAqIGRlbGliZXJhdGUga2lsbCwgYW5kIGEgaGFyZCBlbm91Z2gga2lsbCByZWNvcmRzIG5vdGhpbmcgXHUyMDE0IHNvIHRoZSBlcnJvciBpc1xuICogc3RpbGwgYnVpbHQsIG5hbWluZyB0aGUgaW5zdGFuY2Ugd2l0aG91dCBjbGFpbWluZyB0byBrbm93IGhvdyBpdCBkaWVkLlxuICpcbiAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgZXhpdCBtYXJrZXIgcmVhZCBmb3IgaXRzIHBvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdyBpbiBwbGFjZSBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcihjZHBVcmw6IHN0cmluZywgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB8IHVuZGVmaW5lZCk6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB7XG4gIGlmICghbWFya2VyKSB7XG4gICAgcmV0dXJuIG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoeyBjZHBVcmwgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcih7XG4gICAgY2RwVXJsLFxuICAgIGNvZGU6IG1hcmtlci5jb2RlLFxuICAgIGV4aXRlZEF0SW5NaWxsaXNlY29uZHM6IG1hcmtlci5leGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IG1hcmtlci5vdXRwdXRUYWlsLFxuICAgIHBpZDogbWFya2VyLnBpZCxcbiAgICBzaWduYWw6IG1hcmtlci5zaWduYWwsXG4gICAgc3Bhd25FcnJvcjogbWFya2VyLnNwYXduRXJyb3JcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVzc2FnZShwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBUaGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBhdCAke3BhcmFtcy5jZHBVcmx9IGlzIGdvbmU6ICR7ZGVzY3JpYmVFeGl0KHBhcmFtcyl9LiBgXG4gICAgKyAnV2hhdGV2ZXIgcmFuIGFmdGVyIGl0IGhhZCBubyBhcHAgdG8gdGFsayB0bywgc28gdGhlc2UgZmFpbHVyZXMgYXJlIG5vdCB0ZXN0IHJlc3VsdHMgXHUyMDE0ICdcbiAgICArICdsb29rIGZvciB0aGUgYCEhISBPV05FRCBPQlNJRElBTiBFWElURURgIGxpbmUgaW4gdGhlIHJ1biBsb2cgZm9yIHRoZSBtb21lbnQgaXQgaGFwcGVuZWQuJztcblxuICByZXR1cm4gYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwobWVzc2FnZSwgeyBvdXRwdXQ6IHBhcmFtcy5vdXRwdXRUYWlsID8/ICcnLCBvdXRwdXRMYWJlbDogJ09ic2lkaWFuIG91dHB1dCcgfSk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdChwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgaWYgKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYGl0IGZhaWxlZCB0byBzdGFydCAoJHtwYXJhbXMuc3Bhd25FcnJvcn0pYDtcbiAgfVxuXG4gIGlmIChwYXJhbXMuY29kZSA9PT0gdW5kZWZpbmVkICYmIHBhcmFtcy5zaWduYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnaXQgZXhpdGVkIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoaXMgcnVuLCBhbmQgdGhlIGhhcm5lc3MgcmVjb3JkZWQgbm90aGluZyBhYm91dCBob3cgJ1xuICAgICAgKyAnKHRoZSBydW4gdGhhdCBvd25zIGl0IGxvZ3MgdGhlIGV4aXQgY29kZTsgYSB3b3JrZXIgc2VlcyBvbmx5IHdoYXQgdGhlIGV4aXQgbWFya2VyIHByZXNlcnZlZCknO1xuICB9XG5cbiAgcmV0dXJuIGAke2Rlc2NyaWJlUHJvY2VzcyhwYXJhbXMpfSAke2Rlc2NyaWJlUmVhc29uKHBhcmFtcyl9JHtkZXNjcmliZVdoZW4ocGFyYW1zLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMpfWA7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUHJvY2VzcyhwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtcy5waWQgPT09IHVuZGVmaW5lZCA/ICdpdCcgOiBgaXRzIHByb2Nlc3MgKHBpZCAke1N0cmluZyhwYXJhbXMucGlkKX0pYDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24ocGFyYW1zOiBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyk6IHN0cmluZyB7XG4gIGlmIChwYXJhbXMuc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnNpZ25hbCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7cGFyYW1zLnNpZ25hbH1gO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5jb2RlID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvZGUgPT09IG51bGwgPyAnZXhpdGVkIHdpdGggbm8gZXhpdCBjb2RlJyA6IGBleGl0ZWQgd2l0aCBjb2RlICR7U3RyaW5nKHBhcmFtcy5jb2RlKX1gO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdoZW4oZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGVsYXBzZWRJblNlY29uZHMgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gZXhpdGVkQXRJbk1pbGxpc2Vjb25kcykgLyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCkpO1xuICByZXR1cm4gYCAke1N0cmluZyhlbGFwc2VkSW5TZWNvbmRzKX1zIGFnbywgYXQgJHtuZXcgRGF0ZShleGl0ZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfWA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFvQkEsU0FBUywrQkFBK0I7QUFFeEMsTUFBTSwwQkFBMEI7QUFvRHpCLE1BQU0saUNBQWlDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULFlBQVksUUFBbUQ7QUFDcEUsVUFBTSxhQUFhLE1BQU0sQ0FBQztBQUMxQixTQUFLLE9BQU87QUFDWixTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLE9BQU8sT0FBTztBQUNuQixTQUFLLHlCQUF5QixPQUFPO0FBQ3JDLFNBQUssU0FBUyxPQUFPO0FBQUEsRUFDdkI7QUFDRjtBQWNPLFNBQVMsd0NBQXdDLFFBQWdCLFFBQXVFO0FBQzdJLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTyxJQUFJLHlCQUF5QixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ2hEO0FBRUEsU0FBTyxJQUFJLHlCQUF5QjtBQUFBLElBQ2xDO0FBQUEsSUFDQSxNQUFNLE9BQU87QUFBQSxJQUNiLHdCQUF3QixPQUFPO0FBQUEsSUFDL0IsWUFBWSxPQUFPO0FBQUEsSUFDbkIsS0FBSyxPQUFPO0FBQUEsSUFDWixRQUFRLE9BQU87QUFBQSxJQUNmLFlBQVksT0FBTztBQUFBLEVBQ3JCLENBQUM7QUFDSDtBQUVBLFNBQVMsYUFBYSxRQUEyRDtBQUMvRSxRQUFNLFVBQVUsMENBQTBDLE9BQU8sTUFBTSxhQUFhLGFBQWEsTUFBTSxDQUFDO0FBSXhHLFNBQU8sd0JBQXdCLFNBQVMsRUFBRSxRQUFRLE9BQU8sY0FBYyxJQUFJLGFBQWEsa0JBQWtCLENBQUM7QUFDN0c7QUFFQSxTQUFTLGFBQWEsUUFBMkQ7QUFDL0UsTUFBSSxPQUFPLGVBQWUsUUFBVztBQUNuQyxXQUFPLHVCQUF1QixPQUFPLFVBQVU7QUFBQSxFQUNqRDtBQUVBLE1BQUksT0FBTyxTQUFTLFVBQWEsT0FBTyxXQUFXLFFBQVc7QUFDNUQsV0FBTztBQUFBLEVBRVQ7QUFFQSxTQUFPLEdBQUcsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsTUFBTSxDQUFDLEdBQUcsYUFBYSxPQUFPLHNCQUFzQixDQUFDO0FBQzNHO0FBRUEsU0FBUyxnQkFBZ0IsUUFBMkQ7QUFDbEYsU0FBTyxPQUFPLFFBQVEsU0FBWSxPQUFPLG9CQUFvQixPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ2pGO0FBRUEsU0FBUyxlQUFlLFFBQTJEO0FBQ2pGLE1BQUksT0FBTyxXQUFXLFVBQWEsT0FBTyxXQUFXLE1BQU07QUFDekQsV0FBTyw0QkFBNEIsT0FBTyxNQUFNO0FBQUEsRUFDbEQ7QUFFQSxTQUFPLE9BQU8sU0FBUyxVQUFhLE9BQU8sU0FBUyxPQUFPLDZCQUE2QixvQkFBb0IsT0FBTyxPQUFPLElBQUksQ0FBQztBQUNqSTtBQUVBLFNBQVMsYUFBYSx3QkFBb0Q7QUFDeEUsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQW1CLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTyxLQUFLLElBQUksSUFBSSwwQkFBMEIsdUJBQXVCLENBQUM7QUFDaEgsU0FBTyxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsYUFBYSxJQUFJLEtBQUssc0JBQXNCLEVBQUUsWUFBWSxDQUFDO0FBQ2hHOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -19,11 +19,30 @@
19
19
  * Seeding both was verified to open the vault directly (no selector) on 0.6.4,
20
20
  * 0.9.20, 0.12.19, 0.13.19, 0.14.5 and 1.12.7. `updateDisabled` suppresses the
21
21
  * throwaway instance's self-update.
22
+ *
23
+ * Both markers can also be **withheld** — see
24
+ * {@link BuildOwnedObsidianJsonParams.shouldAutoOpenVault}. The one caller that
25
+ * does so wants the starter screen on purpose: a `configDirectory` override is a
26
+ * `localStorage` entry, and `localStorage` only exists once a renderer does, so
27
+ * the override has to be written in the starter screen's renderer before the
28
+ * vault's own window is created. The vault stays registered under the harness's
29
+ * id either way, and the later `vault-open` IPC reuses that id (verified on
30
+ * 1.13.7) rather than minting a second entry — which is what makes the
31
+ * `<vaultId>-config` key name knowable before launch.
22
32
  */
23
33
  /**
24
34
  * Parameters for {@link buildOwnedObsidianJson}.
25
35
  */
26
36
  export interface BuildOwnedObsidianJsonParams {
37
+ /**
38
+ * Whether to include the auto-open markers, so Obsidian opens the vault
39
+ * directly instead of showing the starter screen. Pass `false` to keep the
40
+ * vault registered but closed — the caller then opens it itself, over the
41
+ * `vault-open` IPC, once it has prepared the starter screen's renderer.
42
+ *
43
+ * @default `true`
44
+ */
45
+ readonly shouldAutoOpenVault?: boolean;
27
46
  /**
28
47
  Last-access timestamp to stamp on the vault entry.
29
48
  */
@@ -44,8 +63,9 @@ export interface OwnedObsidianJson {
44
63
  /**
45
64
  * Top-level auto-open marker (vault id) honored by old Obsidian versions;
46
65
  * ignored as an unknown key by newer versions that use the per-entry `open`.
66
+ * Omitted when the caller withheld the auto-open markers.
47
67
  */
48
- readonly last_open: string;
68
+ readonly last_open?: string;
49
69
  /**
50
70
  Disables the throwaway instance's self-update.
51
71
  */
@@ -60,9 +80,10 @@ export interface OwnedObsidianJson {
60
80
  */
61
81
  export interface OwnedObsidianVaultEntry {
62
82
  /**
63
- Per-entry auto-open flag honored by newer Obsidian versions.
83
+ * Per-entry auto-open flag honored by newer Obsidian versions. Omitted when
84
+ * the caller withheld the auto-open markers.
64
85
  */
65
- readonly open: true;
86
+ readonly open?: true;
66
87
  /**
67
88
  Absolute path to the harness vault folder.
68
89
  */
@@ -1,14 +1,18 @@
1
1
  function buildOwnedObsidianJson(params) {
2
+ const shouldAutoOpenVault = params.shouldAutoOpenVault ?? true;
3
+ const entry = shouldAutoOpenVault ? { open: true, path: params.vaultPath, ts: params.ts } : { path: params.vaultPath, ts: params.ts };
2
4
  return {
5
+ // Spread rather than `last_open: undefined`, so the key is genuinely absent from
6
+ // The written JSON: this seed is read by Obsidian versions spanning a decade, and
7
+ // A present-but-undefined auto-open marker is not a shape any of them was tested
8
+ // Against.
3
9
  // eslint-disable-next-line camelcase -- Obsidian's own obsidian.json field name (old versions' auto-open marker).
4
- last_open: params.vaultId,
10
+ ...shouldAutoOpenVault && { last_open: params.vaultId },
5
11
  updateDisabled: true,
6
- vaults: {
7
- [params.vaultId]: { open: true, path: params.vaultPath, ts: params.ts }
8
- }
12
+ vaults: { [params.vaultId]: entry }
9
13
  };
10
14
  }
11
15
  export {
12
16
  buildOwnedObsidianJson
13
17
  };
14
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLXZhdWx0LXNlZWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYCB0aGUgaGFybmVzcyBwcmUtc2VlZHMgaW50byBhbiBvd25lZFxuICogaW5zdGFuY2UncyB0ZW1wIGAtLXVzZXItZGF0YS1kaXJgIHNvIE9ic2lkaWFuIG9wZW5zIHRoZSBoYXJuZXNzIHZhdWx0IGRpcmVjdGx5XG4gKiBpbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZpcnN0LXJ1biB2YXVsdC1zZWxlY3RvciAodGhlIGBzdGFydGVyLXNjcmVlbmApLlxuICpcbiAqIFRoZSBhdXRvLW9wZW4gbWFya2VyIGNoYW5nZWQgYWNyb3NzIE9ic2lkaWFuJ3MgaGlzdG9yeSwgc28gdGhlIHNlZWQgY2Fycmllc1xuICogQk9USCBmb3JtcyBhbmQgZWFjaCB2ZXJzaW9uIHJlYWRzIHRoZSBvbmUgaXQgdW5kZXJzdGFuZHMgKGlnbm9yaW5nIHRoZSBvdGhlclxuICogdW5rbm93biBrZXkpIFx1MjAxNCBubyBwZXItdmVyc2lvbiBicmFuY2hpbmc6XG4gKlxuICogLSAqKk9sZCB2ZXJzaW9ucyoqIChjb25maXJtZWQgMC42LjQpIGF1dG8tb3BlbiBmcm9tIGEgKip0b3AtbGV2ZWwgYGxhc3Rfb3BlbmAqKlxuICogICBob2xkaW5nIHRoZSB2YXVsdCBpZCAoYG1haW4uanNgOiBgaWYgKGlkICYmIHZhdWx0cy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gKiAgIGNyZWF0ZVdpbmRvdyhpZCk7IGVsc2Ugb3BlblN0YXJ0ZXIoKTtgKSwgYW5kIHN0b3JlIGVhY2ggdmF1bHQgZW50cnkgYXMganVzdFxuICogICBgeyBwYXRoLCB0cyB9YC4gV2l0aG91dCBgbGFzdF9vcGVuYCB0aGV5IGZhbGwgdGhyb3VnaCB0byB0aGUgdmF1bHQtc2VsZWN0b3IuXG4gKiAtICoqTmV3ZXIgdmVyc2lvbnMqKiAoY29uZmlybWVkIDAuMTQuNSspIGRyb3BwZWQgYGxhc3Rfb3BlbmAgYW5kIGF1dG8tb3BlbiBmcm9tXG4gKiAgIHRoZSBwZXItZW50cnkgKipgb3BlbjogdHJ1ZWAqKiBmbGFnLlxuICpcbiAqIFNlZWRpbmcgYm90aCB3YXMgdmVyaWZpZWQgdG8gb3BlbiB0aGUgdmF1bHQgZGlyZWN0bHkgKG5vIHNlbGVjdG9yKSBvbiAwLjYuNCxcbiAqIDAuOS4yMCwgMC4xMi4xOSwgMC4xMy4xOSwgMC4xNC41IGFuZCAxLjEyLjcuIGB1cGRhdGVEaXNhYmxlZGAgc3VwcHJlc3NlcyB0aGVcbiAqIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkT3duZWRPYnNpZGlhbkpzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMge1xuICAvKipcbiAgTGFzdC1hY2Nlc3MgdGltZXN0YW1wIHRvIHN0YW1wIG9uIHRoZSB2YXVsdCBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSByYW5kb21seS1nZW5lcmF0ZWQgdmF1bHQgaWQgdXNlZCBhcyB0aGUgcmVnaXN0cnkga2V5IGFuZCBgbGFzdF9vcGVuYC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0SWQ6IHN0cmluZztcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgaGFybmVzcyB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgYG9ic2lkaWFuLmpzb25gIHN0cnVjdHVyZSB0aGUgaGFybmVzcyBzZWVkcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhbkpzb24ge1xuICAvKipcbiAgICogVG9wLWxldmVsIGF1dG8tb3BlbiBtYXJrZXIgKHZhdWx0IGlkKSBob25vcmVkIGJ5IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucztcbiAgICogaWdub3JlZCBhcyBhbiB1bmtub3duIGtleSBieSBuZXdlciB2ZXJzaW9ucyB0aGF0IHVzZSB0aGUgcGVyLWVudHJ5IGBvcGVuYC5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3Rfb3Blbjogc3RyaW5nO1xuXG4gIC8qKlxuICBEaXNhYmxlcyB0aGUgdGhyb3dhd2F5IGluc3RhbmNlJ3Mgc2VsZi11cGRhdGUuXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVEaXNhYmxlZDogdHJ1ZTtcblxuICAvKipcbiAgVmF1bHQgcmVnaXN0cnkga2V5ZWQgYnkgdmF1bHQgaWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE93bmVkT2JzaWRpYW5WYXVsdEVudHJ5Pj47XG59XG5cbi8qKlxuICogQSBzaW5nbGUgdmF1bHQgZW50cnkgaW4gdGhlIHNlZWRlZCBgb2JzaWRpYW4uanNvbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhblZhdWx0RW50cnkge1xuICAvKipcbiAgUGVyLWVudHJ5IGF1dG8tb3BlbiBmbGFnIGhvbm9yZWQgYnkgbmV3ZXIgT2JzaWRpYW4gdmVyc2lvbnMuXG4gICAqL1xuICByZWFkb25seSBvcGVuOiB0cnVlO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBoYXJuZXNzIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgTGFzdC1hY2Nlc3MgdGltZXN0YW1wLlxuICAgKi9cbiAgcmVhZG9ubHkgdHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYCB0aGF0IGZvcmNlLW9wZW5zIHRoZSBvd25lZCB2YXVsdCBhY3Jvc3MgYWxsXG4gKiBzdXBwb3J0ZWQgT2JzaWRpYW4gdmVyc2lvbnMgKHNlZSB0aGUgZmlsZSBvdmVydmlldyBmb3IgdGhlIGR1YWwtbWFya2VyXG4gKiByYXRpb25hbGUpLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmF1bHQgaWQsIHBhdGgsIGFuZCB0aW1lc3RhbXAgdG8gc2VlZC5cbiAqIEByZXR1cm5zIFRoZSBgb2JzaWRpYW4uanNvbmAgb2JqZWN0IHRvIHdyaXRlIGludG8gdGhlIG93bmVkIHVzZXItZGF0YSBkaXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE93bmVkT2JzaWRpYW5Kc29uKHBhcmFtczogQnVpbGRPd25lZE9ic2lkaWFuSnNvblBhcmFtcyk6IE93bmVkT2JzaWRpYW5Kc29uIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlIC0tIE9ic2lkaWFuJ3Mgb3duIG9ic2lkaWFuLmpzb24gZmllbGQgbmFtZSAob2xkIHZlcnNpb25zJyBhdXRvLW9wZW4gbWFya2VyKS5cbiAgICBsYXN0X29wZW46IHBhcmFtcy52YXVsdElkLFxuICAgIHVwZGF0ZURpc2FibGVkOiB0cnVlLFxuICAgIHZhdWx0czoge1xuICAgICAgW3BhcmFtcy52YXVsdElkXTogeyBvcGVuOiB0cnVlLCBwYXRoOiBwYXJhbXMudmF1bHRQYXRoLCB0czogcGFyYW1zLnRzIH1cbiAgICB9XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUE0Rk8sU0FBUyx1QkFBdUIsUUFBeUQ7QUFDOUYsU0FBTztBQUFBO0FBQUEsSUFFTCxXQUFXLE9BQU87QUFBQSxJQUNsQixnQkFBZ0I7QUFBQSxJQUNoQixRQUFRO0FBQUEsTUFDTixDQUFDLE9BQU8sT0FBTyxHQUFHLEVBQUUsTUFBTSxNQUFNLE1BQU0sT0FBTyxXQUFXLElBQUksT0FBTyxHQUFHO0FBQUEsSUFDeEU7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
18
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLXZhdWx0LXNlZWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYCB0aGUgaGFybmVzcyBwcmUtc2VlZHMgaW50byBhbiBvd25lZFxuICogaW5zdGFuY2UncyB0ZW1wIGAtLXVzZXItZGF0YS1kaXJgIHNvIE9ic2lkaWFuIG9wZW5zIHRoZSBoYXJuZXNzIHZhdWx0IGRpcmVjdGx5XG4gKiBpbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZpcnN0LXJ1biB2YXVsdC1zZWxlY3RvciAodGhlIGBzdGFydGVyLXNjcmVlbmApLlxuICpcbiAqIFRoZSBhdXRvLW9wZW4gbWFya2VyIGNoYW5nZWQgYWNyb3NzIE9ic2lkaWFuJ3MgaGlzdG9yeSwgc28gdGhlIHNlZWQgY2Fycmllc1xuICogQk9USCBmb3JtcyBhbmQgZWFjaCB2ZXJzaW9uIHJlYWRzIHRoZSBvbmUgaXQgdW5kZXJzdGFuZHMgKGlnbm9yaW5nIHRoZSBvdGhlclxuICogdW5rbm93biBrZXkpIFx1MjAxNCBubyBwZXItdmVyc2lvbiBicmFuY2hpbmc6XG4gKlxuICogLSAqKk9sZCB2ZXJzaW9ucyoqIChjb25maXJtZWQgMC42LjQpIGF1dG8tb3BlbiBmcm9tIGEgKip0b3AtbGV2ZWwgYGxhc3Rfb3BlbmAqKlxuICogICBob2xkaW5nIHRoZSB2YXVsdCBpZCAoYG1haW4uanNgOiBgaWYgKGlkICYmIHZhdWx0cy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gKiAgIGNyZWF0ZVdpbmRvdyhpZCk7IGVsc2Ugb3BlblN0YXJ0ZXIoKTtgKSwgYW5kIHN0b3JlIGVhY2ggdmF1bHQgZW50cnkgYXMganVzdFxuICogICBgeyBwYXRoLCB0cyB9YC4gV2l0aG91dCBgbGFzdF9vcGVuYCB0aGV5IGZhbGwgdGhyb3VnaCB0byB0aGUgdmF1bHQtc2VsZWN0b3IuXG4gKiAtICoqTmV3ZXIgdmVyc2lvbnMqKiAoY29uZmlybWVkIDAuMTQuNSspIGRyb3BwZWQgYGxhc3Rfb3BlbmAgYW5kIGF1dG8tb3BlbiBmcm9tXG4gKiAgIHRoZSBwZXItZW50cnkgKipgb3BlbjogdHJ1ZWAqKiBmbGFnLlxuICpcbiAqIFNlZWRpbmcgYm90aCB3YXMgdmVyaWZpZWQgdG8gb3BlbiB0aGUgdmF1bHQgZGlyZWN0bHkgKG5vIHNlbGVjdG9yKSBvbiAwLjYuNCxcbiAqIDAuOS4yMCwgMC4xMi4xOSwgMC4xMy4xOSwgMC4xNC41IGFuZCAxLjEyLjcuIGB1cGRhdGVEaXNhYmxlZGAgc3VwcHJlc3NlcyB0aGVcbiAqIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICpcbiAqIEJvdGggbWFya2VycyBjYW4gYWxzbyBiZSAqKndpdGhoZWxkKiogXHUyMDE0IHNlZVxuICoge0BsaW5rIEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMuc2hvdWxkQXV0b09wZW5WYXVsdH0uIFRoZSBvbmUgY2FsbGVyIHRoYXRcbiAqIGRvZXMgc28gd2FudHMgdGhlIHN0YXJ0ZXIgc2NyZWVuIG9uIHB1cnBvc2U6IGEgYGNvbmZpZ0RpcmVjdG9yeWAgb3ZlcnJpZGUgaXMgYVxuICogYGxvY2FsU3RvcmFnZWAgZW50cnksIGFuZCBgbG9jYWxTdG9yYWdlYCBvbmx5IGV4aXN0cyBvbmNlIGEgcmVuZGVyZXIgZG9lcywgc29cbiAqIHRoZSBvdmVycmlkZSBoYXMgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc3RhcnRlciBzY3JlZW4ncyByZW5kZXJlciBiZWZvcmUgdGhlXG4gKiB2YXVsdCdzIG93biB3aW5kb3cgaXMgY3JlYXRlZC4gVGhlIHZhdWx0IHN0YXlzIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGhhcm5lc3Mnc1xuICogaWQgZWl0aGVyIHdheSwgYW5kIHRoZSBsYXRlciBgdmF1bHQtb3BlbmAgSVBDIHJldXNlcyB0aGF0IGlkICh2ZXJpZmllZCBvblxuICogMS4xMy43KSByYXRoZXIgdGhhbiBtaW50aW5nIGEgc2Vjb25kIGVudHJ5IFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZVxuICogYDx2YXVsdElkPi1jb25maWdgIGtleSBuYW1lIGtub3dhYmxlIGJlZm9yZSBsYXVuY2guXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRPd25lZE9ic2lkaWFuSnNvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPd25lZE9ic2lkaWFuSnNvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF1dG8tb3BlbiBtYXJrZXJzLCBzbyBPYnNpZGlhbiBvcGVucyB0aGUgdmF1bHRcbiAgICogZGlyZWN0bHkgaW5zdGVhZCBvZiBzaG93aW5nIHRoZSBzdGFydGVyIHNjcmVlbi4gUGFzcyBgZmFsc2VgIHRvIGtlZXAgdGhlXG4gICAqIHZhdWx0IHJlZ2lzdGVyZWQgYnV0IGNsb3NlZCBcdTIwMTQgdGhlIGNhbGxlciB0aGVuIG9wZW5zIGl0IGl0c2VsZiwgb3ZlciB0aGVcbiAgICogYHZhdWx0LW9wZW5gIElQQywgb25jZSBpdCBoYXMgcHJlcGFyZWQgdGhlIHN0YXJ0ZXIgc2NyZWVuJ3MgcmVuZGVyZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b09wZW5WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gIExhc3QtYWNjZXNzIHRpbWVzdGFtcCB0byBzdGFtcCBvbiB0aGUgdmF1bHQgZW50cnkuXG4gICAqL1xuICByZWFkb25seSB0czogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgcmFuZG9tbHktZ2VuZXJhdGVkIHZhdWx0IGlkIHVzZWQgYXMgdGhlIHJlZ2lzdHJ5IGtleSBhbmQgYGxhc3Rfb3BlbmAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGhhcm5lc3MgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGBvYnNpZGlhbi5qc29uYCBzdHJ1Y3R1cmUgdGhlIGhhcm5lc3Mgc2VlZHMgZm9yIGFuIG93bmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5Kc29uIHtcbiAgLyoqXG4gICAqIFRvcC1sZXZlbCBhdXRvLW9wZW4gbWFya2VyICh2YXVsdCBpZCkgaG9ub3JlZCBieSBvbGQgT2JzaWRpYW4gdmVyc2lvbnM7XG4gICAqIGlnbm9yZWQgYXMgYW4gdW5rbm93biBrZXkgYnkgbmV3ZXIgdmVyc2lvbnMgdGhhdCB1c2UgdGhlIHBlci1lbnRyeSBgb3BlbmAuXG4gICAqIE9taXR0ZWQgd2hlbiB0aGUgY2FsbGVyIHdpdGhoZWxkIHRoZSBhdXRvLW9wZW4gbWFya2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3Rfb3Blbj86IHN0cmluZztcblxuICAvKipcbiAgRGlzYWJsZXMgdGhlIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlRGlzYWJsZWQ6IHRydWU7XG5cbiAgLyoqXG4gIFZhdWx0IHJlZ2lzdHJ5IGtleWVkIGJ5IHZhdWx0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBPd25lZE9ic2lkaWFuVmF1bHRFbnRyeT4+O1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIHZhdWx0IGVudHJ5IGluIHRoZSBzZWVkZWQgYG9ic2lkaWFuLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqXG4gICAqIFBlci1lbnRyeSBhdXRvLW9wZW4gZmxhZyBob25vcmVkIGJ5IG5ld2VyIE9ic2lkaWFuIHZlcnNpb25zLiBPbWl0dGVkIHdoZW5cbiAgICogdGhlIGNhbGxlciB3aXRoaGVsZCB0aGUgYXV0by1vcGVuIG1hcmtlcnMuXG4gICAqL1xuICByZWFkb25seSBvcGVuPzogdHJ1ZTtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgaGFybmVzcyB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIExhc3QtYWNjZXNzIHRpbWVzdGFtcC5cbiAgICovXG4gIHJlYWRvbmx5IHRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmAgdGhhdCBmb3JjZS1vcGVucyB0aGUgb3duZWQgdmF1bHQgYWNyb3NzIGFsbFxuICogc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb25zIChzZWUgdGhlIGZpbGUgb3ZlcnZpZXcgZm9yIHRoZSBkdWFsLW1hcmtlclxuICogcmF0aW9uYWxlKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZhdWx0IGlkLCBwYXRoLCBhbmQgdGltZXN0YW1wIHRvIHNlZWQuXG4gKiBAcmV0dXJucyBUaGUgYG9ic2lkaWFuLmpzb25gIG9iamVjdCB0byB3cml0ZSBpbnRvIHRoZSBvd25lZCB1c2VyLWRhdGEgZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPd25lZE9ic2lkaWFuSnNvbihwYXJhbXM6IEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMpOiBPd25lZE9ic2lkaWFuSnNvbiB7XG4gIGNvbnN0IHNob3VsZEF1dG9PcGVuVmF1bHQgPSBwYXJhbXMuc2hvdWxkQXV0b09wZW5WYXVsdCA/PyB0cnVlO1xuICBjb25zdCBlbnRyeTogT3duZWRPYnNpZGlhblZhdWx0RW50cnkgPSBzaG91bGRBdXRvT3BlblZhdWx0XG4gICAgPyB7IG9wZW46IHRydWUsIHBhdGg6IHBhcmFtcy52YXVsdFBhdGgsIHRzOiBwYXJhbXMudHMgfVxuICAgIDogeyBwYXRoOiBwYXJhbXMudmF1bHRQYXRoLCB0czogcGFyYW1zLnRzIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBTcHJlYWQgcmF0aGVyIHRoYW4gYGxhc3Rfb3BlbjogdW5kZWZpbmVkYCwgc28gdGhlIGtleSBpcyBnZW51aW5lbHkgYWJzZW50IGZyb21cbiAgICAvLyBUaGUgd3JpdHRlbiBKU09OOiB0aGlzIHNlZWQgaXMgcmVhZCBieSBPYnNpZGlhbiB2ZXJzaW9ucyBzcGFubmluZyBhIGRlY2FkZSwgYW5kXG4gICAgLy8gQSBwcmVzZW50LWJ1dC11bmRlZmluZWQgYXV0by1vcGVuIG1hcmtlciBpcyBub3QgYSBzaGFwZSBhbnkgb2YgdGhlbSB3YXMgdGVzdGVkXG4gICAgLy8gQWdhaW5zdC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlIC0tIE9ic2lkaWFuJ3Mgb3duIG9ic2lkaWFuLmpzb24gZmllbGQgbmFtZSAob2xkIHZlcnNpb25zJyBhdXRvLW9wZW4gbWFya2VyKS5cbiAgICAuLi5zaG91bGRBdXRvT3BlblZhdWx0ICYmIHsgbGFzdF9vcGVuOiBwYXJhbXMudmF1bHRJZCB9LFxuICAgIHVwZGF0ZURpc2FibGVkOiB0cnVlLFxuICAgIHZhdWx0czogeyBbcGFyYW1zLnZhdWx0SWRdOiBlbnRyeSB9XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrSE8sU0FBUyx1QkFBdUIsUUFBeUQ7QUFDOUYsUUFBTSxzQkFBc0IsT0FBTyx1QkFBdUI7QUFDMUQsUUFBTSxRQUFpQyxzQkFDbkMsRUFBRSxNQUFNLE1BQU0sTUFBTSxPQUFPLFdBQVcsSUFBSSxPQUFPLEdBQUcsSUFDcEQsRUFBRSxNQUFNLE9BQU8sV0FBVyxJQUFJLE9BQU8sR0FBRztBQUU1QyxTQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTUwsR0FBRyx1QkFBdUIsRUFBRSxXQUFXLE9BQU8sUUFBUTtBQUFBLElBQ3RELGdCQUFnQjtBQUFBLElBQ2hCLFFBQVEsRUFBRSxDQUFDLE9BQU8sT0FBTyxHQUFHLE1BQU07QUFBQSxFQUNwQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=