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
@@ -19,7 +19,16 @@ export declare function createTransportFromOptions(options?: ObsidianTransportOp
19
19
  * The transport is cached per worker process so WebSocket/Appium sessions
20
20
  * are reused across calls within the same test worker.
21
21
  *
22
- * @param options - Transport configuration. Defaults to CLI transport.
22
+ * This is the single entry point every worker-side caller uses for the **ambient**
23
+ * transport, so it is also where a failed global setup is turned into a failing test.
24
+ * A failed setup publishes no transport options, and `undefined` options mean the owned
25
+ * **desktop** CDP default — so without this guard an Android project's suite would run
26
+ * on desktop and then die on an unrelated CDP error, hiding the real cause (**L9**).
27
+ * The setup path itself is unaffected: `coreSetup` builds its transport through
28
+ * {@link createTransportFromOptions} with explicit options.
29
+ *
30
+ * @param options - Transport configuration. Defaults to an owned desktop CDP transport.
23
31
  * @returns The cached or newly created transport.
32
+ * @throws {IntegrationSetupFailedError} When this project's global setup failed.
24
33
  */
25
34
  export declare function getOrCreateTransport(options?: ObsidianTransportOptions): Promise<ObsidianTransport>;
@@ -18,14 +18,22 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var transport_options_exports = {};
20
20
  __export(transport_options_exports, {
21
- checkIsMobileTransport: () => checkIsMobileTransport
21
+ checkIsMobileTransport: () => checkIsMobileTransport,
22
+ resolveOwnedConfigDirectory: () => resolveOwnedConfigDirectory
22
23
  });
23
24
  module.exports = __toCommonJS(transport_options_exports);
24
25
  function checkIsMobileTransport(options) {
25
26
  return options.type === "obsidian-android-appium";
26
27
  }
28
+ function resolveOwnedConfigDirectory(options) {
29
+ if (options.type !== "obsidian-cdp" || options.port !== void 0) {
30
+ return void 0;
31
+ }
32
+ return options.configDirectory;
33
+ }
27
34
  // Annotate the CommonJS export names for ESM import in node:
28
35
  0 && (module.exports = {
29
- checkIsMobileTransport
36
+ checkIsMobileTransport,
37
+ resolveOwnedConfigDirectory
30
38
  });
31
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIEFWRCAoQW5kcm9pZCBWaXJ0dWFsIERldmljZSkgbmFtZS5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBmYWN0b3J5IGxhdW5jaGVzIGBlbXVsYXRvciAtYXZkIDxhdmROYW1lPmAgYXMgYSBiYWNrZ3JvdW5kXG4gICAqIHByb2Nlc3MgYW5kIHBvbGxzIHVudGlsIHRoZSBkZXZpY2UgYXBwZWFycy4gVGhlIGVtdWxhdG9yIGlzIGtpbGxlZFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIFJ1biBgZW11bGF0b3IgLWxpc3QtYXZkc2AgdG8gc2VlIGF2YWlsYWJsZSBBVkQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCB0byByZXVzZSAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLiBXaGVuIHByZXNlbnQgYWxvbmdzaWRlIHtAbGluayBzZXNzaW9uSWR9LCB0aGUgdHJhbnNwb3J0XG4gICAqIGZhY3Rvcnkgc2tpcHMgZW11bGF0b3Igc3RhcnR1cCBhbmQgYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLCBmb3IgYVxuICAgKiBoYXJuZXNzLXN0YXJ0ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC4gT25seSBhcHBsaWVzXG4gICAqIHRvIGEgaGFybmVzcy1zdGFydGVkIGVtdWxhdG9yLCBub3QgYSByZXVzZWQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93bi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIHByb2Nlc3MgaXMgc3Bhd25lZCB3aXRoXG4gICAqIGl0cyBjb25zb2xlIHdpbmRvdyBoaWRkZW4gKGB3aW5kb3dzSGlkZWApIGFuZCBpdHMgb3V0cHV0IGRpc2NhcmRlZCwgc28gaXRcbiAgICogbmVpdGhlciBzdGVhbHMgZm9jdXMgbm9yIHdyaXRlcyB0byB0aGUgaW52b2tpbmcgdGVybWluYWwuIElnbm9yZWQgd2hlblxuICAgKiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIEFwcGl1bSBzZXJ2ZXIgKHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19XG4gICAqIGBmYWxzZWAsIG9yIHRoZSBzZXJ2ZXIgYWxyZWFkeSByZWFjaGFibGUpLiBTZXQgYHRydWVgIHRvIHNlZSB0aGUgc2VydmVyIGxvZyB3aW5kb3dcbiAgICogYW5kIGl0cyBsaXZlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBbmRyb2lkIGVtdWxhdG9yIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgZW11bGF0b3IgaXMgc3RhcnRlZCB3aXRoIGAtbm8td2luZG93YFxuICAgKiAoaGVhZGxlc3MpLCBzbyBpdCBuZXZlciBzdGVhbHMgZm9jdXMuIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZ1xuICAgKiBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQgdG8gaGlkZSkuIFNldCBgdHJ1ZWAgdG8gd2F0Y2ggdGhlIGVtdWxhdG9yIFVJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgYWZ0ZXJcbiAgICogdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQuXG4gICAqXG4gICAqIFJlZ2lzdGVyaW5nIGEgdmF1bHQgdHJpZ2dlcnMgYSBmdWxsIE9ic2lkaWFuIHJlLWluaXQgKGBsb2NhdGlvbi5yZWxvYWQoKWBcbiAgICogcmVvcGVucyB0aGUgdmF1bHQgYW5kIHJlbG9hZHMgZXZlcnkgcGx1Z2luIFx1MjAxNCB0aGUgaGVhdmllc3Qgc3RhcnR1cCBzdGVwKS4gT25cbiAgICogYSBjb2xkLWJvb3RlZCBvciB1bmRlci1wcm92aXNpb25lZCBlbXVsYXRvciB0aGF0IGluaXQgY2FuIHRha2UgYSB3aGlsZSwgc29cbiAgICogdGhpcyBidWRnZXQgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHRyYW5zcG9ydCB0aW1lb3V0cy4gUmFpc2UgaXQgZnVydGhlciBpZlxuICAgKiByZWxlYXNlcyBzdGlsbCBmbGFrZSBvbiBzbG93IENJIGVtdWxhdG9ycy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciAqKmhvc3QqKiBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmVcbiAgICoge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfSByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBHb3Zlcm5zIHRoZSBob3N0LXNpZGUgc3dlZXAgb25seSAodGhlIGB0ZW1wLXZhdWx0LSpgIHN0YWdpbmcgZGlyZWN0b3JpZXNcbiAgICogdGhpcyBydW4ncyBtYWNoaW5lIGFjY3VtdWxhdGVzIGluIGl0cyB0ZW1wIGRpcikuIFRoZSAqKmRldmljZSoqIHN3ZWVwIGlzXG4gICAqIHVuY29uZGl0aW9uYWw6IEFuZHJvaWQgcnVucyBob2xkIHRoZSBleGNsdXNpdmUgYGFuZHJvaWRgIHNldHVwIGxvY2ssIHNvIG5vXG4gICAqIGNvbmN1cnJlbnQgcnVuIGNhbiBvd24gYSBkZXZpY2UgdmF1bHQsIGFuZCBhbiBhZ2UgZ2F0ZSB0aGVyZSB3b3VsZCBsZXQgYVxuICAgKiB2YXVsdCBsZWFrZWQgbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1biBcdTIwMTQgd2hpY2ggaXMgdGhlIGZhaWx1cmVcbiAgICogbG9vcCB0aGUgc3dlZXAgZXhpc3RzIHRvIGJyZWFrLiBTZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBob3N0IG1hdGNoIHRvby5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaGFybmVzcyByZW1vdmVzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgZWFjaCBydW4gc3dlZXBzIGF0IHN0YXJ0ICoqYW5kKiogYXQgZW5kOiBvbiB0aGVcbiAgICogZGV2aWNlLCBldmVyeSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcnkgdW5kZXIge0BsaW5rIHZhdWx0QmFzZVBhdGh9IChwbHVzIHRoZVxuICAgKiBzdGFsZSB2YXVsdCByZWdpc3RyYXRpb25zIGluIE9ic2lkaWFuIE1vYmlsZSdzIGBsb2NhbFN0b3JhZ2VgKTsgb24gdGhlIGhvc3QsXG4gICAqIHRoZSBsZWZ0b3ZlciBgdGVtcC12YXVsdC0qYCBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGRpcmVjdG9yaWVzIG9sZGVyIHRoYW5cbiAgICoge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LlxuICAgKlxuICAgKiBBIHJ1biB0aGF0IGRpZXMgY2Fubm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiBcdTIwMTQgaXRzIHRlYXJkb3duIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogV2ViVmlldywgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIHdoYXQgbW9zdCBBbmRyb2lkIGZhaWx1cmVzIGFyZSBcdTIwMTQgc28gdGhlXG4gICAqIHJlc2lkdWUgYWNjdW11bGF0ZXMgYW5kIHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXAgZW51bWVyYXRpb24gdW50aWwgaXRcbiAgICogbWlzc2VzIHRoZSBXZWJWaWV3LXJlYWRpbmVzcyBidWRnZXQuIFRoZSBzdGFydCBzd2VlcCBpcyB0aGUgaGFsZiB0aGF0IGJyZWFrc1xuICAgKiB0aGF0IGxvb3AsIGJlY2F1c2UgaXQgcnVucyBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZGllLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogT24gc2xvdyBlbXVsYXRvcnMsIHRoZSBDaHJvbWVEcml2ZXIgcHJveHkgdGhhdCBoYW5kbGVzIFdlYlZpZXcgY29tbWFuZHNcbiAgICogbWF5IG5vdCBiZSByZWFkeSBpbW1lZGlhdGVseSBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gc3RhcnRzLiBUaGlzIHRpbWVvdXRcbiAgICogY29udHJvbHMgaG93IGxvbmcgdG8gcG9sbCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBkZXNrdG9wIHRlc3RpbmcgdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHRoZSBoYXJuZXNzICoqbGF1bmNoZXMgYW5kXG4gKiBvd25zIGFuIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlKiogaW4gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciAobmV2ZXJcbiAqIHRvdWNoaW5nIHRoZSB1c2VyJ3MgT2JzaWRpYW4pLCBjb25uZWN0ZWQgb3ZlciBhIGZyZWUgQ0RQIHBvcnQuIFByb3ZpZGVcbiAqIHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH0gdG8gaW5zdGVhZCBhdHRhY2ggdG8gYW5cbiAqIGFscmVhZHktcnVubmluZyBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byAzMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBUaGUgZ2F0ZSBtYXR0ZXJzIG1vc3Qgb24gZGVza3RvcDogcnVucyBhcmUgZGVsaWJlcmF0ZWx5ICoqbm90Kiogc2VyaWFsaXplZFxuICAgKiAoZWFjaCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSwgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzXG4gICAqIG9uZSB0ZW1wIGRpcmVjdG9yeSwgc28gYSB5b3VuZyBgdGVtcC12YXVsdC0qYCAvIGB1c2VyZGF0YS0qYCBkaXJlY3RvcnkgbWF5XG4gICAqIHdlbGwgYmVsb25nIHRvIGEgcnVuIHRoYXQgaXMgc3RpbGwgaW4gZmxpZ2h0LiBSYWlzZSBpdCBpZiBhIHJ1biBvZiB5b3VycyBjYW5cbiAgICogb3V0bGl2ZSB0aGUgZGVmYXVsdDsgc2V0IGAwYCB0byByZW1vdmUgZXZlcnkgbWF0Y2ggcmVnYXJkbGVzcyBvZiBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipFbGVjdHJvbiBzaGVsbCoqIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFRoZSBtYXRjaGluZyBHaXRIdWIgcmVsZWFzZSBpbnN0YWxsZXIgaXMgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRvIGFcbiAgICogcG9ydGFibGUgc2hlbGwgKGNhY2hlZCBmb3IgcmV1c2UpLiBQdWJsaWMgcmVsZWFzZXMgb25seSBcdTIwMTQgY2F0YWx5c3QgYnVpbGRzXG4gICAqIGhhdmUgbm8gcHVibGljIGluc3RhbGxlci4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipPYnNpZGlhbiBhcHAgdmVyc2lvbioqIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBWZXJzaW9ucyBhdCBvciBhYm92ZSB0aGUgc2hlbGwgdmVyc2lvbiBhcmUgYXBwbGllZCBhcyBhIGNoZWFwIGFzYXIgc3dhcDtcbiAgICogb2xkZXIgdmVyc2lvbnMgdHJhbnNwYXJlbnRseSB1c2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgdXNlcidzIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9XG4gICAqIChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0byAodGhlXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgaXQgd2FzIGxhdW5jaGVkIHdpdGgpLiBXaGVuIHNldCwgdGhlIGhhcm5lc3NcbiAgICogYXR0YWNoZXMgaW5zdGVhZCBvZiBvd25pbmcgYW4gaW5zdGFuY2UsIGFuZCB0aGUgdmVyc2lvbiBrbm9icyBhcmUgaWdub3JlZC5cbiAgICogV2hlbiBvbWl0dGVkLCBhbiBvd25lZCBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5XG4gICAqIGNob3NlbiBmcmVlIHBvcnQgKG5vIHBvcnQgaXMgaGFyZGNvZGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGF1bmNoIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoIENocm9taXVtJ3Mgc2FuZGJveCBkaXNhYmxlZFxuICAgKiAoYC0tbm8tc2FuZGJveGApLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gYm9vdCBhbiBvd25lZCBpbnN0YW5jZSBvbiBMaW51eCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciBcdTIwMTQgZS5nLiBhIHBvcnRhYmxlIHNoZWxsXG4gICAqIGV4dHJhY3RlZCBmcm9tIGFuIGluc3RhbGxlciwgb3IgYSBDSSBydW5uZXIgbGF1bmNoaW5nIGFzIGEgbm9uLXJvb3QgdXNlciwgaW5cbiAgICogd2hpY2ggY2FzZSB0aGUgcmVuZGVyZXIgb3RoZXJ3aXNlIHJlZnVzZXMgdG8gc3RhcnQuIEhhcm1sZXNzIG9uXG4gICAqIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSB1c2VyJ3MgcnVubmluZyBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgYW5kIGF0IGVuZCBmb3JcbiAgICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZyBkaXJlY3RvcmllcyBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGluc3RhbmNlIHByb2ZpbGVzXG4gICAqIG9sZGVyIHRoYW4ge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LiBBIHJ1biBraWxsZWQgbWlkLWZsaWdodFxuICAgKiBuZXZlciByZWFjaGVzIGl0cyBvd24gY2xlYW51cCwgc28gd2l0aG91dCB0aGlzIHRoZSB0ZW1wIGRpcmVjdG9yeSBncm93c1xuICAgKiB3aXRob3V0IGJvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhbiAqKnVucnVubmFibGUqKiBpbnN0YWxsZXJcdTIxOTRhcHAgdmVyc2lvbiBwYWlyIGZhaWxzIGZhc3QgYmVmb3JlIGxhdW5jaC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgKHRoZVxuICAgKiBvbGRlc3QgaW5zdGFsbGVyIHRoZSBhcHAncyBhc2FyIGNhbiBib290IG9uKSB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24sIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLiBTZXQgYGZhbHNlYCB0byBsZXQgdGhlIHBpbiBwcm9jZWVkIHRvIGxhdW5jaFxuICAgKiBpbnN0ZWFkIFx1MjAxNCB3aGVyZSB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbFxuICAgKiAoYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLCBzZWUge0BsaW5rIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kc30pXG4gICAqIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXNcbiAgICogc3VyZmFjZWQgYXMgZGF0YSByYXRoZXIgdGhhbiB0aHJvd24uIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdCBhZnRlciBib290LlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCB0b28gb2xkIGZvciBpdCwgdGhlIGluc3RhbmNlXG4gICAqIG1heSBub3QgZGVhZC1ib290IFx1MjAxNCBpdCBjYW4gc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZFxuICAgKiBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmcgKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWBcbiAgICogKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBhZ2FpbnN0IHRoZSBwaW5cbiAgICogcG9zdC1ib290IGFuZCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBvbiBhIG1pc21hdGNoLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBsZXQgdGhlIGJvb3QgcHJvY2VlZCBcdTIwMTQgdGhlIG1pc21hdGNoIGlzIHRoZW4gc3VyZmFjZWQgYXMgZGF0YSAodGhlIGZhbGxiYWNrXG4gICAqIHZlcmRpY3QpIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlIHJ1bm5pbmcgYVxuICAgKiBzd2FwcGVkLWluIGFzYXIgKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQsIGFuZCB3aGVuIG5vIGFzYXIgaXNcbiAgICogc3dhcHBlZCBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyAqKmJvdGgqKiBjb21wYXRpYmlsaXR5IG5hZ3M6IHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIChhXG4gICAqIHJ1bm5hYmxlIGluc3RhbGxlciBiZWxvdyB0aGUgcmVjb21tZW5kZWQgZmxvb3IpIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZyAoYSBsaXZlIEVsZWN0cm9uIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZFxuICAgKiBtaW5pbXVtKS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzcyBsb2c7IHNldFxuICAgKiBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBjb21wdXRlZCBhbmQgc3VyZmFjZWQgYXNcbiAgICogZGF0YSAoYGNvbXBhdGliaWxpdHlgIC8gYGVsZWN0cm9uQ29tcGF0aWJpbGl0eWApLCBvbmx5IHRoZSBsb2cgaXMgc3VwcHJlc3NlZC5cbiAgICogRG9lcyBub3QgYWZmZWN0IHRoZSBgJ3VucnVubmFibGUnYCB0aHJvdyAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSkuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZFxuICAgKiBpbnN0YW5jZSAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZXNlIG9wdGlvbnMgZGVzY3JpYmUgYSBtb2JpbGUgdHJhbnNwb3J0LlxuICpcbiAqIFRoZSBzYW1lIGZhY3QgYXMge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmlzTW9iaWxlfSwgYnV0IGtub3dhYmxlIGZyb20gdGhlIG9wdGlvbnMgYWxvbmUgXHUyMDE0IHNvIGEgY2FsbGVyXG4gKiBjYW4gYWN0IG9uIGl0IGJlZm9yZSBwYXlpbmcgZm9yIGEgZGV2aWNlLiBSZWFkaW5nIGl0IG9mZiBhIGxpdmUgdHJhbnNwb3J0IG1lYW5zIGJvb3RpbmcgdGhlIGVtdWxhdG9yXG4gKiBhbmQgdGhlIEFwcGl1bSBzZXNzaW9uIGZpcnN0LCB3aGljaCBpcyB+NzAgcyB0byBsZWFybiBzb21ldGhpbmcgdGhlIGRpc2NyaW1pbmFudCBhbHJlYWR5IHNheXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbW9iaWxlIHRyYW5zcG9ydCwgYGZhbHNlYCBmb3IgZGVza3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa2VPLFNBQVMsdUJBQXVCLFNBQTRDO0FBQ2pGLFNBQU8sUUFBUSxTQUFTO0FBQzFCOyIsCiAgIm5hbWVzIjogW10KfQo=
39
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBPYnNpZGlhbiBNb2JpbGUgdG8gZ2V0IGFzIGZhciBhcyBgZ2xvYmFsVGhpcy5hcHBgXG4gICAqIGV4aXN0aW5nIGFmdGVyIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBidWRnZXRzIHRoZSB0cmFuc3BvcnQgc3BlbmRzIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAuXG4gICAqIEl0IGNvdmVycyB0aGUgYXBwJ3Mgb3duIGNvbGQgc3RhcnQgXHUyMDE0IHRoZSBXZWJWaWV3IHJlbG9hZGluZyBhbmQgT2JzaWRpYW4nc1xuICAgKiBidW5kbGUgY29taW5nIHVwIFx1MjAxNCB3aGljaCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGd1ZXN0IGNhbiB0YWtlIG1pbnV0ZXMsIGFuZFxuICAgKiBpcyBub3Qgd29yayB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IHNob3VsZCBiZSBzaXplZCBmb3IuXG4gICAqIE9ubHkgb25jZSBgZ2xvYmFsVGhpcy5hcHBgIGFwcGVhcnMgZG9lcyB0aGF0IGZhciB0aWdodGVyIGNsb2NrIHN0YXJ0LlxuICAgKlxuICAgKiBTcGxpdHRpbmcgdGhlIHR3byBpcyB3aGF0IHN0b3BzIGEgZmlyc3QgcnVuIGFmdGVyIGEgbWFjaGluZSByZXN0YXJ0IGZyb21cbiAgICogZmFpbGluZyBieSBkZXNpZ246IHRoZSBvbGQgc2luZ2xlIDkwcyB3YWxsIGNsb2NrIHN0YXJ0ZWQgYXQgdGhlIHJlbG9hZCwgc28gYVxuICAgKiBjb2xkIGFwcCBzdGFydCBzcGVudCBpdCBiZWZvcmUgT2JzaWRpYW4gaGFkIGJlZ3VuIGxheWluZyBhbnl0aGluZyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFuZHJvaWQgQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBuYW1lLlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIHRvIHJldXNlIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gaXNcbiAgICogZXN0YWJsaXNoZWQuIFdoZW4gcHJlc2VudCBhbG9uZ3NpZGUge0BsaW5rIHNlc3Npb25JZH0sIHRoZSB0cmFuc3BvcnRcbiAgICogZmFjdG9yeSBza2lwcyBlbXVsYXRvciBzdGFydHVwIGFuZCBhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZywgYWZ0ZXIgYHN5cy5ib290X2NvbXBsZXRlZGAsIGZvciB0aGVcbiAgICogZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC5cbiAgICpcbiAgICogQXBwbGllcyB0byBhICoqcmV1c2VkKiogZGV2aWNlIGFzIHdlbGwgYXMgYSBoYXJuZXNzLXN0YXJ0ZWQgb25lLiBBIGRldmljZVxuICAgKiB0aGF0IGlzIG1lcmVseSBwcmVzZW50IGluIGBhZGIgZGV2aWNlc2AgY2FuIHN0aWxsIGJlIG1pZC1gZGV4Mm9hdGAsIGFuZFxuICAgKiBza2lwcGluZyB0aGUgZ2F0ZSB0aGVyZSBpcyB3aGF0IGxlZnQgYSBydW4gcG9sbGluZyBhIGNodXJuaW5nIGd1ZXN0IHVudGlsXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gcmFuIG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgYG5weCBhcHBpdW1gIHNlcnZlciBwcm9jZXNzIGlzIHNwYXduZWQgd2l0aFxuICAgKiBpdHMgY29uc29sZSB3aW5kb3cgaGlkZGVuIChgd2luZG93c0hpZGVgKSBhbmQgaXRzIG91dHB1dCBkaXNjYXJkZWQsIHNvIGl0XG4gICAqIG5laXRoZXIgc3RlYWxzIGZvY3VzIG5vciB3cml0ZXMgdG8gdGhlIGludm9raW5nIHRlcm1pbmFsLiBJZ25vcmVkIHdoZW5cbiAgICogYXR0YWNoaW5nIHRvIGFuIGFscmVhZHktcnVubmluZyBBcHBpdW0gc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfVxuICAgKiBgZmFsc2VgLCBvciB0aGUgc2VydmVyIGFscmVhZHkgcmVhY2hhYmxlKS4gU2V0IGB0cnVlYCB0byBzZWUgdGhlIHNlcnZlciBsb2cgd2luZG93XG4gICAqIGFuZCBpdHMgbGl2ZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90XG4gICAqIGZyb20gdGhlIHJlbG9hZC5cbiAgICpcbiAgICogVGhlIHNlY29uZCBvZiB0aGUgdHdvIGJ1ZGdldHMgdGhlIHRyYW5zcG9ydCBzcGVuZHMgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYC5cbiAgICogSXQgY292ZXJzIG9ubHkgT2JzaWRpYW4ncyBvd24gd29yayBcdTIwMTQgb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmcgZXZlcnlcbiAgICogcGx1Z2luIFx1MjAxNCBvbmNlIHRoZSBhcHAgaXRzZWxmIGlzIHVwLCB3aGljaCBpcyB3aHkgaXQgY2FuIHN0YXkgdGlnaHQ6IG1lYXN1cmVkXG4gICAqIGF0IH4xcywgYW5kIFx1MjI2NDguNHMgdW5kZXIgMTItY29yZSArIGRpc2sgKyBtZW1vcnkgc3RyZXNzLlxuICAgKlxuICAgKiBCbG93aW5nIGl0IHRoZXJlZm9yZSBtZWFucyBPYnNpZGlhbiBnZW51aW5lbHkgc3RhbGxlZCwgKipvcioqIHRoYXQgZWFjaCBwcm9iZVxuICAgKiByb3VuZC10cmlwIGlzIGJlaW5nIGluZmxhdGVkIGJ5IGEgYnVzeSBndWVzdC4gVGhlIHRpbWVvdXQgZXJyb3IgbmFtZXMgd2hpY2gsXG4gICAqIGJ5IHJlcG9ydGluZyB0aGUgcHJvYmUgY291bnQgYW5kIHNsb3dlc3Qgcm91bmQtdHJpcCBhbG9uZ3NpZGUgdGhlIGZ1cnRoZXN0XG4gICAqIHN0YXJ0dXAgbWlsZXN0b25lIHJlYWNoZWQ6IGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIGlzXG4gICAqIGEgY29udGVuZGVkIGd1ZXN0LCBhbmQgdGhlIGtub2IgZm9yIHRoYXQgaXNcbiAgICoge0BsaW5rIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LCBub3QgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgbGVmdG92ZXIgKipob3N0KiogZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlXG4gICAqIHtAbGluayBzaG91bGRTd2VlcExlZnRvdmVyc30gcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogR292ZXJucyB0aGUgaG9zdC1zaWRlIHN3ZWVwIG9ubHkgKHRoZSBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzXG4gICAqIHRoaXMgcnVuJ3MgbWFjaGluZSBhY2N1bXVsYXRlcyBpbiBpdHMgdGVtcCBkaXIpLiBUaGUgKipkZXZpY2UqKiBzd2VlcCBpc1xuICAgKiB1bmNvbmRpdGlvbmFsOiBBbmRyb2lkIHJ1bnMgaG9sZCB0aGUgZXhjbHVzaXZlIGBhbmRyb2lkYCBzZXR1cCBsb2NrLCBzbyBub1xuICAgKiBjb25jdXJyZW50IHJ1biBjYW4gb3duIGEgZGV2aWNlIHZhdWx0LCBhbmQgYW4gYWdlIGdhdGUgdGhlcmUgd291bGQgbGV0IGFcbiAgICogdmF1bHQgbGVha2VkIG1pbnV0ZXMgYWdvIHN1cnZpdmUgaW50byB0aGUgbmV4dCBydW4gXHUyMDE0IHdoaWNoIGlzIHRoZSBmYWlsdXJlXG4gICAqIGxvb3AgdGhlIHN3ZWVwIGV4aXN0cyB0byBicmVhay4gU2V0IGAwYCB0byByZW1vdmUgZXZlcnkgaG9zdCBtYXRjaCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIHRoZSBkZXZpY2UtaWRsZSBnYXRlLCBmb3IgdGhlXG4gICAqIGVtdWxhdG9yIHRvIHJlcG9ydCBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZSB0aGUgQXBwaXVtIHNlc3Npb25cbiAgICogaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEEgZGV2aWNlIGNhbiBiZSBpZGxlLCBmdWxseSBwYWNrYWdlZCBhbmQgYW5zd2VyaW5nIGBhZGJgIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAgKiBubyByb3V0ZTogdGhlIHR3byB7QGxpbmsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gc2lnbmFscyBhcmVcbiAgICogc2F0aXNmaWVkIHdlbGwgYmVmb3JlIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkLCB3aGljaFxuICAgKiBsYW5kcyB+ODBzIGludG8gZ3Vlc3QgdXB0aW1lLiBUaGF0IGdhcCBpcyBkYW5nZXJvdXMgcmF0aGVyIHRoYW4gbWVyZWx5IHNsb3dcbiAgICogXHUyMDE0IGEgdGVzdCB0aGF0IHJlYWNoZXMgdGhlIG5ldHdvcmsgdGhlcmUgcnVucyB0byBjb21wbGV0aW9uIGFnYWluc3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5IHJlc3VsdCoqLCB3aGljaCBubyBhc3NlcnRpb24gaW5zaWRlIHRoZSBzdWl0ZSBjYW4gdGVsbFxuICAgKiBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgZmFjdG9yeSBwb2xscyBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHVudGlsIGFuIGFjdGl2ZSBkZWZhdWx0IG5ldHdvcmtcbiAgICogcmVwb3J0cyB2YWxpZGF0aW9uLCBwcm9jZWVkaW5nIGVhcmx5IG9uY2UgaXQgZG9lcyBvciBhZnRlciB0aGlzIGJ1ZGdldFxuICAgKiAoYmVzdC1lZmZvcnQgXHUyMDE0IGEgdGltZW91dCBsb2dzIGEgd2FybmluZyBuYW1pbmcgdGhlIG1pc3NpbmcgbmV0d29yayBhbmRcbiAgICogcHJvY2VlZHMpLiBTZXQgYDBgIHRvIHNraXAgdGhlIHdhaXQsIGUuZy4gZm9yIGEgZGVsaWJlcmF0ZWx5IG9mZmxpbmUgQVZEIG9yXG4gICAqIGEgc3VpdGUgdGhhdCBuZXZlciB0b3VjaGVzIHRoZSBuZXR3b3JrLlxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGEgKipyZXVzZWQqKiBkZXZpY2UgYXMgd2VsbCBhcyBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUsIGZvciB0aGVcbiAgICogc2FtZSByZWFzb24gdGhlIGlkbGUgZ2F0ZSBkb2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgXHUyMDE0IGFuZCByZWZyZXNoIFx1MjAxNCB0aGUgQVZEJ3NcbiAgICogc2F2ZWQgYm9vdCBzbmFwc2hvdC5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aFxuICAgKiBgLW5vLXNuYXBzaG90LWxvYWQgLW5vLXNuYXBzaG90LXNhdmVgLCBzbyBldmVyeSBydW4gY29sZC1ib290cyBhIGd1ZXN0IHdob3NlXG4gICAqIHN0YXRlIG5vdGhpbmcgY2FycmllZCBvdmVyLiBUaGF0IGlzIHRoZSBoZXJtZXRpYyBkZWZhdWx0IGEgdGVzdCBoYXJuZXNzXG4gICAqIG93ZXMgaXRzIGNhbGxlcnMsIGFuZCBpdCBpcyBhbHNvIHRoZSBzYWZlIG9uZTogYSBzbmFwc2hvdCB0aGUgaGFybmVzcyBsb2Fkc1xuICAgKiBidXQgbmV2ZXIgd3JpdGVzIHJvdHMgdW5ub3RpY2VkLCBhbmQgdGhlIGZhaWx1cmUgaXQgZXZlbnR1YWxseSBwcm9kdWNlcyBcdTIwMTQgYVxuICAgKiBkZXZpY2UgdGhhdCBzZXJ2ZXMgYWRiLCBhY2NlcHRzIGEgc2Vzc2lvbiwgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhXG4gICAqIG1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gTWVhc3VyZWQgb24gb25lXG4gICAqIEFWRCBiYWNrIHRvIGJhY2ssIGEgcmVzdW1lZCBzbmFwc2hvdCBraWxsZWQgdGhlIGd1ZXN0IH45MHMgaW4gKmV2ZXJ5KiB0aW1lLFxuICAgKiB3aGlsZSB0aGUgc2FtZSBBVkQgY29sZC1ib290ZWQgaW4gNTBzIGFuZCBzdGF5ZWQgdXAuXG4gICAqXG4gICAqIFNldCBpdCB0byBgdHJ1ZWAgb24gYSAqKnBlcnNpc3RlbnQgcnVubmVyKiogd2hvc2UgQVZEIGlzIG5vdCBzaGFyZWQgd2l0aFxuICAgKiBhbnl0aGluZyBlbHNlOiB0aGUgZW11bGF0b3IgdGhlbiBib3RoIGxvYWRzIGFuZCBzYXZlcyBgZGVmYXVsdF9ib290YCwgc28gdGhlXG4gICAqIHNuYXBzaG90IGVhY2ggcnVuIHJlc3VtZXMgaXMgb25lIGEgcHJldmlvdXMgcnVuIHdyb3RlLCBhbmQgdGhlIH4xMTJzIGNvbGRcbiAgICogYm9vdCBpcyBsYXJnZWx5IGJvdWdodCBiYWNrLiBUaGUgdHJhZGUgaXMgdGVzdCBpc29sYXRpb24gXHUyMDE0IGEgZ3Vlc3QgdGhhdFxuICAgKiBjYXJyaWVzIHN0YXRlIGJldHdlZW4gcnVucyBcdTIwMTQgc28gaXQgaXMgb3B0LWluIHBlciBwcm9qZWN0LCBuZXZlciBhIGRlZmF1bHQuXG4gICAqIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZyBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgKiphbmQqKiBhdCBlbmQ6IG9uIHRoZVxuICAgKiBkZXZpY2UsIGV2ZXJ5IGB0ZW1wLXZhdWx0LSpgIGRpcmVjdG9yeSB1bmRlciB7QGxpbmsgdmF1bHRCYXNlUGF0aH0gKHBsdXMgdGhlXG4gICAqIHN0YWxlIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWApOyBvbiB0aGUgaG9zdCxcbiAgICogdGhlIGxlZnRvdmVyIGB0ZW1wLXZhdWx0LSpgIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgZGlyZWN0b3JpZXMgb2xkZXIgdGhhblxuICAgKiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uXG4gICAqXG4gICAqIEEgcnVuIHRoYXQgZGllcyBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIFx1MjAxNCBpdHMgdGVhcmRvd24gZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBXZWJWaWV3LCBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlIFx1MjAxNCBzbyB0aGVcbiAgICogcmVzaWR1ZSBhY2N1bXVsYXRlcyBhbmQgc2xvd3MgdGhlIG5leHQgcnVuJ3Mgc3RhcnR1cCBlbnVtZXJhdGlvbiB1bnRpbCBpdFxuICAgKiBtaXNzZXMgdGhlIFdlYlZpZXctcmVhZGluZXNzIGJ1ZGdldC4gVGhlIHN0YXJ0IHN3ZWVwIGlzIHRoZSBoYWxmIHRoYXQgYnJlYWtzXG4gICAqIHRoYXQgbG9vcCwgYmVjYXVzZSBpdCBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBPbiBzbG93IGVtdWxhdG9ycywgdGhlIENocm9tZURyaXZlciBwcm94eSB0aGF0IGhhbmRsZXMgV2ViVmlldyBjb21tYW5kc1xuICAgKiBtYXkgbm90IGJlIHJlYWR5IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBBcHBpdW0gc2Vzc2lvbiBzdGFydHMuIFRoaXMgdGltZW91dFxuICAgKiBjb250cm9scyBob3cgbG9uZyB0byBwb2xsIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IG9wdGlvbnMgZm9yIGRlc2t0b3AgdGVzdGluZyB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVza3RvcCB0cmFuc3BvcnQuIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgKipsYXVuY2hlcyBhbmRcbiAqIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UqKiBpbiBhIHRlbXBvcmFyeSB1c2VyLWRhdGEgZGlyIChuZXZlclxuICogdG91Y2hpbmcgdGhlIHVzZXIncyBPYnNpZGlhbiksIGNvbm5lY3RlZCBvdmVyIGEgZnJlZSBDRFAgcG9ydC4gUHJvdmlkZVxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5wb3J0fSB0byBpbnN0ZWFkIGF0dGFjaCB0byBhblxuICogYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqIERlZmF1bHRzIHRvIDMwMDAwXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyAqKmNvbmZpZyBmb2xkZXIqKiBcdTIwMTQgT2JzaWRpYW4ncyBwZXItdmF1bHQgKk92ZXJyaWRlIGNvbmZpZ1xuICAgKiBmb2xkZXIqIHNldHRpbmcsIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBNdXN0IHN0YXJ0IHdpdGggYSBkb3QsIG11c3Qgbm90XG4gICAqIGJlIHRoZSBiYXJlIGRvdCwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYSBwYXRoIHNlcGFyYXRvcjsgYW55dGhpbmcgZWxzZSB0aHJvd3NcbiAgICogYmVmb3JlIE9ic2lkaWFuIGlzIGxhdW5jaGVkLCBiZWNhdXNlIE9ic2lkaWFuIGl0c2VsZiB3b3VsZCBzaWxlbnRseVxuICAgKiBzdWJzdGl0dXRlIGAub2JzaWRpYW5gLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gb3BlbiBhIHZhdWx0IHRoYXQga2VlcHMgaXRzIHNldHRpbmdzIHNvbWV3aGVyZSBvdGhlciB0aGFuXG4gICAqIGAub2JzaWRpYW5gIFx1MjAxNCBhIHZhdWx0IHdpdGggYSBzdGFsZSBgLm9ic2lkaWFuYCBiZXNpZGUgdGhlIHJlYWwgZm9sZGVyIHdvdWxkXG4gICAqIG90aGVyd2lzZSBvcGVuIHN1Y2Nlc3NmdWxseSBhZ2FpbnN0IHRoZSB3cm9uZyBzZXR0aW5ncyBhbmQgcmVwb3J0IHN1Y2Nlc3MuXG4gICAqIFRoZSBvdmVycmlkZSBsaXZlcyBpbiBgbG9jYWxTdG9yYWdlYCwga2V5ZWQgYnkgdmF1bHQgaWQsIGFuZCBzbyBpcyBzY29wZWQgdG9cbiAgICogYSB1c2VyLWRhdGEgZGlyZWN0b3J5OiBhbiBvd25lZCBpbnN0YW5jZSBnZXRzIGEgZnJlc2ggdGVtcCBvbmUgYW5kIHRoZXJlZm9yZVxuICAgKiBpbmhlcml0cyBub3RoaW5nIGZyb20gdGhlIHVzZXIncyBPYnNpZGlhbiwgaG93ZXZlciB0aGF0IHZhdWx0IGlzIGNvbmZpZ3VyZWRcbiAgICogdGhlcmUuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgY29zdHMgb25lIGV4dHJhIGJvb3QgcGhhc2U6IHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCB0byB0aGVcbiAgICogc3RhcnRlciBzY3JlZW4sIHRoZSBvdmVycmlkZSBpcyB3cml0dGVuIGluIHRoYXQgcmVuZGVyZXIsIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogdGhlbiBvcGVuZWQgb3ZlciBJUEMuIEFmdGVyIHRoZSB2YXVsdCBpcyByZWFkeSBpdHMgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyByZWFkIGJhY2sgYW5kIGFueSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JgIFx1MjAxNCB0aGVyZSBpcyBubyBrbm9iIHRvIGRvd25ncmFkZSB0aGF0LCBiZWNhdXNlIGFcbiAgICogdmF1bHQgb3BlbmVkIGFnYWluc3QgdGhlIHdyb25nIGNvbmZpZyBmb2xkZXIgaXMgc2lsZW50bHkgdGhlIHdyb25nIHZhdWx0LlxuICAgKlxuICAgKiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTsgKippZ25vcmVkIGluIGF0dGFjaCBtb2RlKiogKHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH1cbiAgICogc2V0KSwgd2hlcmUgdGhlIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlciBpdHMgb3duXG4gICAqIGNvbmZpZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGAgKE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQsIGAub2JzaWRpYW5gKVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSAqKmRlYWQgYm9vdCoqIG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZS5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGNhbm5vdCBydW4gb24gdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsICh0aGUgaW5zdGFsbGVyXG4gICAqIHZlcnNpb24gaXMgdG9vIG9sZCBmb3IgdGhlIGFwcCB2ZXJzaW9uKSwgdGhlIHJlbmRlcmVyIGxvYWRzIGJ1dCBuZXZlclxuICAgKiBib290c3RyYXBzOiBgZG9jdW1lbnQuYm9keWAgc3RheXMgZW1wdHkgYW5kIGB3aW5kb3cuYXBwYCByZW1haW5zXG4gICAqIGB1bmRlZmluZWRgIFx1MjAxNCBhIGJsYWNrIHNjcmVlbi4gUmF0aGVyIHRoYW4gd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzXG4gICAqIHRpbWVvdXQsIHRoZSBvd25lZC12YXVsdCByZWFkaW5lc3MgcG9sbCBjb25jbHVkZXMgdGhlIGJvb3QgaXMgZGVhZCBvbmNlIHRoZVxuICAgKiByZW5kZXJlciBoYXMgYmVlbiBgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgIGZvciB0aGlzIGxvbmcgd2l0aCBub1xuICAgKiBgd2luZG93LmFwcGAgYW5kIGFuIGVtcHR5IGA8Ym9keT5gLCBhbmQgdGhyb3dzIGFcbiAgICogYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2VcbiAgICogKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvIGRpc2FibGUgZmFzdC1mYWlsIGFuZFxuICAgKiByZXN0b3JlIHRoZSBwbGFpbiB3YWl0LW91dC10aGUtcmVhZGluZXNzLXRpbWVvdXQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqIERlZmF1bHRzIHRvIGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1hcmtzIHtAbGluayBwb3J0fSBhcyB0aGUgQ0RQIHBvcnQgb2YgYSAqKmhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlKipcbiAgICogdGhhdCB0aGUgZ2xvYmFsIHNldHVwIGFscmVhZHkgbGF1bmNoZWQgYW5kIHByZXBhcmVkICh2YXVsdCByZWdpc3RlcmVkLFxuICAgKiBwbHVnaW4gZW5hYmxlZCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2VycyB2aWFcbiAgICogdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLiBXaGVuIHNldCxcbiAgICogdGhlIHdvcmtlciAqKmF0dGFjaGVzKiogdG8gdGhlIG93bmVkIGluc3RhbmNlIG9uIHtAbGluayBwb3J0fSBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyBpdHMgb3duLCBhbmQgc2tpcHMgdGhlIHVzZXItc2NvcGUgdmF1bHQtcmVnaXN0cmF0aW9uIHByZWZsaWdodCBcdTIwMTRcbiAgICogdGhlIG93bmVkIGluc3RhbmNlJ3MgdmF1bHQgbGl2ZXMgaW4gYW4gaXNvbGF0ZWQgdXNlci1kYXRhIGNvbmZpZywgbm90IHRoZVxuICAgKiB1c2VyLXNjb3BlIHJlZ2lzdHJ5LiBEbyBub3Qgc2V0IHRoaXMgbWFudWFsbHk7IGZvciBwbGFpbiBhdHRhY2ggbW9kZSB1c2VcbiAgICoge0BsaW5rIHBvcnR9IGFsb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIGRlc2t0b3AgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgLCB0aGUgaGFybmVzcyBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aFxuICAgKiBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZCBtb3ZlcyBpdHMgd2luZG93ICoqb2ZmLXNjcmVlbioqIG9uY2UgRWxlY3Ryb24nc1xuICAgKiByZW1vdGUgYnJpZGdlIGlzIGF2YWlsYWJsZSwgc28gdGhlIHJ1biBuZXZlciBzdGVhbHMgZm9jdXMgb3IgcG9wcyBhIHdpbmRvdyBpblxuICAgKiBmcm9udCBvZiB5b3UuIE9mZi1zY3JlZW4gKG5vdCBtaW5pbWl6ZWQpIGtlZXBzIHRoZSByZW5kZXJlciBsaXZlLCBzb1xuICAgKiBgc2V0VGltZW91dGAsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQgYmVoYXZlXG4gICAqIGlkZW50aWNhbGx5IHRvIGEgdmlzaWJsZSB3aW5kb3cuIERlZmF1bHRzIHRvIGB0cnVlYDsgaW50ZWdyYXRpb24gc2V0dXBcbiAgICogZXhwbGljaXRseSBwYXNzZXMgYGZhbHNlYCB0byBhdm9pZCBzdGVhbGluZyBmb2N1cy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZVxuICAgKiAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIG1vdmVzIHRoZSB1c2VyJ3Mgb3duIHJ1bm5pbmcgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSG93IG9sZCBhIGxlZnRvdmVyIGRpcmVjdG9yeSBtdXN0IGJlIGJlZm9yZSB7QGxpbmsgc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIFRoZSBnYXRlIG1hdHRlcnMgbW9zdCBvbiBkZXNrdG9wOiBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKipub3QqKiBzZXJpYWxpemVkXG4gICAqIChlYWNoIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UpLCBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXNcbiAgICogb25lIHRlbXAgZGlyZWN0b3J5LCBzbyBhIHlvdW5nIGB0ZW1wLXZhdWx0LSpgIC8gYHVzZXJkYXRhLSpgIGRpcmVjdG9yeSBtYXlcbiAgICogd2VsbCBiZWxvbmcgdG8gYSBydW4gdGhhdCBpcyBzdGlsbCBpbiBmbGlnaHQuIFJhaXNlIGl0IGlmIGEgcnVuIG9mIHlvdXJzIGNhblxuICAgKiBvdXRsaXZlIHRoZSBkZWZhdWx0OyBzZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBtYXRjaCByZWdhcmRsZXNzIG9mIGFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKkVsZWN0cm9uIHNoZWxsKiogKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuXG4gICAqXG4gICAqIEFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogVGhlIG1hdGNoaW5nIEdpdEh1YiByZWxlYXNlIGluc3RhbGxlciBpcyBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQgdG8gYVxuICAgKiBwb3J0YWJsZSBzaGVsbCAoY2FjaGVkIGZvciByZXVzZSkuIFB1YmxpYyByZWxlYXNlcyBvbmx5IFx1MjAxNCBjYXRhbHlzdCBidWlsZHNcbiAgICogaGF2ZSBubyBwdWJsaWMgaW5zdGFsbGVyLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKk9ic2lkaWFuIGFwcCB2ZXJzaW9uKiogKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFZlcnNpb25zIGF0IG9yIGFib3ZlIHRoZSBzaGVsbCB2ZXJzaW9uIGFyZSBhcHBsaWVkIGFzIGEgY2hlYXAgYXNhciBzd2FwO1xuICAgKiBvbGRlciB2ZXJzaW9ucyB0cmFuc3BhcmVudGx5IHVzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsLiBXaGVuIG9taXR0ZWQsXG4gICAqIHRoZSB1c2VyJ3MgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuIElnbm9yZWQgd2hlbiB7QGxpbmsgcG9ydH1cbiAgICogKGF0dGFjaCBtb2RlKSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvICh0aGVcbiAgICogYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBpdCB3YXMgbGF1bmNoZWQgd2l0aCkuIFdoZW4gc2V0LCB0aGUgaGFybmVzc1xuICAgKiBhdHRhY2hlcyBpbnN0ZWFkIG9mIG93bmluZyBhbiBpbnN0YW5jZSwgYW5kIHRoZSB2ZXJzaW9uIGtub2JzIGFyZSBpZ25vcmVkLlxuICAgKiBXaGVuIG9taXR0ZWQsIGFuIG93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHlcbiAgICogY2hvc2VuIGZyZWUgcG9ydCAobm8gcG9ydCBpcyBoYXJkY29kZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IGFuIG93bmVkIGluc3RhbmNlIG9uIExpbnV4IHdoZW4gdGhlcmUgaXMgbm9cbiAgICogY29ycmVjdGx5LWNvbmZpZ3VyZWQgc2V0dWlkIGBjaHJvbWUtc2FuZGJveGAgaGVscGVyIFx1MjAxNCBlLmcuIGEgcG9ydGFibGUgc2hlbGxcbiAgICogZXh0cmFjdGVkIGZyb20gYW4gaW5zdGFsbGVyLCBvciBhIENJIHJ1bm5lciBsYXVuY2hpbmcgYXMgYSBub24tcm9vdCB1c2VyLCBpblxuICAgKiB3aGljaCBjYXNlIHRoZSByZW5kZXJlciBvdGhlcndpc2UgcmVmdXNlcyB0byBzdGFydC4gSGFybWxlc3Mgb25cbiAgICogV2luZG93cy9tYWNPUy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHVzZXIncyBydW5uaW5nIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhhcm5lc3MgcmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQuXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGVhY2ggcnVuIHN3ZWVwcyBhdCBzdGFydCBhbmQgYXQgZW5kIGZvclxuICAgKiBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgaW5zdGFuY2UgcHJvZmlsZXNcbiAgICogb2xkZXIgdGhhbiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uIEEgcnVuIGtpbGxlZCBtaWQtZmxpZ2h0XG4gICAqIG5ldmVyIHJlYWNoZXMgaXRzIG93biBjbGVhbnVwLCBzbyB3aXRob3V0IHRoaXMgdGhlIHRlbXAgZGlyZWN0b3J5IGdyb3dzXG4gICAqIHdpdGhvdXQgYm91bmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciAodGhlXG4gICAqIG9sZGVzdCBpbnN0YWxsZXIgdGhlIGFwcCdzIGFzYXIgY2FuIGJvb3Qgb24pIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiwgYmVmb3JlIGFueXRoaW5nXG4gICAqIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoXG4gICAqIGluc3RlYWQgXHUyMDE0IHdoZXJlIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsXG4gICAqIChgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAsIHNlZSB7QGxpbmsgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzfSlcbiAgICogc3RpbGwgY2F0Y2hlcyB0aGUgYmxhY2stc2NyZWVuIGJvb3QsIGFuZCB0aGUgYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCBpc1xuICAgKiBzdXJmYWNlZCBhcyBkYXRhIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiBmYWlscyBmYXN0IGFmdGVyIGJvb3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IG5vdCBkZWFkLWJvb3QgXHUyMDE0IGl0IGNhbiBzaWxlbnRseSByZXZlcnQgdG8gdGhlIGluc3RhbGxlcidzIG93biBidW5kbGVkXG4gICAqIGFzYXIgYW5kIHJ1biB0aGUgKip3cm9uZyAob2xkZXIpKiogdmVyc2lvbiBiZWhpbmQgYSBoZWFsdGh5IFVJLiBXaGVuIGB0cnVlYFxuICAgKiAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFnYWluc3QgdGhlIHBpblxuICAgKiBwb3N0LWJvb3QgYW5kIHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgIG9uIGEgbWlzbWF0Y2guIFNldCBgZmFsc2VgIHRvXG4gICAqIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2ggaXMgdGhlbiBzdXJmYWNlZCBhcyBkYXRhICh0aGUgZmFsbGJhY2tcbiAgICogdmVyZGljdCkgcmF0aGVyIHRoYW4gdGhyb3duLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2UgcnVubmluZyBhXG4gICAqIHN3YXBwZWQtaW4gYXNhciAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCwgYW5kIHdoZW4gbm8gYXNhciBpc1xuICAgKiBzd2FwcGVkIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzICoqYm90aCoqIGNvbXBhdGliaWxpdHkgbmFnczogdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgKGFcbiAgICogcnVubmFibGUgaW5zdGFsbGVyIGJlbG93IHRoZSByZWNvbW1lbmRlZCBmbG9vcikgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nIChhIGxpdmUgRWxlY3Ryb24gYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkXG4gICAqIG1pbmltdW0pLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzIGxvZzsgc2V0XG4gICAqIGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCBhc1xuICAgKiBkYXRhIChgY29tcGF0aWJpbGl0eWAgLyBgZWxlY3Ryb25Db21wYXRpYmlsaXR5YCksIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIGAndW5ydW5uYWJsZSdgIHRocm93IChzZWVcbiAgICoge0BsaW5rIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KS4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkXG4gICAqIGluc3RhbmNlIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZWQgaW4gdml0ZXN0IGBlbnZpcm9ubWVudE9wdGlvbnMub2JzaWRpYW5UcmFuc3BvcnRgIHRvIHNlbGVjdCBhbmRcbiAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zID1cbiAgfCBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gIHwgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlc2Ugb3B0aW9ucyBkZXNjcmliZSBhIG1vYmlsZSB0cmFuc3BvcnQuXG4gKlxuICogVGhlIHNhbWUgZmFjdCBhcyB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuaXNNb2JpbGV9LCBidXQga25vd2FibGUgZnJvbSB0aGUgb3B0aW9ucyBhbG9uZSBcdTIwMTQgc28gYSBjYWxsZXJcbiAqIGNhbiBhY3Qgb24gaXQgYmVmb3JlIHBheWluZyBmb3IgYSBkZXZpY2UuIFJlYWRpbmcgaXQgb2ZmIGEgbGl2ZSB0cmFuc3BvcnQgbWVhbnMgYm9vdGluZyB0aGUgZW11bGF0b3JcbiAqIGFuZCB0aGUgQXBwaXVtIHNlc3Npb24gZmlyc3QsIHdoaWNoIGlzIH43MCBzIHRvIGxlYXJuIHNvbWV0aGluZyB0aGUgZGlzY3JpbWluYW50IGFscmVhZHkgc2F5cy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYSBtb2JpbGUgdHJhbnNwb3J0LCBgZmFsc2VgIGZvciBkZXNrdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc01vYmlsZVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlnIGZvbGRlciBhIHZhdWx0IHRoZSBoYXJuZXNzICoqb3ducyoqIHdpbGwgYWN0dWFsbHkgcmVhZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICogT2JzaWRpYW4ncyBvd24gZGVmYXVsdC5cbiAqXG4gKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLmNvbmZpZ0RpcmVjdG9yeX0gaXMgdGhlIG9ubHkga25vYiB0aGF0IG1vdmVzIGl0LCBhbmQgaXQgaXNcbiAqIG1lYW5pbmdmdWwgb25seSBpbiBvd25lZCBtb2RlOiBpbiBhdHRhY2ggbW9kZSB0aGUgdmF1bHQgaXMgb3BlbmVkIGJ5IHRoZSB1c2VyJ3Mgb3duIE9ic2lkaWFuIHVuZGVyXG4gKiBpdHMgb3duIGNvbmZpZywgYW5kIG9uIEFuZHJvaWQgdGhlcmUgaXMgbm8gb3ZlcnJpZGUgYXQgYWxsLiBBbnl0aGluZyB0aGUgaGFybmVzcyB3cml0ZXMgaW50byBhIHZhdWx0XG4gKiBiZWZvcmUgaXQgaXMgb3BlbmVkIGhhcyB0byBnbyB3aGVyZSB0aGF0IHZhdWx0IHdpbGwgbG9vaywgc28gdGhpcyBpcyB0aGUgYW5zd2VyIGV2ZXJ5IHN1Y2ggd3JpdGVyXG4gKiBuZWVkcyBcdTIwMTQgc2VlIGBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBvdmVycmlkZGVuIGNvbmZpZyBmb2xkZXIgbmFtZSwgb3IgYHVuZGVmaW5lZGAgZm9yIE9ic2lkaWFuJ3MgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeShvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucy50eXBlICE9PSAnb2JzaWRpYW4tY2RwJyB8fCBvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy5jb25maWdEaXJlY3Rvcnk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEra0JPLFNBQVMsdUJBQXVCLFNBQTRDO0FBQ2pGLFNBQU8sUUFBUSxTQUFTO0FBQzFCO0FBZU8sU0FBUyw0QkFBNEIsU0FBdUQ7QUFDakcsTUFBSSxRQUFRLFNBQVMsa0JBQWtCLFFBQVEsU0FBUyxRQUFXO0FBQ2pFLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRO0FBQ2pCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -29,6 +29,23 @@ export interface ObsidianAndroidAppiumTransportOptions {
29
29
  * The Appium server URL (e.g. `'http://localhost:4723'`).
30
30
  */
31
31
  readonly appiumUrl: string;
32
+ /**
33
+ * Timeout in milliseconds for Obsidian Mobile to get as far as `globalThis.app`
34
+ * existing after the vault is (re)opened.
35
+ *
36
+ * The first of the two budgets the transport spends after `location.reload()`.
37
+ * It covers the app's own cold start — the WebView reloading and Obsidian's
38
+ * bundle coming up — which on a cold or contended guest can take minutes, and
39
+ * is not work {@link layoutReadyTimeoutInMilliseconds} should be sized for.
40
+ * Only once `globalThis.app` appears does that far tighter clock start.
41
+ *
42
+ * Splitting the two is what stops a first run after a machine restart from
43
+ * failing by design: the old single 90s wall clock started at the reload, so a
44
+ * cold app start spent it before Obsidian had begun laying anything out.
45
+ *
46
+ * @default `180000`
47
+ */
48
+ readonly appStartTimeoutInMilliseconds?: number;
32
49
  /**
33
50
  * The Android AVD (Android Virtual Device) name.
34
51
  *
@@ -48,9 +65,8 @@ export interface ObsidianAndroidAppiumTransportOptions {
48
65
  */
49
66
  readonly deviceId?: string;
50
67
  /**
51
- * Timeout in milliseconds for waiting, after `sys.boot_completed`, for a
52
- * harness-started emulator to become idle before the Appium session is
53
- * established.
68
+ * Timeout in milliseconds for waiting, after `sys.boot_completed`, for the
69
+ * emulator to become idle before the Appium session is established.
54
70
  *
55
71
  * `sys.boot_completed` fires *before* the guest is actually idle: package
56
72
  * optimization and system services keep churning, so establishing the session
@@ -58,8 +74,12 @@ export interface ObsidianAndroidAppiumTransportOptions {
58
74
  * contend with that work and inflates session establishment ~3x. The factory
59
75
  * instead waits until the boot animation has stopped and the package manager
60
76
  * is serving, proceeding early once idle or after this budget (best-effort — a
61
- * timeout logs a warning and proceeds). Set `0` to skip the wait. Only applies
62
- * to a harness-started emulator, not a reused one.
77
+ * timeout logs a warning and proceeds). Set `0` to skip the wait.
78
+ *
79
+ * Applies to a **reused** device as well as a harness-started one. A device
80
+ * that is merely present in `adb devices` can still be mid-`dex2oat`, and
81
+ * skipping the gate there is what left a run polling a churning guest until
82
+ * {@link layoutReadyTimeoutInMilliseconds} ran out.
63
83
  *
64
84
  * @default `60000`
65
85
  */
@@ -88,14 +108,21 @@ export interface ObsidianAndroidAppiumTransportOptions {
88
108
  */
89
109
  readonly isEmulatorVisible?: boolean;
90
110
  /**
91
- * Timeout in milliseconds for waiting for `app.workspace.layoutReady` after
92
- * the vault is (re)opened.
111
+ * Timeout in milliseconds for waiting for `app.workspace.layoutReady`, counted
112
+ * from the moment {@link appStartTimeoutInMilliseconds} is satisfied — not
113
+ * from the reload.
114
+ *
115
+ * The second of the two budgets the transport spends after `location.reload()`.
116
+ * It covers only Obsidian's own work — opening the vault and loading every
117
+ * plugin — once the app itself is up, which is why it can stay tight: measured
118
+ * at ~1s, and ≤8.4s under 12-core + disk + memory stress.
93
119
  *
94
- * Registering a vault triggers a full Obsidian re-init (`location.reload()`
95
- * reopens the vault and reloads every plugin the heaviest startup step). On
96
- * a cold-booted or under-provisioned emulator that init can take a while, so
97
- * this budget is the largest of the transport timeouts. Raise it further if
98
- * releases still flake on slow CI emulators.
120
+ * Blowing it therefore means Obsidian genuinely stalled, **or** that each probe
121
+ * round-trip is being inflated by a busy guest. The timeout error names which,
122
+ * by reporting the probe count and slowest round-trip alongside the furthest
123
+ * startup milestone reached: a handful of probes each taking tens of seconds is
124
+ * a contended guest, and the knob for that is
125
+ * {@link deviceIdleTimeoutInMilliseconds}, not this one.
99
126
  *
100
127
  * @default `90000`
101
128
  */
@@ -114,6 +141,31 @@ export interface ObsidianAndroidAppiumTransportOptions {
114
141
  * @default `7200000`
115
142
  */
116
143
  readonly leftoverMaxAgeInMilliseconds?: number;
144
+ /**
145
+ * Timeout in milliseconds for waiting, after the device-idle gate, for the
146
+ * emulator to report a **validated default network** before the Appium session
147
+ * is established.
148
+ *
149
+ * A device can be idle, fully packaged and answering `adb` while still having
150
+ * no route: the two {@link deviceIdleTimeoutInMilliseconds} signals are
151
+ * satisfied well before the default network is created and validated, which
152
+ * lands ~80s into guest uptime. That gap is dangerous rather than merely slow
153
+ * — a test that reaches the network there runs to completion against a
154
+ * silently **empty result**, which no assertion inside the suite can tell
155
+ * apart from a genuinely empty response.
156
+ *
157
+ * The factory polls `dumpsys connectivity` until an active default network
158
+ * reports validation, proceeding early once it does or after this budget
159
+ * (best-effort — a timeout logs a warning naming the missing network and
160
+ * proceeds). Set `0` to skip the wait, e.g. for a deliberately offline AVD or
161
+ * a suite that never touches the network.
162
+ *
163
+ * Applies to a **reused** device as well as a harness-started one, for the
164
+ * same reason the idle gate does.
165
+ *
166
+ * @default `120000`
167
+ */
168
+ readonly networkReadyTimeoutInMilliseconds?: number;
117
169
  /**
118
170
  * Number of extra attempts to enable the plugin and verify it loaded, on top
119
171
  * of the first attempt.
@@ -188,6 +240,30 @@ export interface ObsidianAndroidAppiumTransportOptions {
188
240
  * @default `true`
189
241
  */
190
242
  readonly shouldAutoStartAppium?: boolean;
243
+ /**
244
+ * Whether the auto-started emulator may resume — and refresh — the AVD's
245
+ * saved boot snapshot.
246
+ *
247
+ * When `false` (the default) the emulator is started with
248
+ * `-no-snapshot-load -no-snapshot-save`, so every run cold-boots a guest whose
249
+ * state nothing carried over. That is the hermetic default a test harness
250
+ * owes its callers, and it is also the safe one: a snapshot the harness loads
251
+ * but never writes rots unnoticed, and the failure it eventually produces — a
252
+ * device that serves adb, accepts a session, then drops `offline` about half a
253
+ * minute later — is indistinguishable from a code regression. Measured on one
254
+ * AVD back to back, a resumed snapshot killed the guest ~90s in *every* time,
255
+ * while the same AVD cold-booted in 50s and stayed up.
256
+ *
257
+ * Set it to `true` on a **persistent runner** whose AVD is not shared with
258
+ * anything else: the emulator then both loads and saves `default_boot`, so the
259
+ * snapshot each run resumes is one a previous run wrote, and the ~112s cold
260
+ * boot is largely bought back. The trade is test isolation — a guest that
261
+ * carries state between runs — so it is opt-in per project, never a default.
262
+ * Ignored when reusing an already-running device (nothing is launched).
263
+ *
264
+ * @default `false`
265
+ */
266
+ readonly shouldReuseEmulatorSnapshot?: boolean;
191
267
  /**
192
268
  * Whether the harness removes the temporary directories earlier runs leaked.
193
269
  *
@@ -244,6 +320,35 @@ export interface ObsidianCdpTransportOptions {
244
320
  * Defaults to 30000
245
321
  */
246
322
  readonly commandTimeoutInMilliseconds?: number;
323
+ /**
324
+ * The vault's **config folder** — Obsidian's per-vault *Override config
325
+ * folder* setting, e.g. `'.obsidian-desktop'`. Must start with a dot, must not
326
+ * be the bare dot, and must not contain a path separator; anything else throws
327
+ * before Obsidian is launched, because Obsidian itself would silently
328
+ * substitute `.obsidian`.
329
+ *
330
+ * Needed to open a vault that keeps its settings somewhere other than
331
+ * `.obsidian` — a vault with a stale `.obsidian` beside the real folder would
332
+ * otherwise open successfully against the wrong settings and report success.
333
+ * The override lives in `localStorage`, keyed by vault id, and so is scoped to
334
+ * a user-data directory: an owned instance gets a fresh temp one and therefore
335
+ * inherits nothing from the user's Obsidian, however that vault is configured
336
+ * there.
337
+ *
338
+ * Setting it costs one extra boot phase: the instance is launched to the
339
+ * starter screen, the override is written in that renderer, and the vault is
340
+ * then opened over IPC. After the vault is ready its actual
341
+ * `app.vault.configDir` is read back and any mismatch throws
342
+ * `ConfigDirectoryFallbackError` — there is no knob to downgrade that, because a
343
+ * vault opened against the wrong config folder is silently the wrong vault.
344
+ *
345
+ * Only meaningful in owned mode; **ignored in attach mode** ({@link ObsidianCdpTransportOptions.port}
346
+ * set), where the vault is opened by the user's own Obsidian under its own
347
+ * config.
348
+ *
349
+ * @default `undefined` (Obsidian's own default, `.obsidian`)
350
+ */
351
+ readonly configDirectory?: string;
247
352
  /**
248
353
  * Grace window in milliseconds for fast-failing a **dead boot** of the owned
249
354
  * instance.
@@ -442,3 +547,17 @@ export type ObsidianTransportOptions = ObsidianAndroidAppiumTransportOptions | O
442
547
  * @returns `true` for a mobile transport, `false` for desktop.
443
548
  */
444
549
  export declare function checkIsMobileTransport(options: ObsidianTransportOptions): boolean;
550
+ /**
551
+ * The config folder a vault the harness **owns** will actually read, or `undefined` when it is
552
+ * Obsidian's own default.
553
+ *
554
+ * {@link ObsidianCdpTransportOptions.configDirectory} is the only knob that moves it, and it is
555
+ * meaningful only in owned mode: in attach mode the vault is opened by the user's own Obsidian under
556
+ * its own config, and on Android there is no override at all. Anything the harness writes into a vault
557
+ * before it is opened has to go where that vault will look, so this is the answer every such writer
558
+ * needs — see `ensureHeadlessVaultConfig`.
559
+ *
560
+ * @param options - The resolved transport options.
561
+ * @returns The overridden config folder name, or `undefined` for Obsidian's default.
562
+ */
563
+ export declare function resolveOwnedConfigDirectory(options: ObsidianTransportOptions): string | undefined;
@@ -14,4 +14,4 @@ var __copyProps = (to, from, except, desc) => {
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
  var transport_exports = {};
16
16
  module.exports = __toCommonJS(transport_exports);
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlZmluZXMgdGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5cbi8qKlxuICogQW4gb3BhcXVlIGhhbmRsZSBpZGVudGlmeWluZyBhIGNvbnNvbGUtY2FwdHVyZSB3aW5kb3cgb3BlbmVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZX0gYW5kIGNvbnN1bWVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNvbGVDYXB0dXJlSGFuZGxlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIG1hcmtlciB3cml0dGVuIGludG8gdGhlIHRhcmdldCdzIGxvZyBzdHJlYW0gYXQgY2FwdHVyZSBzdGFydCxcbiAgICogdXNlZCB0byBzbGljZSBvdXQgZXZlcnl0aGluZyBsb2dnZWQgYWZ0ZXIgdGhpcyBwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcGx1Z2dhYmxlIHRyYW5zcG9ydCB0aGF0IGV2YWx1YXRlcyBKYXZhU2NyaXB0IGV4cHJlc3Npb25zIGluc2lkZSBhIHJ1bm5pbmdcbiAqIE9ic2lkaWFuIGluc3RhbmNlIGFuZCBtYW5hZ2VzIHZhdWx0IGxpZmVjeWNsZS5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgaGFuZGxlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXRhaWxzOlxuICogLSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gXHUyMDE0IERlc2t0b3AgT2JzaWRpYW4gdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbFxuICogICAoYSBoYXJuZXNzLW93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGJ5IGRlZmF1bHQsIG9yIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lKVxuICogLSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0fSBcdTIwMTQgTW9iaWxlIE9ic2lkaWFuIHZpYSBBcHBpdW0gV2ViVmlldyBKUyBpbmplY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBCZWdpbnMgY2FwdHVyaW5nIHRoZSB0YXJnZXQncyBuYXRpdmUgY29uc29sZS9lcnJvciBzdHJlYW0gc28gYSBsYXRlclxuICAgKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiByZXR1cm4gZXZlcnl0aGluZ1xuICAgKiBsb2dnZWQgc2luY2UgdGhpcyBjYWxsLlxuICAgKlxuICAgKiBVc2VkIHRvIHN1cmZhY2UgdGhlICpyZWFsKiBwbHVnaW4tbG9hZCBlcnJvciB3aGVuIE9ic2lkaWFuIHN3YWxsb3dzIGl0XG4gICAqIGJlZm9yZSB0aGUgaGFybmVzcydzIGBsb2FkUGx1Z2luYCBtb25rZXktcGF0Y2ggc2VlcyBpdCAodGhlIGVycm9yIHRoZW5cbiAgICogb25seSBleGlzdHMgaW4gdGhlIHJlbmRlcmVyL1dlYlZpZXcgY29uc29sZSkuIE9wdGlvbmFsIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYzpcbiAgICogaW1wbGVtZW50ZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydH0gKHRhaWxzIGBhZGIgbG9nY2F0YCk7IGFic2VudCBvblxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gKGRlc2t0b3AgZXJyb3JzIGFyZSBzdXJmYWNlZCBpbi1yZW5kZXJlciwgYW5kIGFcbiAgICogZGV2ZWxvcGVyIGNhbiBvcGVuIERldlRvb2xzIGRpcmVjdGx5KS5cbiAgICpcbiAgICogQHJldHVybnMgQW4gb3BhcXVlIGhhbmRsZSB0byBwYXNzIHRvIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zdXBwb3J0ZWQuXG4gICAqL1xuICBiZWdpbkNvbnNvbGVDYXB0dXJlPygpOiBQcm9taXNlPENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogT3B0aW9uYWwgYW5kIHBsYXRmb3JtLXNwZWNpZmljLCBsaWtlIHRoZSBvdGhlciBtZW1iZXJzIGhlcmUuIEltcGxlbWVudGVkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0fSAoQ0RQIGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YCwgb3B0aW9uYWxseSB3aXRoXG4gICAqIHRoZSB2aWV3cG9ydCBwaW5uZWQgdG8gYW4gZXhhY3Qgc2l6ZSkgYW5kIGJ5IHtAbGluayBBcHBpdW1UcmFuc3BvcnR9XG4gICAqIChgdGFrZVNjcmVlbnNob3RgLCBhbHdheXMgdGhlIGRldmljZSdzIG5hdGl2ZSBmcmFtZWJ1ZmZlciBcdTIwMTQgdGhlIHNpemUga25vYnNcbiAgICogYXJlIGlnbm9yZWQsIHNvIGEgbW9iaWxlIGNhcHR1cmUgaXMgc2l6ZWQgYnkgY2hvb3NpbmcgYW4gQVZEIHdpdGggdGhlIHdhbnRlZFxuICAgKiBzY3JlZW4gZ2VvbWV0cnkpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggd2luZG93IHRvIGNhcHR1cmUsIGFuZCB0aGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGl0IGF0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3Q/KHBhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0cmFuc3BvcnQgcmVzb3VyY2VzIChlLmcuIFdlYlNvY2tldCBjb25uZWN0aW9ucywgQXBwaXVtIHNlc3Npb25zKS5cbiAgICovXG4gIGRpc3Bvc2U/KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIGZvciB1c2UgaW4gYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMgd2hlcmVcbiAgICogYXN5bmMgd29yayBpcyBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgcGVyZm9ybSBvbmx5IHN5bmNocm9ub3VzIGNsZWFudXAgaGVyZSAoZS5nLiBraWxsaW5nXG4gICAqIGNoaWxkIHByb2Nlc3NlcykuIEFzeW5jIG9wZXJhdGlvbnMgbGlrZSB1bnJlZ2lzdGVyaW5nIHZhdWx0cyBhcmUgc2tpcHBlZC5cbiAgICovXG4gIGRpc3Bvc2VTeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gc3RyaW5nIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogcmF3IHN0cmluZyByZXN1bHQuXG4gICAqXG4gICAqIFRoZSB0cmFuc3BvcnQgbm9ybWFsaXplcyB0aGUgb3V0cHV0IFx1MjAxNCBzdHJpcHBpbmcgdHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzXG4gICAqIGFuZCBoYW5kbGluZyB0cmFuc3BvcnQtc3BlY2lmaWMgZXJyb3JzIFx1MjAxNCBzbyBjYWxsZXJzIHJlY2VpdmUgYSBjbGVhbiByZXN1bHRcbiAgICogc3RyaW5nIChlLmcuIGEgSlNPTiBzdHJpbmcsIG9yIGAobm8gb3V0cHV0KWApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uICh0eXBpY2FsbHkgYW4gYXN5bmMgSUlGRSkuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zIGluY2x1ZGluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgcmVzdWx0IHN0cmluZyBmcm9tIE9ic2lkaWFuLlxuICAgKi9cbiAgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCB0YXJnZXRzIGEgbW9iaWxlIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwgZGVza3RvcC1vbmx5IHBsdWdpbnMgKHdpdGggYGlzRGVza3RvcE9ubHk6IHRydWVgIGluIG1hbmlmZXN0KVxuICAgKiB3aWxsIHJlZnVzZSB0byBydW4gaW50ZWdyYXRpb24gdGVzdHMuXG4gICAqL1xuICBpc01vYmlsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUnVucyB0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZmxpZ2h0IGNoZWNrcyBiZWZvcmUgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHRoZSBDTEkgdHJhbnNwb3J0IHZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsXG4gICAqIHRoZSBDTEkgaXMgZW5hYmxlZCwgYW5kIHRoZSBDTEkgYmluYXJ5IGlzIGluIFBBVEguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgZmlsZXMgaW50byBhIHZhdWx0IGRpcmVjdG9yeSBvbiB0aGUgdGFyZ2V0IGRldmljZS5cbiAgICpcbiAgICogT24gZGVza3RvcCB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBsb2NhbCBmaWxlc3lzdGVtIGRpcmVjdGx5KS5cbiAgICogT24gbW9iaWxlIHRoaXMgdXNlcyB0aGUgZGV2aWNlJ3MgZmlsZSB0cmFuc2ZlciBtZWNoYW5pc20gKGUuZy4gQXBwaXVtIGBwdXNoRmlsZWApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzLlxuICAgKi9cbiAgcHVzaEZpbGVzPyh2YXVsdFBhdGg6IHN0cmluZywgZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmVhZHMgdGhlIG5hdGl2ZSBjb25zb2xlL2Vycm9yIG91dHB1dCBjYXB0dXJlZCBzaW5jZSB0aGUgbWF0Y2hpbmdcbiAgICoge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IGNhbGwuXG4gICAqXG4gICAqIEEgYm91bmRlZCwgcG9zdC1ob2MsIGZhaWx1cmUtcGF0aC1vbmx5IGR1bXAgXHUyMDE0IG5vdCBhIGxpdmUgbW9uaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZSAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgd2FzIHVuc3VwcG9ydGVkKS5cbiAgICogQHJldHVybnMgVGhlIGNhcHR1cmVkIGNvbnNvbGUvZXJyb3IgdGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnN1cHBvcnRlZCBvciBub3RoaW5nIHJlbGV2YW50IHdhcyBsb2dnZWQuXG4gICAqL1xuICByZWFkQ29uc29sZUNhcHR1cmVTaW5jZT8oaGFuZGxlOiBDb25zb2xlQ2FwdHVyZUhhbmRsZSB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBzbyBPYnNpZGlhbiBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBPbiBkZXNrdG9wOiB1c2VzIEVsZWN0cm9uIElQQyB0byBvcGVuIHRoZSB2YXVsdCBhbmQgcG9sbHMgZm9yIHJlYWRpbmVzcy5cbiAgICogT24gbW9iaWxlOiBwdXNoZXMgdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSBhbmQgcmVzdGFydHMgdGhlIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBwYXRoIGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIE9uIGRlc2t0b3A6IGNsb3NlcyB0aGUgdmF1bHQgd2luZG93IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBPbiBtb2JpbGU6IHJlbW92ZXMgdmF1bHQgZmlsZXMgZnJvbSB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmV2YWx1YXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRFdmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpIGZvciB0aGUgZXZhbHVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGV2YWx1YXRpb24gY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlZmluZXMgdGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5cbi8qKlxuICogQW4gb3BhcXVlIGhhbmRsZSBpZGVudGlmeWluZyBhIGNvbnNvbGUtY2FwdHVyZSB3aW5kb3cgb3BlbmVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZX0gYW5kIGNvbnN1bWVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNvbGVDYXB0dXJlSGFuZGxlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIG1hcmtlciB3cml0dGVuIGludG8gdGhlIHRhcmdldCdzIGxvZyBzdHJlYW0gYXQgY2FwdHVyZSBzdGFydCxcbiAgICogdXNlZCB0byBzbGljZSBvdXQgZXZlcnl0aGluZyBsb2dnZWQgYWZ0ZXIgdGhpcyBwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcGx1Z2dhYmxlIHRyYW5zcG9ydCB0aGF0IGV2YWx1YXRlcyBKYXZhU2NyaXB0IGV4cHJlc3Npb25zIGluc2lkZSBhIHJ1bm5pbmdcbiAqIE9ic2lkaWFuIGluc3RhbmNlIGFuZCBtYW5hZ2VzIHZhdWx0IGxpZmVjeWNsZS5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgaGFuZGxlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXRhaWxzOlxuICogLSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gXHUyMDE0IERlc2t0b3AgT2JzaWRpYW4gdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbFxuICogICAoYSBoYXJuZXNzLW93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGJ5IGRlZmF1bHQsIG9yIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lKVxuICogLSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0fSBcdTIwMTQgTW9iaWxlIE9ic2lkaWFuIHZpYSBBcHBpdW0gV2ViVmlldyBKUyBpbmplY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBCZWdpbnMgY2FwdHVyaW5nIHRoZSB0YXJnZXQncyBuYXRpdmUgY29uc29sZS9lcnJvciBzdHJlYW0gc28gYSBsYXRlclxuICAgKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiByZXR1cm4gZXZlcnl0aGluZ1xuICAgKiBsb2dnZWQgc2luY2UgdGhpcyBjYWxsLlxuICAgKlxuICAgKiBVc2VkIHRvIHN1cmZhY2UgdGhlICpyZWFsKiBwbHVnaW4tbG9hZCBlcnJvciB3aGVuIE9ic2lkaWFuIHN3YWxsb3dzIGl0XG4gICAqIGJlZm9yZSB0aGUgaGFybmVzcydzIGBsb2FkUGx1Z2luYCBtb25rZXktcGF0Y2ggc2VlcyBpdCAodGhlIGVycm9yIHRoZW5cbiAgICogb25seSBleGlzdHMgaW4gdGhlIHJlbmRlcmVyL1dlYlZpZXcgY29uc29sZSkuIE9wdGlvbmFsIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYzpcbiAgICogaW1wbGVtZW50ZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydH0gKHRhaWxzIGBhZGIgbG9nY2F0YCk7IGFic2VudCBvblxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gKGRlc2t0b3AgZXJyb3JzIGFyZSBzdXJmYWNlZCBpbi1yZW5kZXJlciwgYW5kIGFcbiAgICogZGV2ZWxvcGVyIGNhbiBvcGVuIERldlRvb2xzIGRpcmVjdGx5KS5cbiAgICpcbiAgICogQHJldHVybnMgQW4gb3BhcXVlIGhhbmRsZSB0byBwYXNzIHRvIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zdXBwb3J0ZWQuXG4gICAqL1xuICBiZWdpbkNvbnNvbGVDYXB0dXJlPygpOiBQcm9taXNlPENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogT3B0aW9uYWwgYW5kIHBsYXRmb3JtLXNwZWNpZmljLCBsaWtlIHRoZSBvdGhlciBtZW1iZXJzIGhlcmUuIEltcGxlbWVudGVkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0fSAoQ0RQIGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YCwgb3B0aW9uYWxseSB3aXRoXG4gICAqIHRoZSB2aWV3cG9ydCBwaW5uZWQgdG8gYW4gZXhhY3Qgc2l6ZSkgYW5kIGJ5IHtAbGluayBBcHBpdW1UcmFuc3BvcnR9XG4gICAqIChgdGFrZVNjcmVlbnNob3RgLCBhbHdheXMgdGhlIGRldmljZSdzIG5hdGl2ZSBmcmFtZWJ1ZmZlciBcdTIwMTQgdGhlIHNpemUga25vYnNcbiAgICogYXJlIGlnbm9yZWQsIHNvIGEgbW9iaWxlIGNhcHR1cmUgaXMgc2l6ZWQgYnkgY2hvb3NpbmcgYW4gQVZEIHdpdGggdGhlIHdhbnRlZFxuICAgKiBzY3JlZW4gZ2VvbWV0cnkpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggd2luZG93IHRvIGNhcHR1cmUsIGFuZCB0aGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGl0IGF0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3Q/KHBhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0cmFuc3BvcnQgcmVzb3VyY2VzIChlLmcuIFdlYlNvY2tldCBjb25uZWN0aW9ucywgQXBwaXVtIHNlc3Npb25zKS5cbiAgICovXG4gIGRpc3Bvc2U/KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIGZvciB1c2UgaW4gYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMgd2hlcmVcbiAgICogYXN5bmMgd29yayBpcyBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgcGVyZm9ybSBvbmx5IHN5bmNocm9ub3VzIGNsZWFudXAgaGVyZSAoZS5nLiBraWxsaW5nXG4gICAqIGNoaWxkIHByb2Nlc3NlcykuIEFzeW5jIG9wZXJhdGlvbnMgbGlrZSB1bnJlZ2lzdGVyaW5nIHZhdWx0cyBhcmUgc2tpcHBlZC5cbiAgICovXG4gIGRpc3Bvc2VTeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gc3RyaW5nIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogcmF3IHN0cmluZyByZXN1bHQuXG4gICAqXG4gICAqIFRoZSB0cmFuc3BvcnQgbm9ybWFsaXplcyB0aGUgb3V0cHV0IFx1MjAxNCBzdHJpcHBpbmcgdHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzXG4gICAqIGFuZCBoYW5kbGluZyB0cmFuc3BvcnQtc3BlY2lmaWMgZXJyb3JzIFx1MjAxNCBzbyBjYWxsZXJzIHJlY2VpdmUgYSBjbGVhbiByZXN1bHRcbiAgICogc3RyaW5nIChlLmcuIGEgSlNPTiBzdHJpbmcsIG9yIGAobm8gb3V0cHV0KWApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uICh0eXBpY2FsbHkgYW4gYXN5bmMgSUlGRSkuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zIGluY2x1ZGluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgcmVzdWx0IHN0cmluZyBmcm9tIE9ic2lkaWFuLlxuICAgKi9cbiAgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCB0YXJnZXRzIGEgbW9iaWxlIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwgZGVza3RvcC1vbmx5IHBsdWdpbnMgKHdpdGggYGlzRGVza3RvcE9ubHk6IHRydWVgIGluIG1hbmlmZXN0KVxuICAgKiB3aWxsIHJlZnVzZSB0byBydW4gaW50ZWdyYXRpb24gdGVzdHMuXG4gICAqL1xuICBpc01vYmlsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUnVucyB0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZmxpZ2h0IGNoZWNrcyBiZWZvcmUgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHRoZSBDTEkgdHJhbnNwb3J0IHZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsXG4gICAqIHRoZSBDTEkgaXMgZW5hYmxlZCwgYW5kIHRoZSBDTEkgYmluYXJ5IGlzIGluIFBBVEguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgZmlsZXMgaW50byBhIHZhdWx0IGRpcmVjdG9yeSBvbiB0aGUgdGFyZ2V0IGRldmljZS5cbiAgICpcbiAgICogT24gZGVza3RvcCB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBsb2NhbCBmaWxlc3lzdGVtIGRpcmVjdGx5KS5cbiAgICogT24gbW9iaWxlIHRoaXMgdXNlcyB0aGUgZGV2aWNlJ3MgZmlsZSB0cmFuc2ZlciBtZWNoYW5pc20gKGUuZy4gQXBwaXVtIGBwdXNoRmlsZWApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzLlxuICAgKi9cbiAgcHVzaEZpbGVzPyh2YXVsdFBhdGg6IHN0cmluZywgZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmVhZHMgdGhlIG5hdGl2ZSBjb25zb2xlL2Vycm9yIG91dHB1dCBjYXB0dXJlZCBzaW5jZSB0aGUgbWF0Y2hpbmdcbiAgICoge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IGNhbGwuXG4gICAqXG4gICAqIEEgYm91bmRlZCwgcG9zdC1ob2MsIGZhaWx1cmUtcGF0aC1vbmx5IGR1bXAgXHUyMDE0IG5vdCBhIGxpdmUgbW9uaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZSAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgd2FzIHVuc3VwcG9ydGVkKS5cbiAgICogQHJldHVybnMgVGhlIGNhcHR1cmVkIGNvbnNvbGUvZXJyb3IgdGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnN1cHBvcnRlZCBvciBub3RoaW5nIHJlbGV2YW50IHdhcyBsb2dnZWQuXG4gICAqL1xuICByZWFkQ29uc29sZUNhcHR1cmVTaW5jZT8oaGFuZGxlOiBDb25zb2xlQ2FwdHVyZUhhbmRsZSB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBzbyBPYnNpZGlhbiBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBPbiBkZXNrdG9wOiB1c2VzIEVsZWN0cm9uIElQQyB0byBvcGVuIHRoZSB2YXVsdCBhbmQgcG9sbHMgZm9yIHJlYWRpbmVzcy5cbiAgICogT24gbW9iaWxlOiBwdXNoZXMgb25seSBhIG1pbmltYWwgYC5vYnNpZGlhbmAgbWFya2VyIHNvIHRoZSBmb2xkZXIgaXMgcmVjb2duaXplZCBhcyBhIHZhdWx0LFxuICAgKiBwb2ludHMgdGhlIGFwcCdzIGBsb2NhbFN0b3JhZ2VgIGF0IGl0LCBhbmQgcmVsb2Fkcy5cbiAgICpcbiAgICogSXQgZG9lcyAqKm5vdCoqIGNhcnJ5IHRoZSB2YXVsdCdzIGNvbnRlbnRzIGFjcm9zcyBvbiBlaXRoZXIgcGxhdGZvcm0gXHUyMDE0IHRoYXQgaXNcbiAgICoge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LnB1c2hGaWxlc30nIGpvYiwgd2hpY2ggYFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyYCBydW5zIGZpcnN0LiBBIGNhbGxlclxuICAgKiBkcml2aW5nIGEgdHJhbnNwb3J0IGRpcmVjdGx5IGhhcyB0byBwdXNoIGJlZm9yZSByZWdpc3RlcmluZywgb3IgdGhlIGFwcCBvcGVucyBhbiBlbXB0eSB2YXVsdFxuICAgKiB3aXRoIG5vdGhpbmcgcmFpc2VkIHRvIHNheSBzby5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBwYXRoIGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIE9uIGRlc2t0b3A6IGNsb3NlcyB0aGUgdmF1bHQgd2luZG93IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBPbiBtb2JpbGU6IHJlbW92ZXMgdmF1bHQgZmlsZXMgZnJvbSB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmV2YWx1YXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRFdmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpIGZvciB0aGUgZXZhbHVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGV2YWx1YXRpb24gY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -120,7 +120,13 @@ export interface ObsidianTransport {
120
120
  * Registers a vault path so Obsidian can target it.
121
121
  *
122
122
  * On desktop: uses Electron IPC to open the vault and polls for readiness.
123
- * On mobile: pushes vault files to the device and restarts the app.
123
+ * On mobile: pushes only a minimal `.obsidian` marker so the folder is recognized as a vault,
124
+ * points the app's `localStorage` at it, and reloads.
125
+ *
126
+ * It does **not** carry the vault's contents across on either platform — that is
127
+ * {@link ObsidianTransport.pushFiles}' job, which `TemporaryVault.register` runs first. A caller
128
+ * driving a transport directly has to push before registering, or the app opens an empty vault
129
+ * with nothing raised to say so.
124
130
  *
125
131
  * @param vaultPath - The absolute path to the vault folder.
126
132
  */
@@ -0,0 +1,40 @@
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 vault_plugin_install_exports = {};
20
+ __export(vault_plugin_install_exports, {
21
+ installPluginIntoVault: () => installPluginIntoVault
22
+ });
23
+ module.exports = __toCommonJS(vault_plugin_install_exports);
24
+ var import_promises = require("node:fs/promises");
25
+ var import_node_path = require("node:path");
26
+ var import_config_directory = require("./config-directory.cjs");
27
+ const PLUGINS_DIR = "plugins";
28
+ const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
29
+ async function installPluginIntoVault(params) {
30
+ const { configDirectory = import_config_directory.DEFAULT_CONFIG_DIRECTORY, distPath, pluginId, vaultPath } = params;
31
+ const pluginDirectory = (0, import_node_path.join)(vaultPath, configDirectory, PLUGINS_DIR, pluginId);
32
+ await (0, import_promises.mkdir)(pluginDirectory, { recursive: true });
33
+ await (0, import_promises.cp)(distPath, pluginDirectory, { recursive: true });
34
+ await (0, import_promises.writeFile)((0, import_node_path.join)(vaultPath, configDirectory, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
35
+ }
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ installPluginIntoVault
39
+ });
40
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXBsdWdpbi1pbnN0YWxsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBidWlsdCBwbHVnaW4gaW50byBhICoqaGFybmVzcy1vd25lZCoqIHZhdWx0J3MgY29uZmlnIGZvbGRlciwgYmVmb3JlXG4gKiB0aGF0IHZhdWx0IGlzIGV2ZXIgb3BlbmVkOiB0aGUgYnVpbGQgb3V0cHV0IGludG9cbiAqIGA8Y29uZmlnRGlyZWN0b3J5Pi9wbHVnaW5zLzxwbHVnaW5JZD4vYCwgYW5kIHRoZSBpZCBpbnRvXG4gKiBgPGNvbmZpZ0RpcmVjdG9yeT4vY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgc28gT2JzaWRpYW4gZW5hYmxlcyBpdCBvbiBsb2FkLlxuICpcbiAqIENhcnZlZCBvdXQgb2YgYGdsb2JhbC1zZXR1cC1jb3JlYCdzIGBjb3B5UGx1Z2luSW50b1ZhdWx0YCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiBgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZ2Agd2FzIGNhcnZlZCBvdXQgb2YgdGhlIGBhcHAuanNvbmAgd3JpdGU6IHRoZSB3cml0ZVxuICogaGFzIHRvIGdvIHdoZXJlIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IGxvb2ssIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlXG4gKiBtb3ZlcyB0aGF0LiBgY29weVBsdWdpbkludG9WYXVsdGAgc3RpbGwgb3ducyB0aGUgcGFydHMgYXJvdW5kIGl0IFx1MjAxNCByZXNvbHZpbmdcbiAqIGBkaXN0L2RldmAgdnMgYGRpc3QvYnVpbGRgLCByZWFkaW5nIHRoZSBtYW5pZmVzdCwgYW5kIHJlZnVzaW5nIGEgZGVza3RvcC1vbmx5XG4gKiBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0IFx1MjAxNCBhbmQgZGVsZWdhdGVzIG9ubHkgdGhlIHdyaXRlIGhlcmUsIHdoaWNoIGlzXG4gKiB3aGF0IG1ha2VzIHRoZSBvdmVycmlkZSBwYXRoIHJlYWNoYWJsZSBmcm9tIGEgdW5pdCB0ZXN0LlxuICpcbiAqIFdyaXRpbmcgaW50byBgLm9ic2lkaWFuYCB3aGlsZSB0aGUgdmF1bHQgcmVhZHMgYC5vYnNpZGlhbi1kZXNrdG9wYCBpbnN0YWxscyB0aGVcbiAqIHBsdWdpbiBpbnRvIGEgZm9sZGVyIG5vdGhpbmcgbG9va3MgYXQsIGFuZCB0aGUgZW5hYmxlIHRoYXQgZm9sbG93cyBmYWlscyB3aXRoXG4gKiB0aGUgZ2VuZXJpYyBcImVuYWJsZWQgYnV0IG5vdCBsb2FkZWRcIiBzaGFwZSwgbmFtaW5nIG5vdGhpbmcgYWJvdXQgYSBjb25maWdcbiAqIGZvbGRlci4gYHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeWAgKGB0cmFuc3BvcnQtb3B0aW9ucy50c2ApIGlzIHRoZSBvbmVcbiAqIGFuc3dlciB0byBcIndoaWNoIGZvbGRlciB3aWxsIHRoaXMgdmF1bHQgcmVhZFwiOyBldmVyeSBjYWxsZXIgaGVyZSB0YWtlcyBpdHNcbiAqIHJlc3VsdC5cbiAqL1xuXG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkuY2pzJztcblxuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsUGx1Z2luSW50b1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgbmFtZSwgd2hlbiBpdCBpcyBvdmVycmlkZGVuIGF3YXkgZnJvbVxuICAgKiB7QGxpbmsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZfS4gSW5zdGFsbGluZyBpbnRvIGAub2JzaWRpYW5gIHdoaWxlIHRoZSB2YXVsdFxuICAgKiByZWFkcyBgLm9ic2lkaWFuLWRlc2t0b3BgIGxlYXZlcyB0aGUgcGx1Z2luIHdoZXJlIG5vdGhpbmcgbG9va3MgZm9yIGl0LCBzb1xuICAgKiB0aGUgb3ZlcnJpZGUgaGFzIHRvIHJlYWNoIHRoaXMgZmFyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy5vYnNpZGlhbidgXG4gICAqL1xuICByZWFkb25seSBjb25maWdEaXJlY3Rvcnk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgYnVpbHQgcGx1Z2luIChgbWFpbi5qc2AsIGBtYW5pZmVzdC5qc29uYCwgXHUyMDI2KSBcdTIwMTRcbiAgICogdGhlIHJlc29sdmVkIGBkaXN0L2RldmAgb3IgYGRpc3QvYnVpbGRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLCB3aGljaCBuYW1lcyBib3RoIGl0cyBmb2xkZXIgYW5kIGl0c1xuICAgKiBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgZW50cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgaGFybmVzcy1vd25lZCB2YXVsdCB0byBpbnN0YWxsIGludG8uXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgYW5kIG1hcmtzIGl0IGFzIGFuXG4gKiBlbmFibGVkIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogT25seSBldmVyIGNhbGwgdGhpcyBvbiBhIHZhdWx0IHRoZSBoYXJuZXNzIG93bnM6IGl0IG92ZXJ3cml0ZXNcbiAqIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCBvdXRyaWdodCwgYmVjYXVzZSB0aGUgaGFybmVzcyBpcyB0aGUgb25lIHRoYXQgZGVjaWRlc1xuICogd2hhdCBhIHRocm93YXdheSB2YXVsdCBoYXMgZW5hYmxlZC4gRXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgYXJlIHNlZWRlZCB0aHJvdWdoXG4gKiBgcG9wdWxhdGVgIGFuZCBlbmFibGVkIGFmdGVyIG9wZW4gaW5zdGVhZCwgc28gdGhleSBkbyBub3QgbmVlZCB0byBzdXJ2aXZlIHRoaXNcbiAqIHdyaXRlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmF1bHQgdG8gaW5zdGFsbCBpbnRvLCBpdHMgY29uZmlnIGZvbGRlciwgYW5kIHRoZSBidWlsZCB0byBpbnN0YWxsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdpbkludG9WYXVsdChwYXJhbXM6IEluc3RhbGxQbHVnaW5JbnRvVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjb25maWdEaXJlY3RvcnkgPSBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlksIGRpc3RQYXRoLCBwbHVnaW5JZCwgdmF1bHRQYXRoIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgcGx1Z2luRGlyZWN0b3J5ID0gam9pbih2YXVsdFBhdGgsIGNvbmZpZ0RpcmVjdG9yeSwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHZhdWx0UGF0aCwgY29uZmlnRGlyZWN0b3J5LCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdCQSxzQkFJTztBQUNQLHVCQUFxQjtBQUVyQiw4QkFBeUM7QUFFekMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0seUJBQXlCO0FBOEMvQixlQUFzQix1QkFBdUIsUUFBcUQ7QUFDaEcsUUFBTSxFQUFFLGtCQUFrQixrREFBMEIsVUFBVSxVQUFVLFVBQVUsSUFBSTtBQUV0RixRQUFNLHNCQUFrQix1QkFBSyxXQUFXLGlCQUFpQixhQUFhLFFBQVE7QUFDOUUsWUFBTSx1QkFBTSxpQkFBaUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxZQUFNLG9CQUFHLFVBQVUsaUJBQWlCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDdkQsWUFBTSwrQkFBVSx1QkFBSyxXQUFXLGlCQUFpQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Installs a built plugin into a **harness-owned** vault's config folder, before
5
+ * that vault is ever opened: the build output into
6
+ * `<configDirectory>/plugins/<pluginId>/`, and the id into
7
+ * `<configDirectory>/community-plugins.json` so Obsidian enables it on load.
8
+ *
9
+ * Carved out of `global-setup-core`'s `copyPluginIntoVault` for the same reason
10
+ * `ensureHeadlessVaultConfig` was carved out of the `app.json` write: the write
11
+ * has to go where the vault will actually look, and a `configDirectory` override
12
+ * moves that. `copyPluginIntoVault` still owns the parts around it — resolving
13
+ * `dist/dev` vs `dist/build`, reading the manifest, and refusing a desktop-only
14
+ * plugin on a mobile transport — and delegates only the write here, which is
15
+ * what makes the override path reachable from a unit test.
16
+ *
17
+ * Writing into `.obsidian` while the vault reads `.obsidian-desktop` installs the
18
+ * plugin into a folder nothing looks at, and the enable that follows fails with
19
+ * the generic "enabled but not loaded" shape, naming nothing about a config
20
+ * folder. `resolveOwnedConfigDirectory` (`transport-options.ts`) is the one
21
+ * answer to "which folder will this vault read"; every caller here takes its
22
+ * result.
23
+ */
24
+ /**
25
+ * Parameters for {@link installPluginIntoVault}.
26
+ */
27
+ export interface InstallPluginIntoVaultParams {
28
+ /**
29
+ * The vault's config folder name, when it is overridden away from
30
+ * {@link DEFAULT_CONFIG_DIRECTORY}. Installing into `.obsidian` while the vault
31
+ * reads `.obsidian-desktop` leaves the plugin where nothing looks for it, so
32
+ * the override has to reach this far.
33
+ *
34
+ * @default `'.obsidian'`
35
+ */
36
+ readonly configDirectory?: string | undefined;
37
+ /**
38
+ * The directory holding the built plugin (`main.js`, `manifest.json`, …) —
39
+ * the resolved `dist/dev` or `dist/build`.
40
+ */
41
+ readonly distPath: string;
42
+ /**
43
+ * The plugin's id, which names both its folder and its
44
+ * `community-plugins.json` entry.
45
+ */
46
+ readonly pluginId: string;
47
+ /**
48
+ * The absolute path of the harness-owned vault to install into.
49
+ */
50
+ readonly vaultPath: string;
51
+ }
52
+ /**
53
+ * Copies the built plugin into the vault's config folder and marks it as an
54
+ * enabled community plugin.
55
+ *
56
+ * Only ever call this on a vault the harness owns: it overwrites
57
+ * `community-plugins.json` outright, because the harness is the one that decides
58
+ * what a throwaway vault has enabled. Extra community plugins are seeded through
59
+ * `populate` and enabled after open instead, so they do not need to survive this
60
+ * write.
61
+ *
62
+ * @param params - The vault to install into, its config folder, and the build to install.
63
+ */
64
+ export declare function installPluginIntoVault(params: InstallPluginIntoVaultParams): Promise<void>;
@@ -0,0 +1,42 @@
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 vault_teardown_verdict_exports = {};
20
+ __export(vault_teardown_verdict_exports, {
21
+ shouldTearDownVaultWindow: () => shouldTearDownVaultWindow
22
+ });
23
+ module.exports = __toCommonJS(vault_teardown_verdict_exports);
24
+ function shouldTearDownVaultWindow(params) {
25
+ const {
26
+ isHarnessOwnedInstance,
27
+ isOwnedInstance,
28
+ isSelfRegistered
29
+ } = params;
30
+ if (isOwnedInstance) {
31
+ return false;
32
+ }
33
+ if (isHarnessOwnedInstance) {
34
+ return isSelfRegistered;
35
+ }
36
+ return true;
37
+ }
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ shouldTearDownVaultWindow
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXRlYXJkb3duLXZlcmRpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGRlY2lzaW9uIGZvciB3aGV0aGVyIHVucmVnaXN0ZXJpbmcgYSB2YXVsdCBtYXkgdGVhciBpdHMgd2luZG93IGRvd24uXG4gKlxuICogVGhlIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydCB1c2VkIHRvIGFuc3dlciB0aGlzIHdpdGggYSBzaW5nbGUgZmxhZy4gSXRzXG4gKiByZWFkaW5lc3MgZ3VhcmQgYXNrcyBgb3duZWRDb25maWcgfHwgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgXHUyMDE0IHRoZSB0d28gd2F5c1xuICogXCJ0aGUgaGFybmVzcyBvd25zIHRoaXMgaW5zdGFuY2VcIiBjYW4gYmUgdHJ1ZSBcdTIwMTQgd2hpbGUgaXRzIHRlYXJkb3duIGd1YXJkIGFza2VkXG4gKiBvbmx5IGBvd25lZENvbmZpZ2AuIEEgKip3b3JrZXIqKiBhdHRhY2hlZCB0byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgaGFzXG4gKiBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZWAgYW5kIG5vIGBvd25lZENvbmZpZ2AgYXQgYWxsICh0aGUgZ2xvYmFsIHNldHVwXG4gKiBvd25zIHRoZSBjb25maWc7IHRoZSB3b3JrZXIgd2FzIGhhbmRlZCBvbmx5IHRoZSBwb3J0KSwgc28gaXQgZmVsbCBzdHJhaWdodFxuICogdGhyb3VnaCB0aGUgdGVhcmRvd24gZ3VhcmQgYW5kIHJhbiBgZGVzdHJveUN1cnJlbnRXaW5kb3coKWAgYWdhaW5zdCB0aGUgdmF1bHRcbiAqIGl0IHdhcyBhc2tlZCB0byB1bnJlZ2lzdGVyLiBXaGVuIHRoYXQgdmF1bHQgaXMgdGhlIG9uZSB0aGUgd2hvbGUgcnVuIHNoYXJlcyxcbiAqIGl0cyB3aW5kb3cgaXMgdGhlIG9ubHkgb25lIFx1MjAxNCBkZXN0cm95aW5nIGl0IHF1aXRzIHRoZSBhcHAsIGFuZCBldmVyeSBsYXRlciBmaWxlXG4gKiBmYWlscyB3aXRoIGBFQ09OTlJFRlVTRURgIG9uIGEgY2xvc2VkIENEUCBwb3J0LCB3aGljaCByZWFkcyBhcyBhIGhhcm5lc3NcbiAqIG91dGFnZSByYXRoZXIgdGhhbiBhcyBhIHRlYXJkb3duIHRoYXQgb3ZlcnJlYWNoZWQuXG4gKlxuICogTWFraW5nIHRoZSB0d28gZ3VhcmRzIGlkZW50aWNhbCB3b3VsZCBmaXggdGhhdCBhbmQgYnJlYWsgc29tZXRoaW5nIGVsc2U6IGFuXG4gKiBhdHRhY2hlZCB3b3JrZXIgdGhhdCByZWdpc3RlcnMgaXRzICoqb3duKiogYFRlbXBvcmFyeVZhdWx0YCBkb2VzIG5lZWQgdGhhdFxuICogd2luZG93IGNsb3NlZCwgYW5kIGEgYmxhbmtldCBlYXJseS1yZXR1cm4gbGVha3Mgb25lIHN0YWxlIHdpbmRvdyBwZXIgdGVtcFxuICogdmF1bHQgZm9yIHRoZSBsaWZlIG9mIHRoZSBydW4gXHUyMDE0IGVhY2ggcG9pbnRpbmcgYXQgYSBkaXJlY3RvcnkgdGhlIGRpc3Bvc2FsIGhhc1xuICogYWxyZWFkeSBkZWxldGVkLiBTaW5jZSBldmVyeSB3b3JrZXIgaW4gYSBgY3JlYXRlU2V0dXBgIHJ1biBpcyBhbiBhdHRhY2hlZCBvbmUsXG4gKiB0aGF0IGlzIHRoZSBjb21tb24gcGF0aCwgbm90IGFuIGVkZ2UgY2FzZS5cbiAqXG4gKiBTbyB0aGUgaW52YXJpYW50IGlzIG5hcnJvd2VyIHRoYW4gZWl0aGVyIGd1YXJkIGV4cHJlc3NlZDogKiphIHdvcmtlciBhdHRhY2hlZFxuICogdG8gYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIG1heSB0ZWFyIGRvd24gb25seSBhIHZhdWx0IGl0IHJlZ2lzdGVyZWQgaXRzZWxmLioqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaW4gdGhhdCBpbnN0YW5jZSBiZWxvbmdzIHRvIHRoZSBnbG9iYWwgc2V0dXAgdGhhdCBsYXVuY2hlZCBpdC5cbiAqXG4gKiBLZXB0IG91dCBvZiB0aGUgaW50ZWdyYXRpb24tb25seSB0cmFuc3BvcnQgbW9kdWxlIChleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMsXG4gKiBgTEY6MGAgaW4gY292ZXJhZ2UpIGZvciB0aGUgc2FtZSByZWFzb24gYHZhdWx0LXBhdGgtbWF0Y2gudHNgIGlzIFx1MjAxNCBzbyB0aGVcbiAqIGRlY2lzaW9uIGlzIHVuaXQtdGVzdGFibGUgd2hpbGUgdGhlIHRyYW5zcG9ydCBrZWVwcyBvbmx5IHRoZSBwbHVtYmluZy5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRUZWFyRG93blZhdWx0V2luZG93UGFyYW1zIHtcbiAgLyoqXG4gIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgYSB3b3JrZXIgYXR0YWNoZWQgdG8gYW4gaW5zdGFuY2UgdGhlIGhhcm5lc3MgbGF1bmNoZWQgZWxzZXdoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciB0aGlzIHRyYW5zcG9ydCBsYXVuY2hlZCBhbmQgb3ducyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNPd25lZEluc3RhbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIHRoZSBvbmUgdGhhdCByZWdpc3RlcmVkIHRoZSB2YXVsdCBiZWluZyB1bnJlZ2lzdGVyZWQuXG4gICAqL1xuICByZWFkb25seSBpc1NlbGZSZWdpc3RlcmVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdW5yZWdpc3RlcmluZyBhIHZhdWx0IG1heSBkZXN0cm95IGl0cyB3aW5kb3cgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZVxuICogcmVnaXN0cnksIG9yIG11c3QgbGVhdmUgdGhlIGluc3RhbmNlIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gV2hvIG93bnMgdGhlIGluc3RhbmNlLCBhbmQgd2hvIHJlZ2lzdGVyZWQgdGhlIHZhdWx0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHdpbmRvdyBtYXkgYmUgdG9ybiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvdyhwYXJhbXM6IFNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3dQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2UsXG4gICAgaXNPd25lZEluc3RhbmNlLFxuICAgIGlzU2VsZlJlZ2lzdGVyZWRcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNPd25lZEluc3RhbmNlKSB7XG4gICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZSwgYW5kIGl0cyByZWdpc3RyeSBsaXZlc1xuICAgIC8vIEluIHRoZSBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHVucmVnaXN0ZXIgZnJvbS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgIC8vIEF0dGFjaGVkIHRvIHNvbWVvbmUgZWxzZSdzIGluc3RhbmNlOiBvbmx5IHRoaXMgdHJhbnNwb3J0J3Mgb3duIHZhdWx0cy5cbiAgICByZXR1cm4gaXNTZWxmUmVnaXN0ZXJlZDtcbiAgfVxuXG4gIC8vIFBsYWluIGF0dGFjaCBtb2RlIFx1MjAxNCBhIGZvcmVpZ24gT2JzaWRpYW4gdGhlIGhhcm5lc3Mgb3BlbmVkIGEgdmF1bHQgaW4sIHdoaWNoXG4gIC8vIE91dGxpdmVzIHRoZSBydW4gYW5kIG11c3QgYmUgbGVmdCBhcyBpdCB3YXMgZm91bmQuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTRETyxTQUFTLDBCQUEwQixRQUFrRDtBQUMxRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosTUFBSSxpQkFBaUI7QUFHbkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLHdCQUF3QjtBQUUxQixXQUFPO0FBQUEsRUFDVDtBQUlBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K