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
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var community_plugin_registry_exports = {};
20
+ __export(community_plugin_registry_exports, {
21
+ COMMUNITY_PLUGINS_REGISTRY_URL: () => COMMUNITY_PLUGINS_REGISTRY_URL,
22
+ OPTIONAL_PLUGIN_ASSET_NAMES: () => OPTIONAL_PLUGIN_ASSET_NAMES,
23
+ REQUIRED_PLUGIN_ASSET_NAMES: () => REQUIRED_PLUGIN_ASSET_NAMES,
24
+ buildPluginAssetUrl: () => buildPluginAssetUrl,
25
+ isValidRepoReference: () => isValidRepoReference,
26
+ selectPluginRepo: () => selectPluginRepo
27
+ });
28
+ module.exports = __toCommonJS(community_plugin_registry_exports);
29
+ const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json";
30
+ const REQUIRED_PLUGIN_ASSET_NAMES = ["main.js", "manifest.json"];
31
+ const OPTIONAL_PLUGIN_ASSET_NAMES = ["styles.css"];
32
+ function buildPluginAssetUrl(params) {
33
+ const { assetName, repo, version } = params;
34
+ const releasePath = version === void 0 ? "latest/download" : `download/${version}`;
35
+ return `https://github.com/${repo}/releases/${releasePath}/${assetName}`;
36
+ }
37
+ function isValidRepoReference(repo) {
38
+ return /^[\w.-]+\/[\w.-]+$/.test(repo);
39
+ }
40
+ function selectPluginRepo(params) {
41
+ return params.entries.find((entry) => entry.id === params.pluginId)?.repo;
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ COMMUNITY_PLUGINS_REGISTRY_URL,
46
+ OPTIONAL_PLUGIN_ASSET_NAMES,
47
+ REQUIRED_PLUGIN_ASSET_NAMES,
48
+ buildPluginAssetUrl,
49
+ isValidRepoReference,
50
+ selectPluginRepo
51
+ });
52
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIHJlc29sdmluZyBhIGNvbW11bml0eSBwbHVnaW4ncyAqKkdpdEh1YiByZWxlYXNlIGFzc2V0cyoqIGZyb21cbiAqIG5vdGhpbmcgYnV0IGl0cyBwbHVnaW4gaWQgXHUyMDE0IHRoZSBpZCBcdTIxOTIgcmVwbyBsb29rdXAgYW5kIHRoZSBhc3NldCBVUkwgc2hhcGVzLlxuICpcbiAqIEEgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbmV2ZXIgbGl2ZSBpbiBnaXQ6IGAub2JzaWRpYW4vcGx1Z2lucy8qYCBpcyBnaXRpZ25vcmVkIGluXG4gKiBhIHBsdWdpbiByZXBvLCBzbyBhIGRlbW8gdmF1bHQncyBpbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyBleGlzdCBvblxuICogZXhhY3RseSB0aGUgbWFjaGluZSB0aGF0IG9uY2Ugb3BlbmVkIHRoYXQgdmF1bHQgaW4gT2JzaWRpYW4uIFRvIGluc3RhbGwgdGhlbVxuICogaGVhZGxlc3NseSAoc2VlIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2ApIHR3byB0aGluZ3MgbXVzdCBiZSBkZXJpdmFibGU6XG4gKlxuICogLSAqKldoaWNoIHJlcG8gcHVibGlzaGVzIHRoZSBpZC4qKiBPYnNpZGlhbidzIG93biByZWdpc3RyeSBcdTIwMTRcbiAqICAge0BsaW5rIENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTH0sIHNlcnZlZCBmcm9tIHRoZSBzYW1lXG4gKiAgIGBvYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzYCByZXBvc2l0b3J5IHRoZSBpbnN0YWxsZXIgZG93bmxvYWRlciBhbHJlYWR5XG4gKiAgIHVzZXMgXHUyMDE0IG1hcHMgZXZlcnkgY29tbXVuaXR5IHBsdWdpbidzIGBpZGAgdG8gaXRzIGBvd25lci9uYW1lYCByZXBvLiBUaGF0IGlzXG4gKiAgIHRoZSBzYW1lIHRhYmxlIHRoZSBpbi1hcHAgY29tbXVuaXR5IGJyb3dzZXIgaW5zdGFsbHMgZnJvbSwgc28gbm9cbiAqICAgcGx1Z2luLXNwZWNpZmljIG1hcHBpbmcgaGFzIHRvIGJlIGhhcmRjb2RlZCBoZXJlLlxuICogLSAqKldoZXJlIHRoYXQgcmVwbydzIGFzc2V0cyBsaXZlLioqIEEgcGx1Z2luIHJlbGVhc2UgcHVibGlzaGVzIGBtYW5pZmVzdC5qc29uYCxcbiAqICAgYG1haW4uanNgIGFuZCAob3B0aW9uYWxseSkgYHN0eWxlcy5jc3NgIGFzIHJlbGVhc2UgYXNzZXRzO1xuICogICB7QGxpbmsgYnVpbGRQbHVnaW5Bc3NldFVybH0gYnVpbGRzIHRoZSBVUkwgZm9yIG9uZSwgZm9yIGVpdGhlciB0aGUgbGF0ZXN0XG4gKiAgIHJlbGVhc2Ugb3IgYSBwaW5uZWQgdGFnLlxuICpcbiAqIEV2ZXJ5dGhpbmcgZGVjaWRhYmxlIHdpdGhvdXQgdGhlIG5ldHdvcmsgbGl2ZXMgaGVyZSBzbyBpdCBzdGF5cyB1bml0LXRlc3RlZDsgdGhlXG4gKiBmZXRjaGluZyBhbmQgd3JpdGluZyBzaXQgaW4gYGRlbW8tdmF1bHQtYm9vdHN0cmFwLnRzYCwgbWlycm9yaW5nIHRoZVxuICogYGluc3RhbGxlci1hc3NldC50c2AgLyBgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCBzcGxpdC5cbiAqL1xuXG4vKipcbiAqIE9ic2lkaWFuJ3Mgb3duIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnk6IHRoZSBgaWRgIFx1MjE5MiBgcmVwb2AgdGFibGUgdGhlIGluLWFwcFxuICogY29tbXVuaXR5IGJyb3dzZXIgaW5zdGFsbHMgZnJvbSwgc2VydmVkIGZyb20gdGhlIGBvYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzYFxuICogcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9tYXN0ZXIvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5cbi8qKlxuICogVGhlIGBtYWluLmpzYCAvIGBtYW5pZmVzdC5qc29uYCBwYWlyIGV2ZXJ5IHBsdWdpbiByZWxlYXNlIG11c3QgcHVibGlzaCBmb3IgdGhlXG4gKiBwbHVnaW4gdG8gYmUgbG9hZGFibGUgXHUyMDE0IHRoZSBzYW1lIHR3byBmaWxlcyBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgb25cbiAqIGRpc2suXG4gKi9cbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMgPSBbJ21haW4uanMnLCAnbWFuaWZlc3QuanNvbiddIGFzIGNvbnN0O1xuXG4vKipcbiAqIGBzdHlsZXMuY3NzYCBpcyBwdWJsaXNoZWQgb25seSBieSBwbHVnaW5zIHRoYXQgc2hpcCBDU1MsIHNvIGEgZG93bmxvYWQgb2YgaXQgaXNcbiAqIGFsbG93ZWQgdG8gNDA0IHdpdGhvdXQgZmFpbGluZyB0aGUgaW5zdGFsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QVElPTkFMX1BMVUdJTl9BU1NFVF9OQU1FUyA9IFsnc3R5bGVzLmNzcyddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZFBsdWdpbkFzc2V0VXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSByZWxlYXNlIGFzc2V0J3MgZmlsZSBuYW1lLCBlLmcuIGBtYWluLmpzYC5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHVibGlzaGluZyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSB0YWcgdG8gZG93bmxvYWQgZnJvbS4gT21pdCBmb3IgdGhlIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTRcbiAgICogd2hpY2ggaXMgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPbmUgcm93IG9mIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gLCByZWR1Y2VkIHRvIHRoZSBmaWVsZHMgdGhlXG4gKiBib290c3RyYXAgbmVlZHMuIFRoZSBwdWJsaXNoZWQgcm93cyBjYXJyeSBgbmFtZWAsIGBhdXRob3JgIGFuZCBgZGVzY3JpcHRpb25gXG4gKiB0b287IHRoZXkgYXJlIGRlbGliZXJhdGVseSBub3QgbW9kZWxsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeSB7XG4gIC8qKlxuICBUaGUgcGx1Z2luJ3MgaWQgXHUyMDE0IGl0cyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPmAgZm9sZGVyIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHVibGlzaGluZyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZWxlY3RQbHVnaW5SZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RQbHVnaW5SZXBvUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSByZWdpc3RyeSByb3dzLCBhcyBwdWJsaXNoZWQgYnkge0BsaW5rIENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTH0uXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W107XG5cbiAgLyoqXG4gIFRoZSBwbHVnaW4gaWQgdG8gbG9vayB1cC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBkb3dubG9hZCBVUkwgZm9yIG9uZSBhc3NldCBvZiBhIHBsdWdpbidzIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEdpdEh1YiBzZXJ2ZXMgdHdvIGZvcm1zIFx1MjAxNCBhIHBpbm5lZCBgcmVsZWFzZXMvZG93bmxvYWQvPHRhZz4vPGFzc2V0PmAgYW5kIHRoZVxuICogbW92aW5nIGByZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvPGFzc2V0PmAgXHUyMDE0IHNvIGEgcGlubmVkIHZlcnNpb24gYW5kIHRoZSBkZWZhdWx0XG4gKiBcIndoYXRldmVyIGlzIGN1cnJlbnRcIiBzaGFyZSBvbmUgYnVpbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCdzIGRvd25sb2FkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGx1Z2luQXNzZXRVcmwocGFyYW1zOiBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgcmVsZWFzZVBhdGggPSB2ZXJzaW9uID09PSB1bmRlZmluZWQgPyAnbGF0ZXN0L2Rvd25sb2FkJyA6IGBkb3dubG9hZC8ke3ZlcnNpb259YDtcbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy8ke3JlbGVhc2VQYXRofS8ke2Fzc2V0TmFtZX1gO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgc3RyaW5nIGhhcyB0aGUgYG93bmVyL25hbWVgIHNoYXBlIGEgR2l0SHViIHJlcG9zaXRvcnkgcmVmZXJlbmNlXG4gKiBuZWVkcywgc28gYSBtYWxmb3JtZWQgb3ZlcnJpZGUgaXMgcmVqZWN0ZWQgYmVmb3JlIGl0IGlzIHNwbGljZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gcmVwbyAtIFRoZSBjYW5kaWRhdGUgcmVwb3NpdG9yeSByZWZlcmVuY2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGEgd2VsbC1mb3JtZWQgYG93bmVyL25hbWVgIHBhaXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmVwb1JlZmVyZW5jZShyZXBvOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW1xcdy4tXStcXC9bXFx3Li1dKyQvLnRlc3QocmVwbyk7XG59XG5cbi8qKlxuICogTG9va3MgYSBwbHVnaW4gaWQgdXAgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFNlbGVjdFBsdWdpblJlcG9QYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHB1Ymxpc2hpbmcgYG93bmVyL25hbWVgIHJlcG8sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGlkIGlzIG5vdCBhXG4gKiAgIHJlZ2lzdGVyZWQgY29tbXVuaXR5IHBsdWdpbiAoYSBwcml2YXRlIG9yIHVubGlzdGVkIHBsdWdpbiwgb3IgYSB0eXBvKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFBsdWdpblJlcG8ocGFyYW1zOiBTZWxlY3RQbHVnaW5SZXBvUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBhcmFtcy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5pZCA9PT0gcGFyYW1zLnBsdWdpbklkKT8ucmVwbztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0NPLE1BQU0saUNBQWlDO0FBT3ZDLE1BQU0sOEJBQThCLENBQUMsV0FBVyxlQUFlO0FBTS9ELE1BQU0sOEJBQThCLENBQUMsWUFBWTtBQWlFakQsU0FBUyxvQkFBb0IsUUFBMkM7QUFDN0UsUUFBTSxFQUFFLFdBQVcsTUFBTSxRQUFRLElBQUk7QUFDckMsUUFBTSxjQUFjLFlBQVksU0FBWSxvQkFBb0IsWUFBWSxPQUFPO0FBQ25GLFNBQU8sc0JBQXNCLElBQUksYUFBYSxXQUFXLElBQUksU0FBUztBQUN4RTtBQVNPLFNBQVMscUJBQXFCLE1BQXVCO0FBQzFELFNBQU8scUJBQXFCLEtBQUssSUFBSTtBQUN2QztBQVNPLFNBQVMsaUJBQWlCLFFBQW9EO0FBQ25GLFNBQU8sT0FBTyxRQUFRLEtBQUssQ0FBQyxVQUFVLE1BQU0sT0FBTyxPQUFPLFFBQVEsR0FBRztBQUN2RTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for resolving a community plugin's **GitHub release assets** from
5
+ * nothing but its plugin id — the id → repo lookup and the asset URL shapes.
6
+ *
7
+ * A plugin's built files never live in git: `.obsidian/plugins/*` is gitignored in
8
+ * a plugin repo, so a demo vault's injected community plugins exist on
9
+ * exactly the machine that once opened that vault in Obsidian. To install them
10
+ * headlessly (see `demo-vault-bootstrap.ts`) two things must be derivable:
11
+ *
12
+ * - **Which repo publishes the id.** Obsidian's own registry —
13
+ * {@link COMMUNITY_PLUGINS_REGISTRY_URL}, served from the same
14
+ * `obsidianmd/obsidian-releases` repository the installer downloader already
15
+ * uses — maps every community plugin's `id` to its `owner/name` repo. That is
16
+ * the same table the in-app community browser installs from, so no
17
+ * plugin-specific mapping has to be hardcoded here.
18
+ * - **Where that repo's assets live.** A plugin release publishes `manifest.json`,
19
+ * `main.js` and (optionally) `styles.css` as release assets;
20
+ * {@link buildPluginAssetUrl} builds the URL for one, for either the latest
21
+ * release or a pinned tag.
22
+ *
23
+ * Everything decidable without the network lives here so it stays unit-tested; the
24
+ * fetching and writing sit in `demo-vault-bootstrap.ts`, mirroring the
25
+ * `installer-asset.ts` / `obsidian-installer.ts` split.
26
+ */
27
+ /**
28
+ * Obsidian's own community plugin registry: the `id` → `repo` table the in-app
29
+ * community browser installs from, served from the `obsidianmd/obsidian-releases`
30
+ * repository.
31
+ */
32
+ export declare const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json";
33
+ /**
34
+ * The `main.js` / `manifest.json` pair every plugin release must publish for the
35
+ * plugin to be loadable — the same two files `buildDemoVaultPopulate` requires on
36
+ * disk.
37
+ */
38
+ export declare const REQUIRED_PLUGIN_ASSET_NAMES: readonly ["main.js", "manifest.json"];
39
+ /**
40
+ * `styles.css` is published only by plugins that ship CSS, so a download of it is
41
+ * allowed to 404 without failing the install.
42
+ */
43
+ export declare const OPTIONAL_PLUGIN_ASSET_NAMES: readonly ["styles.css"];
44
+ /**
45
+ * Parameters for {@link buildPluginAssetUrl}.
46
+ */
47
+ export interface BuildPluginAssetUrlParams {
48
+ /**
49
+ The release asset's file name, e.g. `main.js`.
50
+ */
51
+ readonly assetName: string;
52
+ /**
53
+ The publishing GitHub repository, as `owner/name`.
54
+ */
55
+ readonly repo: string;
56
+ /**
57
+ * The release tag to download from. Omit for the repository's latest release —
58
+ * which is what the in-app community browser installs.
59
+ */
60
+ readonly version?: string | undefined;
61
+ }
62
+ /**
63
+ * One row of Obsidian's `community-plugins.json`, reduced to the fields the
64
+ * bootstrap needs. The published rows carry `name`, `author` and `description`
65
+ * too; they are deliberately not modelled.
66
+ */
67
+ export interface CommunityPluginRegistryEntry {
68
+ /**
69
+ The plugin's id — its `.obsidian/plugins/<id>` folder name.
70
+ */
71
+ readonly id: string;
72
+ /**
73
+ The publishing GitHub repository, as `owner/name`.
74
+ */
75
+ readonly repo: string;
76
+ }
77
+ /**
78
+ * Parameters for {@link selectPluginRepo}.
79
+ */
80
+ export interface SelectPluginRepoParams {
81
+ /**
82
+ The registry rows, as published by {@link COMMUNITY_PLUGINS_REGISTRY_URL}.
83
+ */
84
+ readonly entries: readonly CommunityPluginRegistryEntry[];
85
+ /**
86
+ The plugin id to look up.
87
+ */
88
+ readonly pluginId: string;
89
+ }
90
+ /**
91
+ * Builds the download URL for one asset of a plugin's GitHub release.
92
+ *
93
+ * GitHub serves two forms — a pinned `releases/download/<tag>/<asset>` and the
94
+ * moving `releases/latest/download/<asset>` — so a pinned version and the default
95
+ * "whatever is current" share one builder.
96
+ *
97
+ * @param params - The {@link BuildPluginAssetUrlParams}.
98
+ * @returns The asset's download URL.
99
+ */
100
+ export declare function buildPluginAssetUrl(params: BuildPluginAssetUrlParams): string;
101
+ /**
102
+ * Checks that a string has the `owner/name` shape a GitHub repository reference
103
+ * needs, so a malformed override is rejected before it is spliced into a URL.
104
+ *
105
+ * @param repo - The candidate repository reference.
106
+ * @returns Whether it is a well-formed `owner/name` pair.
107
+ */
108
+ export declare function isValidRepoReference(repo: string): boolean;
109
+ /**
110
+ * Looks a plugin id up in Obsidian's community plugin registry.
111
+ *
112
+ * @param params - The {@link SelectPluginRepoParams}.
113
+ * @returns The publishing `owner/name` repo, or `undefined` when the id is not a
114
+ * registered community plugin (a private or unlisted plugin, or a typo).
115
+ */
116
+ export declare function selectPluginRepo(params: SelectPluginRepoParams): string | undefined;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var config_directory_fallback_error_exports = {};
20
+ __export(config_directory_fallback_error_exports, {
21
+ ConfigDirectoryFallbackError: () => ConfigDirectoryFallbackError
22
+ });
23
+ module.exports = __toCommonJS(config_directory_fallback_error_exports);
24
+ class ConfigDirectoryFallbackError extends Error {
25
+ /**
26
+ The config folder the vault is actually using.
27
+ */
28
+ actualConfigDirectory;
29
+ /**
30
+ The config folder that was requested.
31
+ */
32
+ requestedConfigDirectory;
33
+ /**
34
+ Absolute path to the vault that was opened.
35
+ */
36
+ vaultPath;
37
+ /**
38
+ * Creates the error from the requested and actual config folders.
39
+ *
40
+ * @param params - The requested folder, the folder actually in use, and the vault path.
41
+ */
42
+ constructor(params) {
43
+ const { actualConfigDirectory, requestedConfigDirectory, vaultPath } = params;
44
+ super(
45
+ `Vault ${vaultPath} was opened with config folder ${actualConfigDirectory} but ${requestedConfigDirectory} was requested \u2014 Obsidian rejected the override or never saw it, and silently fell back. Check that ${requestedConfigDirectory} exists in the vault and is a name Obsidian accepts.`
46
+ );
47
+ this.name = "ConfigDirectoryFallbackError";
48
+ this.actualConfigDirectory = actualConfigDirectory;
49
+ this.requestedConfigDirectory = requestedConfigDirectory;
50
+ this.vaultPath = vaultPath;
51
+ }
52
+ }
53
+ // Annotate the CommonJS export names for ESM import in node:
54
+ 0 && (module.exports = {
55
+ ConfigDirectoryFallbackError
56
+ });
57
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgZGlzdGluY3QgZXJyb3IgdGhyb3duIHdoZW4gYW4gb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYm9vdGVkIGEgdmF1bHRcbiAqIGFnYWluc3QgYSAqKmRpZmZlcmVudCBjb25maWcgZm9sZGVyKiogdGhhbiB0aGUgb25lIHJlcXVlc3RlZCB0aHJvdWdoXG4gKiBgY29uZmlnRGlyZWN0b3J5YCBcdTIwMTQgT2JzaWRpYW4gcmVqZWN0ZWQgdGhlIG92ZXJyaWRlLCBvciBuZXZlciBzYXcgaXQsIGFuZCBzaWxlbnRseVxuICogZmVsbCBiYWNrIHRvIGAub2JzaWRpYW5gLlxuICpcbiAqIFRoZSBmYWxsYmFjayBpcyBzaWxlbnQgYnkgY29uc3RydWN0aW9uIChgc2V0Q29uZmlnRGlyYCBzd2FwcyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBmb3IgdGhlIGRlZmF1bHQgd2l0aG91dCBhIHdvcmQpIGFuZCB0aGUgcmVzdWx0aW5nIHZhdWx0IGxvb2tzIHBlcmZlY3RseVxuICogaGVhbHRoeTogaXQgb3BlbnMsIGl0cyBsYXlvdXQgaXMgcmVhZHksIGFuZCBpdCByZXBvcnRzIHN1Y2Nlc3MuIFdoYXQgaXQgZG9lc1xuICogbm90IGhhdmUgaXMgdGhlIHNldHRpbmdzLCBlbmFibGVkIHBsdWdpbnMsIGFuZCB3b3Jrc3BhY2Ugb2YgdGhlIGZvbGRlciB0aGF0XG4gKiB3YXMgYXNrZWQgZm9yIFx1MjAxNCBzbyBhIHN1aXRlIHRoYXQgdmVyaWZpZXMgYmVoYXZpb3VyIGFnYWluc3QgYSByZWFsIHZhdWx0J3NcbiAqIHBsdWdpbiBzZXQgd291bGQgc2lsZW50bHkgdmVyaWZ5IG5vdGhpbmcuIEhlbmNlIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGFcbiAqIHdhcm5pbmcsIGFuZCwgdW5saWtlIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAsIG5vIGtub2IgdG8gZG93bmdyYWRlIGl0OiB0aGVyZVxuICogaXMgbm8gdmVyc2lvbiBvZiB0aGlzIG91dGNvbWUgd29ydGggY29udGludWluZyBhZ2FpbnN0LlxuICpcbiAqIEV4cG9ydGVkIHNvIGNhbGxlcnMgb2YgYGNvbm5lY3RUb0NkcGAgLyB0aGUgdHJhbnNwb3J0IGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2hcbiAqIHRoaXMgc3BlY2lmaWMgZmFpbHVyZS5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjb25maWcgZm9sZGVyIHRoZSB2YXVsdCBpcyBhY3R1YWxseSB1c2luZywgYXMgcmVhZCBiYWNrIGZyb20gYGFwcC52YXVsdC5jb25maWdEaXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0dWFsQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBjb25maWcgZm9sZGVyIHRoYXQgd2FzIHJlcXVlc3RlZCB0aHJvdWdoIGBjb25maWdEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IHRoYXQgd2FzIG9wZW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgYm9vdGVkIG93bmVkIGluc3RhbmNlIHJlcG9ydHMgYSBkaWZmZXJlbnQgYGFwcC52YXVsdC5jb25maWdEaXJgXG4gKiB0aGFuIHRoZSByZXF1ZXN0ZWRcbiAqIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMucmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5fS5cbiAqIENhcnJpZXMgYm90aCBmb2xkZXIgbmFtZXMgYW5kIHRoZSB2YXVsdCBwYXRoIHNvIGNhbGxlcnMgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaFxuICogYW5kIHJlcG9ydCB3aGljaCB2YXVsdCB3YXMgb3BlbmVkIHdyb25nbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgVGhlIGNvbmZpZyBmb2xkZXIgdGhlIHZhdWx0IGlzIGFjdHVhbGx5IHVzaW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjdHVhbENvbmZpZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgY29uZmlnIGZvbGRlciB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IHRoYXQgd2FzIG9wZW5lZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB0aGUgcmVxdWVzdGVkIGFuZCBhY3R1YWwgY29uZmlnIGZvbGRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWVzdGVkIGZvbGRlciwgdGhlIGZvbGRlciBhY3R1YWxseSBpbiB1c2UsIGFuZCB0aGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IHsgYWN0dWFsQ29uZmlnRGlyZWN0b3J5LCByZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnksIHZhdWx0UGF0aCB9ID0gcGFyYW1zO1xuICAgIHN1cGVyKFxuICAgICAgYFZhdWx0ICR7dmF1bHRQYXRofSB3YXMgb3BlbmVkIHdpdGggY29uZmlnIGZvbGRlciAke2FjdHVhbENvbmZpZ0RpcmVjdG9yeX0gYnV0ICR7cmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5fSB3YXMgcmVxdWVzdGVkIFx1MjAxNCBgXG4gICAgICAgICsgJ09ic2lkaWFuIHJlamVjdGVkIHRoZSBvdmVycmlkZSBvciBuZXZlciBzYXcgaXQsIGFuZCBzaWxlbnRseSBmZWxsIGJhY2suICdcbiAgICAgICAgKyBgQ2hlY2sgdGhhdCAke3JlcXVlc3RlZENvbmZpZ0RpcmVjdG9yeX0gZXhpc3RzIGluIHRoZSB2YXVsdCBhbmQgaXMgYSBuYW1lIE9ic2lkaWFuIGFjY2VwdHMuYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3InO1xuICAgIHRoaXMuYWN0dWFsQ29uZmlnRGlyZWN0b3J5ID0gYWN0dWFsQ29uZmlnRGlyZWN0b3J5O1xuICAgIHRoaXMucmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5ID0gcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5O1xuICAgIHRoaXMudmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0RPLE1BQU0scUNBQXFDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxRQUF1RDtBQUN4RSxVQUFNLEVBQUUsdUJBQXVCLDBCQUEwQixVQUFVLElBQUk7QUFDdkU7QUFBQSxNQUNFLFNBQVMsU0FBUyxrQ0FBa0MscUJBQXFCLFFBQVEsd0JBQXdCLDRHQUV2Rix3QkFBd0I7QUFBQSxJQUM1QztBQUNBLFNBQUssT0FBTztBQUNaLFNBQUssd0JBQXdCO0FBQzdCLFNBQUssMkJBQTJCO0FBQ2hDLFNBQUssWUFBWTtBQUFBLEVBQ25CO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when an owned Obsidian instance booted a vault
5
+ * against a **different config folder** than the one requested through
6
+ * `configDirectory` — Obsidian rejected the override, or never saw it, and silently
7
+ * fell back to `.obsidian`.
8
+ *
9
+ * The fallback is silent by construction (`setConfigDir` swaps an invalid value
10
+ * for the default without a word) and the resulting vault looks perfectly
11
+ * healthy: it opens, its layout is ready, and it reports success. What it does
12
+ * not have is the settings, enabled plugins, and workspace of the folder that
13
+ * was asked for — so a suite that verifies behaviour against a real vault's
14
+ * plugin set would silently verify nothing. Hence a hard failure rather than a
15
+ * warning, and, unlike `SilentAsarFallbackError`, no knob to downgrade it: there
16
+ * is no version of this outcome worth continuing against.
17
+ *
18
+ * Exported so callers of `connectToCdp` / the transport can `instanceof`-match
19
+ * this specific failure.
20
+ */
21
+ /**
22
+ * Parameters for the {@link ConfigDirectoryFallbackError} constructor.
23
+ */
24
+ export interface ConfigDirectoryFallbackErrorConstructorParams {
25
+ /**
26
+ The config folder the vault is actually using, as read back from `app.vault.configDir`.
27
+ */
28
+ readonly actualConfigDirectory: string;
29
+ /**
30
+ The config folder that was requested through `configDirectory`.
31
+ */
32
+ readonly requestedConfigDirectory: string;
33
+ /**
34
+ Absolute path to the vault that was opened.
35
+ */
36
+ readonly vaultPath: string;
37
+ }
38
+ /**
39
+ * Thrown when a booted owned instance reports a different `app.vault.configDir`
40
+ * than the requested
41
+ * {@link ConfigDirectoryFallbackErrorConstructorParams.requestedConfigDirectory}.
42
+ * Carries both folder names and the vault path so callers can `instanceof`-match
43
+ * and report which vault was opened wrongly.
44
+ */
45
+ export declare class ConfigDirectoryFallbackError extends Error {
46
+ /**
47
+ The config folder the vault is actually using.
48
+ */
49
+ readonly actualConfigDirectory: string;
50
+ /**
51
+ The config folder that was requested.
52
+ */
53
+ readonly requestedConfigDirectory: string;
54
+ /**
55
+ Absolute path to the vault that was opened.
56
+ */
57
+ readonly vaultPath: string;
58
+ /**
59
+ * Creates the error from the requested and actual config folders.
60
+ *
61
+ * @param params - The requested folder, the folder actually in use, and the vault path.
62
+ */
63
+ constructor(params: ConfigDirectoryFallbackErrorConstructorParams);
64
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var config_directory_exports = {};
20
+ __export(config_directory_exports, {
21
+ DEFAULT_CONFIG_DIRECTORY: () => DEFAULT_CONFIG_DIRECTORY,
22
+ assertValidConfigDirectory: () => assertValidConfigDirectory
23
+ });
24
+ module.exports = __toCommonJS(config_directory_exports);
25
+ const DEFAULT_CONFIG_DIRECTORY = ".obsidian";
26
+ function assertValidConfigDirectory(configDirectory) {
27
+ if (!configDirectory.startsWith(".")) {
28
+ throw new Error(
29
+ `Invalid configDirectory ${JSON.stringify(configDirectory)}: an Obsidian config folder name must start with a dot, e.g. '${DEFAULT_CONFIG_DIRECTORY}'.`
30
+ );
31
+ }
32
+ if (configDirectory === ".") {
33
+ throw new Error(`Invalid configDirectory ${JSON.stringify(configDirectory)}: a bare dot is not a config folder name.`);
34
+ }
35
+ if (configDirectory.includes("/") || configDirectory.includes("\\")) {
36
+ throw new Error(
37
+ `Invalid configDirectory ${JSON.stringify(configDirectory)}: the config folder sits directly inside the vault, so its name cannot contain a path separator.`
38
+ );
39
+ }
40
+ }
41
+ // Annotate the CommonJS export names for ESM import in node:
42
+ 0 && (module.exports = {
43
+ DEFAULT_CONFIG_DIRECTORY,
44
+ assertValidConfigDirectory
45
+ });
46
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbmZpZy1kaXJlY3RvcnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0ZXMgYSB2YXVsdCdzICoqY29uZmlnIGZvbGRlcioqIG5hbWUgXHUyMDE0IHRoZSBwZXItdmF1bHQgb3ZlcnJpZGUgT2JzaWRpYW5cbiAqIGV4cG9zZXMgYXMgKlNldHRpbmdzIFx1MjE5MiBBYm91dCBcdTIxOTIgT3ZlcnJpZGUgY29uZmlnIGZvbGRlciogYW5kIHN0b3JlcyBhcyB0aGVcbiAqIGA8dmF1bHRJZD4tY29uZmlnYCBgbG9jYWxTdG9yYWdlYCBlbnRyeSAoc2VlIGB0cmFuc3BvcnQtZGVza3RvcC1jZHBgJ3NcbiAqIGBvcGVuVmF1bHRGcm9tU3RhcnRlclNjcmVlbmApLlxuICpcbiAqIE9ic2lkaWFuIHZhbGlkYXRlcyB0aGUgc2FtZSB2YWx1ZSBiZWZvcmUgYXBwbHlpbmcgaXQsIGFuZCAqKnNpbGVudGx5IGZhbGxzXG4gKiBiYWNrKiogdG8ge0BsaW5rIERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWX0gd2hlbiB0aGUgdmFsdWUgaXMgcmVqZWN0ZWRcbiAqIChPYnNpZGlhbiAxLjEzLjcsIGBhcHAuanNgKTpcbiAqXG4gKiBgYGBqc1xuICogdC52YWxpZGF0ZUNvbmZpZ0RpciA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBcIi5cIiAhPT0gZSAmJiBlLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFIRC50ZXN0KGUpIH07XG4gKiB0LnByb3RvdHlwZS5zZXRDb25maWdEaXIgPSBmdW5jdGlvbiAoZSkgeyB0LnZhbGlkYXRlQ29uZmlnRGlyKGUpIHx8IChlID0gVUQpLCB0aGlzLmNvbmZpZ0RpciA9IGUgfTtcbiAqIGBgYFxuICpcbiAqIFRoZSB0d28gc3RydWN0dXJhbCBjbGF1c2VzIGFyZSByZXByb2R1Y2VkIGhlcmUgc28gYSBiYWQgdmFsdWUgZmFpbHMgbG91ZGx5IGF0XG4gKiB0aGUgY2FsbCBzaXRlLCBuYW1pbmcgdGhlIG9wdGlvbiwgaW5zdGVhZCBvZiBib290aW5nIGEgdmF1bHQgYWdhaW5zdCB0aGUgd3JvbmdcbiAqIGZvbGRlci4gVGhlIHRoaXJkIFx1MjAxNCBgSERgLCBhIGNoYXJhY3RlciBibGFja2xpc3QgbWluaWZpZWQgcGFzdCByZWNvdmVyeSBcdTIwMTQgaXNcbiAqIGRlbGliZXJhdGVseSAqKm5vdCoqIGd1ZXNzZWQgYXQ6IGEgc3RyaWN0ZXIgbG9jYWwgY29weSB3b3VsZCByZWplY3QgZm9sZGVyXG4gKiBuYW1lcyBPYnNpZGlhbiBhY2NlcHRzLiBBbnl0aGluZyB0aGlzIHZhbGlkYXRvciBsZXRzIHRocm91Z2ggdGhhdCBPYnNpZGlhblxuICogdGhlbiByZWplY3RzIGlzIGNhdWdodCBwb3N0LWJvb3QgYnkgdGhlIGBhcHAudmF1bHQuY29uZmlnRGlyYCByZWFkYmFjaywgd2hpY2hcbiAqIHRocm93cyBgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcmAuIFRoYXQgcmVhZGJhY2sgaXMgdGhlIHJlYWwgZ3VhcmFudGVlO1xuICogdGhpcyBpcyB0aGUgZWFybHksIGJldHRlci13b3JkZWQgaGFsZiBvZiBpdC5cbiAqL1xuXG4vKipcbiAqIFRoZSBjb25maWcgZm9sZGVyIE9ic2lkaWFuIHVzZXMgd2hlbiBhIHZhdWx0IGhhcyBubyBvdmVycmlkZSBcdTIwMTQgYW5kIHRoZSBvbmUgaXRcbiAqIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gd2hlbiBhbiBvdmVycmlkZSBmYWlscyBpdHMgb3duIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgPSAnLm9ic2lkaWFuJztcblxuLyoqXG4gKiBUaHJvd3MgdW5sZXNzIGBjb25maWdEaXJlY3RvcnlgIGlzIGEgc3RydWN0dXJhbGx5IHZhbGlkIE9ic2lkaWFuIGNvbmZpZyBmb2xkZXJcbiAqIG5hbWUuXG4gKlxuICogTWlycm9ycyB0aGUgdHdvIHJlY292ZXJhYmxlIGNsYXVzZXMgb2YgT2JzaWRpYW4ncyBvd24gYHZhbGlkYXRlQ29uZmlnRGlyYDogdGhlXG4gKiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGRvdCBhbmQgbXVzdCBub3QgYmUgdGhlIGJhcmUgZG90LiBBIHBhdGggc2VwYXJhdG9yIGlzXG4gKiByZWplY3RlZCBvbiB0b3Agb2YgdGhvc2UsIGJlY2F1c2UgdGhlIG92ZXJyaWRlIG5hbWVzIGEgc2luZ2xlIGZvbGRlciBkaXJlY3RseVxuICogaW5zaWRlIHRoZSB2YXVsdCwgbmV2ZXIgYSBuZXN0ZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnRGlyZWN0b3J5IC0gVGhlIGNhbmRpZGF0ZSBjb25maWcgZm9sZGVyIG5hbWUsIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLlxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gdGhlIG5hbWUgd291bGQgYmUgcmVqZWN0ZWQgYnkgT2JzaWRpYW4gYW5kIHNpbGVudGx5XG4gKiAgIHJlcGxhY2VkIHdpdGgge0BsaW5rIERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeShjb25maWdEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWNvbmZpZ0RpcmVjdG9yeS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogYW4gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGRvdCwgZS5nLiAnJHtERUZBVUxUX0NPTkZJR19ESVJFQ1RPUll9Jy5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChjb25maWdEaXJlY3RvcnkgPT09ICcuJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogYSBiYXJlIGRvdCBpcyBub3QgYSBjb25maWcgZm9sZGVyIG5hbWUuYCk7XG4gIH1cblxuICBpZiAoY29uZmlnRGlyZWN0b3J5LmluY2x1ZGVzKCcvJykgfHwgY29uZmlnRGlyZWN0b3J5LmluY2x1ZGVzKCdcXFxcJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogdGhlIGNvbmZpZyBmb2xkZXIgc2l0cyBkaXJlY3RseSBpbnNpZGUgdGhlIHZhdWx0LCBzbyBpdHMgbmFtZSBjYW5ub3QgY29udGFpbiBhIHBhdGggc2VwYXJhdG9yLmBcbiAgICApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQk8sTUFBTSwyQkFBMkI7QUFlakMsU0FBUywyQkFBMkIsaUJBQStCO0FBQ3hFLE1BQUksQ0FBQyxnQkFBZ0IsV0FBVyxHQUFHLEdBQUc7QUFDcEMsVUFBTSxJQUFJO0FBQUEsTUFDUiwyQkFBMkIsS0FBSyxVQUFVLGVBQWUsQ0FBQyxpRUFBaUUsd0JBQXdCO0FBQUEsSUFDcko7QUFBQSxFQUNGO0FBRUEsTUFBSSxvQkFBb0IsS0FBSztBQUMzQixVQUFNLElBQUksTUFBTSwyQkFBMkIsS0FBSyxVQUFVLGVBQWUsQ0FBQywyQ0FBMkM7QUFBQSxFQUN2SDtBQUVBLE1BQUksZ0JBQWdCLFNBQVMsR0FBRyxLQUFLLGdCQUFnQixTQUFTLElBQUksR0FBRztBQUNuRSxVQUFNLElBQUk7QUFBQSxNQUNSLDJCQUEyQixLQUFLLFVBQVUsZUFBZSxDQUFDO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Validates a vault's **config folder** name — the per-vault override Obsidian
5
+ * exposes as *Settings → About → Override config folder* and stores as the
6
+ * `<vaultId>-config` `localStorage` entry (see `transport-desktop-cdp`'s
7
+ * `openVaultFromStarterScreen`).
8
+ *
9
+ * Obsidian validates the same value before applying it, and **silently falls
10
+ * back** to {@link DEFAULT_CONFIG_DIRECTORY} when the value is rejected
11
+ * (Obsidian 1.13.7, `app.js`):
12
+ *
13
+ * ```js
14
+ * t.validateConfigDir = function (e) { return "." !== e && e.startsWith(".") && !HD.test(e) };
15
+ * t.prototype.setConfigDir = function (e) { t.validateConfigDir(e) || (e = UD), this.configDir = e };
16
+ * ```
17
+ *
18
+ * The two structural clauses are reproduced here so a bad value fails loudly at
19
+ * the call site, naming the option, instead of booting a vault against the wrong
20
+ * folder. The third — `HD`, a character blacklist minified past recovery — is
21
+ * deliberately **not** guessed at: a stricter local copy would reject folder
22
+ * names Obsidian accepts. Anything this validator lets through that Obsidian
23
+ * then rejects is caught post-boot by the `app.vault.configDir` readback, which
24
+ * throws `ConfigDirectoryFallbackError`. That readback is the real guarantee;
25
+ * this is the early, better-worded half of it.
26
+ */
27
+ /**
28
+ * The config folder Obsidian uses when a vault has no override — and the one it
29
+ * silently falls back to when an override fails its own validation.
30
+ */
31
+ export declare const DEFAULT_CONFIG_DIRECTORY = ".obsidian";
32
+ /**
33
+ * Throws unless `configDirectory` is a structurally valid Obsidian config folder
34
+ * name.
35
+ *
36
+ * Mirrors the two recoverable clauses of Obsidian's own `validateConfigDir`: the
37
+ * name must start with a dot and must not be the bare dot. A path separator is
38
+ * rejected on top of those, because the override names a single folder directly
39
+ * inside the vault, never a nested path.
40
+ *
41
+ * @param configDirectory - The candidate config folder name, e.g. `'.obsidian-desktop'`.
42
+ * @throws {Error} When the name would be rejected by Obsidian and silently
43
+ * replaced with {@link DEFAULT_CONFIG_DIRECTORY}.
44
+ */
45
+ export declare function assertValidConfigDirectory(configDirectory: string): void;
@@ -22,19 +22,28 @@ __export(connect_to_cdp_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(connect_to_cdp_exports);
24
24
  var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
25
+ var import_headless_vault_config = require("./headless-vault-config.cjs");
25
26
  var import_leftover_cleanup = require("./leftover-cleanup.cjs");
26
27
  var import_log = require("./log.cjs");
27
28
  var import_normalize_optional_properties = require("./normalize-optional-properties.cjs");
28
29
  var import_temporary_vault = require("./temporary-vault.cjs");
29
30
  var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
30
31
  var import_transport_factory = require("./transport-factory.cjs");
32
+ var import_transport_options = require("./transport-options.cjs");
31
33
  const DEFAULT_CDP_HOST = "localhost";
32
34
  async function connectToCdp(options) {
33
35
  const transportOptions = buildCdpTransportOptions(options);
34
36
  await sweepLeftovers(transportOptions);
35
37
  const transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
36
- const vault = new import_temporary_vault.TemporaryVault(options?.vault);
37
38
  const shouldRemoveVaultOnDispose = options?.shouldRemoveVaultOnDispose ?? options?.vault === void 0;
39
+ const vault = new import_temporary_vault.TemporaryVault(options?.vault, { shouldRemoveDirectoryOnDispose: shouldRemoveVaultOnDispose });
40
+ if (options?.vault === void 0) {
41
+ await (0, import_headless_vault_config.ensureHeadlessVaultConfig)({
42
+ configDirectory: (0, import_transport_options.resolveOwnedConfigDirectory)(transportOptions),
43
+ label: transportOptions.type,
44
+ vaultPath: vault.path
45
+ });
46
+ }
38
47
  await vault.register(transport);
39
48
  const { host, port } = resolveEndpoint(transport, options);
40
49
  const cdpUrl = `http://${host}:${String(port)}`;
@@ -54,11 +63,7 @@ async function connectToCdp(options) {
54
63
  },
55
64
  async dispose() {
56
65
  try {
57
- if (shouldRemoveVaultOnDispose) {
58
- await vault.dispose(transport);
59
- } else {
60
- await transport.unregisterVault(vault.path);
61
- }
66
+ await vault.dispose(transport);
62
67
  } finally {
63
68
  await transport.dispose?.();
64
69
  }
@@ -80,6 +85,7 @@ async function connectToCdp(options) {
80
85
  function buildCdpTransportOptions(options) {
81
86
  return (0, import_normalize_optional_properties.normalizeOptionalProperties)({
82
87
  commandTimeoutInMilliseconds: options?.commandTimeoutInMilliseconds,
88
+ configDirectory: options?.configDirectory,
83
89
  deadBootGraceInMilliseconds: options?.deadBootGraceInMilliseconds,
84
90
  host: options?.host,
85
91
  isObsidianAppVisible: options?.isObsidianAppVisible ?? true,
@@ -126,4 +132,4 @@ async function sweepLeftovers(transportOptions) {
126
132
  0 && (module.exports = {
127
133
  connectToCdp
128
134
  });
129
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdFxufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHMsXG4gIHN3ZWVwSG9zdExlZnRvdmVycyxcbiAgd2lsbFN3ZWVwTGVmdG92ZXJzXG59IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4vbm9ybWFsaXplLW9wdGlvbmFsLXByb3BlcnRpZXMuY2pzJztcbmltcG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQuY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfQ0RQX0hPU1QgPSAnbG9jYWxob3N0JztcblxuLyoqXG4gKiBBIGxpdmUgY29ubmVjdGlvbiB0byBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlIHdpdGggdGhlIHJ1bnRpbWUgaGVscGVyXG4gKiBuYW1lc3BhY2UgYm9vdHN0cmFwcGVkLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAsIHNvIGBhd2FpdCB1c2luZyBjb25uID0gYXdhaXQgY29ubmVjdFRvQ2RwKFx1MjAyNilgXG4gKiBkaXNwb3NlcyBpdCAoa2lsbGluZyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgXHUyMDE0IGZvciBhIHRocm93LWF3YXkgdGVtcCB2YXVsdCBcdTIwMTRcbiAqIHJlbW92aW5nIGl0cyBkaXJlY3RvcnkpIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwQ29ubmVjdGlvbiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHJlYWQgbGl2ZSBhZnRlciBib290OlxuICAgKiB3aGV0aGVyIHRoZSBhcHAgdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBvclxuICAgKiB0aGUgaW5zdGFsbGVyIHNpbGVudGx5IHJldmVydGVkIHRvIGl0cyBvd24gYnVuZGxlZCBhc2FyLiBgdW5kZWZpbmVkYCBpbiBhdHRhY2hcbiAgICogbW9kZSwgd2hlbiBubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB3aGVuIHRoZSBydW5uaW5nIHZlcnNpb24gd2FzIHVucmVhZGFibGUuIEFcbiAgICogYCdmYWxsYmFjaydgIHZlcmRpY3QgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgdGhyb3cgaXMgZGlzYWJsZWRcbiAgICogKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2t9IGBmYWxzZWApO1xuICAgKiBvdGhlcndpc2UgaXQgdGhyb3dzIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBhc2FyRmFsbGJhY2s/OiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhpcyBjb25uZWN0aW9uJ3MgT2JzaWRpYW4gd2luZG93LCB3aXRoIHRoZVxuICAgKiB2YXVsdCBwYXRoIHByZS1ib3VuZC5cbiAgICpcbiAgICogUGFzcyBgd2lkdGhJblBpeGVsc2AgKyBgaGVpZ2h0SW5QaXhlbHNgIHRvIHBpbiB0aGUgdmlld3BvcnQgZm9yIHRoZSBkdXJhdGlvblxuICAgKiBvZiB0aGUgY2FwdHVyZSwgc28gdGhlIGVtaXR0ZWQgUE5HIGlzIGV4YWN0bHkgdGhhdCBzaXplIHdoYXRldmVyIHNpemUgdGhlXG4gICAqIHdpbmRvdyBoYXBwZW5zIHRvIGJlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGV4YWN0IHNpemUgdG8gY2FwdHVyZSBhdC4gT21pdCB0byBjYXB0dXJlIHRoZSB3aW5kb3cgYXQgaXRzIG5hdHVyYWwgc2l6ZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmF3IFBORyBieXRlcy5cbiAgICovXG4gIGNhcHR1cmVTY3JlZW5zaG90KHBhcmFtcz86IEV4Y2VwdDxDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcywgJ2N3ZCc+KTogUHJvbWlzZTxVaW50OEFycmF5PjtcblxuICAvKipcbiAgICogVGhlIGJhc2UgQ0RQIFVSTCwgZS5nLiBgaHR0cDovL2xvY2FsaG9zdDo1MTg4OGAuXG4gICAqL1xuICByZWFkb25seSBjZHBVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIGFuIG93bmVkIGluc3RhbmNlLCB3aGVuXG4gICAqIGl0IGNvdWxkIGJlIGRldGVybWluZWQuIGB1bmRlZmluZWRgIGluIGF0dGFjaCBtb2RlLCBvciB3aGVuIHRoZSB2ZXJkaWN0IGlzXG4gICAqIHVua25vd24gKHVuZGV0ZWN0YWJsZSBzaGVsbCB2ZXJzaW9uLCBvciB0aGUgYXBwIHZlcnNpb24gaXMgYWJzZW50IGZyb20gdGhlXG4gICAqIHRhYmxlKS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSBwcm9hY3RpdmUgdGhyb3dcbiAgICogaXMgZGlzYWJsZWQgKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9XG4gICAqIGBmYWxzZWApOyBvdGhlcndpc2UgaXQgdGhyb3dzIGBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JgIGJlZm9yZSB0aGVcbiAgICogY29ubmVjdGlvbiBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGF0aWJpbGl0eT86IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBjb25uZWN0aW9uOiBraWxscyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgcmVtb3ZlcyBpdHMgaXNvbGF0ZWRcbiAgICogdXNlci1kYXRhIGRpci4gVGhlIHZhdWx0IGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiBpdCBpcyBhIHRocm93LWF3YXlcbiAgICogdGVtcCB2YXVsdCAoc2VlIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlfSk7IGFcbiAgICogcmVhbCB2YXVsdCBwYXNzZWQgdmlhIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnZhdWx0fSBpcyBuZXZlciBkZWxldGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZGlzcG9zYWwgY29tcGxldGVzLlxuICAgKi9cbiAgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIGFuIG93bmVkIGluc3RhbmNlLCByZWFkIGxpdmVcbiAgICogYWZ0ZXIgYm9vdDogd2hldGhlciB0aGUgRWxlY3Ryb24gdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIGlzIG5ldyBlbm91Z2hcbiAgICogZm9yIHRoZSBydW5uaW5nIGFwcCB2ZXJzaW9uLiBgdW5kZWZpbmVkYCBpbiBhdHRhY2ggbW9kZSwgb3Igd2hlbiB0aGUgdmVyZGljdFxuICAgKiBpcyB1bmtub3duICh0aGUgbGl2ZSB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBub1xuICAgKiByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS4gQW4gb2xkIEVsZWN0cm9uIG5ldmVyIGJsb2NrcyBcdTIwMTQgaXQgb25seSB3YXJucyBcdTIwMTRcbiAgICogc28gdW5saWtlIHtAbGluayBjb21wYXRpYmlsaXR5fSB0aGVyZSBpcyBubyB0aHJvd2luZyB0aWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlY3Ryb25Db21wYXRpYmlsaXR5PzogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzZWxmLWNvbnRhaW5lZCBmdW5jdGlvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIHRoZSByaWNoIGhlbHBlclxuICAgKiBwYXRoLCByZWNlaXZpbmcgYHsgYXBwLCBsaWIsIG9ic2lkaWFuTW9kdWxlLCBjb250ZXh0IH1gIHBsdXMgYW55IGBpbnB1dGBcbiAgICogKHNoYXJlZCBoZWxwZXJzIGxpa2UgYHR5cGVJbnRvRWRpdG9yYCAvIGB3YWl0VW50aWxgIGxpdmUgb24gYGxpYmApLiBNaXJyb3JzXG4gICAqIHRoZSB0b3AtbGV2ZWwgYGV2YWxJbk9ic2lkaWFuYCwgd2l0aCB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBwYXRoIHByZS1ib3VuZFxuICAgKiB0byB0aGlzIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZhbHVhdGlvbiBwYXJhbWV0ZXJzIChgY2FsbGJhY2tgLCBvcHRpb25hbCBgaW5wdXRgL2Bjb250ZXh0SWRgKS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBjYWxsYmFja2AuXG4gICAqL1xuICBldmFsSW5PYnNpZGlhbjxJbnB1dCBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgcGFyYW1zOiBFeGNlcHQ8RXZhbEluT2JzaWRpYW5QYXJhbXM8SW5wdXQsIFJlc3VsdCwgVENvbnRleHRJZD4sICd0cmFuc3BvcnQnIHwgJ3ZhdWx0UGF0aCc+XG4gICk6IFByb21pc2U8UmVzdWx0PjtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgcmF3IEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gYW5kIHJldHVybnMgdGhlXG4gICAqIG5vcm1hbGl6ZWQgc3RyaW5nIHJlc3VsdCAoZS5nLiBgJzUnYCwgYSBKU09OIHN0cmluZywgb3IgYCcobm8gb3V0cHV0KSdgKS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBBIHNlbGYtY29udGFpbmVkIEphdmFTY3JpcHQgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmF3IHJlc3VsdCBzdHJpbmcuXG4gICAqL1xuICBpbnZva2UoZXhwcmVzc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIHBvcnQgdGhlIGluc3RhbmNlIGlzIHJlYWNoYWJsZSBvbiAodGhlIGZyZWUgcG9ydCBjaG9zZW4gZm9yIGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciB0aGUgYXR0YWNoZWQge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMucG9ydH0pLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlbmVkIHZhdWx0LiBFeHBvc2VzIGBwYXRoYCBhbmQgYHBvcHVsYXRlKC4uLilgIGZvciBzZWVkaW5nIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHQ6IFRlbXBvcmFyeVZhdWx0O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBjb25uZWN0VG9DZHB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RUb0NkcE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMzAwMDBgXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSBkZWFkIGJvb3Qgb2YgdGhlIG93bmVkXG4gICAqIGluc3RhbmNlIFx1MjAxNCB0aGUgcmVuZGVyZXIgbG9hZGVkIGJ1dCB0aGUgYXBwIG5ldmVyIGJvb3RzdHJhcHBlZCAoZW1wdHlcbiAgICogYDxib2R5PmAsIG5vIGB3aW5kb3cuYXBwYCksIHRoZSB0ZXJtaW5hbCBzdGF0ZSB3aGVuIHRoZSBhc2FyIGNhbm5vdCBydW4gb25cbiAgICogdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsLiBPbmNlIGl0IGhhcyBoZWxkIHRoaXMgbG9uZyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYCBpcyB0aHJvd24gaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbFxuICAgKiByZWFkaW5lc3MgdGltZW91dC4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuIFNldCBgMGAgdG9cbiAgICogZGlzYWJsZSBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIERlZmF1bHRzIHRvIGB0cnVlYDsgc2V0XG4gICAqIGBmYWxzZWAgdG8gbGF1bmNoIGl0IG9mZi1zY3JlZW4uXG4gICAqIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHNoZWxsIGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkluc3RhbGxlclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIE9ic2lkaWFuIGFwcCB2ZXJzaW9uIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy4gQWNjZXB0c1xuICAgKiBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLiBJZ25vcmVkIHdoZW5cbiAgICoge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LiBXaGVuIG9taXR0ZWQsIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0by4gV2hlbiBvbWl0dGVkLCBhblxuICAgKiBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5IGNob3NlbiBmcmVlIHBvcnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS5cbiAgICpcbiAgICogTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZFxuICAgKiBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBpbnN0YWxsZXItZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSVxuICAgKiBydW5uaW5nIGFzIGEgbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoXG4gICAqIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSB2YXVsdCBkaXJlY3Rvcnkgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uZGlzcG9zZX0uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBhbiBpbXBsaWNpdCB0aHJvdy1hd2F5IHRlbXAgdmF1bHRcbiAgICogKHtAbGluayB2YXVsdH0gbm90IGdpdmVuKSBhbmQgYGZhbHNlYCB3aGVuIGEge0BsaW5rIHZhdWx0fSBwYXRoIGlzIGdpdmVuLCBzb1xuICAgKiBhIHJlYWwgdmF1bHQgaXMgbmV2ZXIgZGVsZXRlZC4gU2V0IGV4cGxpY2l0bHkgdG8gb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gKip1bnJ1bm5hYmxlKiogaW5zdGFsbGVyXHUyMTk0YXBwIHZlcnNpb24gcGFpciBmYWlscyBmYXN0IGJlZm9yZSBsYXVuY2guXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogZG93bmxvYWRlZCBvciBsYXVuY2hlZC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBwaW4gcHJvY2VlZCB0byBsYXVuY2ggXHUyMDE0IHdoZXJlXG4gICAqIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlXG4gICAqIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXMgc3VyZmFjZWQgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uY29tcGF0aWJpbGl0eX1cbiAgICogcmF0aGVyIHRoYW4gdGhyb3duLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhIHBvc3QtYm9vdCAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdC5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGlzIHN3YXBwZWQgb250byBhbiBpbnN0YWxsZXIgc2hlbGwgdG9vIG9sZCBmb3IgaXQsIHRoZSBpbnN0YW5jZVxuICAgKiBtYXkgc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZCBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmdcbiAgICogKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHJ1bm5pbmdcbiAgICogYXBwIHZlcnNpb24gaXMgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcGluIHBvc3QtYm9vdCBhbmQgYSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBib290IHByb2NlZWQgXHUyMDE0IHRoZSBtaXNtYXRjaFxuICAgKiBpcyB0aGVuIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmFzYXJGYWxsYmFja30gcmF0aGVyIHRoYW4gdGhyb3duLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KSBhbmQgd2hlbiBubyBhc2FyIGlzIHN3YXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzIGJvdGggdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzXG4gICAqIGxvZzsgc2V0IGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIHN1cmZhY2VkIG9uXG4gICAqIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9IC8ge0BsaW5rIENkcENvbm5lY3Rpb24uZWxlY3Ryb25Db21wYXRpYmlsaXR5fSxcbiAgICogb25seSB0aGUgbG9nIGlzIHN1cHByZXNzZWQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHZhdWx0IHRvIG9wZW4uIFdoZW4gb21pdHRlZCwgYW4gZW1wdHkgdGVtcG9yYXJ5XG4gICAqIHZhdWx0IGlzIGNyZWF0ZWQgKGFuZCByZW1vdmVkIG9uIGRpc3Bvc2UgdW5sZXNzXG4gICAqIHtAbGluayBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0gc2F5cyBvdGhlcndpc2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXNvbHZlZCBDRFAgaG9zdC9wb3J0IHBhaXIuXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGF1bmNoZXMgKG9yIGF0dGFjaGVzIHRvKSBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlLCBvcGVucyBhIHZhdWx0LCBhbmRcbiAqIGJvb3RzdHJhcHMgdGhlIHJ1bnRpbWUgaGVscGVyIG5hbWVzcGFjZSwgcmV0dXJuaW5nIGEgZGlzcG9zYWJsZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGl2ZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9DZHAob3B0aW9ucz86IENvbm5lY3RUb0NkcE9wdGlvbnMpOiBQcm9taXNlPENkcENvbm5lY3Rpb24+IHtcbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGJ1aWxkQ2RwVHJhbnNwb3J0T3B0aW9ucyhvcHRpb25zKTtcbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnModHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCB2YXVsdCA9IG5ldyBUZW1wb3JhcnlWYXVsdChvcHRpb25zPy52YXVsdCk7XG4gIGNvbnN0IHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlID0gb3B0aW9ucz8uc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPz8gKG9wdGlvbnM/LnZhdWx0ID09PSB1bmRlZmluZWQpO1xuXG4gIC8vIFJlZ2lzdGVyaW5nIHRoZSB2YXVsdCBpcyB3aGF0IGxhdW5jaGVzIHRoZSBvd25lZCBpbnN0YW5jZSAocHJvdmlzaW9ucyB0aGVcbiAgLy8gQXNhciwgb3BlbnMgdGhlIHZhdWx0LCBhbmQgYm9vdHN0cmFwcyB0aGUgaGVscGVyIG5hbWVzcGFjZSksIG9yIG9wZW5zIHRoZVxuICAvLyBWYXVsdCBpbiB0aGUgYXR0YWNoZWQgaW5zdGFuY2UuXG4gIGF3YWl0IHZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG5cbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSByZXNvbHZlRW5kcG9pbnQodHJhbnNwb3J0LCBvcHRpb25zKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2hvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG4gIGNvbnN0IGFzYXJGYWxsYmFjayA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0QXNhckZhbGxiYWNrKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldENvbXBhdGliaWxpdHkoKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZWxlY3Ryb25Db21wYXRpYmlsaXR5ID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHkoKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBjb25uZWN0aW9uOiBDZHBDb25uZWN0aW9uID0ge1xuICAgIGNkcFVybCxcbiAgICAuLi4oYXNhckZhbGxiYWNrICYmIHsgYXNhckZhbGxiYWNrIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICAuLi4oZWxlY3Ryb25Db21wYXRpYmlsaXR5ICYmIHsgZWxlY3Ryb25Db21wYXRpYmlsaXR5IH0pLFxuXG4gICAgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zPzogRXhjZXB0PENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLCAnY3dkJz4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgIC8vIEV2ZXJ5IHRyYW5zcG9ydCBgY29ubmVjdFRvQ2RwYCBidWlsZHMgaXMgYSBEZXNrdG9wQ2RwVHJhbnNwb3J0LCB3aGljaFxuICAgICAgLy8gSW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgbWV0aG9kIFx1MjAxNCBidXQgdGhlIGludGVyZmFjZSBzdGlsbCB0eXBlcyBpdFxuICAgICAgLy8gT3B0aW9uYWwsIHNvIHRoZSBhYnNlbmNlIGlzIHJlcG9ydGVkIHJhdGhlciB0aGFuIHNpbGVudGx5IHRocm93biBhdC5cbiAgICAgIGlmICghdHJhbnNwb3J0LmNhcHR1cmVTY3JlZW5zaG90KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY29ubmVjdFRvQ2RwOiB0aGlzIHRyYW5zcG9ydCBjYW5ub3QgY2FwdHVyZSBzY3JlZW5zaG90cy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5jYXB0dXJlU2NyZWVuc2hvdCh7IC4uLnBhcmFtcywgY3dkOiB2YXVsdC5wYXRoIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlKSB7XG4gICAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHQodmF1bHQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48SW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICAgICAgcGFyYW1zOiBFeGNlcHQ8RXZhbEluT2JzaWRpYW5QYXJhbXM8SW5wdXQsIFJlc3VsdCwgVENvbnRleHRJZD4sICd0cmFuc3BvcnQnIHwgJ3ZhdWx0UGF0aCc+XG4gICAgKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgIHJldHVybiBldmFsSW5PYnNpZGlhbjxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9uc30gZm9yIGEgY29ubmVjdGlvbiwgdGhyZWFkaW5nIG9ubHlcbiAqIHRoZSBwcm92aWRlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9uc30gdGhyb3VnaCAob3duZWQtdmlzaWJsZSBkZWZhdWx0cyB0b1xuICogYHRydWVgLCB1bmxpa2UgdGhlIGhpZGRlbi1ieS1kZWZhdWx0IHRlc3QgdHJhbnNwb3J0cykuIFVuc2V0IGtub2JzIHBhc3MgdGhyb3VnaFxuICogYXMgYHVuZGVmaW5lZGAgYW5kIGFyZSByZWFkIHdpdGggYD8/IGRlZmF1bHRgIC8gYCE9PSB1bmRlZmluZWRgIGd1YXJkc1xuICogZG93bnN0cmVhbSwgc28gYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhYnNlbnQga2V5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24ncyB0cmFuc3BvcnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnM+KHtcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzLFxuICAgIGhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlID8/IHRydWUsXG4gICAgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24sXG4gICAgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhblZlcnNpb24sXG4gICAgcG9ydDogb3B0aW9ucz8ucG9ydCxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogb3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcixcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIENEUCBob3N0L3BvcnQgZm9yIHRoZSBjb25uZWN0aW9uOiBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzXG4gKiBsYXVuY2hlZCBlbmRwb2ludCB3aGVuIHByZXNlbnQsIG90aGVyd2lzZSBmcm9tIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaG9zdCBhbmQgcG9ydC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvcnQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQ6IHVua25vd24sIG9wdGlvbnM6IENvbm5lY3RUb0NkcE9wdGlvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaWYgKHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRyYW5zcG9ydC5nZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTtcbiAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGhvc3Q6IGVuZHBvaW50Lmhvc3QsIHBvcnQ6IGVuZHBvaW50LnBvcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogb3B0aW9ucy5ob3N0ID8/IERFRkFVTFRfQ0RQX0hPU1QsIHBvcnQ6IG9wdGlvbnMucG9ydCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIENEUCBwb3J0LicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQsIGJlZm9yZSB0aGlzXG4gKiBjb25uZWN0aW9uIGFkZHMgaXRzIG93bi5cbiAqXG4gKiBgY29ubmVjdFRvQ2RwYCBtaW50cyB0aGUgc2FtZSBgdGVtcC12YXVsdC0qYCAvIG93bmVkIGB1c2VyZGF0YS0qYCBkaXJlY3Rvcmllc1xuICogdGhlIHRlc3QgZ2xvYmFsIHNldHVwIGRvZXMsIGFuZCBhbiBhZC1ob2MgZGVidWdnaW5nIHNlc3Npb24gaXMgZXhhY3RseSB0aGVcbiAqIGtpbmQgdGhhdCBnZXRzIGtpbGxlZCB3aXRoIGEgbGVmdG92ZXIgYmVoaW5kIFx1MjAxNCBzbyBpdCBzd2VlcHMgdG9vLiBBZ2UtZ2F0ZWQgYW5kXG4gKiBiZXN0LWVmZm9ydDsgc2VlIHRoZSBjb3JlJ3MgYHN3ZWVwTGVmdG92ZXJzYC5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXdpbGxTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIG1heEFnZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID4gMCB8fCByZXN1bHQuZmFpbGVkQ291bnQgPiAwKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbY29ubmVjdC10by1jZHBdIFN3ZXB0ICR7U3RyaW5nKHJlc3VsdC5yZW1vdmVkQ291bnQpfSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yKGllcykgZnJvbSBlYXJsaWVyIHJ1bnMgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhyZXN1bHQuZmFpbGVkQ291bnQpfSBzdGlsbCBpbiB1c2UpLmBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2Nvbm5lY3QtdG8tY2RwXSBMZWZ0b3ZlciBzd2VlcCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNEJBLDhCQUErQjtBQUMvQiw4QkFJTztBQUNQLGlCQUFvQjtBQUNwQiwyQ0FBNEM7QUFDNUMsNkJBQStCO0FBQy9CLG1DQUFvQztBQUNwQywrQkFB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
135
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdFxufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZyB9IGZyb20gJy4vaGVhZGxlc3MtdmF1bHQtY29uZmlnLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyxcbiAgc3dlZXBIb3N0TGVmdG92ZXJzLFxuICB3aWxsU3dlZXBMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5janMnO1xuaW1wb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkuY2pzJztcbmltcG9ydCB7IHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeSB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICdsb2NhbGhvc3QnO1xuXG4vKipcbiAqIEEgbGl2ZSBjb25uZWN0aW9uIHRvIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXJcbiAqIG5hbWVzcGFjZSBib290c3RyYXBwZWQuXG4gKlxuICogSW1wbGVtZW50cyBgQXN5bmNEaXNwb3NhYmxlYCwgc28gYGF3YWl0IHVzaW5nIGNvbm4gPSBhd2FpdCBjb25uZWN0VG9DZHAoXHUyMDI2KWBcbiAqIGRpc3Bvc2VzIGl0IChraWxsaW5nIGFuIG93bmVkIGluc3RhbmNlIGFuZCBcdTIwMTQgZm9yIGEgdGhyb3ctYXdheSB0ZW1wIHZhdWx0IFx1MjAxNFxuICogcmVtb3ZpbmcgaXRzIGRpcmVjdG9yeSkgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBDb25uZWN0aW9uIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgcmVhZCBsaXZlIGFmdGVyIGJvb3Q6XG4gICAqIHdoZXRoZXIgdGhlIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yXG4gICAqIHRoZSBpbnN0YWxsZXIgc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIuIGB1bmRlZmluZWRgIGluIGF0dGFjaFxuICAgKiBtb2RlLCB3aGVuIG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHdoZW4gdGhlIHJ1bm5pbmcgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZS4gQVxuICAgKiBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja30gYGZhbHNlYCk7XG4gICAqIG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJGYWxsYmFjaz86IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGlzIGNvbm5lY3Rpb24ncyBPYnNpZGlhbiB3aW5kb3csIHdpdGggdGhlXG4gICAqIHZhdWx0IHBhdGggcHJlLWJvdW5kLlxuICAgKlxuICAgKiBQYXNzIGB3aWR0aEluUGl4ZWxzYCArIGBoZWlnaHRJblBpeGVsc2AgdG8gcGluIHRoZSB2aWV3cG9ydCBmb3IgdGhlIGR1cmF0aW9uXG4gICAqIG9mIHRoZSBjYXB0dXJlLCBzbyB0aGUgZW1pdHRlZCBQTkcgaXMgZXhhY3RseSB0aGF0IHNpemUgd2hhdGV2ZXIgc2l6ZSB0aGVcbiAgICogd2luZG93IGhhcHBlbnMgdG8gYmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGF0LiBPbWl0IHRvIGNhcHR1cmUgdGhlIHdpbmRvdyBhdCBpdHMgbmF0dXJhbCBzaXplLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zPzogRXhjZXB0PENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLCAnY3dkJz4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBDRFAgVVJMLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHdoZW5cbiAgICogaXQgY291bGQgYmUgZGV0ZXJtaW5lZC4gYHVuZGVmaW5lZGAgaW4gYXR0YWNoIG1vZGUsIG9yIHdoZW4gdGhlIHZlcmRpY3QgaXNcbiAgICogdW5rbm93biAodW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGVcbiAgICogdGFibGUpLiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXMgaGVyZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvd1xuICAgKiBpcyBkaXNhYmxlZCAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcn1cbiAgICogYGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3MgYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZVxuICAgKiBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIGNvbm5lY3Rpb246IGtpbGxzIGFuIG93bmVkIGluc3RhbmNlIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZFxuICAgKiB1c2VyLWRhdGEgZGlyLiBUaGUgdmF1bHQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgb25seSB3aGVuIGl0IGlzIGEgdGhyb3ctYXdheVxuICAgKiB0ZW1wIHZhdWx0IChzZWUge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9KTsgYVxuICAgKiByZWFsIHZhdWx0IHBhc3NlZCB2aWEge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMudmF1bHR9IGlzIG5ldmVyIGRlbGV0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHJlYWQgbGl2ZVxuICAgKiBhZnRlciBib290OiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaFxuICAgKiBmb3IgdGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24uIGB1bmRlZmluZWRgIGluIGF0dGFjaCBtb2RlLCBvciB3aGVuIHRoZSB2ZXJkaWN0XG4gICAqIGlzIHVua25vd24gKHRoZSBsaXZlIHZlcnNpb24gd2FzIHVucmVhZGFibGUsIG9yIHRoZSBhcHAgdmVyc2lvbiBjYXJyaWVzIG5vXG4gICAqIHJlY29tbWVuZGVkIEVsZWN0cm9uIHZlcnNpb24pLiBBbiBvbGQgRWxlY3Ryb24gbmV2ZXIgYmxvY2tzIFx1MjAxNCBpdCBvbmx5IHdhcm5zIFx1MjAxNFxuICAgKiBzbyB1bmxpa2Uge0BsaW5rIGNvbXBhdGliaWxpdHl9IHRoZXJlIGlzIG5vIHRocm93aW5nIHRpZXIuXG4gICAqL1xuICByZWFkb25seSBlbGVjdHJvbkNvbXBhdGliaWxpdHk/OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHNlbGYtY29udGFpbmVkIGZ1bmN0aW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgdGhlIHJpY2ggaGVscGVyXG4gICAqIHBhdGgsIHJlY2VpdmluZyBgeyBhcHAsIGxpYiwgb2JzaWRpYW5Nb2R1bGUsIGNvbnRleHQgfWAgcGx1cyBhbnkgYGlucHV0YFxuICAgKiAoc2hhcmVkIGhlbHBlcnMgbGlrZSBgdHlwZUludG9FZGl0b3JgIC8gYHdhaXRVbnRpbGAgbGl2ZSBvbiBgbGliYCkuIE1pcnJvcnNcbiAgICogdGhlIHRvcC1sZXZlbCBgZXZhbEluT2JzaWRpYW5gLCB3aXRoIHRoZSB0cmFuc3BvcnQgYW5kIHZhdWx0IHBhdGggcHJlLWJvdW5kXG4gICAqIHRvIHRoaXMgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmFsdWF0aW9uIHBhcmFtZXRlcnMgKGBjYWxsYmFja2AsIG9wdGlvbmFsIGBpbnB1dGAvYGNvbnRleHRJZGApLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNhbGxiYWNrYC5cbiAgICovXG4gIGV2YWxJbk9ic2lkaWFuPElucHV0IGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPiwgJ3RyYW5zcG9ydCcgfCAndmF1bHRQYXRoJz5cbiAgKTogUHJvbWlzZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSByYXcgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogbm9ybWFsaXplZCBzdHJpbmcgcmVzdWx0IChlLmcuIGAnNSdgLCBhIEpTT04gc3RyaW5nLCBvciBgJyhubyBvdXRwdXQpJ2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgcG9ydCB0aGUgaW5zdGFuY2UgaXMgcmVhY2hhYmxlIG9uICh0aGUgZnJlZSBwb3J0IGNob3NlbiBmb3IgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIHRoZSBhdHRhY2hlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5wb3J0fSkuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVuZWQgdmF1bHQuIEV4cG9zZXMgYHBhdGhgIGFuZCBgcG9wdWxhdGUoLi4uKWAgZm9yIHNlZWRpbmcgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSB2YXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNvbm5lY3RUb0NkcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdFRvQ2RwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzICoqY29uZmlnIGZvbGRlcioqIFx1MjAxNCBPYnNpZGlhbidzIHBlci12YXVsdCAqT3ZlcnJpZGUgY29uZmlnXG4gICAqIGZvbGRlciogc2V0dGluZywgZS5nLiBgJy5vYnNpZGlhbi1kZXNrdG9wJ2AuIFNldCBpdCB0byBvcGVuIGEgdmF1bHQgdGhhdFxuICAgKiBrZWVwcyBpdHMgc2V0dGluZ3Mgc29tZXdoZXJlIG90aGVyIHRoYW4gYC5vYnNpZGlhbmA7IHdpdGhvdXQgaXQgc3VjaCBhIHZhdWx0XG4gICAqIG9wZW5zIGFnYWluc3QgYC5vYnNpZGlhbmAsIHdoaWNoIGZvciBhIHZhdWx0IHRoYXQgaGFzIGEgc3RhbGUgb25lIGJlc2lkZSB0aGVcbiAgICogcmVhbCBmb2xkZXIgbWVhbnMgb3BlbmluZyBzdWNjZXNzZnVsbHkgYWdhaW5zdCB0aGUgd3Jvbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGRvdCwgbXVzdCBub3QgYmUgdGhlIGJhcmUgZG90LCBhbmQgbXVzdCBub3QgY29udGFpbiBhIHBhdGhcbiAgICogc2VwYXJhdG9yIFx1MjAxNCBhbnl0aGluZyBlbHNlIHRocm93cyBiZWZvcmUgT2JzaWRpYW4gbGF1bmNoZXMsIHNpbmNlIE9ic2lkaWFuXG4gICAqIHdvdWxkIHNpbGVudGx5IHN1YnN0aXR1dGUgYC5vYnNpZGlhbmAuIEFmdGVyIHRoZSB2YXVsdCBvcGVucywgaXRzIGFjdHVhbFxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgaXMgcmVhZCBiYWNrIGFuZCBhIG1pc21hdGNoIHRocm93c1xuICAgKiBgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcmAuXG4gICAqXG4gICAqIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnBvcnR9IHNldCksIHdoZXJlIHRoZVxuICAgKiB2YXVsdCBpcyBvcGVuZWQgYnkgdGhlIHVzZXIncyBvd24gT2JzaWRpYW4gdW5kZXIgaXRzIG93biBjb25maWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSBcdTIwMTQgdGhlIHJlbmRlcmVyIGxvYWRlZCBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWQgKGVtcHR5XG4gICAqIGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3QgcnVuIG9uXG4gICAqIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSBpdCBoYXMgaGVsZCB0aGlzIGxvbmcgYVxuICAgKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAgaXMgdGhyb3duIGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGxcbiAgICogcmVhZGluZXNzIHRpbWVvdXQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvXG4gICAqIGRpc2FibGUgZmFzdC1mYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBPYnNpZGlhbiB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldFxuICAgKiBgZmFsc2VgIHRvIGxhdW5jaCBpdCBvZmYtc2NyZWVuLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIEVsZWN0cm9uIHNoZWxsIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLiBBY2NlcHRzXG4gICAqIGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuIElnbm9yZWQgd2hlblxuICAgKiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuIFdoZW4gb21pdHRlZCwgdGhlIGluc3RhbGxlZCBzaGVsbCBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBPYnNpZGlhbiBhcHAgdmVyc2lvbiAoYXNhcikgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgb2YgYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIHRvICoqYXR0YWNoKiogdG8uIFdoZW4gb21pdHRlZCwgYW5cbiAgICogaXNvbGF0ZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gYW4gYXV0b21hdGljYWxseSBjaG9zZW4gZnJlZSBwb3J0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZCBzZXR1aWRcbiAgICogYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gaW5zdGFsbGVyLWV4dHJhY3RlZCBwb3J0YWJsZSBzaGVsbCwgb3IgQ0lcbiAgICogcnVubmluZyBhcyBhIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBJZ25vcmVkIGluIGF0dGFjaFxuICAgKiBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGUgdmF1bHQgZGlyZWN0b3J5IG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmRpc3Bvc2V9LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIGB0cnVlYCBmb3IgYW4gaW1wbGljaXQgdGhyb3ctYXdheSB0ZW1wIHZhdWx0XG4gICAqICh7QGxpbmsgdmF1bHR9IG5vdCBnaXZlbikgYW5kIGBmYWxzZWAgd2hlbiBhIHtAbGluayB2YXVsdH0gcGF0aCBpcyBnaXZlbiwgc29cbiAgICogYSByZWFsIHZhdWx0IGlzIG5ldmVyIGRlbGV0ZWQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24gYmVmb3JlIGFueXRoaW5nIGlzXG4gICAqIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoIFx1MjAxNCB3aGVyZVxuICAgKiB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbCBzdGlsbCBjYXRjaGVzIHRoZSBibGFjay1zY3JlZW4gYm9vdCwgYW5kIHRoZVxuICAgKiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IGlzIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9XG4gICAqIHJhdGhlciB0aGFuIHRocm93bi4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqIGZhaWxzIGZhc3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IHNpbGVudGx5IHJldmVydCB0byB0aGUgaW5zdGFsbGVyJ3Mgb3duIGJ1bmRsZWQgYXNhciBhbmQgcnVuIHRoZSAqKndyb25nXG4gICAqIChvbGRlcikqKiB2ZXJzaW9uIGJlaGluZCBhIGhlYWx0aHkgVUkuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBydW5uaW5nXG4gICAqIGFwcCB2ZXJzaW9uIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIHBpbiBwb3N0LWJvb3QgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2hcbiAgICogaXMgdGhlbiBzdXJmYWNlZCBvbiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5hc2FyRmFsbGJhY2t9IHJhdGhlciB0aGFuIHRocm93bi5cbiAgICogSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgYW5kIHdoZW4gbm8gYXNhciBpcyBzd2FwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyBib3RoIHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZy4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzc1xuICAgKiBsb2c7IHNldCBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBzdXJmYWNlZCBvblxuICAgKiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5jb21wYXRpYmlsaXR5fSAvIHtAbGluayBDZHBDb25uZWN0aW9uLmVsZWN0cm9uQ29tcGF0aWJpbGl0eX0sXG4gICAqIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBhbiBleGlzdGluZyB2YXVsdCB0byBvcGVuLiBXaGVuIG9taXR0ZWQsIGFuIGVtcHR5IHRlbXBvcmFyeVxuICAgKiB2YXVsdCBpcyBjcmVhdGVkIChhbmQgcmVtb3ZlZCBvbiBkaXNwb3NlIHVubGVzc1xuICAgKiB7QGxpbmsgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9IHNheXMgb3RoZXJ3aXNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZWQgQ0RQIGhvc3QvcG9ydCBwYWlyLlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRFbmRwb2ludCB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZSwgb3BlbnMgYSB2YXVsdCwgYW5kXG4gKiBib290c3RyYXBzIHRoZSBydW50aW1lIGhlbHBlciBuYW1lc3BhY2UsIHJldHVybmluZyBhIGRpc3Bvc2FibGUgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxpdmUge0BsaW5rIENkcENvbm5lY3Rpb259LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFRvQ2RwKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogUHJvbWlzZTxDZHBDb25uZWN0aW9uPiB7XG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBidWlsZENkcFRyYW5zcG9ydE9wdGlvbnMob3B0aW9ucyk7XG4gIGF3YWl0IHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3Qgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPSBvcHRpb25zPy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSA/PyAob3B0aW9ucz8udmF1bHQgPT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHZhdWx0ID0gbmV3IFRlbXBvcmFyeVZhdWx0KG9wdGlvbnM/LnZhdWx0LCB7IHNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZTogc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgfSk7XG5cbiAgLy8gVGhlIGhlYWRsZXNzIGRlZmF1bHRzIGdvIG9ubHkgaW50byBhIHZhdWx0IHRoZSBoYXJuZXNzIG1hZGUgXHUyMDE0IHRoZSBzYW1lXG4gIC8vIGBvcHRpb25zLnZhdWx0ID09PSB1bmRlZmluZWRgIGRpc2NyaW1pbmF0b3IgdGhlIGRpc3Bvc2FsIGFib3ZlIHR1cm5zIG9uLiBBXG4gIC8vIENhbGxlci1zdXBwbGllZCB2YXVsdCBpcyBhIHJlYWwgb25lIHRoZSB1c2VyIGtlZXBzLCBhbmQgYSBkZWJ1Z2dpbmcgc2Vzc2lvblxuICAvLyBIYXMgbm8gYnVzaW5lc3MgcmV3cml0aW5nIGl0cyBzZXR0aW5ncy5cbiAgaWYgKG9wdGlvbnM/LnZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnKHtcbiAgICAgIGNvbmZpZ0RpcmVjdG9yeTogcmVzb2x2ZU93bmVkQ29uZmlnRGlyZWN0b3J5KHRyYW5zcG9ydE9wdGlvbnMpLFxuICAgICAgbGFiZWw6IHRyYW5zcG9ydE9wdGlvbnMudHlwZSxcbiAgICAgIHZhdWx0UGF0aDogdmF1bHQucGF0aFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVnaXN0ZXJpbmcgdGhlIHZhdWx0IGlzIHdoYXQgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIChwcm92aXNpb25zIHRoZVxuICAvLyBBc2FyLCBvcGVucyB0aGUgdmF1bHQsIGFuZCBib290c3RyYXBzIHRoZSBoZWxwZXIgbmFtZXNwYWNlKSwgb3Igb3BlbnMgdGhlXG4gIC8vIFZhdWx0IGluIHRoZSBhdHRhY2hlZCBpbnN0YW5jZS5cbiAgYXdhaXQgdmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcblxuICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQsIG9wdGlvbnMpO1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtTdHJpbmcocG9ydCl9YDtcbiAgY29uc3QgYXNhckZhbGxiYWNrID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRBc2FyRmFsbGJhY2soKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0Q29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBlbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb246IENkcENvbm5lY3Rpb24gPSB7XG4gICAgY2RwVXJsLFxuICAgIC4uLihhc2FyRmFsbGJhY2sgJiYgeyBhc2FyRmFsbGJhY2sgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIC4uLihlbGVjdHJvbkNvbXBhdGliaWxpdHkgJiYgeyBlbGVjdHJvbkNvbXBhdGliaWxpdHkgfSksXG5cbiAgICBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChwYXJhbXM/OiBFeGNlcHQ8Q2FwdHVyZVNjcmVlbnNob3RQYXJhbXMsICdjd2QnPik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgLy8gRXZlcnkgdHJhbnNwb3J0IGBjb25uZWN0VG9DZHBgIGJ1aWxkcyBpcyBhIERlc2t0b3BDZHBUcmFuc3BvcnQsIHdoaWNoXG4gICAgICAvLyBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBtZXRob2QgXHUyMDE0IGJ1dCB0aGUgaW50ZXJmYWNlIHN0aWxsIHR5cGVzIGl0XG4gICAgICAvLyBPcHRpb25hbCwgc28gdGhlIGFic2VuY2UgaXMgcmVwb3J0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgdGhyb3duIGF0LlxuICAgICAgaWYgKCF0cmFuc3BvcnQuY2FwdHVyZVNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IHRoaXMgdHJhbnNwb3J0IGNhbm5vdCBjYXB0dXJlIHNjcmVlbnNob3RzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNwb3J0LmNhcHR1cmVTY3JlZW5zaG90KHsgLi4ucGFyYW1zLCBjd2Q6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgdmF1bHQgY2FycmllcyBgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2VgIGl0c2VsZiAoaGFuZGVkIHRvIGl0cyBjb25zdHJ1Y3RvciBhYm92ZSksIHNvXG4gICAgICAgIC8vIFRoaXMgaXMgb25lIGNhbGwgcmF0aGVyIHRoYW4gYSBicmFuY2g6IGl0IGFsd2F5cyB1bnJlZ2lzdGVycywgYW5kIHJlbW92ZXMgdGhlIGRpcmVjdG9yeSBvbmx5XG4gICAgICAgIC8vIFdoZW4gdGhhdCBmbGFnIHNheXMgdG8uXG4gICAgICAgIGF3YWl0IHZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48SW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICAgICAgcGFyYW1zOiBFeGNlcHQ8RXZhbEluT2JzaWRpYW5QYXJhbXM8SW5wdXQsIFJlc3VsdCwgVENvbnRleHRJZD4sICd0cmFuc3BvcnQnIHwgJ3ZhdWx0UGF0aCc+XG4gICAgKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgIHJldHVybiBldmFsSW5PYnNpZGlhbjxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9uc30gZm9yIGEgY29ubmVjdGlvbiwgdGhyZWFkaW5nIG9ubHlcbiAqIHRoZSBwcm92aWRlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9uc30gdGhyb3VnaCAob3duZWQtdmlzaWJsZSBkZWZhdWx0cyB0b1xuICogYHRydWVgLCB1bmxpa2UgdGhlIGhpZGRlbi1ieS1kZWZhdWx0IHRlc3QgdHJhbnNwb3J0cykuIFVuc2V0IGtub2JzIHBhc3MgdGhyb3VnaFxuICogYXMgYHVuZGVmaW5lZGAgYW5kIGFyZSByZWFkIHdpdGggYD8/IGRlZmF1bHRgIC8gYCE9PSB1bmRlZmluZWRgIGd1YXJkc1xuICogZG93bnN0cmVhbSwgc28gYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhYnNlbnQga2V5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24ncyB0cmFuc3BvcnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnM+KHtcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGNvbmZpZ0RpcmVjdG9yeTogb3B0aW9ucz8uY29uZmlnRGlyZWN0b3J5LFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzLFxuICAgIGhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlID8/IHRydWUsXG4gICAgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24sXG4gICAgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhblZlcnNpb24sXG4gICAgcG9ydDogb3B0aW9ucz8ucG9ydCxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogb3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcixcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIENEUCBob3N0L3BvcnQgZm9yIHRoZSBjb25uZWN0aW9uOiBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzXG4gKiBsYXVuY2hlZCBlbmRwb2ludCB3aGVuIHByZXNlbnQsIG90aGVyd2lzZSBmcm9tIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaG9zdCBhbmQgcG9ydC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvcnQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQ6IHVua25vd24sIG9wdGlvbnM6IENvbm5lY3RUb0NkcE9wdGlvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaWYgKHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRyYW5zcG9ydC5nZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTtcbiAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGhvc3Q6IGVuZHBvaW50Lmhvc3QsIHBvcnQ6IGVuZHBvaW50LnBvcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogb3B0aW9ucy5ob3N0ID8/IERFRkFVTFRfQ0RQX0hPU1QsIHBvcnQ6IG9wdGlvbnMucG9ydCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIENEUCBwb3J0LicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQsIGJlZm9yZSB0aGlzXG4gKiBjb25uZWN0aW9uIGFkZHMgaXRzIG93bi5cbiAqXG4gKiBgY29ubmVjdFRvQ2RwYCBtaW50cyB0aGUgc2FtZSBgdGVtcC12YXVsdC0qYCAvIG93bmVkIGB1c2VyZGF0YS0qYCBkaXJlY3Rvcmllc1xuICogdGhlIHRlc3QgZ2xvYmFsIHNldHVwIGRvZXMsIGFuZCBhbiBhZC1ob2MgZGVidWdnaW5nIHNlc3Npb24gaXMgZXhhY3RseSB0aGVcbiAqIGtpbmQgdGhhdCBnZXRzIGtpbGxlZCB3aXRoIGEgbGVmdG92ZXIgYmVoaW5kIFx1MjAxNCBzbyBpdCBzd2VlcHMgdG9vLiBBZ2UtZ2F0ZWQgYW5kXG4gKiBiZXN0LWVmZm9ydDsgc2VlIHRoZSBjb3JlJ3MgYHN3ZWVwTGVmdG92ZXJzYC5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXdpbGxTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIG1heEFnZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID4gMCB8fCByZXN1bHQuZmFpbGVkQ291bnQgPiAwKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbY29ubmVjdC10by1jZHBdIFN3ZXB0ICR7U3RyaW5nKHJlc3VsdC5yZW1vdmVkQ291bnQpfSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yKGllcykgZnJvbSBlYXJsaWVyIHJ1bnMgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhyZXN1bHQuZmFpbGVkQ291bnQpfSBzdGlsbCBpbiB1c2UpLmBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2Nvbm5lY3QtdG8tY2RwXSBMZWZ0b3ZlciBzd2VlcCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAi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
@@ -120,6 +120,25 @@ export interface ConnectToCdpOptions {
120
120
  * @default `30000`
121
121
  */
122
122
  readonly commandTimeoutInMilliseconds?: number;
123
+ /**
124
+ * The vault's **config folder** — Obsidian's per-vault *Override config
125
+ * folder* setting, e.g. `'.obsidian-desktop'`. Set it to open a vault that
126
+ * keeps its settings somewhere other than `.obsidian`; without it such a vault
127
+ * opens against `.obsidian`, which for a vault that has a stale one beside the
128
+ * real folder means opening successfully against the wrong settings.
129
+ *
130
+ * Must start with a dot, must not be the bare dot, and must not contain a path
131
+ * separator — anything else throws before Obsidian launches, since Obsidian
132
+ * would silently substitute `.obsidian`. After the vault opens, its actual
133
+ * `app.vault.configDir` is read back and a mismatch throws
134
+ * `ConfigDirectoryFallbackError`.
135
+ *
136
+ * Ignored in attach mode ({@link ConnectToCdpOptions.port} set), where the
137
+ * vault is opened by the user's own Obsidian under its own config.
138
+ *
139
+ * @default `undefined` (Obsidian's own default, `.obsidian`)
140
+ */
141
+ readonly configDirectory?: string;
123
142
  /**
124
143
  * Grace window in milliseconds for fast-failing a dead boot of the owned
125
144
  * instance — the renderer loaded but the app never bootstrapped (empty