obsidian-integration-testing 9.2.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/README.md +45 -45
  2. package/dist/lib/cjs/appium-dependencies.cjs +5 -5
  3. package/dist/lib/cjs/appium-dependencies.d.cts +4 -2
  4. package/dist/lib/cjs/appium-session-config.cjs +1 -1
  5. package/dist/lib/cjs/asar-fallback-detection.cjs +4 -4
  6. package/dist/lib/cjs/asar-fallback-detection.d.cts +15 -7
  7. package/dist/lib/cjs/avd-list.cjs +1 -1
  8. package/dist/lib/cjs/avd-list.d.cts +6 -2
  9. package/dist/lib/cjs/cli.cjs +4 -4
  10. package/dist/lib/cjs/compatibility-options.cjs +13 -13
  11. package/dist/lib/cjs/compatibility-options.d.cts +24 -12
  12. package/dist/lib/cjs/connect-to-cdp.cjs +4 -4
  13. package/dist/lib/cjs/connect-to-cdp.d.cts +6 -6
  14. package/dist/lib/cjs/context-id.cjs +5 -5
  15. package/dist/lib/cjs/context-id.d.cts +1 -1
  16. package/dist/lib/cjs/context-provider.cjs +5 -5
  17. package/dist/lib/cjs/context-provider.d.cts +4 -4
  18. package/dist/lib/cjs/demo-vault-populate.cjs +5 -5
  19. package/dist/lib/cjs/demo-vault-populate.d.cts +4 -4
  20. package/dist/lib/cjs/demo-vault-tree.cjs +4 -4
  21. package/dist/lib/cjs/demo-vault-tree.d.cts +3 -3
  22. package/dist/lib/cjs/device-readiness.cjs +3 -3
  23. package/dist/lib/cjs/device-readiness.d.cts +7 -3
  24. package/dist/lib/cjs/ecmascript-version.cjs +1 -1
  25. package/dist/lib/cjs/electron-compatibility.cjs +4 -4
  26. package/dist/lib/cjs/electron-compatibility.d.cts +33 -17
  27. package/dist/lib/cjs/emulator-arguments.cjs +36 -0
  28. package/dist/lib/{esm/emulator-args.d.mts → cjs/emulator-arguments.d.cts} +6 -4
  29. package/dist/lib/cjs/enable-plugin.cjs +29 -29
  30. package/dist/lib/cjs/enable-plugin.d.cts +6 -6
  31. package/dist/lib/cjs/eval-in-obsidian.cjs +9 -9
  32. package/dist/lib/cjs/eval-in-obsidian.d.cts +23 -23
  33. package/dist/lib/cjs/exec.cjs +49 -53
  34. package/dist/lib/cjs/exec.d.cts +9 -9
  35. package/dist/lib/cjs/function-expression.cjs +8 -8
  36. package/dist/lib/cjs/function-expression.d.cts +4 -4
  37. package/dist/lib/cjs/generate-function-call.cjs +6 -6
  38. package/dist/lib/cjs/generate-function-call.d.cts +15 -9
  39. package/dist/lib/cjs/global-setup-core.cjs +43 -43
  40. package/dist/lib/cjs/global-setup-core.d.cts +19 -9
  41. package/dist/lib/cjs/incompatible-installer-version-error.cjs +10 -4
  42. package/dist/lib/cjs/incompatible-installer-version-error.d.cts +18 -6
  43. package/dist/lib/cjs/index.cjs +10 -10
  44. package/dist/lib/cjs/index.d.cts +8 -8
  45. package/dist/lib/cjs/installer-asset.cjs +4 -4
  46. package/dist/lib/cjs/installer-asset.d.cts +21 -7
  47. package/dist/lib/cjs/installer-compatibility.cjs +4 -4
  48. package/dist/lib/cjs/installer-compatibility.d.cts +36 -18
  49. package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +3 -3
  50. package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +1 -1
  51. package/dist/lib/cjs/jest/global-setup.cjs +11 -11
  52. package/dist/lib/cjs/jest/global-setup.d.cts +12 -8
  53. package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +2 -3
  54. package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +1 -2
  55. package/dist/lib/cjs/jest/global-teardown.cjs +2 -3
  56. package/dist/lib/cjs/jest/global-teardown.d.cts +1 -2
  57. package/dist/lib/cjs/jest/setup.cjs +2 -2
  58. package/dist/lib/cjs/jest/setup.d.cts +1 -1
  59. package/dist/lib/cjs/json-with-functions.cjs +7 -7
  60. package/dist/lib/cjs/leftover-cleanup.cjs +14 -14
  61. package/dist/lib/cjs/leftover-cleanup.d.cts +42 -20
  62. package/dist/lib/cjs/library.cjs +2 -2
  63. package/dist/lib/cjs/namespace-bootstrap.cjs +46 -40
  64. package/dist/lib/cjs/native-dialog-monitor.cjs +15 -13
  65. package/dist/lib/cjs/normalize-optional-properties.cjs +3 -3
  66. package/dist/lib/cjs/normalize-optional-properties.d.cts +2 -2
  67. package/dist/lib/cjs/obsidian-config.cjs +30 -31
  68. package/dist/lib/cjs/obsidian-config.d.cts +8 -8
  69. package/dist/lib/cjs/obsidian-executable.cjs +2 -2
  70. package/dist/lib/cjs/obsidian-installer.cjs +37 -37
  71. package/dist/lib/cjs/obsidian-installer.d.cts +7 -3
  72. package/dist/lib/cjs/obsidian-instance.cjs +3 -3
  73. package/dist/lib/cjs/obsidian-instance.d.cts +18 -8
  74. package/dist/lib/cjs/obsidian-metadata.cjs +1 -1
  75. package/dist/lib/cjs/obsidian-metadata.d.cts +36 -12
  76. package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
  77. package/dist/lib/cjs/obsidian-namespace.d.cts +25 -11
  78. package/dist/lib/cjs/obsidian-version-switch.cjs +9 -9
  79. package/dist/lib/cjs/obsidian-version-switch.d.cts +14 -10
  80. package/dist/lib/cjs/obsidian-version.cjs +3 -3
  81. package/dist/lib/cjs/obsidian-version.d.cts +15 -5
  82. package/dist/lib/cjs/owned-vault-seed.cjs +1 -1
  83. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -8
  84. package/dist/lib/cjs/parent-liveness.cjs +4 -4
  85. package/dist/lib/cjs/parent-liveness.d.cts +7 -3
  86. package/dist/lib/cjs/poll-in-obsidian.cjs +5 -5
  87. package/dist/lib/cjs/poll-in-obsidian.d.cts +12 -12
  88. package/dist/lib/cjs/poll-until.cjs +1 -1
  89. package/dist/lib/cjs/poll-until.d.cts +21 -7
  90. package/dist/lib/cjs/process-exit-message.cjs +1 -1
  91. package/dist/lib/cjs/process-exit-message.d.cts +21 -7
  92. package/dist/lib/cjs/renderer-boot-detection.cjs +9 -9
  93. package/dist/lib/cjs/renderer-boot-detection.d.cts +31 -27
  94. package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +1 -1
  95. package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +1 -1
  96. package/dist/lib/cjs/setup-lock.cjs +26 -26
  97. package/dist/lib/cjs/setup-lock.d.cts +6 -2
  98. package/dist/lib/cjs/silent-asar-fallback-error.cjs +7 -3
  99. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +12 -4
  100. package/dist/lib/cjs/spawn-options.cjs +1 -1
  101. package/dist/lib/cjs/spawn-options.d.cts +3 -1
  102. package/dist/lib/cjs/strict-proxy.cjs +25 -25
  103. package/dist/lib/cjs/strict-proxy.d.cts +3 -3
  104. package/dist/lib/cjs/temporary-vault.cjs +166 -0
  105. package/dist/lib/cjs/{temp-vault.d.cts → temporary-vault.d.cts} +3 -3
  106. package/dist/lib/cjs/transport-appium.cjs +7 -7
  107. package/dist/lib/cjs/transport-appium.d.cts +7 -3
  108. package/dist/lib/cjs/transport-desktop-cdp.cjs +57 -57
  109. package/dist/lib/cjs/transport-desktop-cdp.d.cts +29 -17
  110. package/dist/lib/cjs/transport-factory.cjs +62 -63
  111. package/dist/lib/cjs/type-guards.cjs +3 -3
  112. package/dist/lib/cjs/type-guards.d.cts +2 -2
  113. package/dist/lib/cjs/vault-path-match.cjs +9 -9
  114. package/dist/lib/cjs/vault-path-match.d.cts +11 -11
  115. package/dist/lib/cjs/version-matrix.cjs +1 -1
  116. package/dist/lib/cjs/version-matrix.d.cts +51 -17
  117. package/dist/lib/cjs/visibility.cjs +7 -7
  118. package/dist/lib/cjs/visibility.d.cts +5 -5
  119. package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +3 -3
  120. package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +2 -2
  121. package/dist/lib/cjs/vitest/global-setup.cjs +9 -9
  122. package/dist/lib/cjs/vitest/global-setup.d.cts +4 -4
  123. package/dist/lib/cjs/vitest/setup.cjs +2 -2
  124. package/dist/lib/cjs/vitest/typings.d.cts +2 -2
  125. package/dist/lib/esm/appium-dependencies.d.mts +4 -2
  126. package/dist/lib/esm/appium-dependencies.mjs +4 -4
  127. package/dist/lib/esm/appium-session-config.mjs +1 -1
  128. package/dist/lib/esm/asar-fallback-detection.d.mts +15 -7
  129. package/dist/lib/esm/asar-fallback-detection.mjs +3 -3
  130. package/dist/lib/esm/avd-list.d.mts +6 -2
  131. package/dist/lib/esm/avd-list.mjs +1 -1
  132. package/dist/lib/esm/cli.mjs +4 -4
  133. package/dist/lib/esm/compatibility-options.d.mts +24 -12
  134. package/dist/lib/esm/compatibility-options.mjs +10 -10
  135. package/dist/lib/esm/connect-to-cdp.d.mts +6 -6
  136. package/dist/lib/esm/connect-to-cdp.mjs +6 -6
  137. package/dist/lib/esm/context-id.d.mts +1 -1
  138. package/dist/lib/esm/context-id.mjs +5 -5
  139. package/dist/lib/esm/context-provider.d.mts +4 -4
  140. package/dist/lib/esm/context-provider.mjs +5 -5
  141. package/dist/lib/esm/demo-vault-populate.d.mts +4 -4
  142. package/dist/lib/esm/demo-vault-populate.mjs +5 -5
  143. package/dist/lib/esm/demo-vault-tree.d.mts +3 -3
  144. package/dist/lib/esm/demo-vault-tree.mjs +4 -4
  145. package/dist/lib/esm/device-readiness.d.mts +7 -3
  146. package/dist/lib/esm/device-readiness.mjs +3 -3
  147. package/dist/lib/esm/ecmascript-version.mjs +1 -1
  148. package/dist/lib/esm/electron-compatibility.d.mts +33 -17
  149. package/dist/lib/esm/electron-compatibility.mjs +3 -3
  150. package/dist/lib/{cjs/emulator-args.d.cts → esm/emulator-arguments.d.mts} +6 -4
  151. package/dist/lib/esm/emulator-arguments.mjs +12 -0
  152. package/dist/lib/esm/enable-plugin.d.mts +6 -6
  153. package/dist/lib/esm/enable-plugin.mjs +29 -29
  154. package/dist/lib/esm/eval-in-obsidian.d.mts +23 -23
  155. package/dist/lib/esm/eval-in-obsidian.mjs +9 -9
  156. package/dist/lib/esm/exec.d.mts +9 -9
  157. package/dist/lib/esm/exec.mjs +49 -53
  158. package/dist/lib/esm/function-expression.d.mts +4 -4
  159. package/dist/lib/esm/function-expression.mjs +8 -8
  160. package/dist/lib/esm/generate-function-call.d.mts +15 -9
  161. package/dist/lib/esm/generate-function-call.mjs +6 -6
  162. package/dist/lib/esm/global-setup-core.d.mts +19 -9
  163. package/dist/lib/esm/global-setup-core.mjs +45 -45
  164. package/dist/lib/esm/incompatible-installer-version-error.d.mts +18 -6
  165. package/dist/lib/esm/incompatible-installer-version-error.mjs +10 -4
  166. package/dist/lib/esm/index.d.mts +8 -8
  167. package/dist/lib/esm/index.mjs +9 -9
  168. package/dist/lib/esm/installer-asset.d.mts +21 -7
  169. package/dist/lib/esm/installer-asset.mjs +4 -4
  170. package/dist/lib/esm/installer-compatibility.d.mts +36 -18
  171. package/dist/lib/esm/installer-compatibility.mjs +3 -3
  172. package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +1 -1
  173. package/dist/lib/esm/jest/global-setup-no-plugin.mjs +3 -3
  174. package/dist/lib/esm/jest/global-setup.d.mts +12 -8
  175. package/dist/lib/esm/jest/global-setup.mjs +10 -10
  176. package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +1 -2
  177. package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +2 -3
  178. package/dist/lib/esm/jest/global-teardown.d.mts +1 -2
  179. package/dist/lib/esm/jest/global-teardown.mjs +2 -3
  180. package/dist/lib/esm/jest/setup.d.mts +1 -1
  181. package/dist/lib/esm/jest/setup.mjs +2 -2
  182. package/dist/lib/esm/json-with-functions.mjs +7 -7
  183. package/dist/lib/esm/leftover-cleanup.d.mts +42 -20
  184. package/dist/lib/esm/leftover-cleanup.mjs +12 -12
  185. package/dist/lib/esm/library.mjs +2 -2
  186. package/dist/lib/esm/namespace-bootstrap.mjs +46 -40
  187. package/dist/lib/esm/native-dialog-monitor.mjs +15 -13
  188. package/dist/lib/esm/normalize-optional-properties.d.mts +2 -2
  189. package/dist/lib/esm/normalize-optional-properties.mjs +3 -3
  190. package/dist/lib/esm/obsidian-config.d.mts +8 -8
  191. package/dist/lib/esm/obsidian-config.mjs +27 -28
  192. package/dist/lib/esm/obsidian-executable.mjs +2 -2
  193. package/dist/lib/esm/obsidian-installer.d.mts +7 -3
  194. package/dist/lib/esm/obsidian-installer.mjs +36 -36
  195. package/dist/lib/esm/obsidian-instance.d.mts +18 -8
  196. package/dist/lib/esm/obsidian-instance.mjs +3 -3
  197. package/dist/lib/esm/obsidian-metadata.d.mts +36 -12
  198. package/dist/lib/esm/obsidian-metadata.mjs +1 -1
  199. package/dist/lib/esm/obsidian-namespace.d.mts +25 -11
  200. package/dist/lib/esm/obsidian-version-switch.d.mts +14 -10
  201. package/dist/lib/esm/obsidian-version-switch.mjs +9 -9
  202. package/dist/lib/esm/obsidian-version.d.mts +15 -5
  203. package/dist/lib/esm/obsidian-version.mjs +3 -3
  204. package/dist/lib/esm/owned-vault-seed.d.mts +24 -8
  205. package/dist/lib/esm/owned-vault-seed.mjs +1 -1
  206. package/dist/lib/esm/parent-liveness.d.mts +7 -3
  207. package/dist/lib/esm/parent-liveness.mjs +3 -3
  208. package/dist/lib/esm/poll-in-obsidian.d.mts +12 -12
  209. package/dist/lib/esm/poll-in-obsidian.mjs +5 -5
  210. package/dist/lib/esm/poll-until.d.mts +21 -7
  211. package/dist/lib/esm/poll-until.mjs +1 -1
  212. package/dist/lib/esm/process-exit-message.d.mts +21 -7
  213. package/dist/lib/esm/process-exit-message.mjs +1 -1
  214. package/dist/lib/esm/renderer-boot-detection.d.mts +31 -27
  215. package/dist/lib/esm/renderer-boot-detection.mjs +7 -7
  216. package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +1 -1
  217. package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +1 -1
  218. package/dist/lib/esm/setup-lock.d.mts +6 -2
  219. package/dist/lib/esm/setup-lock.mjs +26 -26
  220. package/dist/lib/esm/silent-asar-fallback-error.d.mts +12 -4
  221. package/dist/lib/esm/silent-asar-fallback-error.mjs +7 -3
  222. package/dist/lib/esm/spawn-options.d.mts +3 -1
  223. package/dist/lib/esm/spawn-options.mjs +1 -1
  224. package/dist/lib/esm/strict-proxy.d.mts +3 -3
  225. package/dist/lib/esm/strict-proxy.mjs +25 -25
  226. package/dist/lib/esm/{temp-vault.d.mts → temporary-vault.d.mts} +3 -3
  227. package/dist/lib/esm/temporary-vault.mjs +157 -0
  228. package/dist/lib/esm/transport-appium.d.mts +7 -3
  229. package/dist/lib/esm/transport-appium.mjs +7 -7
  230. package/dist/lib/esm/transport-desktop-cdp.d.mts +29 -17
  231. package/dist/lib/esm/transport-desktop-cdp.mjs +67 -67
  232. package/dist/lib/esm/transport-factory.mjs +71 -72
  233. package/dist/lib/esm/type-guards.d.mts +2 -2
  234. package/dist/lib/esm/type-guards.mjs +3 -3
  235. package/dist/lib/esm/vault-path-match.d.mts +11 -11
  236. package/dist/lib/esm/vault-path-match.mjs +7 -7
  237. package/dist/lib/esm/version-matrix.d.mts +51 -17
  238. package/dist/lib/esm/version-matrix.mjs +1 -1
  239. package/dist/lib/esm/visibility.d.mts +5 -5
  240. package/dist/lib/esm/visibility.mjs +5 -5
  241. package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +2 -2
  242. package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +3 -3
  243. package/dist/lib/esm/vitest/global-setup.d.mts +4 -4
  244. package/dist/lib/esm/vitest/global-setup.mjs +8 -8
  245. package/dist/lib/esm/vitest/setup.mjs +2 -2
  246. package/dist/lib/esm/vitest/typings.d.mts +2 -2
  247. package/dist/obsidian-integration-testing-10.0.0.tgz +0 -0
  248. package/package.json +15 -13
  249. package/dist/lib/cjs/emulator-args.cjs +0 -36
  250. package/dist/lib/cjs/temp-vault.cjs +0 -166
  251. package/dist/lib/esm/emulator-args.mjs +0 -12
  252. package/dist/lib/esm/temp-vault.mjs +0 -157
  253. package/dist/obsidian-integration-testing-9.2.2.tgz +0 -0
@@ -39,7 +39,7 @@ var import_namespace_bootstrap = require("./namespace-bootstrap.cjs");
39
39
  var import_transport_factory = require("./transport-factory.cjs");
40
40
  const NO_OUTPUT = "(no output)";
41
41
  async function evalInObsidian(params) {
42
- const { args = {}, contextId, fn, shouldSkipPreflightChecks = false, transport: transportOverride, vaultPath } = params;
42
+ const { callback, contextId, input = {}, shouldSkipPreflightChecks = false, transport: transportOverride, vaultPath } = params;
43
43
  const cwd = vaultPath ?? (0, import_context_provider.getVaultPath)() ?? import_node_process.default.cwd();
44
44
  if (vaultPath !== void 0 && !(0, import_node_fs.existsSync)(vaultPath)) {
45
45
  throw new Error(`Vault path does not exist: ${vaultPath}`);
@@ -50,24 +50,24 @@ async function evalInObsidian(params) {
50
50
  }
51
51
  await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(transport, cwd);
52
52
  const namespaceCallParams = {
53
- args,
54
- fn,
53
+ callback,
54
+ input,
55
55
  ...contextId !== void 0 && { contextId: String(contextId) }
56
56
  };
57
57
  const expression = (0, import_generate_function_call.generateNamespaceCall)(namespaceCallParams);
58
- const resultStr = await transport.evaluate(expression, { cwd });
59
- if (resultStr === "" || resultStr === NO_OUTPUT) {
58
+ const resultString = await transport.evaluate(expression, { cwd });
59
+ if (resultString === "" || resultString === NO_OUTPUT) {
60
60
  return void 0;
61
61
  }
62
62
  let envelope;
63
63
  try {
64
- envelope = JSON.parse(resultStr);
64
+ envelope = JSON.parse(resultString);
65
65
  } catch {
66
- throw new Error(`evalInObsidian: Obsidian returned non-JSON output: ${resultStr}`);
66
+ throw new Error(`evalInObsidian: Obsidian returned non-JSON output: ${resultString}`);
67
67
  }
68
68
  if ("type" in envelope) {
69
69
  if (envelope.type === "error") {
70
- const sanitizedDetail = envelope.value.replace(/\(https?:\/\/localhost\/:(?<line>\d)/g, "(obsidian-webview:$<line>");
70
+ const sanitizedDetail = envelope.value.replaceAll(/\(https?:\/\/localhost\/:(?<line>\d)/g, "(obsidian-webview:$<line>");
71
71
  throw new Error(`evalInObsidian: Error inside Obsidian:
72
72
  ${sanitizedDetail}`);
73
73
  }
@@ -79,4 +79,4 @@ ${sanitizedDetail}`);
79
79
  0 && (module.exports = {
80
80
  evalInObsidian
81
81
  });
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lc3BhY2UgLS0gV2UgbmVlZCB0byByZWZlcmVuY2UgYG9ic2lkaWFuYCBtb2R1bGUuXG5pbXBvcnQgdHlwZSAqIGFzIG9ic2lkaWFuIGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3MsXG4gIENvbnRleHRJZFxufSBmcm9tICcuL2NvbnRleHQtaWQuY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVOYW1lc3BhY2VDYWxsUGFyYW1zIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgZ2V0VHJhbnNwb3J0T3B0aW9ucyxcbiAgZ2V0VmF1bHRQYXRoXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOYW1lc3BhY2VDYWxsIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuXG5pbnRlcmZhY2UgRXZhbEVycm9yRW52ZWxvcGUge1xuICB0eXBlOiAnZXJyb3InO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgcmV0dXJuZWQgYnkgdGhlIHJlZ2lzdGVyZWQgYGV2YWxXcmFwcGVyYCBmcm9tIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiAtIGBFdmFsRXJyb3JFbnZlbG9wZWAgXHUyMDE0IGBmbmAgdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIHNlcmlhbGl6ZWQgZXJyb3IuXG4gKiAtIGBFdmFsVW5kZWZpbmVkRW52ZWxvcGVgIFx1MjAxNCBgZm5gIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgRXZhbFZhbHVlRW52ZWxvcGVgIFx1MjAxNCBgZm5gIHJldHVybmVkIGEgSlNPTi1zZXJpYWxpemFibGUgdmFsdWUuXG4gKi9cbnR5cGUgRXZhbFJlc3VsdEVudmVsb3BlID1cbiAgfCBFdmFsRXJyb3JFbnZlbG9wZVxuICB8IEV2YWxVbmRlZmluZWRFbnZlbG9wZVxuICB8IEV2YWxWYWx1ZUVudmVsb3BlO1xuXG5pbnRlcmZhY2UgRXZhbFVuZGVmaW5lZEVudmVsb3BlIHtcbiAgdHlwZTogJ3VuZGVmaW5lZCc7XG59XG5cbmludGVyZmFjZSBFdmFsVmFsdWVFbnZlbG9wZSB7XG4gIHZhbHVlOiB1bmtub3duO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuXG4vKipcbiAqIENvbW1vbiBhcmd1bWVudHMgYXV0b21hdGljYWxseSBwcm92aWRlZCB0byBldmVyeSB7QGxpbmsgZXZhbEluT2JzaWRpYW59IGNhbGxiYWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkFyZ3Mge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHtAbGluayBBcHB9IGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgbGlicmFyeSBiYWcgaW5qZWN0ZWQgaW50byBldmVyeSBjYWxsYmFjayBcdTIwMTQgc2VlIHtAbGluayBMaWJ9LlxuICAgKlxuICAgKiBOZXZlciBlbXB0eTogdGhlIGhhcm5lc3MgcHJlLXBvcHVsYXRlcyBhICoqYmFzZSoqIHNldCBvZiByZW5kZXJlci1kcml2aW5nXG4gICAqIGhlbHBlcnMgKHRydXN0ZWQgaW5wdXQgXHUyMDE0IGB0eXBlSW50b0VkaXRvcmAgLyBgcHJlc3NLZXlgIC8gYG1vdmVNb3VzZWAgL1xuICAgKiBgaG92ZXJFbGVtZW50YCAvIGB1bmhvdmVyRWxlbWVudGAgXHUyMDE0IGFuZCBgd2FpdFVudGlsYCksIGFuZCBwcm92aWRlciBwYWNrYWdlc1xuICAgKiAoY2hpZWZseSBgb2JzaWRpYW4tZGV2LXV0aWxzYCkgYE9iamVjdC5hc3NpZ25gIHRoZWlyIHdob2xlIHJlbmRlcmVyLXNhZmVcbiAgICogbGlicmFyeSBvbiB0b3AgdmlhIHtAbGluayByZWdpc3RlckxpYlJlc29sdmVyfS4gQSBzZXJpYWxpemVkIGNsb3N1cmUgcmVhY2hlc1xuICAgKiBldmVyeSBzaGFyZWQgaGVscGVyIHRocm91Z2ggYGxpYmAgXHUyMDE0IGBsaWIudHlwZUludG9FZGl0b3IoeyBlZGl0b3IsIHRleHQgfSlgLFxuICAgKiBgbGliLmdldEZpbGVPck51bGwoeyBhcHAsIFx1MjAyNiB9KWAgXHUyMDE0IGluc3RlYWQgb2YgaW1wb3J0aW5nIG9yIGhhbmQtcm9sbGluZyB0aGVtLlxuICAgKi9cbiAgbGliOiBMaWI7XG5cbiAgLyoqXG4gICAqIFRoZSBgb2JzaWRpYW5gIG1vZHVsZSwgcmVzb2x2ZWQgYXQgcnVudGltZSBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gICAqL1xuICBvYnNpZGlhbk1vZHVsZTogdHlwZW9mIG9ic2lkaWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLmNyZWF0ZU5vdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUncyBjb250ZW50LiBUaGlzIGV4YWN0IHN0cmluZyBpcyB3aGF0IHRoZSBjcmVhdGVkIG5vdGUgaXMgcmVhZCBiYWNrXG4gICAqIGFnYWluc3QsIHNvIGl0IGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3VjY2Vzc2Z1bCB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggdG8gY3JlYXRlLCBleHRlbnNpb24gaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4gVmFsdWVzIG1heSBpbmNsdWRlIGZ1bmN0aW9ucyBcdTIwMTRcbiAgICogdGhleSBhcmUgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJncz86IEFyZ3M7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENvbnRleHRJZH0gbGlua2luZyB0aGlzIGNhbGwgdG8gYSBwZXJzaXN0ZW50IHN0b3JlIG9uIGB3aW5kb3dgXG4gICAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSB0eXBlZCBgY29udGV4dGAgb2JqZWN0XG4gICAqIHRoYXQgc3Vydml2ZXMgYWNyb3NzIGNhbGxzIHNoYXJpbmcgdGhlIHNhbWUgSUQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYGNvbnRleHRgIGlzIGEgZnJlc2ggZW1wdHkgb2JqZWN0IGVhY2ggY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRJZD86IFRDb250ZXh0SWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSBpbiB0aGUgT2JzaWRpYW4gY29udGV4dC5cbiAgICovXG4gIGZuKGFyZ3M6IEFyZ3MgJiBDb21tb25BcmdzICYgQ29udGV4dEFyZ3M8VENvbnRleHRJZD4pOiBQcm9taXNhYmxlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRyYW5zcG9ydCBmb3IgdGhpcyBjYWxsLiBXaGVuIG9taXR0ZWQsIHVzZXMgdGhlIHRyYW5zcG9ydFxuICAgKiBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlciAoc2V0IGJ5IHRoZSBmcmFtZXdvcmsgYWRhcHRlcidzIGdsb2JhbCBzZXR1cCkuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLmhvdmVyRWxlbWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJFbGVtZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGhvdmVyLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBpdHMgY2VudGVyLiBUaGlzIGlzIGEgbGl2ZVxuICAgKiByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3NcbiAgICogc2VyaWFsaXphdGlvbiBpcyBuZWVkZWQgKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogVGhlIHNoYXJlZCBsaWJyYXJ5IGJhZyBpbmplY3RlZCBpbnRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2sgYXNcbiAqIHtAbGluayBDb21tb25BcmdzLmxpYn0uXG4gKlxuICogVHdvIGxheWVycyBjb21wb3NlIGludG8gdGhpcyBvbmUgYmFnLiBUaGUgKipiYXNlKiogXHUyMDE0IHRoZSBoYXJuZXNzLXByb3ZpZGVkXG4gKiByZW5kZXJlci1kcml2aW5nIGhlbHBlcnMgZGVjbGFyZWQgYmVsb3cgKHRoZSB0cnVzdGVkLWlucHV0IHByaW1pdGl2ZXMgYW5kXG4gKiB7QGxpbmsgTGliLndhaXRVbnRpbH0pIFx1MjAxNCBpcyBhbHdheXMgcHJlc2VudC4gT24gdG9wLCBwcm92aWRlciBwYWNrYWdlcyByZWdpc3RlclxuICogYSByZW5kZXJlci1zaWRlIHJlc29sdmVyIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0gdG8gYE9iamVjdC5hc3NpZ25gXG4gKiB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlIGxpYnJhcnkgYXQgcnVudGltZSwgYW5kIGF1Z21lbnQgdGhpcyAqKmF1Z21lbnRhYmxlKipcbiAqIGludGVyZmFjZSAodGhlIGBpMThuZXh0YCBgQ3VzdG9tVHlwZU9wdGlvbnNgIGlkaW9tKSB2aWFcbiAqIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZydgIHRvIHR5cGUgaXQuIE11bHRpcGxlIHByb3ZpZGVyc1xuICogY29tcG9zZTogdGhlaXIgZXhwb3J0cyBtZXJnZSBhdCBydW50aW1lIGFuZCB0aGVpciBhdWdtZW50YXRpb25zIG1lcmdlIGluIHRoZVxuICogdHlwZSBzeXN0ZW0gKGBpbnRlcmZhY2UgTGliIGV4dGVuZHMgXHUyMDI2YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycge1xuICogICBpbnRlcmZhY2UgTGliIGV4dGVuZHMgKHR5cGVvZiBpbXBvcnQoJ29ic2lkaWFuLWRldi11dGlscy9fX21lcmdlZCcpKSB7fVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGliIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBub3RlIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgaXRzIGNvbnRlbnQgaXMgdmVyaWZpYWJseSBvblxuICAgKiBkaXNrLCByZXdyaXRpbmcgaXQgaWYgaXQgaXMgbm90LlxuICAgKlxuICAgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGBhcHAudmF1bHQuY3JlYXRlYCBpbiBhbnkgc3VpdGUgdGhhdCBtYXkgcnVuIG9uXG4gICAqIEFuZHJvaWQuIFRoZSBlbXVsYXRvciB0cmFuc3BvcnQgbG9zZXMgcm91Z2hseSAqKjAuOSAlKiogb2YgYHZhdWx0LmNyZWF0ZWBcbiAgICogd3JpdGVzIChtZWFzdXJlZDogNyBsb3N0IGluIDgwMCBjcmVhdGVzKTogdGhlIGZpbGUgbGFuZHMgKiowIGJ5dGVzKiogb25cbiAgICogZGlzayB3aGlsZSBPYnNpZGlhbidzIGluLW1lbW9yeSBgVEZpbGUuc3RhdGAgcmVwb3J0cyB0aGUgZnVsbCBieXRlIGNvdW50LFxuICAgKiBhbmQgaXQgZG9lcyBub3QgaGVhbCBvbiBpdHMgb3duLiBBIHN1aXRlIGRvaW5nIH4zNCBjcmVhdGVzIHBlciBydW5cbiAgICogdGhlcmVmb3JlIGhhcyBhIH4yNiAlIGNoYW5jZSBvZiBhdCBsZWFzdCBvbmUgbG9zdCB3cml0ZSwgYW5kIHdoaWNoZXZlciB0ZXN0XG4gICAqIGxvc2VzIHRoYXQgbG90dGVyeSBmYWlscyBvbiBhIGB3YWl0VW50aWxgIGZvciBjb250ZW50IHRoYXQgd2FzIG5ldmVyXG4gICAqIHdyaXR0ZW4gXHUyMDE0IHdoaWNoIGlzIHdoeSBpdCByZWFkcyBhcyBhbiB1bnJlbGF0ZWQgcGVyLXRlc3QgZmxha2UgcmF0aGVyIHRoYW5cbiAgICogb25lIHNoYXJlZCBjYXVzZS5cbiAgICpcbiAgICogVmVyaWZpY2F0aW9uIGlzIGJ5ICoqcmVhZGluZyB0aGUgbm90ZSBiYWNrKiosIG5ldmVyIGJ5IGluc3BlY3RpbmdcbiAgICogYFRGaWxlLnN0YXRgOiBgc3RhdGAgaXMgZXhhY3RseSB0aGUgZmllbGQgdGhhdCBsaWVzIGhlcmUuIEEgcmV3cml0ZSB0aHJvdWdoXG4gICAqIGB2YXVsdC5tb2RpZnlgIHdpdGggdGhlIHNhbWUgY29udGVudCBsYW5kcyBjb3JyZWN0bHkgKGFsc28gbWVhc3VyZWQpLCBzbyBhXG4gICAqIGxvc3Qgd3JpdGUgY29zdHMgYSByZXRyeSByYXRoZXIgdGhhbiBhIGZhaWx1cmUuIEEgbm90ZSB3aG9zZSBjb250ZW50IHN0aWxsXG4gICAqIGRvZXMgbm90IG1hdGNoIGFmdGVyIHRoZSBib3VuZGVkIHJldHJpZXMgdGhyb3dzLCBuYW1pbmcgdGhlIHBhdGggYW5kIGJvdGhcbiAgICogbGVuZ3Rocywgc28gYSBnZW51aW5lbHkgYnJva2VuIHdyaXRlIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNwaW5uaW5nLlxuICAgKlxuICAgKiBIYXJtbGVzcyBldmVyeXdoZXJlIGVsc2UgXHUyMDE0IG9uIGEgdHJhbnNwb3J0IHRoYXQgZG9lcyBub3QgbG9zZSB3cml0ZXMgdGhlXG4gICAqIHJlYWQtYmFjayBtYXRjaGVzIGZpcnN0IHRpbWUgYW5kIG5vdGhpbmcgaXMgcmV3cml0dGVuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG5vdGUgcGF0aCBhbmQgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIGZpbGUsIG9uY2UgaXRzIGNvbnRlbnRcbiAgICogICBpcyBjb25maXJtZWQuXG4gICAqL1xuICBjcmVhdGVOb3RlKHRoaXM6IHZvaWQsIHBhcmFtczogQ3JlYXRlTm90ZVBhcmFtcyk6IFByb21pc2U8VEZpbGU+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgKip0cnVzdGVkKipcbiAgICogRWxlY3Ryb24gcG9pbnRlciBpbnB1dCwgdGhlbiBwb2xscyB1bnRpbCB0aGUgZWxlbWVudCBhY3R1YWxseSBtYXRjaGVzXG4gICAqIGA6aG92ZXJgLlxuICAgKlxuICAgKiBCZWNhdXNlIHRoZSBtb3ZlIGlzIHRydXN0ZWQgKHNlZSB7QGxpbmsgTGliLm1vdmVNb3VzZX0pLCB0aGUgcmVhbCBgOmhvdmVyYFxuICAgKiBzdGF0ZSB0YWtlcyBlZmZlY3QgaW4gdGhlIENTUyBlbmdpbmUgXHUyMDE0IHJlYWwgdGhlbWUgYHZhcigpYCB2YWx1ZXMgYW5kIHJlYWxcbiAgICogY29tcG9zaXRpbmcgXHUyMDE0IGluc3RlYWQgb2YgYSBoYW5kLXNpbXVsYXRlZCBjYXNjYWRlLiBJdCBwb2xscyB0aGUgbGl2ZVxuICAgKiBgZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKWAgc3RhdGUgKG5vdCBhIGZpeGVkIGRlbGF5KSwgc28gaXQgaXMgcm9idXN0IHVuZGVyXG4gICAqIHNoYXJlZC1pbnN0YW5jZSBsb2FkLiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkIHdpbmRvdydzICoqZ2xvYmFsKipcbiAgICogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGhvdmVyLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGVsZW1lbnQgbWF0Y2hlcyBgOmhvdmVyYC5cbiAgICovXG4gIGhvdmVyRWxlbWVudCh0aGlzOiB2b2lkLCBwYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIHRoZSBnaXZlbiB3ZWItY29udGVudHMgY29vcmRpbmF0ZXMgdXNpbmcgYVxuICAgKiAqKnRydXN0ZWQqKiBFbGVjdHJvbiBwb2ludGVyIG1vdmUuXG4gICAqXG4gICAqIEEgdHJ1c3RlZCBtb3ZlIChpbmplY3RlZCB2aWEgRWxlY3Ryb24ncyBgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnRgKVxuICAgKiB1cGRhdGVzIHRoZSByZWFsIHBvaW50ZXIgc3RhdGUgaW4gdGhlIENTUyBlbmdpbmUsIHNvIGA6aG92ZXJgIHJ1bGVzXG4gICAqIGdlbnVpbmVseSBhcHBseSBcdTIwMTQgdW5saWtlIGBkaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW92ZXInKSlgLFxuICAgKiB3aGljaCBpcyB1bnRydXN0ZWQgYW5kIG5ldmVyIHNldHMgYDpob3ZlcmAuIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgcHJpbWl0aXZlOiBpdCBwZXJmb3JtcyBhIHNpbmdsZSBtb3ZlIGFuZCBkb2VzICoqbm90KipcbiAgICogd2FpdCBmb3IgYW55IHN0YXRlIHRvIHNldHRsZSAoY2FsbGVycyBwb2xsIHRoZWlyIG93biByZWFkaW5lc3Mgc2lnbmFsKS5cbiAgICogUHJlZmVyIHtAbGluayBMaWIuaG92ZXJFbGVtZW50fSAvIHtAbGluayBMaWIudW5ob3ZlckVsZW1lbnR9IGZvclxuICAgKiBlbGVtZW50LXJlbGF0aXZlIG1vdmVzOyB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgd2hlbiBhbiBlbGVtZW50LXJlbGF0aXZlXG4gICAqIHRhcmdldCBkb2VzIG5vdCBmaXQgKGUuZy4gYW4gZWxlbWVudCBzcGFubmluZyB0aGUgZnVsbCB2aWV3cG9ydCB3aWR0aCkuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQgbW92ZSBkb2VzIG5vIHJlYWwgYXdhaXRpbmcsIHNvIHRoZSBjYWxsZXJcbiAgICogZG9lcyBub3QgbmVlZCB0byBgYXdhaXRgIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdlYi1jb250ZW50cyBESVAgY29vcmRpbmF0ZXMgdG8gbW92ZSB0by5cbiAgICovXG4gIG1vdmVNb3VzZSh0aGlzOiB2b2lkLCBwYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFByZXNzZXMgYSBzaW5nbGUga2V5IChvcHRpb25hbGx5IHdpdGggbW9kaWZpZXJzKSB1c2luZyAqKnRydXN0ZWQqKiBFbGVjdHJvblxuICAgKiBrZXlib2FyZCBpbnB1dCwgZmlyaW5nIHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lIFx1MjAxNFxuICAgKiBga2V5ZG93bmAgXHUyMTkyIGBrZXlwcmVzc2AgXHUyMTkyIGBiZWZvcmVpbnB1dGAgXHUyMTkyIGBpbnB1dGAgXHUyMTkyIGBrZXl1cGAuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGtleS1wcmVzcyBhbmFsb2cgb2Yge0BsaW5rIExpYi50eXBlSW50b0VkaXRvcn06IGl0IGluamVjdHMgYVxuICAgKiB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIHNlcXVlbmNlIHZpYSBFbGVjdHJvbidzXG4gICAqIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGAsIHNvIGl0IGlzIGRlbGl2ZXJlZCB0byB0aGUgd2luZG93J3MgRE9NLWZvY3VzZWRcbiAgICogZWxlbWVudCBhbmQgZmxvd3MgdGhyb3VnaCB0aGUgcmVhbCBpbnB1dCBwaXBlbGluZSBcdTIwMTQgdW5saWtlXG4gICAqIGBkaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KC4uLikpYCwgd2hpY2ggaXMgdW50cnVzdGVkIChgaXNUcnVzdGVkOlxuICAgKiBmYWxzZWApIGFuZCBpZ25vcmVkIGJ5IENvZGVNaXJyb3IgYW5kIG1vc3Qga2V5IGhhbmRsZXJzLiBVc2UgaXQgZm9yIHNwZWNpYWxcbiAgICoga2V5cyAoYCdFbnRlcidgLCBgJ0VzY2FwZSdgLCBgJ1RhYidgLCBhcnJvdyBrZXlzKSBhbmQgbW9kaWZpZXIgY29tYmluYXRpb25zXG4gICAqIChgU2hpZnQrRW50ZXJgLCBgQ3RybCtBYCkgdGhhdCB7QGxpbmsgTGliLnR5cGVJbnRvRWRpdG9yfSAod2hpY2ggdHlwZXNcbiAgICogcHJpbnRhYmxlIHRleHQpIGRvZXMgbm90IGNvdmVyLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgcHJpbWl0aXZlOiBpdCBpbmplY3RzIHRoZSBrZXkgcHJlc3MgYW5kIGRvZXMgKipub3QqKlxuICAgKiBwb2xsIGZvciBhbnkgZWZmZWN0IChhIGtleSBwcmVzcyBoYXMgbm8gdW5pdmVyc2FsIG9ic2VydmFibGUgb3V0Y29tZSBcdTIwMTRcbiAgICogYEVudGVyYCBlZGl0cyB0aGUgZG9jdW1lbnQsIGBFc2NhcGVgIGNsb3NlcyBhIG1vZGFsLCBgQXJyb3dEb3duYCBtb3ZlcyB0aGVcbiAgICogc2VsZWN0aW9uKS4gVGhlIGNhbGxlciBmb2N1c2VzIHRoZSBpbnRlbmRlZCB0YXJnZXQgZmlyc3QsIHRoZW4gYXdhaXRzIHRoZVxuICAgKiBleHBlY3RlZCBlZmZlY3QgdmlhIHtAbGluayBMaWIud2FpdFVudGlsfS4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIGZvY3VzLCBzbyBvbmx5IHRoZSBET00tZm9jdXNlZCBlbGVtZW50IHJlY2VpdmVzIHRoZSBrZXkuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQga2V5IHByZXNzIGRvZXMgbm8gcmVhbCBhd2FpdGluZywgc28gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIGBhd2FpdGAgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUga2V5IHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzIHRvIGhvbGQuXG4gICAqL1xuICBwcmVzc0tleSh0aGlzOiB2b2lkLCBwYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogdm9pZDtcblxuICAvKipcbiAgICogVHlwZXMgdGV4dCBpbnRvIGEgQ29kZU1pcnJvciB7QGxpbmsgRWRpdG9yfSB1c2luZyAqKnRydXN0ZWQqKiBFbGVjdHJvblxuICAgKiBrZXlib2FyZCBpbnB1dC5cbiAgICpcbiAgICogVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiB0aGlzIGZvY3VzZXMgdGhlIGVkaXRvclxuICAgKiAoY2FyZXQgdG8gZW5kKSBhbmQgcHJlc3NlcyBldmVyeSBjb2RlIHBvaW50IG9mIGB0ZXh0YCB2aWFcbiAgICoge0BsaW5rIExpYi5wcmVzc0tleX0gXHUyMDE0IHRoZSBzYW1lIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgYSByZWFsXG4gICAqIHVzZXIgcHJvZHVjZXMuIEVhY2gga2V5c3Ryb2tlIGlzIGRlbGl2ZXJlZCB0byB0aGUgd2luZG93J3MgRE9NLWZvY3VzZWRcbiAgICogZWxlbWVudCBhbmQgZmxvd3MgdGhyb3VnaCBDb2RlTWlycm9yJ3MgcmVhbCBpbnB1dCBwaXBlbGluZSwgc28gdGhlIHR5cGVkXG4gICAqIHRleHQgcmVhY2hlcyB0aGUgZG9jdW1lbnQgKipvbmx5IGlmIHRoZSBlZGl0b3IgZ2VudWluZWx5IGhvbGRzIGZvY3VzKiouXG4gICAqIFRoaXMgbWFrZXMgXCJ0aGUgdXNlciB0eXBlZCBpbnRvIHRoZSBlZGl0b3JcIiBhIGZhaXRoZnVsIGVuZC10by1lbmQgY2hlY2ssXG4gICAqIHVubGlrZSBgZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCguLi4pKWAgKHVudHJ1c3RlZCBcdTIwMTQgaWdub3JlZCBieVxuICAgKiBDb2RlTWlycm9yKSBvciBgZXhlY0NvbW1hbmQoJ2luc2VydFRleHQnKWAgKG11dGF0ZXMgdGhlIHNlbGVjdGlvbiBldmVuXG4gICAqIHdoZW4gdGhlIGVkaXRvciBpcyBub3QgZm9jdXNlZCwgbWFza2luZyBmb2N1cyBidWdzIGFzIGZhbHNlIHBvc2l0aXZlcykuXG4gICAqXG4gICAqIEFmdGVyIGluamVjdGluZyB0aGUga2V5c3Ryb2tlcyBpdCBwb2xscyB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlXG4gICAqIGlucHV0LCBvciBhIGJvdW5kZWQgdGltZW91dCBlbGFwc2VzICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBlZGl0b3JcbiAgICogaXMgcmVhZC1vbmx5IGFuZCByZWplY3RzIHRoZSBpbnB1dCwgb3Igd2hlbiBmb2N1cyB3YXMgc3RvbGVuKS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlZGl0b3IgdG8gdHlwZSBpbnRvIGFuZCB0aGUgdGV4dCB0byB0eXBlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGtleXN0cm9rZXMgaGF2ZSBzZXR0bGVkLlxuICAgKi9cbiAgdHlwZUludG9FZGl0b3IodGhpczogdm9pZCwgcGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIGFuIGVsZW1lbnQncyBib3VuZGluZyBib3hcbiAgICogdXNpbmcgYSAqKnRydXN0ZWQqKiBFbGVjdHJvbiBwb2ludGVyIG1vdmUsIHRoZW4gcG9sbHMgdW50aWwgdGhlIGVsZW1lbnQgbm9cbiAgICogbG9uZ2VyIG1hdGNoZXMgYDpob3ZlcmAuXG4gICAqXG4gICAqIFRoZSBpbnZlcnNlIG9mIHtAbGluayBMaWIuaG92ZXJFbGVtZW50fS4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuIFdoZW5cbiAgICogYW4gZWxlbWVudCBzcGFucyB0aGUgZnVsbCB2aWV3cG9ydCAobm8gcG9pbnQgb3V0c2lkZSBpdHMgYm94IGlzIHJlYWNoYWJsZSksXG4gICAqIHVzZSB7QGxpbmsgTGliLm1vdmVNb3VzZX0gZGlyZWN0bHkgdG8gbW92ZSB0aGUgcG9pbnRlciB0byBhIGtub3duIGVtcHR5XG4gICAqIGNvb3JkaW5hdGUgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYXdheSBmcm9tLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGVsZW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXNcbiAgICogICBgOmhvdmVyYC5cbiAgICovXG4gIHVuaG92ZXJFbGVtZW50KHRoaXM6IHZvaWQsIHBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQb2xscyBhIHByZWRpY2F0ZSB1bnRpbCBpdCBiZWNvbWVzIHRydXRoeSwgb3IgcmVqZWN0cyBvbmNlIGEgYm91bmRlZFxuICAgKiB0aW1lb3V0IGVsYXBzZXMuXG4gICAqXG4gICAqIEludGVncmF0aW9uLXRlc3QgYGV2YWxJbk9ic2lkaWFuYCBjYWxsYmFja3Mgcm91dGluZWx5IG5lZWQgdG8gd2FpdCBmb3IgYW5cbiAgICogYXN5bmNocm9ub3VzIGVmZmVjdCB0byBzZXR0bGUgKGEgdmlldyB0byBvcGVuLCBhIERPTSBub2RlIHRvIGFwcGVhciwgYVxuICAgKiBzZXR0aW5nIHRvIGFwcGx5KS4gQmVjYXVzZSB0aGUgY2FsbGJhY2sgaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZFxuICAgKiBjYW5ub3QgaW1wb3J0IG1vZHVsZXMsIGl0IGNhbid0IHJldXNlIGBvYnNpZGlhbi1kZXYtdXRpbHNgJ1xuICAgKiBgcmV0cnlXaXRoVGltZW91dGAgLyBgcnVuV2l0aFRpbWVvdXRgLiBUaGlzIGhlbHBlciBpcyB0aGUgc2hhcmVkLCBpbmplY3RlZFxuICAgKiByZXBsYWNlbWVudCBmb3IgdGhlIHBlci1jbG9zdXJlIHBvbGwgbG9vcHMgY29uc3VtZXJzIHdvdWxkIG90aGVyd2lzZVxuICAgKiBoYW5kLXJvbGwuXG4gICAqXG4gICAqIFRoZSBgcHJlZGljYXRlYCBtYXkgYmUgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIFx1MjAxNCBpdCBpcyBhd2FpdGVkIG9uIGV2ZXJ5XG4gICAqIHBvbGwuIEl0IGlzIGNoZWNrZWQgaW1tZWRpYXRlbHksIHRoZW4gcmUtY2hlY2tlZCBldmVyeVxuICAgKiBgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kc2AgdW50aWwgaXQgcmV0dXJucyB0cnV0aHkgb3IgYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2BcbiAgICogZWxhcHNlcywgYXQgd2hpY2ggcG9pbnQgdGhlIHJldHVybmVkIHtAbGluayBQcm9taXNlfSByZWplY3RzICh0aGUgZXJyb3JcbiAgICogaW5jbHVkZXMgYG1lc3NhZ2VgIHdoZW4gcHJvdmlkZWQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHByZWRpY2F0ZSB0byBwb2xsIHBsdXMgb3B0aW9uYWwgdGltZW91dCwgaW50ZXJ2YWwsIGFuZFxuICAgKiAgIHRpbWVvdXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwcmVkaWNhdGUgaXMgdHJ1dGh5LlxuICAgKi9cbiAgd2FpdFVudGlsKHRoaXM6IHZvaWQsIHBhcmFtczogV2FpdFVudGlsUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJncy5tb3ZlTW91c2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVNb3VzZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgeCBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLnByZXNzS2V5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzc0tleVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHByZXNzLCBnaXZlbiBhcyBhbiBFbGVjdHJvbiBBY2NlbGVyYXRvciBrZXkgbmFtZSBcdTIwMTQgZS5nLlxuICAgKiBgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGAnQmFja3NwYWNlJ2AsIGAnRGVsZXRlJ2AsIGFuIGFycm93IGtleVxuICAgKiAoYCdVcCdgIC8gYCdEb3duJ2AgLyBgJ0xlZnQnYCAvIGAnUmlnaHQnYCksIG9yIGEgcHJpbnRhYmxlIGNoYXJhY3RlclxuICAgKiAoYCdhJ2AsIGAnMSdgKS4gVGhlIHByb2R1Y2VkIGNoYXJhY3RlciAod2hlbiB0aGUga2V5IGluc2VydHMgdGV4dCkgaXMgdGhlXG4gICAqIGxpdGVyYWwgYGtleWAgdmFsdWU7IGNhc2UtY29ycmVjdCB0ZXh0IGJlbG9uZ3MgdG9cbiAgICoge0BsaW5rIENvbW1vbkFyZ3MudHlwZUludG9FZGl0b3J9LCBub3QgYSBrZXktcHJlc3MgcHJpbWl0aXZlLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RpZmllciBrZXlzIHRvIGhvbGQgd2hpbGUgdGhlIGtleSBpcyBwcmVzc2VkLCB1c2luZyBPYnNpZGlhbidzXG4gICAqIHtAbGluayBNb2RpZmllcn0gbmFtZXMgKHRoZSBzYW1lIHZhbHVlcyBhcyBhbiBPYnNpZGlhbiBgSG90a2V5YCkuIGAnTW9kJ2BcbiAgICogcmVzb2x2ZXMgcGVyLXBsYXRmb3JtIChDbWQgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlKTsgZWFjaCBpcyBtYXBwZWQgdG9cbiAgICogRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM/OiByZWFkb25seSBNb2RpZmllcltdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLnR5cGVJbnRvRWRpdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlSW50b0VkaXRvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWRpdG9yIHRvIHR5cGUgaW50by4gSXQgaXMgZm9jdXNlZCAod2l0aCB0aGUgY2FyZXQgbW92ZWQgdG8gdGhlIGVuZCBvZlxuICAgKiB0aGUgZG9jdW1lbnQpIGJlZm9yZSB0aGUga2V5c3Ryb2tlcyBhcmUgaW5qZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3I6IEVkaXRvcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gdHlwZS4gRWFjaCBjb2RlIHBvaW50IGlzIHByZXNzZWQgdmlhIHtAbGluayBDb21tb25BcmdzLnByZXNzS2V5fVxuICAgKiAoYSB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgKSwgZXhhY3RseSBhcyBhIHJlYWwgdXNlciB0eXBpbmcuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3MudW5ob3ZlckVsZW1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaG92ZXJFbGVtZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYXdheSBmcm9tLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBhIHBvaW50XG4gICAqIGp1c3Qgb3V0c2lkZSBpdHMgYm91bmRpbmcgYm94LiBUaGlzIGlzIGEgbGl2ZSByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlXG4gICAqIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3Mgc2VyaWFsaXphdGlvbiBpcyBuZWVkZWRcbiAgICogKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3Mud2FpdFVudGlsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWl0VW50aWxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBvbGxpbmcgaW50ZXJ2YWwgYmV0d2VlbiBwcmVkaWNhdGUgY2hlY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTBgXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBkZXRhaWwgYXBwZW5kZWQgdG8gdGhlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSwgZGVzY3JpYmluZyB3aGF0XG4gICAqIHdhcyBiZWluZyB3YWl0ZWQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiB0byB3YWl0IGZvci4gUG9sbGVkIGltbWVkaWF0ZWx5LCB0aGVuIG9uIGV2ZXJ5IGludGVydmFsIHVudGlsXG4gICAqIGl0IHJldHVybnMgYSB0cnV0aHkgdmFsdWUuIE1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzXG4gICAqIGF3YWl0ZWQgb24gZWFjaCBwb2xsLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhd2FpdGVkIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuXG4gICAqL1xuICBwcmVkaWNhdGUodGhpczogdm9pZCk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlamVjdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgZnVuY3Rpb24gaW5zaWRlIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQgYW5kIHJldHVybnMgdGhlIHBhcnNlZCByZXN1bHQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIGFyZ3Mgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYGFwcGAsIGBvYnNpZGlhbk1vZHVsZWAsXG4gKiBgY29udGV4dGAsIGFuZCBhbnkgYWRkaXRpb25hbCBgYXJnc2AgcGFzc2VkIGJ5IHRoZSBjYWxsZXIuXG4gKiBJdCBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGludm9rZWQgYXMgYW4gSUlGRS5cbiAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIHNlbGYtY29udGFpbmVkIFx1MjAxNCBjbG9zdXJlcyBvdmVyIGxvY2FsIHZhcmlhYmxlcyB3aWxsIG5vdCB3b3JrLlxuICogUGFzcyBhbnkgbmVlZGVkIHZhbHVlcyBhcyBgYXJnc2AgXHUyMDE0IHRoZXkgYXJlIEpTT04tc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIG9uIHRoZSBPYnNpZGlhbiBzaWRlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYEpTT04uc3RyaW5naWZ5YCdkIG9uIHRoZSBPYnNpZGlhbiBzaWRlIGFuZCBwYXJzZWQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgZm5gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIHBhcmFtczogRXZhbEluT2JzaWRpYW5QYXJhbXM8QXJncywgUmVzdWx0LCBUQ29udGV4dElkPlxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBgZm5gIGNhbiBiZSB1bmJvdW5kLlxuICBjb25zdCB7IGFyZ3MgPSB7fSwgY29udGV4dElkLCBmbiwgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcyA9IGZhbHNlLCB0cmFuc3BvcnQ6IHRyYW5zcG9ydE92ZXJyaWRlLCB2YXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgY3dkID0gdmF1bHRQYXRoID8/IGdldFZhdWx0UGF0aCgpID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gQ2hlY2s6IFZhdWx0IHBhdGggZXhpc3RzIG9uIGRpc2suXG4gIGlmICh2YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiAhZXhpc3RzU3luYyh2YXVsdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG5cbiAgaWYgKCFzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzKSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnByZWZsaWdodENoZWNrKGN3ZCk7XG4gIH1cblxuICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0LCBjd2QpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZUNhbGxQYXJhbXM6IEdlbmVyYXRlTmFtZXNwYWNlQ2FsbFBhcmFtcyA9IHtcbiAgICBhcmdzLFxuICAgIGZuLFxuICAgIC4uLihjb250ZXh0SWQgIT09IHVuZGVmaW5lZCAmJiB7IGNvbnRleHRJZDogU3RyaW5nKGNvbnRleHRJZCkgfSlcbiAgfTtcblxuICBjb25zdCBleHByZXNzaW9uID0gZ2VuZXJhdGVOYW1lc3BhY2VDYWxsKG5hbWVzcGFjZUNhbGxQYXJhbXMpO1xuXG4gIGNvbnN0IHJlc3VsdFN0ciA9IGF3YWl0IHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZCB9KTtcblxuICBpZiAocmVzdWx0U3RyID09PSAnJyB8fCByZXN1bHRTdHIgPT09IE5PX09VVFBVVCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUmVzdWx0O1xuICB9XG5cbiAgbGV0IGVudmVsb3BlOiBFdmFsUmVzdWx0RW52ZWxvcGU7XG4gIHRyeSB7XG4gICAgZW52ZWxvcGUgPSBKU09OLnBhcnNlKHJlc3VsdFN0cikgYXMgRXZhbFJlc3VsdEVudmVsb3BlO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV2YWxJbk9ic2lkaWFuOiBPYnNpZGlhbiByZXR1cm5lZCBub24tSlNPTiBvdXRwdXQ6ICR7cmVzdWx0U3RyfWApO1xuICB9XG5cbiAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBSZXdyaXRlIGJhcmUtb3JpZ2luIGxvY2FsaG9zdCBzdGFjayBmcmFtZXMgbGlrZSBcIihodHRwOi8vbG9jYWxob3N0Lzo5MTU6MzIpXCJcbiAgICAgIC8vIFNvIFZpdGVzdCdzIHNvdXJjZS1tYXAgcmVzb2x2ZXIgd29uJ3QgZXh0cmFjdCBcIi9cIiBhcyB0aGUgZmlsZSBwYXRoIGFuZCBjcmFzaFxuICAgICAgLy8gV2l0aCBFSVNESVIgd2hlbiBpdCB0cmllcyB0byByZWFkRmlsZVN5bmMgb24gdGhlIHJvb3QgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgc2FuaXRpemVkRGV0YWlsID0gZW52ZWxvcGUudmFsdWVcbiAgICAgICAgLnJlcGxhY2UoL1xcKGh0dHBzPzpcXC9cXC9sb2NhbGhvc3RcXC86KD88bGluZT5cXGQpL2csICcob2JzaWRpYW4td2VidmlldzokPGxpbmU+Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV2YWxJbk9ic2lkaWFuOiBFcnJvciBpbnNpZGUgT2JzaWRpYW46XFxuJHtzYW5pdGl6ZWREZXRhaWx9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZW52ZWxvcGUudmFsdWUgYXMgUmVzdWx0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEscUJBQTJCO0FBQzNCLDBCQUFvQjtBQVNwQiw4QkFHTztBQUNQLG9DQUFzQztBQUN0QyxpQ0FBNEM7QUFDNUMsK0JBQXFDO0FBMkJyQyxNQUFNLFlBQVk7QUE2WmxCLGVBQXNCLGVBQ3BCLFFBQ2lCO0FBRWpCLFFBQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxXQUFXLElBQUksNEJBQTRCLE9BQU8sV0FBVyxtQkFBbUIsVUFBVSxJQUFJO0FBQ2pILFFBQU0sTUFBTSxpQkFBYSxzQ0FBYSxLQUFLLG9CQUFBQSxRQUFRLElBQUk7QUFHdkQsTUFBSSxjQUFjLFVBQWEsS0FBQywyQkFBVyxTQUFTLEdBQUc7QUFDckQsVUFBTSxJQUFJLE1BQU0sOEJBQThCLFNBQVMsRUFBRTtBQUFBLEVBQzNEO0FBRUEsUUFBTSxZQUFZLHFCQUFxQixVQUFNLG1EQUFxQiw2Q0FBb0IsQ0FBQztBQUV2RixNQUFJLENBQUMsMkJBQTJCO0FBQzlCLFVBQU0sVUFBVSxlQUFlLEdBQUc7QUFBQSxFQUNwQztBQUVBLFlBQU0sd0RBQTRCLFdBQVcsR0FBRztBQUVoRCxRQUFNLHNCQUFtRDtBQUFBLElBQ3ZEO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFDaEU7QUFFQSxRQUFNLGlCQUFhLHFEQUFzQixtQkFBbUI7QUFFNUQsUUFBTSxZQUFZLE1BQU0sVUFBVSxTQUFTLFlBQVksRUFBRSxJQUFJLENBQUM7QUFFOUQsTUFBSSxjQUFjLE1BQU0sY0FBYyxXQUFXO0FBQy9DLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUNKLE1BQUk7QUFDRixlQUFXLEtBQUssTUFBTSxTQUFTO0FBQUEsRUFDakMsUUFBUTtBQUNOLFVBQU0sSUFBSSxNQUFNLHNEQUFzRCxTQUFTLEVBQUU7QUFBQSxFQUNuRjtBQUVBLE1BQUksVUFBVSxVQUFVO0FBQ3RCLFFBQUksU0FBUyxTQUFTLFNBQVM7QUFJN0IsWUFBTSxrQkFBa0IsU0FBUyxNQUM5QixRQUFRLHlDQUF5QywyQkFBMkI7QUFDL0UsWUFBTSxJQUFJLE1BQU07QUFBQSxFQUEyQyxlQUFlLEVBQUU7QUFBQSxJQUM5RTtBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxTQUFTO0FBQ2xCOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIl0KfQo=
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lc3BhY2UgLS0gV2UgbmVlZCB0byByZWZlcmVuY2UgYG9ic2lkaWFuYCBtb2R1bGUuXG5pbXBvcnQgdHlwZSAqIGFzIG9ic2lkaWFuIGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dElkXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU5hbWVzcGFjZUNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBnZXRUcmFuc3BvcnRPcHRpb25zLFxuICBnZXRWYXVsdFBhdGhcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLmNqcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5janMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmludGVyZmFjZSBFdmFsRXJyb3JFbnZlbG9wZSB7XG4gIHR5cGU6ICdlcnJvcic7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCBlbnZlbG9wZSByZXR1cm5lZCBieSB0aGUgcmVnaXN0ZXJlZCBgZXZhbFdyYXBwZXJgIGZyb20gaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIC0gYEV2YWxFcnJvckVudmVsb3BlYCBcdTIwMTQgYGNhbGxiYWNrYCB0aHJldzsgYHZhbHVlYCBpcyB0aGUgc2VyaWFsaXplZCBlcnJvci5cbiAqIC0gYEV2YWxVbmRlZmluZWRFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYHVuZGVmaW5lZGAuXG4gKiAtIGBFdmFsVmFsdWVFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYSBKU09OLXNlcmlhbGl6YWJsZSB2YWx1ZS5cbiAqL1xudHlwZSBFdmFsUmVzdWx0RW52ZWxvcGUgPVxuICB8IEV2YWxFcnJvckVudmVsb3BlXG4gIHwgRXZhbFVuZGVmaW5lZEVudmVsb3BlXG4gIHwgRXZhbFZhbHVlRW52ZWxvcGU7XG5cbmludGVyZmFjZSBFdmFsVW5kZWZpbmVkRW52ZWxvcGUge1xuICB0eXBlOiAndW5kZWZpbmVkJztcbn1cblxuaW50ZXJmYWNlIEV2YWxWYWx1ZUVudmVsb3BlIHtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5cbi8qKlxuICogQ29tbW9uIGFyZ3VtZW50cyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQXJndW1lbnRzIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB7QGxpbmsgQXBwfSBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGxpYnJhcnkgYmFnIGluamVjdGVkIGludG8gZXZlcnkgY2FsbGJhY2sgXHUyMDE0IHNlZSB7QGxpbmsgTGlifS5cbiAgICpcbiAgICogTmV2ZXIgZW1wdHk6IHRoZSBoYXJuZXNzIHByZS1wb3B1bGF0ZXMgYSAqKmJhc2UqKiBzZXQgb2YgcmVuZGVyZXItZHJpdmluZ1xuICAgKiBoZWxwZXJzICh0cnVzdGVkIGlucHV0IFx1MjAxNCBgdHlwZUludG9FZGl0b3JgIC8gYHByZXNzS2V5YCAvIGBtb3ZlTW91c2VgIC9cbiAgICogYGhvdmVyRWxlbWVudGAgLyBgdW5ob3ZlckVsZW1lbnRgIFx1MjAxNCBhbmQgYHdhaXRVbnRpbGApLCBhbmQgcHJvdmlkZXIgcGFja2FnZXNcbiAgICogKGNoaWVmbHkgYG9ic2lkaWFuLWRldi11dGlsc2ApIGBPYmplY3QuYXNzaWduYCB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlXG4gICAqIGxpYnJhcnkgb24gdG9wIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0uIEEgc2VyaWFsaXplZCBjbG9zdXJlIHJlYWNoZXNcbiAgICogZXZlcnkgc2hhcmVkIGhlbHBlciB0aHJvdWdoIGBsaWJgIFx1MjAxNCBgbGliLnR5cGVJbnRvRWRpdG9yKHsgZWRpdG9yLCB0ZXh0IH0pYCxcbiAgICogYGxpYi5nZXRGaWxlT3JOdWxsKHsgYXBwLCBcdTIwMjYgfSlgIFx1MjAxNCBpbnN0ZWFkIG9mIGltcG9ydGluZyBvciBoYW5kLXJvbGxpbmcgdGhlbS5cbiAgICovXG4gIGxpYjogTGliO1xuXG4gIC8qKlxuICAgKiBUaGUgYG9ic2lkaWFuYCBtb2R1bGUsIHJlc29sdmVkIGF0IHJ1bnRpbWUgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICAgKi9cbiAgb2JzaWRpYW5Nb2R1bGU6IHR5cGVvZiBvYnNpZGlhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLmNyZWF0ZU5vdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUncyBjb250ZW50LiBUaGlzIGV4YWN0IHN0cmluZyBpcyB3aGF0IHRoZSBjcmVhdGVkIG5vdGUgaXMgcmVhZCBiYWNrXG4gICAqIGFnYWluc3QsIHNvIGl0IGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3VjY2Vzc2Z1bCB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggdG8gY3JlYXRlLCBleHRlbnNpb24gaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4ge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBPYnNpZGlhbiBjb250ZXh0LlxuICAgKi9cbiAgY2FsbGJhY2soaW5wdXQ6IENvbW1vbkFyZ3VtZW50cyAmIENvbnRleHRBcmd1bWVudHM8VENvbnRleHRJZD4gJiBJbnB1dCk6IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogQSB7QGxpbmsgQ29udGV4dElkfSBsaW5raW5nIHRoaXMgY2FsbCB0byBhIHBlcnNpc3RlbnQgc3RvcmUgb24gYHdpbmRvd2BcbiAgICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3MuIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhIHR5cGVkIGBjb250ZXh0YCBvYmplY3RcbiAgICogdGhhdCBzdXJ2aXZlcyBhY3Jvc3MgY2FsbHMgc2hhcmluZyB0aGUgc2FtZSBJRC5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgY29udGV4dGAgaXMgYSBmcmVzaCBlbXB0eSBvYmplY3QgZWFjaCBjYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dElkPzogVENvbnRleHRJZDtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uIFZhbHVlcyBtYXkgaW5jbHVkZSBmdW5jdGlvbnMgXHUyMDE0XG4gICAqIHRoZXkgYXJlIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRyYW5zcG9ydCBmb3IgdGhpcyBjYWxsLiBXaGVuIG9taXR0ZWQsIHVzZXMgdGhlIHRyYW5zcG9ydFxuICAgKiBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlciAoc2V0IGJ5IHRoZSBmcmFtZXdvcmsgYWRhcHRlcidzIGdsb2JhbCBzZXR1cCkuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMuaG92ZXJFbGVtZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3ZlckVsZW1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gaG92ZXIuIFRoZSBwb2ludGVyIGlzIG1vdmVkIHRvIGl0cyBjZW50ZXIuIFRoaXMgaXMgYSBsaXZlXG4gICAqIHJlbmRlcmVyIERPTSBub2RlIFx1MjAxNCB0aGUgY2FsbGJhY2sgcnVucyBpbi1yZW5kZXJlciwgc28gbm8gY3Jvc3MtcHJvY2Vzc1xuICAgKiBzZXJpYWxpemF0aW9uIGlzIG5lZWRlZCAoc2FtZSBhcyB7QGxpbmsgVHlwZUludG9FZGl0b3JQYXJhbXMuZWRpdG9yfSkuXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIGxpYnJhcnkgYmFnIGluamVjdGVkIGludG8gZXZlcnkge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxsYmFjayBhc1xuICoge0BsaW5rIENvbW1vbkFyZ3VtZW50cy5saWJ9LlxuICpcbiAqIFR3byBsYXllcnMgY29tcG9zZSBpbnRvIHRoaXMgb25lIGJhZy4gVGhlICoqYmFzZSoqIFx1MjAxNCB0aGUgaGFybmVzcy1wcm92aWRlZFxuICogcmVuZGVyZXItZHJpdmluZyBoZWxwZXJzIGRlY2xhcmVkIGJlbG93ICh0aGUgdHJ1c3RlZC1pbnB1dCBwcmltaXRpdmVzIGFuZFxuICoge0BsaW5rIExpYi53YWl0VW50aWx9KSBcdTIwMTQgaXMgYWx3YXlzIHByZXNlbnQuIE9uIHRvcCwgcHJvdmlkZXIgcGFja2FnZXMgcmVnaXN0ZXJcbiAqIGEgcmVuZGVyZXItc2lkZSByZXNvbHZlciB2aWEge0BsaW5rIHJlZ2lzdGVyTGliUmVzb2x2ZXJ9IHRvIGBPYmplY3QuYXNzaWduYFxuICogdGhlaXIgd2hvbGUgcmVuZGVyZXItc2FmZSBsaWJyYXJ5IGF0IHJ1bnRpbWUsIGFuZCBhdWdtZW50IHRoaXMgKiphdWdtZW50YWJsZSoqXG4gKiBpbnRlcmZhY2UgKHRoZSBgaTE4bmV4dGAgYEN1c3RvbVR5cGVPcHRpb25zYCBpZGlvbSkgdmlhXG4gKiBgZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnYCB0byB0eXBlIGl0LiBNdWx0aXBsZSBwcm92aWRlcnNcbiAqIGNvbXBvc2U6IHRoZWlyIGV4cG9ydHMgbWVyZ2UgYXQgcnVudGltZSBhbmQgdGhlaXIgYXVnbWVudGF0aW9ucyBtZXJnZSBpbiB0aGVcbiAqIHR5cGUgc3lzdGVtIChgaW50ZXJmYWNlIExpYiBleHRlbmRzIFx1MjAyNmApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnIHtcbiAqICAgaW50ZXJmYWNlIExpYiBleHRlbmRzICh0eXBlb2YgaW1wb3J0KCdvYnNpZGlhbi1kZXYtdXRpbHMvX19tZXJnZWQnKSkge31cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYiB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbm90ZSBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0cyBjb250ZW50IGlzIHZlcmlmaWFibHkgb25cbiAgICogZGlzaywgcmV3cml0aW5nIGl0IGlmIGl0IGlzIG5vdC5cbiAgICpcbiAgICogVXNlIHRoaXMgaW5zdGVhZCBvZiBgYXBwLnZhdWx0LmNyZWF0ZWAgaW4gYW55IHN1aXRlIHRoYXQgbWF5IHJ1biBvblxuICAgKiBBbmRyb2lkLiBUaGUgZW11bGF0b3IgdHJhbnNwb3J0IGxvc2VzIHJvdWdobHkgKiowLjkgJSoqIG9mIGB2YXVsdC5jcmVhdGVgXG4gICAqIHdyaXRlcyAobWVhc3VyZWQ6IDcgbG9zdCBpbiA4MDAgY3JlYXRlcyk6IHRoZSBmaWxlIGxhbmRzICoqMCBieXRlcyoqIG9uXG4gICAqIGRpc2sgd2hpbGUgT2JzaWRpYW4ncyBpbi1tZW1vcnkgYFRGaWxlLnN0YXRgIHJlcG9ydHMgdGhlIGZ1bGwgYnl0ZSBjb3VudCxcbiAgICogYW5kIGl0IGRvZXMgbm90IGhlYWwgb24gaXRzIG93bi4gQSBzdWl0ZSBkb2luZyB+MzQgY3JlYXRlcyBwZXIgcnVuXG4gICAqIHRoZXJlZm9yZSBoYXMgYSB+MjYgJSBjaGFuY2Ugb2YgYXQgbGVhc3Qgb25lIGxvc3Qgd3JpdGUsIGFuZCB3aGljaGV2ZXIgdGVzdFxuICAgKiBsb3NlcyB0aGF0IGxvdHRlcnkgZmFpbHMgb24gYSBgd2FpdFVudGlsYCBmb3IgY29udGVudCB0aGF0IHdhcyBuZXZlclxuICAgKiB3cml0dGVuIFx1MjAxNCB3aGljaCBpcyB3aHkgaXQgcmVhZHMgYXMgYW4gdW5yZWxhdGVkIHBlci10ZXN0IGZsYWtlIHJhdGhlciB0aGFuXG4gICAqIG9uZSBzaGFyZWQgY2F1c2UuXG4gICAqXG4gICAqIFZlcmlmaWNhdGlvbiBpcyBieSAqKnJlYWRpbmcgdGhlIG5vdGUgYmFjayoqLCBuZXZlciBieSBpbnNwZWN0aW5nXG4gICAqIGBURmlsZS5zdGF0YDogYHN0YXRgIGlzIGV4YWN0bHkgdGhlIGZpZWxkIHRoYXQgbGllcyBoZXJlLiBBIHJld3JpdGUgdGhyb3VnaFxuICAgKiBgdmF1bHQubW9kaWZ5YCB3aXRoIHRoZSBzYW1lIGNvbnRlbnQgbGFuZHMgY29ycmVjdGx5IChhbHNvIG1lYXN1cmVkKSwgc28gYVxuICAgKiBsb3N0IHdyaXRlIGNvc3RzIGEgcmV0cnkgcmF0aGVyIHRoYW4gYSBmYWlsdXJlLiBBIG5vdGUgd2hvc2UgY29udGVudCBzdGlsbFxuICAgKiBkb2VzIG5vdCBtYXRjaCBhZnRlciB0aGUgYm91bmRlZCByZXRyaWVzIHRocm93cywgbmFtaW5nIHRoZSBwYXRoIGFuZCBib3RoXG4gICAqIGxlbmd0aHMsIHNvIGEgZ2VudWluZWx5IGJyb2tlbiB3cml0ZSBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzcGlubmluZy5cbiAgICpcbiAgICogSGFybWxlc3MgZXZlcnl3aGVyZSBlbHNlIFx1MjAxNCBvbiBhIHRyYW5zcG9ydCB0aGF0IGRvZXMgbm90IGxvc2Ugd3JpdGVzIHRoZVxuICAgKiByZWFkLWJhY2sgbWF0Y2hlcyBmaXJzdCB0aW1lIGFuZCBub3RoaW5nIGlzIHJld3JpdHRlbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBub3RlIHBhdGggYW5kIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCBmaWxlLCBvbmNlIGl0cyBjb250ZW50XG4gICAqICAgaXMgY29uZmlybWVkLlxuICAgKi9cbiAgY3JlYXRlTm90ZSh0aGlzOiB2b2lkLCBwYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGNlbnRlciBvZiBhbiBlbGVtZW50IHVzaW5nICoqdHJ1c3RlZCoqXG4gICAqIEVsZWN0cm9uIHBvaW50ZXIgaW5wdXQsIHRoZW4gcG9sbHMgdW50aWwgdGhlIGVsZW1lbnQgYWN0dWFsbHkgbWF0Y2hlc1xuICAgKiBgOmhvdmVyYC5cbiAgICpcbiAgICogQmVjYXVzZSB0aGUgbW92ZSBpcyB0cnVzdGVkIChzZWUge0BsaW5rIExpYi5tb3ZlTW91c2V9KSwgdGhlIHJlYWwgYDpob3ZlcmBcbiAgICogc3RhdGUgdGFrZXMgZWZmZWN0IGluIHRoZSBDU1MgZW5naW5lIFx1MjAxNCByZWFsIHRoZW1lIGB2YXIoKWAgdmFsdWVzIGFuZCByZWFsXG4gICAqIGNvbXBvc2l0aW5nIFx1MjAxNCBpbnN0ZWFkIG9mIGEgaGFuZC1zaW11bGF0ZWQgY2FzY2FkZS4gSXQgcG9sbHMgdGhlIGxpdmVcbiAgICogYGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJylgIHN0YXRlIChub3QgYSBmaXhlZCBkZWxheSksIHNvIGl0IGlzIHJvYnVzdCB1bmRlclxuICAgKiBzaGFyZWQtaW5zdGFuY2UgbG9hZC4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZCB3aW5kb3cncyAqKmdsb2JhbCoqXG4gICAqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBob3Zlci5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG1hdGNoZXMgYDpob3ZlcmAuXG4gICAqL1xuICBob3ZlckVsZW1lbnQodGhpczogdm9pZCwgcGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byB0aGUgZ2l2ZW4gd2ViLWNvbnRlbnRzIGNvb3JkaW5hdGVzIHVzaW5nIGFcbiAgICogKip0cnVzdGVkKiogRWxlY3Ryb24gcG9pbnRlciBtb3ZlLlxuICAgKlxuICAgKiBBIHRydXN0ZWQgbW92ZSAoaW5qZWN0ZWQgdmlhIEVsZWN0cm9uJ3MgYHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50YClcbiAgICogdXBkYXRlcyB0aGUgcmVhbCBwb2ludGVyIHN0YXRlIGluIHRoZSBDU1MgZW5naW5lLCBzbyBgOmhvdmVyYCBydWxlc1xuICAgKiBnZW51aW5lbHkgYXBwbHkgXHUyMDE0IHVubGlrZSBgZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2VvdmVyJykpYCxcbiAgICogd2hpY2ggaXMgdW50cnVzdGVkIGFuZCBuZXZlciBzZXRzIGA6aG92ZXJgLiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbG93LWxldmVsIHByaW1pdGl2ZTogaXQgcGVyZm9ybXMgYSBzaW5nbGUgbW92ZSBhbmQgZG9lcyAqKm5vdCoqXG4gICAqIHdhaXQgZm9yIGFueSBzdGF0ZSB0byBzZXR0bGUgKGNhbGxlcnMgcG9sbCB0aGVpciBvd24gcmVhZGluZXNzIHNpZ25hbCkuXG4gICAqIFByZWZlciB7QGxpbmsgTGliLmhvdmVyRWxlbWVudH0gLyB7QGxpbmsgTGliLnVuaG92ZXJFbGVtZW50fSBmb3JcbiAgICogZWxlbWVudC1yZWxhdGl2ZSBtb3ZlczsgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IHdoZW4gYW4gZWxlbWVudC1yZWxhdGl2ZVxuICAgKiB0YXJnZXQgZG9lcyBub3QgZml0IChlLmcuIGFuIGVsZW1lbnQgc3Bhbm5pbmcgdGhlIGZ1bGwgdmlld3BvcnQgd2lkdGgpLlxuICAgKlxuICAgKiBTeW5jaHJvbm91czogaW5qZWN0aW5nIHRoZSB0cnVzdGVkIG1vdmUgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGUgY2FsbGVyXG4gICAqIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3ZWItY29udGVudHMgRElQIGNvb3JkaW5hdGVzIHRvIG1vdmUgdG8uXG4gICAqL1xuICBtb3ZlTW91c2UodGhpczogdm9pZCwgcGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQcmVzc2VzIGEgc2luZ2xlIGtleSAob3B0aW9uYWxseSB3aXRoIG1vZGlmaWVycykgdXNpbmcgKip0cnVzdGVkKiogRWxlY3Ryb25cbiAgICoga2V5Ym9hcmQgaW5wdXQsIGZpcmluZyB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZSBcdTIwMTRcbiAgICogYGtleWRvd25gIFx1MjE5MiBga2V5cHJlc3NgIFx1MjE5MiBgYmVmb3JlaW5wdXRgIFx1MjE5MiBgaW5wdXRgIFx1MjE5MiBga2V5dXBgLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBrZXktcHJlc3MgYW5hbG9nIG9mIHtAbGluayBMaWIudHlwZUludG9FZGl0b3J9OiBpdCBpbmplY3RzIGFcbiAgICogdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBzZXF1ZW5jZSB2aWEgRWxlY3Ryb24nc1xuICAgKiBgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnRgLCBzbyBpdCBpcyBkZWxpdmVyZWQgdG8gdGhlIHdpbmRvdydzIERPTS1mb2N1c2VkXG4gICAqIGVsZW1lbnQgYW5kIGZsb3dzIHRocm91Z2ggdGhlIHJlYWwgaW5wdXQgcGlwZWxpbmUgXHUyMDE0IHVubGlrZVxuICAgKiBgZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCguLi4pKWAsIHdoaWNoIGlzIHVudHJ1c3RlZCAoYGlzVHJ1c3RlZDpcbiAgICogZmFsc2VgKSBhbmQgaWdub3JlZCBieSBDb2RlTWlycm9yIGFuZCBtb3N0IGtleSBoYW5kbGVycy4gVXNlIGl0IGZvciBzcGVjaWFsXG4gICAqIGtleXMgKGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYXJyb3cga2V5cykgYW5kIG1vZGlmaWVyIGNvbWJpbmF0aW9uc1xuICAgKiAoYFNoaWZ0K0VudGVyYCwgYEN0cmwrQWApIHRoYXQge0BsaW5rIExpYi50eXBlSW50b0VkaXRvcn0gKHdoaWNoIHR5cGVzXG4gICAqIHByaW50YWJsZSB0ZXh0KSBkb2VzIG5vdCBjb3Zlci5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbG93LWxldmVsIHByaW1pdGl2ZTogaXQgaW5qZWN0cyB0aGUga2V5IHByZXNzIGFuZCBkb2VzICoqbm90KipcbiAgICogcG9sbCBmb3IgYW55IGVmZmVjdCAoYSBrZXkgcHJlc3MgaGFzIG5vIHVuaXZlcnNhbCBvYnNlcnZhYmxlIG91dGNvbWUgXHUyMDE0XG4gICAqIGBFbnRlcmAgZWRpdHMgdGhlIGRvY3VtZW50LCBgRXNjYXBlYCBjbG9zZXMgYSBtb2RhbCwgYEFycm93RG93bmAgbW92ZXMgdGhlXG4gICAqIHNlbGVjdGlvbikuIFRoZSBjYWxsZXIgZm9jdXNlcyB0aGUgaW50ZW5kZWQgdGFyZ2V0IGZpcnN0LCB0aGVuIGF3YWl0cyB0aGVcbiAgICogZXhwZWN0ZWQgZWZmZWN0IHZpYSB7QGxpbmsgTGliLndhaXRVbnRpbH0uIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBmb2N1cywgc28gb25seSB0aGUgRE9NLWZvY3VzZWQgZWxlbWVudCByZWNlaXZlcyB0aGUga2V5LlxuICAgKlxuICAgKiBTeW5jaHJvbm91czogaW5qZWN0aW5nIHRoZSB0cnVzdGVkIGtleSBwcmVzcyBkb2VzIG5vIHJlYWwgYXdhaXRpbmcsIHNvIHRoZVxuICAgKiBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byBgYXdhaXRgIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICAgKi9cbiAgcHJlc3NLZXkodGhpczogdm9pZCwgcGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFR5cGVzIHRleHQgaW50byBhIENvZGVNaXJyb3Ige0BsaW5rIEVkaXRvcn0gdXNpbmcgKip0cnVzdGVkKiogRWxlY3Ryb25cbiAgICoga2V5Ym9hcmQgaW5wdXQuXG4gICAqXG4gICAqIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogdGhpcyBmb2N1c2VzIHRoZSBlZGl0b3JcbiAgICogKGNhcmV0IHRvIGVuZCkgYW5kIHByZXNzZXMgZXZlcnkgY29kZSBwb2ludCBvZiBgdGV4dGAgdmlhXG4gICAqIHtAbGluayBMaWIucHJlc3NLZXl9IFx1MjAxNCB0aGUgc2FtZSB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGEgcmVhbFxuICAgKiB1c2VyIHByb2R1Y2VzLiBFYWNoIGtleXN0cm9rZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHdpbmRvdydzIERPTS1mb2N1c2VkXG4gICAqIGVsZW1lbnQgYW5kIGZsb3dzIHRocm91Z2ggQ29kZU1pcnJvcidzIHJlYWwgaW5wdXQgcGlwZWxpbmUsIHNvIHRoZSB0eXBlZFxuICAgKiB0ZXh0IHJlYWNoZXMgdGhlIGRvY3VtZW50ICoqb25seSBpZiB0aGUgZWRpdG9yIGdlbnVpbmVseSBob2xkcyBmb2N1cyoqLlxuICAgKiBUaGlzIG1ha2VzIFwidGhlIHVzZXIgdHlwZWQgaW50byB0aGUgZWRpdG9yXCIgYSBmYWl0aGZ1bCBlbmQtdG8tZW5kIGNoZWNrLFxuICAgKiB1bmxpa2UgYGRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoLi4uKSlgICh1bnRydXN0ZWQgXHUyMDE0IGlnbm9yZWQgYnlcbiAgICogQ29kZU1pcnJvcikgb3IgYGV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JylgIChtdXRhdGVzIHRoZSBzZWxlY3Rpb24gZXZlblxuICAgKiB3aGVuIHRoZSBlZGl0b3IgaXMgbm90IGZvY3VzZWQsIG1hc2tpbmcgZm9jdXMgYnVncyBhcyBmYWxzZSBwb3NpdGl2ZXMpLlxuICAgKlxuICAgKiBBZnRlciBpbmplY3RpbmcgdGhlIGtleXN0cm9rZXMgaXQgcG9sbHMgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZVxuICAgKiBpbnB1dCwgb3IgYSBib3VuZGVkIHRpbWVvdXQgZWxhcHNlcyAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgZWRpdG9yXG4gICAqIGlzIHJlYWQtb25seSBhbmQgcmVqZWN0cyB0aGUgaW5wdXQsIG9yIHdoZW4gZm9jdXMgd2FzIHN0b2xlbikuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWRpdG9yIHRvIHR5cGUgaW50byBhbmQgdGhlIHRleHQgdG8gdHlwZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBrZXlzdHJva2VzIGhhdmUgc2V0dGxlZC5cbiAgICovXG4gIHR5cGVJbnRvRWRpdG9yKHRoaXM6IHZvaWQsIHBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSBhbiBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAqIHVzaW5nIGEgKip0cnVzdGVkKiogRWxlY3Ryb24gcG9pbnRlciBtb3ZlLCB0aGVuIHBvbGxzIHVudGlsIHRoZSBlbGVtZW50IG5vXG4gICAqIGxvbmdlciBtYXRjaGVzIGA6aG92ZXJgLlxuICAgKlxuICAgKiBUaGUgaW52ZXJzZSBvZiB7QGxpbmsgTGliLmhvdmVyRWxlbWVudH0uIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLiBXaGVuXG4gICAqIGFuIGVsZW1lbnQgc3BhbnMgdGhlIGZ1bGwgdmlld3BvcnQgKG5vIHBvaW50IG91dHNpZGUgaXRzIGJveCBpcyByZWFjaGFibGUpLFxuICAgKiB1c2Uge0BsaW5rIExpYi5tb3ZlTW91c2V9IGRpcmVjdGx5IHRvIG1vdmUgdGhlIHBvaW50ZXIgdG8gYSBrbm93biBlbXB0eVxuICAgKiBjb29yZGluYXRlIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBtb3ZlIHRoZSBwb2ludGVyIGF3YXkgZnJvbS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG5vIGxvbmdlciBtYXRjaGVzXG4gICAqICAgYDpob3ZlcmAuXG4gICAqL1xuICB1bmhvdmVyRWxlbWVudCh0aGlzOiB2b2lkLCBwYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUG9sbHMgYSBwcmVkaWNhdGUgdW50aWwgaXQgYmVjb21lcyB0cnV0aHksIG9yIHJlamVjdHMgb25jZSBhIGJvdW5kZWRcbiAgICogdGltZW91dCBlbGFwc2VzLlxuICAgKlxuICAgKiBJbnRlZ3JhdGlvbi10ZXN0IGBldmFsSW5PYnNpZGlhbmAgY2FsbGJhY2tzIHJvdXRpbmVseSBuZWVkIHRvIHdhaXQgZm9yIGFuXG4gICAqIGFzeW5jaHJvbm91cyBlZmZlY3QgdG8gc2V0dGxlIChhIHZpZXcgdG8gb3BlbiwgYSBET00gbm9kZSB0byBhcHBlYXIsIGFcbiAgICogc2V0dGluZyB0byBhcHBseSkuIEJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmRcbiAgICogY2Fubm90IGltcG9ydCBtb2R1bGVzLCBpdCBjYW4ndCByZXVzZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCdcbiAgICogYHJldHJ5V2l0aFRpbWVvdXRgIC8gYHJ1bldpdGhUaW1lb3V0YC4gVGhpcyBoZWxwZXIgaXMgdGhlIHNoYXJlZCwgaW5qZWN0ZWRcbiAgICogcmVwbGFjZW1lbnQgZm9yIHRoZSBwZXItY2xvc3VyZSBwb2xsIGxvb3BzIGNvbnN1bWVycyB3b3VsZCBvdGhlcndpc2VcbiAgICogaGFuZC1yb2xsLlxuICAgKlxuICAgKiBUaGUgYHByZWRpY2F0ZWAgbWF5IGJlIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBcdTIwMTQgaXQgaXMgYXdhaXRlZCBvbiBldmVyeVxuICAgKiBwb2xsLiBJdCBpcyBjaGVja2VkIGltbWVkaWF0ZWx5LCB0aGVuIHJlLWNoZWNrZWQgZXZlcnlcbiAgICogYGludGVydmFsSW5NaWxsaXNlY29uZHNgIHVudGlsIGl0IHJldHVybnMgdHJ1dGh5IG9yIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgXG4gICAqIGVsYXBzZXMsIGF0IHdoaWNoIHBvaW50IHRoZSByZXR1cm5lZCB7QGxpbmsgUHJvbWlzZX0gcmVqZWN0cyAodGhlIGVycm9yXG4gICAqIGluY2x1ZGVzIGBtZXNzYWdlYCB3aGVuIHByb3ZpZGVkKS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwcmVkaWNhdGUgdG8gcG9sbCBwbHVzIG9wdGlvbmFsIHRpbWVvdXQsIGludGVydmFsLCBhbmRcbiAgICogICB0aW1lb3V0IG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJlZGljYXRlIGlzIHRydXRoeS5cbiAgICovXG4gIHdhaXRVbnRpbCh0aGlzOiB2b2lkLCBwYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy5tb3ZlTW91c2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVNb3VzZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgeCBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMucHJlc3NLZXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXNzS2V5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGdpdmVuIGFzIGFuIEVsZWN0cm9uIEFjY2VsZXJhdG9yIGtleSBuYW1lIFx1MjAxNCBlLmcuXG4gICAqIGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYCdCYWNrc3BhY2UnYCwgYCdEZWxldGUnYCwgYW4gYXJyb3cga2V5XG4gICAqIChgJ1VwJ2AgLyBgJ0Rvd24nYCAvIGAnTGVmdCdgIC8gYCdSaWdodCdgKSwgb3IgYSBwcmludGFibGUgY2hhcmFjdGVyXG4gICAqIChgJ2EnYCwgYCcxJ2ApLiBUaGUgcHJvZHVjZWQgY2hhcmFjdGVyICh3aGVuIHRoZSBrZXkgaW5zZXJ0cyB0ZXh0KSBpcyB0aGVcbiAgICogbGl0ZXJhbCBga2V5YCB2YWx1ZTsgY2FzZS1jb3JyZWN0IHRleHQgYmVsb25ncyB0b1xuICAgKiB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnR5cGVJbnRvRWRpdG9yfSwgbm90IGEga2V5LXByZXNzIHByaW1pdGl2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXIga2V5cyB0byBob2xkIHdoaWxlIHRoZSBrZXkgaXMgcHJlc3NlZCwgdXNpbmcgT2JzaWRpYW4nc1xuICAgKiB7QGxpbmsgTW9kaWZpZXJ9IG5hbWVzICh0aGUgc2FtZSB2YWx1ZXMgYXMgYW4gT2JzaWRpYW4gYEhvdGtleWApLiBgJ01vZCdgXG4gICAqIHJlc29sdmVzIHBlci1wbGF0Zm9ybSAoQ21kIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZSk7IGVhY2ggaXMgbWFwcGVkIHRvXG4gICAqIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzPzogcmVhZG9ubHkgTW9kaWZpZXJbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnR5cGVJbnRvRWRpdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlSW50b0VkaXRvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWRpdG9yIHRvIHR5cGUgaW50by4gSXQgaXMgZm9jdXNlZCAod2l0aCB0aGUgY2FyZXQgbW92ZWQgdG8gdGhlIGVuZCBvZlxuICAgKiB0aGUgZG9jdW1lbnQpIGJlZm9yZSB0aGUga2V5c3Ryb2tlcyBhcmUgaW5qZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3I6IEVkaXRvcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gdHlwZS4gRWFjaCBjb2RlIHBvaW50IGlzIHByZXNzZWQgdmlhIHtAbGluayBDb21tb25Bcmd1bWVudHMucHJlc3NLZXl9XG4gICAqIChhIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGApLCBleGFjdGx5IGFzIGEgcmVhbCB1c2VyIHR5cGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnVuaG92ZXJFbGVtZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmhvdmVyRWxlbWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0byBtb3ZlIHRoZSBwb2ludGVyIGF3YXkgZnJvbS4gVGhlIHBvaW50ZXIgaXMgbW92ZWQgdG8gYSBwb2ludFxuICAgKiBqdXN0IG91dHNpZGUgaXRzIGJvdW5kaW5nIGJveC4gVGhpcyBpcyBhIGxpdmUgcmVuZGVyZXIgRE9NIG5vZGUgXHUyMDE0IHRoZVxuICAgKiBjYWxsYmFjayBydW5zIGluLXJlbmRlcmVyLCBzbyBubyBjcm9zcy1wcm9jZXNzIHNlcmlhbGl6YXRpb24gaXMgbmVlZGVkXG4gICAqIChzYW1lIGFzIHtAbGluayBUeXBlSW50b0VkaXRvclBhcmFtcy5lZGl0b3J9KS5cbiAgICovXG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMud2FpdFVudGlsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWl0VW50aWxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBvbGxpbmcgaW50ZXJ2YWwgYmV0d2VlbiBwcmVkaWNhdGUgY2hlY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTBgXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBkZXRhaWwgYXBwZW5kZWQgdG8gdGhlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSwgZGVzY3JpYmluZyB3aGF0XG4gICAqIHdhcyBiZWluZyB3YWl0ZWQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiB0byB3YWl0IGZvci4gUG9sbGVkIGltbWVkaWF0ZWx5LCB0aGVuIG9uIGV2ZXJ5IGludGVydmFsIHVudGlsXG4gICAqIGl0IHJldHVybnMgYSB0cnV0aHkgdmFsdWUuIE1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzXG4gICAqIGF3YWl0ZWQgb24gZWFjaCBwb2xsLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhd2FpdGVkIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuXG4gICAqL1xuICBwcmVkaWNhdGUodGhpczogdm9pZCk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlamVjdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgZnVuY3Rpb24gaW5zaWRlIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQgYW5kIHJldHVybnMgdGhlIHBhcnNlZCByZXN1bHQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIGlucHV0IG9iamVjdCB0aGF0IGluY2x1ZGVzIGBhcHBgLCBgb2JzaWRpYW5Nb2R1bGVgLFxuICogYGNvbnRleHRgLCBhbmQgYW55IGFkZGl0aW9uYWwgYGlucHV0YCBwYXNzZWQgYnkgdGhlIGNhbGxlci5cbiAqIEl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgaW52b2tlZCBhcyBhbiBJSUZFLlxuICogVGhlIGZ1bmN0aW9uIG11c3QgYmUgc2VsZi1jb250YWluZWQgXHUyMDE0IGNsb3N1cmVzIG92ZXIgbG9jYWwgdmFyaWFibGVzIHdpbGwgbm90IHdvcmsuXG4gKiBQYXNzIGFueSBuZWVkZWQgdmFsdWVzIGFzIGBpbnB1dGAgXHUyMDE0IHRoZXkgYXJlIEpTT04tc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIG9uIHRoZSBPYnNpZGlhbiBzaWRlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYEpTT04uc3RyaW5naWZ5YCdkIG9uIHRoZSBPYnNpZGlhbiBzaWRlIGFuZCBwYXJzZWQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgY2FsbGJhY2tgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbEluT2JzaWRpYW48SW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICBwYXJhbXM6IEV2YWxJbk9ic2lkaWFuUGFyYW1zPElucHV0LCBSZXN1bHQsIFRDb250ZXh0SWQ+XG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kIC0tIGBjYWxsYmFja2AgY2FuIGJlIHVuYm91bmQuXG4gIGNvbnN0IHsgY2FsbGJhY2ssIGNvbnRleHRJZCwgaW5wdXQgPSB7fSwgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcyA9IGZhbHNlLCB0cmFuc3BvcnQ6IHRyYW5zcG9ydE92ZXJyaWRlLCB2YXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgY3dkID0gdmF1bHRQYXRoID8/IGdldFZhdWx0UGF0aCgpID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gQ2hlY2s6IFZhdWx0IHBhdGggZXhpc3RzIG9uIGRpc2suXG4gIGlmICh2YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiAhZXhpc3RzU3luYyh2YXVsdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG5cbiAgaWYgKCFzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzKSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnByZWZsaWdodENoZWNrKGN3ZCk7XG4gIH1cblxuICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0LCBjd2QpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZUNhbGxQYXJhbXM6IEdlbmVyYXRlTmFtZXNwYWNlQ2FsbFBhcmFtcyA9IHtcbiAgICBjYWxsYmFjayxcbiAgICBpbnB1dCxcbiAgICAuLi4oY29udGV4dElkICE9PSB1bmRlZmluZWQgJiYgeyBjb250ZXh0SWQ6IFN0cmluZyhjb250ZXh0SWQpIH0pXG4gIH07XG5cbiAgY29uc3QgZXhwcmVzc2lvbiA9IGdlbmVyYXRlTmFtZXNwYWNlQ2FsbChuYW1lc3BhY2VDYWxsUGFyYW1zKTtcblxuICBjb25zdCByZXN1bHRTdHJpbmcgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoZXhwcmVzc2lvbiwgeyBjd2QgfSk7XG5cbiAgaWYgKHJlc3VsdFN0cmluZyA9PT0gJycgfHwgcmVzdWx0U3RyaW5nID09PSBOT19PVVRQVVQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFJlc3VsdDtcbiAgfVxuXG4gIGxldCBlbnZlbG9wZTogRXZhbFJlc3VsdEVudmVsb3BlO1xuICB0cnkge1xuICAgIGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHJpbmcpIGFzIEV2YWxSZXN1bHRFbnZlbG9wZTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBldmFsSW5PYnNpZGlhbjogT2JzaWRpYW4gcmV0dXJuZWQgbm9uLUpTT04gb3V0cHV0OiAke3Jlc3VsdFN0cmluZ31gKTtcbiAgfVxuXG4gIGlmICgndHlwZScgaW4gZW52ZWxvcGUpIHtcbiAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gUmV3cml0ZSBiYXJlLW9yaWdpbiBsb2NhbGhvc3Qgc3RhY2sgZnJhbWVzIGxpa2UgXCIoaHR0cDovL2xvY2FsaG9zdC86OTE1OjMyKVwiXG4gICAgICAvLyBTbyBWaXRlc3QncyBzb3VyY2UtbWFwIHJlc29sdmVyIHdvbid0IGV4dHJhY3QgXCIvXCIgYXMgdGhlIGZpbGUgcGF0aCBhbmQgY3Jhc2hcbiAgICAgIC8vIFdpdGggRUlTRElSIHdoZW4gaXQgdHJpZXMgdG8gcmVhZEZpbGVTeW5jIG9uIHRoZSByb290IGRpcmVjdG9yeS5cbiAgICAgIGNvbnN0IHNhbml0aXplZERldGFpbCA9IGVudmVsb3BlLnZhbHVlXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXChodHRwcz86XFwvXFwvbG9jYWxob3N0XFwvOig/PGxpbmU+XFxkKS9nLCAnKG9ic2lkaWFuLXdlYnZpZXc6JDxsaW5lPicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBldmFsSW5PYnNpZGlhbjogRXJyb3IgaW5zaWRlIE9ic2lkaWFuOlxcbiR7c2FuaXRpemVkRGV0YWlsfWApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGVudmVsb3BlLnZhbHVlIGFzIFJlc3VsdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLHFCQUEyQjtBQUMzQiwwQkFBb0I7QUFTcEIsOEJBR087QUFDUCxvQ0FBc0M7QUFDdEMsaUNBQTRDO0FBQzVDLCtCQUFxQztBQTJCckMsTUFBTSxZQUFZO0FBNlpsQixlQUFzQixlQUNwQixRQUNpQjtBQUVqQixRQUFNLEVBQUUsVUFBVSxXQUFXLFFBQVEsQ0FBQyxHQUFHLDRCQUE0QixPQUFPLFdBQVcsbUJBQW1CLFVBQVUsSUFBSTtBQUN4SCxRQUFNLE1BQU0saUJBQWEsc0NBQWEsS0FBSyxvQkFBQUEsUUFBUSxJQUFJO0FBR3ZELE1BQUksY0FBYyxVQUFhLEtBQUMsMkJBQVcsU0FBUyxHQUFHO0FBQ3JELFVBQU0sSUFBSSxNQUFNLDhCQUE4QixTQUFTLEVBQUU7QUFBQSxFQUMzRDtBQUVBLFFBQU0sWUFBWSxxQkFBcUIsVUFBTSxtREFBcUIsNkNBQW9CLENBQUM7QUFFdkYsTUFBSSxDQUFDLDJCQUEyQjtBQUM5QixVQUFNLFVBQVUsZUFBZSxHQUFHO0FBQUEsRUFDcEM7QUFFQSxZQUFNLHdEQUE0QixXQUFXLEdBQUc7QUFFaEQsUUFBTSxzQkFBbUQ7QUFBQSxJQUN2RDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUksY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFNBQVMsRUFBRTtBQUFBLEVBQ2hFO0FBRUEsUUFBTSxpQkFBYSxxREFBc0IsbUJBQW1CO0FBRTVELFFBQU0sZUFBZSxNQUFNLFVBQVUsU0FBUyxZQUFZLEVBQUUsSUFBSSxDQUFDO0FBRWpFLE1BQUksaUJBQWlCLE1BQU0saUJBQWlCLFdBQVc7QUFDckQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osTUFBSTtBQUNGLGVBQVcsS0FBSyxNQUFNLFlBQVk7QUFBQSxFQUNwQyxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sc0RBQXNELFlBQVksRUFBRTtBQUFBLEVBQ3RGO0FBRUEsTUFBSSxVQUFVLFVBQVU7QUFDdEIsUUFBSSxTQUFTLFNBQVMsU0FBUztBQUk3QixZQUFNLGtCQUFrQixTQUFTLE1BQzlCLFdBQVcseUNBQXlDLDJCQUEyQjtBQUNsRixZQUFNLElBQUksTUFBTTtBQUFBLEVBQTJDLGVBQWUsRUFBRTtBQUFBLElBQzlFO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVM7QUFDbEI7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiXQp9Cg==
@@ -6,12 +6,12 @@
6
6
  import type { App, Editor, Modifier, TFile } from 'obsidian';
7
7
  import type * as obsidian from 'obsidian';
8
8
  import type { Promisable } from 'type-fest';
9
- import type { ContextArgs, ContextId } from './context-id.cjs';
9
+ import type { ContextArguments, ContextId } from './context-id.cjs';
10
10
  import type { ObsidianTransport } from './transport.cjs';
11
11
  /**
12
12
  * Common arguments automatically provided to every {@link evalInObsidian} callback.
13
13
  */
14
- export interface CommonArgs {
14
+ export interface CommonArguments {
15
15
  /**
16
16
  * The Obsidian {@link App} instance.
17
17
  */
@@ -34,7 +34,7 @@ export interface CommonArgs {
34
34
  obsidianModule: typeof obsidian;
35
35
  }
36
36
  /**
37
- * Parameters for {@link CommonArgs.createNote}.
37
+ * Parameters for {@link CommonArguments.createNote}.
38
38
  */
39
39
  export interface CreateNoteParams {
40
40
  /**
@@ -50,12 +50,11 @@ export interface CreateNoteParams {
50
50
  /**
51
51
  * Parameters for {@link evalInObsidian}.
52
52
  */
53
- export interface EvalInObsidianParams<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined> {
53
+ export interface EvalInObsidianParams<Input extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined> {
54
54
  /**
55
- * Additional arguments to pass to the function. Values may include functions —
56
- * they are serialized via `toString()`.
55
+ * The function to evaluate in the Obsidian context.
57
56
  */
58
- readonly args?: Args;
57
+ callback(input: CommonArguments & ContextArguments<TContextId> & Input): Promisable<Result>;
59
58
  /**
60
59
  * A {@link ContextId} linking this call to a persistent store on `window`
61
60
  * in the Obsidian process. The callback receives a typed `context` object
@@ -65,9 +64,10 @@ export interface EvalInObsidianParams<Args extends GenericObject, Result, TConte
65
64
  */
66
65
  readonly contextId?: TContextId;
67
66
  /**
68
- * The function to evaluate in the Obsidian context.
67
+ * Additional arguments to pass to the function. Values may include functions —
68
+ * they are serialized via `toString()`.
69
69
  */
70
- fn(args: Args & CommonArgs & ContextArgs<TContextId>): Promisable<Result>;
70
+ readonly input?: Input;
71
71
  /**
72
72
  * Skips pre-flight checks (vault registration, CLI availability).
73
73
  * Used internally by vault registration functions.
@@ -90,7 +90,7 @@ export interface EvalInObsidianParams<Args extends GenericObject, Result, TConte
90
90
  */
91
91
  export type GenericObject = Record<string, unknown>;
92
92
  /**
93
- * Parameters for {@link CommonArgs.hoverElement}.
93
+ * Parameters for {@link CommonArguments.hoverElement}.
94
94
  */
95
95
  export interface HoverElementParams {
96
96
  /**
@@ -102,7 +102,7 @@ export interface HoverElementParams {
102
102
  }
103
103
  /**
104
104
  * The shared library bag injected into every {@link evalInObsidian} callback as
105
- * {@link CommonArgs.lib}.
105
+ * {@link CommonArguments.lib}.
106
106
  *
107
107
  * Two layers compose into this one bag. The **base** — the harness-provided
108
108
  * renderer-driving helpers declared below (the trusted-input primitives and
@@ -281,7 +281,7 @@ export interface Lib {
281
281
  waitUntil(this: void, params: WaitUntilParams): Promise<void>;
282
282
  }
283
283
  /**
284
- * Parameters for {@link CommonArgs.moveMouse}.
284
+ * Parameters for {@link CommonArguments.moveMouse}.
285
285
  */
286
286
  export interface MoveMouseParams {
287
287
  /**
@@ -294,7 +294,7 @@ export interface MoveMouseParams {
294
294
  readonly y: number;
295
295
  }
296
296
  /**
297
- * Parameters for {@link CommonArgs.pressKey}.
297
+ * Parameters for {@link CommonArguments.pressKey}.
298
298
  */
299
299
  export interface PressKeyParams {
300
300
  /**
@@ -303,7 +303,7 @@ export interface PressKeyParams {
303
303
  * (`'Up'` / `'Down'` / `'Left'` / `'Right'`), or a printable character
304
304
  * (`'a'`, `'1'`). The produced character (when the key inserts text) is the
305
305
  * literal `key` value; case-correct text belongs to
306
- * {@link CommonArgs.typeIntoEditor}, not a key-press primitive.
306
+ * {@link CommonArguments.typeIntoEditor}, not a key-press primitive.
307
307
  */
308
308
  readonly key: string;
309
309
  /**
@@ -317,7 +317,7 @@ export interface PressKeyParams {
317
317
  readonly modifiers?: readonly Modifier[];
318
318
  }
319
319
  /**
320
- * Parameters for {@link CommonArgs.typeIntoEditor}.
320
+ * Parameters for {@link CommonArguments.typeIntoEditor}.
321
321
  */
322
322
  export interface TypeIntoEditorParams {
323
323
  /**
@@ -326,13 +326,13 @@ export interface TypeIntoEditorParams {
326
326
  */
327
327
  readonly editor: Editor;
328
328
  /**
329
- * The text to type. Each code point is pressed via {@link CommonArgs.pressKey}
329
+ * The text to type. Each code point is pressed via {@link CommonArguments.pressKey}
330
330
  * (a trusted `keyDown` → `char` → `keyUp`), exactly as a real user typing.
331
331
  */
332
332
  readonly text: string;
333
333
  }
334
334
  /**
335
- * Parameters for {@link CommonArgs.unhoverElement}.
335
+ * Parameters for {@link CommonArguments.unhoverElement}.
336
336
  */
337
337
  export interface UnhoverElementParams {
338
338
  /**
@@ -344,7 +344,7 @@ export interface UnhoverElementParams {
344
344
  readonly element: HTMLElement;
345
345
  }
346
346
  /**
347
- * Parameters for {@link CommonArgs.waitUntil}.
347
+ * Parameters for {@link CommonArguments.waitUntil}.
348
348
  */
349
349
  export interface WaitUntilParams {
350
350
  /**
@@ -377,15 +377,15 @@ export interface WaitUntilParams {
377
377
  * Evaluates a function inside the running Obsidian instance
378
378
  * via the active transport and returns the parsed result.
379
379
  *
380
- * The function receives an args object that includes `app`, `obsidianModule`,
381
- * `context`, and any additional `args` passed by the caller.
380
+ * The function receives an input object that includes `app`, `obsidianModule`,
381
+ * `context`, and any additional `input` passed by the caller.
382
382
  * It is serialized via `toString()` and invoked as an IIFE.
383
383
  * The function must be self-contained — closures over local variables will not work.
384
- * Pass any needed values as `args` — they are JSON-serialized and deserialized on the Obsidian side.
384
+ * Pass any needed values as `input` — they are JSON-serialized and deserialized on the Obsidian side.
385
385
  *
386
386
  * The result is `JSON.stringify`'d on the Obsidian side and parsed back.
387
387
  *
388
388
  * @param params - The parameters for the function to evaluate.
389
- * @returns A {@link Promise} that resolves to the return value of `fn`.
389
+ * @returns A {@link Promise} that resolves to the return value of `callback`.
390
390
  */
391
- export declare function evalInObsidian<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined>(params: EvalInObsidianParams<Args, Result, TContextId>): Promise<Result>;
391
+ export declare function evalInObsidian<Input extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined>(params: EvalInObsidianParams<Input, Result, TContextId>): Promise<Result>;