@dbx-tools/appkit 0.6.225 → 0.6.227

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.
package/README.md CHANGED
@@ -66,10 +66,12 @@ await appkit.createApp({
66
66
  });
67
67
  ```
68
68
 
69
- When `lakebase()` is present, auto-config resolves Lakebase Postgres connection
70
- settings and fills missing `PG*` / `LAKEBASE_*` variables. That avoids a startup
71
- race where the Lakebase plugin reads env before another async setup step can
72
- discover it.
69
+ When native `lakebase()` or beta `database()` is present, auto-config resolves
70
+ Lakebase Postgres connection settings and fills missing `PG*` /
71
+ `LAKEBASE_*` variables. That avoids a startup race where a plugin reads env
72
+ before another async setup step can discover it. A database-only app resolves
73
+ env without implicitly broadening cache-schema grants; AppKit's database plugin
74
+ owns its own pool.
73
75
 
74
76
  Auto-configuration is conservative: existing env vars win unless a caller passes
75
77
  explicit options, and local-only discovery is skipped inside a Databricks App
@@ -114,10 +116,10 @@ reason.
114
116
 
115
117
  `appkit.createApp()` accepts everything AppKit's `createApp` does, plus:
116
118
 
117
- | Option | Type | Default | Description |
118
- | --------------- | ------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
119
- | `autoConfigure` | `"provision" \| "env" \| false` | `"provision"` | What to run before AppKit boots. `"provision"` resolves the Lakebase connection into `process.env` and grants the AppKit cache schema; `"env"` resolves the connection only; `false` skips auto-configuration. Omit it to gate the default on a `lakebase` plugin being registered, or set it explicitly to run regardless. |
120
- | `interceptor` | `Interceptor \| Interceptor[]` | none | One or many callbacks handed an `InterceptorContext` after auto-config computes the env and before AppKit boots. The context carries the resolved env, `onLifecycle`, `onTeardown`, `broadcastSignal`, and globally shared `bindProcess` supervision. |
119
+ | Option | Type | Default | Description |
120
+ | --------------- | ------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
121
+ | `autoConfigure` | `"provision" \| "env" \| false` | `"provision"` | What to run before AppKit boots. `"provision"` resolves the Lakebase connection into `process.env` and grants the AppKit cache schema; `"env"` resolves the connection only; `false` skips auto-configuration. Omit it to gate resolution on native `lakebase` or `database`; implicit database-only resolution does not grant the cache schema. |
122
+ | `interceptor` | `Interceptor \| Interceptor[]` | none | One or many callbacks handed an `InterceptorContext` after auto-config computes the env and before AppKit boots. The context carries the resolved env, `onLifecycle`, `onTeardown`, `broadcastSignal`, and globally shared `bindProcess` supervision. |
121
123
 
122
124
  Set `autoConfigure` explicitly on an app that registers no `lakebase()` plugin but
123
125
  still wants AppKit's PERSISTENT cache. AppKit only chooses Lakebase for
@@ -329,6 +331,7 @@ is shared. `@dbx-tools/appkit-mastra` exposes this as its `genieIdentity` option
329
331
  | `databricks` | Databricks SDK context cancellation adapters. |
330
332
  | `interceptor` | Lifecycle bridging, teardown callbacks, and process-wide child supervision. |
331
333
  | `plugin` | Typed AppKit plugin data, instance, and required-instance lookup. |
334
+ | `toolkit` | Shared AppKit toolkit filtering, naming, and entry construction. |
332
335
  | `provision` | Cache schema provisioning helpers. |
333
336
  | `identity` | OBO-vs-service-principal request identity: modes, resolution, and the forwarded headers. |
334
337
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
6
- export const PACKAGE_VERSION = "0.6.225";
6
+ export const PACKAGE_VERSION = "0.6.227";
7
7
  export * as appkit from "./src/appkit.ts";
8
8
  export * as brand from "./src/brand.ts";
9
9
  export * as bundle from "./src/bundle.ts";
@@ -14,6 +14,7 @@ export * as lakebaseResolver from "./src/lakebase-resolver.ts";
14
14
  export * as pgaddress from "./src/pgaddress.ts";
15
15
  export * as plugin from "./src/plugin.ts";
16
16
  export * as provision from "./src/provision.ts";
17
+ export * as toolkit from "./src/toolkit.ts";
17
18
  export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
18
19
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
19
20
  export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
2
- export declare const PACKAGE_VERSION = "0.6.225";
2
+ export declare const PACKAGE_VERSION = "0.6.227";
3
3
  export * as appkit from "./src/appkit.ts";
4
4
  export * as brand from "./src/brand.ts";
5
5
  export * as bundle from "./src/bundle.ts";
@@ -10,6 +10,7 @@ export * as lakebaseResolver from "./src/lakebase-resolver.ts";
10
10
  export * as pgaddress from "./src/pgaddress.ts";
11
11
  export * as plugin from "./src/plugin.ts";
12
12
  export * as provision from "./src/provision.ts";
13
+ export * as toolkit from "./src/toolkit.ts";
13
14
  export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
14
15
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
15
16
  export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
5
- export const PACKAGE_VERSION = "0.6.225";
5
+ export const PACKAGE_VERSION = "0.6.227";
6
6
  export * as appkit from "./src/appkit.js";
7
7
  export * as brand from "./src/brand.js";
8
8
  export * as bundle from "./src/bundle.js";
@@ -13,8 +13,9 @@ export * as lakebaseResolver from "./src/lakebase-resolver.js";
13
13
  export * as pgaddress from "./src/pgaddress.js";
14
14
  export * as plugin from "./src/plugin.js";
15
15
  export * as provision from "./src/provision.js";
16
+ export * as toolkit from "./src/toolkit.js";
16
17
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.js";
17
18
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.js";
18
19
  export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
19
20
  export { SSL_MODES } from "./src/pgaddress.js";
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEksT0FBTyxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjI1XCI7XG5leHBvcnQgKiBhcyBhcHBraXQgZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0ICogYXMgYnJhbmQgZnJvbSBcIi4vc3JjL2JyYW5kLnRzXCI7XG5leHBvcnQgKiBhcyBidW5kbGUgZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0ICogYXMgZGF0YWJyaWNrcyBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBpbnRlcmNlcHRvciBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCAqIGFzIGxha2ViYXNlUmVzb2x2ZXIgZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5leHBvcnQgKiBhcyBwZ2FkZHJlc3MgZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3Zpc2lvbiBmcm9tIFwiLi9zcmMvcHJvdmlzaW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dG9Db25maWd1cmVNb2RlLCBDcmVhdGVBcHBDb25maWcsIEV4ZWN1dGlvbkNvbnRleHRMaWtlLCBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0IHsgYnVuZGxlQXBwUmVzb3VyY2VTY2hlbWEsIGZsYXR0ZW5BcHBZYW1sRW52LCBmbGF0dGVuQXBwRW52LCBnZXRCdW5kbGVQYXRoIH0gZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdW5kbGVWYWxpZGF0ZUpzb24sIENvbmZpZ0ZpbGUsIENvbmZpZ01hcFZhbHVlLCBDb25maWdTb3VyY2UsIFJlc29sdmVDb25maWdWYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IENvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZGVudGl0eU1vZGUsIEhlYWRlckJlYXJpbmcgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB7IExpZmVjeWNsZUJyaWRnZVBsdWdpbiwgbGlmZWN5Y2xlQnJpZGdlIH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyLCBSZXNvbHZlZEFwcEVudiwgQmluZGFibGVQcm9jZXNzLCBJbnRlcmNlcHRvckNvbnRleHQsIEludGVyY2VwdG9yLCBJbnRlcmNlcHRvclJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VSZXNvbHZlcklucHV0cywgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cywgUGFyc2VkQWRkcmVzcyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGx1Z2luQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG4iXX0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuNi4yMjdcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZCBmcm9tIFwiLi9zcmMvYnJhbmQudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VSZXNvbHZlciBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHBnYWRkcmVzcyBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvdmlzaW9uIGZyb20gXCIuL3NyYy9wcm92aXNpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xraXQgZnJvbSBcIi4vc3JjL3Rvb2xraXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0b0NvbmZpZ3VyZU1vZGUsIENyZWF0ZUFwcENvbmZpZywgRXhlY3V0aW9uQ29udGV4dExpa2UsIFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgeyBidW5kbGVBcHBSZXNvdXJjZVNjaGVtYSwgZmxhdHRlbkFwcFlhbWxFbnYsIGZsYXR0ZW5BcHBFbnYsIGdldEJ1bmRsZVBhdGggfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1bmRsZVZhbGlkYXRlSnNvbiwgQ29uZmlnRmlsZSwgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ1NvdXJjZSwgUmVzb2x2ZUNvbmZpZ1ZhbHVlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IElkZW50aXR5TW9kZSwgSGVhZGVyQmVhcmluZyB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luLCBsaWZlY3ljbGVCcmlkZ2UgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlRXZlbnQsIExpZmVjeWNsZUhhbmRsZXIsIFJlc29sdmVkQXBwRW52LCBCaW5kYWJsZVByb2Nlc3MsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB7IFNTTF9NT0RFUyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NsTW9kZSwgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLCBQYXJzZWRBZGRyZXNzIH0gZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQbHVnaW5Db250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import type { AutoConfigureMode } from "./appkit.ts";
2
+ /** Resolved automatic database-environment and cache-provisioning decision. */
3
+ export interface AutoConfigurePolicy {
4
+ mode: AutoConfigureMode | false;
5
+ explicit: boolean;
6
+ lakebasePluginPresent: boolean;
7
+ databasePluginPresent: boolean;
8
+ shouldResolve: boolean;
9
+ provision: boolean;
10
+ skippedReason?: "disabled" | "no database plugin";
11
+ }
12
+ /** Resolve database demand without constructing another native plugin or pool. */
13
+ export declare function resolveAutoConfigurePolicy(plugins: readonly string[], configured: AutoConfigureMode | false | undefined): AutoConfigurePolicy;
@@ -0,0 +1,24 @@
1
+ const LAKEBASE_PLUGIN = "lakebase";
2
+ const DATABASE_PLUGIN = "database";
3
+ /** Resolve database demand without constructing another native plugin or pool. */
4
+ export function resolveAutoConfigurePolicy(plugins, configured) {
5
+ const mode = configured ?? "provision";
6
+ const explicit = configured !== undefined;
7
+ const lakebasePluginPresent = plugins.includes(LAKEBASE_PLUGIN);
8
+ const databasePluginPresent = plugins.includes(DATABASE_PLUGIN);
9
+ const shouldResolve = mode !== false && (explicit || lakebasePluginPresent || databasePluginPresent);
10
+ return {
11
+ mode,
12
+ explicit,
13
+ lakebasePluginPresent,
14
+ databasePluginPresent,
15
+ shouldResolve,
16
+ provision: mode === "provision" && (explicit || lakebasePluginPresent),
17
+ ...(!shouldResolve
18
+ ? {
19
+ skippedReason: mode === false ? "disabled" : "no database plugin",
20
+ }
21
+ : {}),
22
+ };
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2F1dG8tY29uZmlndXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19hdXRvLWNvbmZpZ3VyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDbkMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBYW5DLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLE9BQTBCLEVBQzFCLFVBQWlEO0lBRWpELE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxXQUFXLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQztJQUMxQyxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEUsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sYUFBYSxHQUNqQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFxQixJQUFJLHFCQUFxQixDQUFDLENBQUM7SUFDakYsT0FBTztRQUNMLElBQUk7UUFDSixRQUFRO1FBQ1IscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQixhQUFhO1FBQ2IsU0FBUyxFQUFFLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUM7UUFDdEUsR0FBRyxDQUFDLENBQUMsYUFBYTtZQUNoQixDQUFDLENBQUM7Z0JBQ0UsYUFBYSxFQUFFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFFLFVBQW9CLENBQUMsQ0FBQyxDQUFFLG9CQUE4QjthQUN4RjtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXV0b0NvbmZpZ3VyZU1vZGUgfSBmcm9tIFwiLi9hcHBraXQudHNcIjtcblxuY29uc3QgTEFLRUJBU0VfUExVR0lOID0gXCJsYWtlYmFzZVwiO1xuY29uc3QgREFUQUJBU0VfUExVR0lOID0gXCJkYXRhYmFzZVwiO1xuXG4vKiogUmVzb2x2ZWQgYXV0b21hdGljIGRhdGFiYXNlLWVudmlyb25tZW50IGFuZCBjYWNoZS1wcm92aXNpb25pbmcgZGVjaXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9Db25maWd1cmVQb2xpY3kge1xuICBtb2RlOiBBdXRvQ29uZmlndXJlTW9kZSB8IGZhbHNlO1xuICBleHBsaWNpdDogYm9vbGVhbjtcbiAgbGFrZWJhc2VQbHVnaW5QcmVzZW50OiBib29sZWFuO1xuICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IGJvb2xlYW47XG4gIHNob3VsZFJlc29sdmU6IGJvb2xlYW47XG4gIHByb3Zpc2lvbjogYm9vbGVhbjtcbiAgc2tpcHBlZFJlYXNvbj86IFwiZGlzYWJsZWRcIiB8IFwibm8gZGF0YWJhc2UgcGx1Z2luXCI7XG59XG5cbi8qKiBSZXNvbHZlIGRhdGFiYXNlIGRlbWFuZCB3aXRob3V0IGNvbnN0cnVjdGluZyBhbm90aGVyIG5hdGl2ZSBwbHVnaW4gb3IgcG9vbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0b0NvbmZpZ3VyZVBvbGljeShcbiAgcGx1Z2luczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGNvbmZpZ3VyZWQ6IEF1dG9Db25maWd1cmVNb2RlIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4pOiBBdXRvQ29uZmlndXJlUG9saWN5IHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZ3VyZWQgPz8gXCJwcm92aXNpb25cIjtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25maWd1cmVkICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IGxha2ViYXNlUGx1Z2luUHJlc2VudCA9IHBsdWdpbnMuaW5jbHVkZXMoTEFLRUJBU0VfUExVR0lOKTtcbiAgY29uc3QgZGF0YWJhc2VQbHVnaW5QcmVzZW50ID0gcGx1Z2lucy5pbmNsdWRlcyhEQVRBQkFTRV9QTFVHSU4pO1xuICBjb25zdCBzaG91bGRSZXNvbHZlID1cbiAgICBtb2RlICE9PSBmYWxzZSAmJiAoZXhwbGljaXQgfHwgbGFrZWJhc2VQbHVnaW5QcmVzZW50IHx8IGRhdGFiYXNlUGx1Z2luUHJlc2VudCk7XG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBleHBsaWNpdCxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHNob3VsZFJlc29sdmUsXG4gICAgcHJvdmlzaW9uOiBtb2RlID09PSBcInByb3Zpc2lvblwiICYmIChleHBsaWNpdCB8fCBsYWtlYmFzZVBsdWdpblByZXNlbnQpLFxuICAgIC4uLighc2hvdWxkUmVzb2x2ZVxuICAgICAgPyB7XG4gICAgICAgICAgc2tpcHBlZFJlYXNvbjogbW9kZSA9PT0gZmFsc2UgPyAoXCJkaXNhYmxlZFwiIGFzIGNvbnN0KSA6IChcIm5vIGRhdGFiYXNlIHBsdWdpblwiIGFzIGNvbnN0KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH07XG59XG4iXX0=
@@ -13,7 +13,8 @@
13
13
  *
14
14
  * @module
15
15
  */
16
- import { type CacheConfig } from "@databricks/appkit";
16
+ import { createLakebasePool, type CacheConfig } from "@databricks/appkit";
17
+ type LakebasePool = ReturnType<typeof createLakebasePool>;
17
18
  type CacheStorage = NonNullable<CacheConfig["storage"]>;
18
19
  /** AppKit's internal persistent storage surface. */
19
20
  export type PersistentStorageBase = CacheStorage & {
@@ -22,6 +23,12 @@ export type PersistentStorageBase = CacheStorage & {
22
23
  schemaName?: string;
23
24
  tableName?: string;
24
25
  };
26
+ type PersistentStorageConstructor = new (config: CacheConfig, pool: LakebasePool) => PersistentStorageBase;
27
+ /**
28
+ * Lazily resolve AppKit's internal `PersistentStorage` constructor. `null`
29
+ * means not attempted yet; `undefined` means the lookup already failed.
30
+ */
31
+ export declare function loadPersistentStorage(): PersistentStorageConstructor | undefined;
25
32
  /** Soften `initialize()` so an ownership-only migration failure is not fatal. */
26
33
  export declare function softenInitialize(storage: PersistentStorageBase, skipMigrations?: () => Promise<boolean>): void;
27
34
  /** Verify the migrated cache table can serve the reads and writes AppKit needs. */
@@ -33,7 +33,7 @@ let persistentStorageCtor = null;
33
33
  * Lazily resolve AppKit's internal `PersistentStorage` constructor. `null`
34
34
  * means not attempted yet; `undefined` means the lookup already failed.
35
35
  */
36
- function loadPersistentStorage() {
36
+ export function loadPersistentStorage() {
37
37
  if (persistentStorageCtor !== null) {
38
38
  return persistentStorageCtor;
39
39
  }
@@ -164,4 +164,4 @@ export async function createSoftPersistentStorage(cache) {
164
164
  return undefined;
165
165
  }
166
166
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NhY2hlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLHVEQUF1RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFTLHlCQUF5QixDQUFDLEdBQVk7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBa0JELElBQUkscUJBQXFCLEdBQW9ELElBQUksQ0FBQztBQUVsRjs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQjtJQUM1QixJQUFJLHFCQUFxQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8scUJBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1B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QUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSBmb3IgQXBwS2l0J3MgcGVyc2lzdGVudCBjYWNoZS5cbiAqXG4gKiBBcHBLaXQncyBgUGVyc2lzdGVudFN0b3JhZ2UuaW5pdGlhbGl6ZSgpYCBydW5zIERETCBtaWdyYXRpb25zIGFuZCB0aHJvd3Mgb25cbiAqIGFueSBzdGVwIGZhaWx1cmUuIFdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOiB0cnVlYCB0aGF0IHRocm93IG1ha2VzXG4gKiBgQ2FjaGVNYW5hZ2VyYCBzaWxlbnRseSBkaXNhYmxlIHRoZSBjYWNoZS4gVGhpcyB3cmFwcyB0aGUgc2FtZSBzdG9yYWdlLFxuICogc3RpbGwgcnVucyBpdHMgbWlncmF0aW9ucywgYnV0IGxvZ3MgYSBmYWlsZWQgc3RlcCBpbnN0ZWFkIG9mIHRocm93aW5nIHNvIGFcbiAqIHVzYWJsZSB0YWJsZSBrZWVwcyBzZXJ2aW5nLlxuICpcbiAqIGBQZXJzaXN0ZW50U3RvcmFnZWAgaXMgbm90IG9uIEFwcEtpdCdzIHB1YmxpYyBleHBvcnQgbWFwLiBUaGUgZGVlcCBsb2FkIGlzXG4gKiBsYXp5IGFuZCBiZXN0LWVmZm9ydDogaWYgdGhlIGluc3RhbGxlZCBBcHBLaXQgbGF5b3V0IGNoYW5nZXMsIHRoaXMgcmV0dXJuc1xuICogYHVuZGVmaW5lZGAgYW5kIGBjcmVhdGVBcHBgIGxlYXZlcyBBcHBLaXQgb24gaXRzIGRlZmF1bHQgY2FjaGUgcGF0aC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUxha2ViYXNlUG9vbCwgZ2V0V29ya3NwYWNlQ2xpZW50LCB0eXBlIENhY2hlQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IsIGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjYWNoZS1zdG9yYWdlXCIpO1xuXG4vKiogUHJvY2Vzcy13aWRlIGRlZHVwZSBmb3Igc29mdCBtaWdyYXRpb24gd2FybmluZ3MuICovXG5jb25zdCBsb2dnZWRNaWdyYXRpb25FcnJvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIFdoZXRoZXIgYExPR19MRVZFTGAgaXMgY3VycmVudGx5IGF0IG9yIGJlbG93IGRlYnVnLiAqL1xuZnVuY3Rpb24gaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBsb2cuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtaWdyYXRpb24gZmFpbGVkIG9ubHkgYmVjYXVzZSB0aGlzIHJvbGUgZG9lcyBub3Qgb3duIGFuIGV4aXN0aW5nIG9iamVjdC4gKi9cbmZ1bmN0aW9uIGlzT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvci5lcnJvckNvbnRleHQoZXJyKS5oYXNNZXNzYWdlKFwibXVzdCBiZSBvd25lclwiKTtcbn1cblxudHlwZSBMYWtlYmFzZVBvb2wgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVMYWtlYmFzZVBvb2w+O1xudHlwZSBDYWNoZVN0b3JhZ2UgPSBOb25OdWxsYWJsZTxDYWNoZUNvbmZpZ1tcInN0b3JhZ2VcIl0+O1xuXG4vKiogQXBwS2l0J3MgaW50ZXJuYWwgcGVyc2lzdGVudCBzdG9yYWdlIHN1cmZhY2UuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW50U3RvcmFnZUJhc2UgPSBDYWNoZVN0b3JhZ2UgJiB7XG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPjtcbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIHNjaGVtYU5hbWU/OiBzdHJpbmc7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciA9IG5ldyAoXG4gIGNvbmZpZzogQ2FjaGVDb25maWcsXG4gIHBvb2w6IExha2ViYXNlUG9vbCxcbikgPT4gUGVyc2lzdGVudFN0b3JhZ2VCYXNlO1xuXG5sZXQgcGVyc2lzdGVudFN0b3JhZ2VDdG9yOiBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogTGF6aWx5IHJlc29sdmUgQXBwS2l0J3MgaW50ZXJuYWwgYFBlcnNpc3RlbnRTdG9yYWdlYCBjb25zdHJ1Y3Rvci4gYG51bGxgXG4gKiBtZWFucyBub3QgYXR0ZW1wdGVkIHlldDsgYHVuZGVmaW5lZGAgbWVhbnMgdGhlIGxvb2t1cCBhbHJlYWR5IGZhaWxlZC5cbiAqL1xuZnVuY3Rpb24gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk6IFBlcnNpc3RlbnRTdG9yYWdlQ29uc3RydWN0b3IgfCB1bmRlZmluZWQge1xuICBpZiAocGVyc2lzdGVudFN0b3JhZ2VDdG9yICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHBlcnNpc3RlbnRTdG9yYWdlQ3RvcjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IGpvaW4oXG4gICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKSksXG4gICAgICBcImNhY2hlL3N0b3JhZ2UvcGVyc2lzdGVudC5qc1wiLFxuICAgICk7XG4gICAgY29uc3QgbG9hZGVkID0gcmVxdWlyZShtb2R1bGVQYXRoKS5QZXJzaXN0ZW50U3RvcmFnZSBhc1xuICAgICAgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGxvYWRlZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc2tpcHBlZCAoUGVyc2lzdGVudFN0b3JhZ2UgbWlzc2luZylcIik7XG4gICAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSBsb2FkZWQ7XG4gICAgcmV0dXJuIGxvYWRlZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic29mdCBwZXJzaXN0ZW50IGNhY2hlIHNraXBwZWQgKFBlcnNpc3RlbnRTdG9yYWdlIHVuYXZhaWxhYmxlKVwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcGVyc2lzdGVudFN0b3JhZ2VDdG9yID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGV4aXN0aW5nIGNhY2hlIHRhYmxlIGJlbG9uZ3MgdG8gYW5vdGhlciByb2xlLlxuICpcbiAqIFBvc3RncmVTUUwgYWxsb3dzIGdyYW50ZWQgcmVhZHMvd3JpdGVzIGJ1dCByZXNlcnZlcyBpbmRleCBEREwgZm9yIHRoZSB0YWJsZVxuICogb3duZXIuIFNraXAgQXBwS2l0IG1pZ3JhdGlvbnMgaW4gdGhhdCBjYXNlOyB7QGxpbmsgcHJvYmVTdG9yYWdlfSBzdGlsbCBwcm92ZXNcbiAqIHRoZSBleGlzdGluZyB0YWJsZSBjYW4gc2VydmUgdGhlIGNhY2hlIGJlZm9yZSBpdCBpcyBhY2NlcHRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoXG4gIHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSxcbiAgcG9vbDogTGFrZWJhc2VQb29sLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3RvcmFnZS5zY2hlbWFOYW1lIHx8ICFzdG9yYWdlLnRhYmxlTmFtZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgIGBTRUxFQ1QgcGdfZ2V0X3VzZXJieWlkKGMucmVsb3duZXIpID0gY3VycmVudF91c2VyIEFTIG93bmVkXG4gICAgIEZST00gcGdfY2xhc3MgY1xuICAgICBKT0lOIHBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgV0hFUkUgbi5uc3BuYW1lID0gJDEgQU5EIGMucmVsbmFtZSA9ICQyIEFORCBjLnJlbGtpbmQgSU4gKCdyJywgJ3AnKWAsXG4gICAgW3N0b3JhZ2Uuc2NoZW1hTmFtZSwgc3RvcmFnZS50YWJsZU5hbWVdLFxuICApO1xuICBpZiAocmVzdWx0LnJvd3NbMF0/Lm93bmVkICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBsb2dnZXIud2FybihcInBlcnNpc3RlbnQgY2FjaGUgbWlncmF0aW9ucyBza2lwcGVkICh0YWJsZSBvd25lZCBieSBhbm90aGVyIHJvbGUpXCIsIHtcbiAgICBzY2hlbWE6IHN0b3JhZ2Uuc2NoZW1hTmFtZSxcbiAgICB0YWJsZTogc3RvcmFnZS50YWJsZU5hbWUsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFNvZnRlbiBgaW5pdGlhbGl6ZSgpYCBzbyBhbiBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZSBpcyBub3QgZmF0YWwuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdGVuSW5pdGlhbGl6ZShcbiAgc3RvcmFnZTogUGVyc2lzdGVudFN0b3JhZ2VCYXNlLFxuICBza2lwTWlncmF0aW9ucz86ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gc3RvcmFnZS5pbml0aWFsaXplLmJpbmQoc3RvcmFnZSk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc3RvcmFnZS5pbml0aWFsaXplID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdG9yYWdlLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgc2tpcE1pZ3JhdGlvbnM/LigpKSkgYXdhaXQgb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycikpIHRocm93IGVycjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICBpZiAoIWxvZ2dlZE1pZ3JhdGlvbkVycm9ycy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgICBsb2dnZWRNaWdyYXRpb25FcnJvcnMuYWRkKG1lc3NhZ2UpO1xuICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzdG9yYWdlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBWZXJpZnkgdGhlIG1pZ3JhdGVkIGNhY2hlIHRhYmxlIGNhbiBzZXJ2ZSB0aGUgcmVhZHMgYW5kIHdyaXRlcyBBcHBLaXQgbmVlZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTdG9yYWdlKHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXkgPSBgZGJ4LXRvb2xzOmNhY2hlLXByb2JlOiR7aGFzaC5pZCgpfWA7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCB7IHZhbHVlOiBrZXksIGV4cGlyeTogRGF0ZS5ub3coKSArIDYwXzAwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmIChyZXN1bHQ/LnZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBlcnNpc3RlbnQgY2FjaGUgcHJvYmUgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc3RvcmFnZS5kZWxldGUoa2V5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBzb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSB3aGVuIGEgcG9vbCBjYW4gYmUgY3JlYXRlZCBhbmRcbiAqIEFwcEtpdCdzIFBlcnNpc3RlbnRTdG9yYWdlIGNhbiBiZSBsb2FkZWQuIFJldHVybnMgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIHNvXG4gKiBBcHBLaXQgY2FuIGZhbGwgdGhyb3VnaCB0byBpdHMgbm9ybWFsIGNhY2hlIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UoXG4gIGNhY2hlOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8Q2FjaGVTdG9yYWdlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFBlcnNpc3RlbnRTdG9yYWdlID0gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk7XG4gIGlmICghUGVyc2lzdGVudFN0b3JhZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IHBvb2w6IExha2ViYXNlUG9vbCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkUG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7IHdvcmtzcGFjZUNsaWVudDogZ2V0V29ya3NwYWNlQ2xpZW50KHt9KSB9KTtcbiAgICBwb29sID0gY3JlYXRlZFBvb2w7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBQZXJzaXN0ZW50U3RvcmFnZShjYWNoZSA/PyB7fSwgY3JlYXRlZFBvb2wpO1xuICAgIHNvZnRlbkluaXRpYWxpemUoc3RvcmFnZSwgKCkgPT4gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoc3RvcmFnZSwgY3JlYXRlZFBvb2wpKTtcbiAgICBpZiAoIShhd2FpdCBzdG9yYWdlLmhlYWx0aENoZWNrKCkpKSB7XG4gICAgICBhd2FpdCBzdG9yYWdlLmNsb3NlKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXdhaXQgc3RvcmFnZS5pbml0aWFsaXplKCk7XG4gICAgYXdhaXQgcHJvYmVTdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgdW5hdmFpbGFibGVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIGlmIChwb29sKSB7XG4gICAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NhY2hlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLHVEQUF1RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFTLHlCQUF5QixDQUFDLEdBQVk7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBa0JELElBQUkscUJBQXFCLEdBQW9ELElBQUksQ0FBQztBQUVsRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLElBQUkscUJBQXFCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFD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bkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvZnQtZmFpbCBMYWtlYmFzZSBjYWNoZSBzdG9yYWdlIGZvciBBcHBLaXQncyBwZXJzaXN0ZW50IGNhY2hlLlxuICpcbiAqIEFwcEtpdCdzIGBQZXJzaXN0ZW50U3RvcmFnZS5pbml0aWFsaXplKClgIHJ1bnMgRERMIG1pZ3JhdGlvbnMgYW5kIHRocm93cyBvblxuICogYW55IHN0ZXAgZmFpbHVyZS4gV2l0aCBgY2FjaGUuc3RyaWN0UGVyc2lzdGVuY2U6IHRydWVgIHRoYXQgdGhyb3cgbWFrZXNcbiAqIGBDYWNoZU1hbmFnZXJgIHNpbGVudGx5IGRpc2FibGUgdGhlIGNhY2hlLiBUaGlzIHdyYXBzIHRoZSBzYW1lIHN0b3JhZ2UsXG4gKiBzdGlsbCBydW5zIGl0cyBtaWdyYXRpb25zLCBidXQgbG9ncyBhIGZhaWxlZCBzdGVwIGluc3RlYWQgb2YgdGhyb3dpbmcgc28gYVxuICogdXNhYmxlIHRhYmxlIGtlZXBzIHNlcnZpbmcuXG4gKlxuICogYFBlcnNpc3RlbnRTdG9yYWdlYCBpcyBub3Qgb24gQXBwS2l0J3MgcHVibGljIGV4cG9ydCBtYXAuIFRoZSBkZWVwIGxvYWQgaXNcbiAqIGxhenkgYW5kIGJlc3QtZWZmb3J0OiBpZiB0aGUgaW5zdGFsbGVkIEFwcEtpdCBsYXlvdXQgY2hhbmdlcywgdGhpcyByZXR1cm5zXG4gKiBgdW5kZWZpbmVkYCBhbmQgYGNyZWF0ZUFwcGAgbGVhdmVzIEFwcEtpdCBvbiBpdHMgZGVmYXVsdCBjYWNoZSBwYXRoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlTGFrZWJhc2VQb29sLCBnZXRXb3Jrc3BhY2VDbGllbnQsIHR5cGUgQ2FjaGVDb25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciwgaGFzaCwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNhY2hlLXN0b3JhZ2VcIik7XG5cbi8qKiBQcm9jZXNzLXdpZGUgZGVkdXBlIGZvciBzb2Z0IG1pZ3JhdGlvbiB3YXJuaW5ncy4gKi9cbmNvbnN0IGxvZ2dlZE1pZ3JhdGlvbkVycm9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKiogV2hldGhlciBgTE9HX0xFVkVMYCBpcyBjdXJyZW50bHkgYXQgb3IgYmVsb3cgZGVidWcuICovXG5mdW5jdGlvbiBpc0RlYnVnRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpO1xufVxuXG4vKiogV2hldGhlciBhIG1pZ3JhdGlvbiBmYWlsZWQgb25seSBiZWNhdXNlIHRoaXMgcm9sZSBkb2VzIG5vdCBvd24gYW4gZXhpc3Rpbmcgb2JqZWN0LiAqL1xuZnVuY3Rpb24gaXNPd25lcnNoaXBNaWdyYXRpb25FcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yLmVycm9yQ29udGV4dChlcnIpLmhhc01lc3NhZ2UoXCJtdXN0IGJlIG93bmVyXCIpO1xufVxuXG50eXBlIExha2ViYXNlUG9vbCA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUxha2ViYXNlUG9vbD47XG50eXBlIENhY2hlU3RvcmFnZSA9IE5vbk51bGxhYmxlPENhY2hlQ29uZmlnW1wic3RvcmFnZVwiXT47XG5cbi8qKiBBcHBLaXQncyBpbnRlcm5hbCBwZXJzaXN0ZW50IHN0b3JhZ2Ugc3VyZmFjZS4gKi9cbmV4cG9ydCB0eXBlIFBlcnNpc3RlbnRTdG9yYWdlQmFzZSA9IENhY2hlU3RvcmFnZSAmIHtcbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+O1xuICBpbml0aWFsaXplZDogYm9vbGVhbjtcbiAgc2NoZW1hTmFtZT86IHN0cmluZztcbiAgdGFibGVOYW1lPzogc3RyaW5nO1xufTtcblxudHlwZSBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yID0gbmV3IChcbiAgY29uZmlnOiBDYWNoZUNvbmZpZyxcbiAgcG9vbDogTGFrZWJhc2VQb29sLFxuKSA9PiBQZXJzaXN0ZW50U3RvcmFnZUJhc2U7XG5cbmxldCBwZXJzaXN0ZW50U3RvcmFnZUN0b3I6IFBlcnNpc3RlbnRTdG9yYWdlQ29uc3RydWN0b3IgfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBMYXppbHkgcmVzb2x2ZSBBcHBLaXQncyBpbnRlcm5hbCBgUGVyc2lzdGVudFN0b3JhZ2VgIGNvbnN0cnVjdG9yLiBgbnVsbGBcbiAqIG1lYW5zIG5vdCBhdHRlbXB0ZWQgeWV0OyBgdW5kZWZpbmVkYCBtZWFucyB0aGUgbG9va3VwIGFscmVhZHkgZmFpbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk6IFBlcnNpc3RlbnRTdG9yYWdlQ29uc3RydWN0b3IgfCB1bmRlZmluZWQge1xuICBpZiAocGVyc2lzdGVudFN0b3JhZ2VDdG9yICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHBlcnNpc3RlbnRTdG9yYWdlQ3RvcjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IGpvaW4oXG4gICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKSksXG4gICAgICBcImNhY2hlL3N0b3JhZ2UvcGVyc2lzdGVudC5qc1wiLFxuICAgICk7XG4gICAgY29uc3QgbG9hZGVkID0gcmVxdWlyZShtb2R1bGVQYXRoKS5QZXJzaXN0ZW50U3RvcmFnZSBhc1xuICAgICAgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGxvYWRlZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc2tpcHBlZCAoUGVyc2lzdGVudFN0b3JhZ2UgbWlzc2luZylcIik7XG4gICAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSBsb2FkZWQ7XG4gICAgcmV0dXJuIGxvYWRlZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic29mdCBwZXJzaXN0ZW50IGNhY2hlIHNraXBwZWQgKFBlcnNpc3RlbnRTdG9yYWdlIHVuYXZhaWxhYmxlKVwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcGVyc2lzdGVudFN0b3JhZ2VDdG9yID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGV4aXN0aW5nIGNhY2hlIHRhYmxlIGJlbG9uZ3MgdG8gYW5vdGhlciByb2xlLlxuICpcbiAqIFBvc3RncmVTUUwgYWxsb3dzIGdyYW50ZWQgcmVhZHMvd3JpdGVzIGJ1dCByZXNlcnZlcyBpbmRleCBEREwgZm9yIHRoZSB0YWJsZVxuICogb3duZXIuIFNraXAgQXBwS2l0IG1pZ3JhdGlvbnMgaW4gdGhhdCBjYXNlOyB7QGxpbmsgcHJvYmVTdG9yYWdlfSBzdGlsbCBwcm92ZXNcbiAqIHRoZSBleGlzdGluZyB0YWJsZSBjYW4gc2VydmUgdGhlIGNhY2hlIGJlZm9yZSBpdCBpcyBhY2NlcHRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoXG4gIHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSxcbiAgcG9vbDogTGFrZWJhc2VQb29sLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3RvcmFnZS5zY2hlbWFOYW1lIHx8ICFzdG9yYWdlLnRhYmxlTmFtZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgIGBTRUxFQ1QgcGdfZ2V0X3VzZXJieWlkKGMucmVsb3duZXIpID0gY3VycmVudF91c2VyIEFTIG93bmVkXG4gICAgIEZST00gcGdfY2xhc3MgY1xuICAgICBKT0lOIHBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgV0hFUkUgbi5uc3BuYW1lID0gJDEgQU5EIGMucmVsbmFtZSA9ICQyIEFORCBjLnJlbGtpbmQgSU4gKCdyJywgJ3AnKWAsXG4gICAgW3N0b3JhZ2Uuc2NoZW1hTmFtZSwgc3RvcmFnZS50YWJsZU5hbWVdLFxuICApO1xuICBpZiAocmVzdWx0LnJvd3NbMF0/Lm93bmVkICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBsb2dnZXIud2FybihcInBlcnNpc3RlbnQgY2FjaGUgbWlncmF0aW9ucyBza2lwcGVkICh0YWJsZSBvd25lZCBieSBhbm90aGVyIHJvbGUpXCIsIHtcbiAgICBzY2hlbWE6IHN0b3JhZ2Uuc2NoZW1hTmFtZSxcbiAgICB0YWJsZTogc3RvcmFnZS50YWJsZU5hbWUsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFNvZnRlbiBgaW5pdGlhbGl6ZSgpYCBzbyBhbiBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZSBpcyBub3QgZmF0YWwuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdGVuSW5pdGlhbGl6ZShcbiAgc3RvcmFnZTogUGVyc2lzdGVudFN0b3JhZ2VCYXNlLFxuICBza2lwTWlncmF0aW9ucz86ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gc3RvcmFnZS5pbml0aWFsaXplLmJpbmQoc3RvcmFnZSk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc3RvcmFnZS5pbml0aWFsaXplID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdG9yYWdlLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgc2tpcE1pZ3JhdGlvbnM/LigpKSkgYXdhaXQgb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycikpIHRocm93IGVycjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICBpZiAoIWxvZ2dlZE1pZ3JhdGlvbkVycm9ycy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgICBsb2dnZWRNaWdyYXRpb25FcnJvcnMuYWRkKG1lc3NhZ2UpO1xuICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzdG9yYWdlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBWZXJpZnkgdGhlIG1pZ3JhdGVkIGNhY2hlIHRhYmxlIGNhbiBzZXJ2ZSB0aGUgcmVhZHMgYW5kIHdyaXRlcyBBcHBLaXQgbmVlZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTdG9yYWdlKHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXkgPSBgZGJ4LXRvb2xzOmNhY2hlLXByb2JlOiR7aGFzaC5pZCgpfWA7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCB7IHZhbHVlOiBrZXksIGV4cGlyeTogRGF0ZS5ub3coKSArIDYwXzAwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmIChyZXN1bHQ/LnZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBlcnNpc3RlbnQgY2FjaGUgcHJvYmUgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc3RvcmFnZS5kZWxldGUoa2V5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBzb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSB3aGVuIGEgcG9vbCBjYW4gYmUgY3JlYXRlZCBhbmRcbiAqIEFwcEtpdCdzIFBlcnNpc3RlbnRTdG9yYWdlIGNhbiBiZSBsb2FkZWQuIFJldHVybnMgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIHNvXG4gKiBBcHBLaXQgY2FuIGZhbGwgdGhyb3VnaCB0byBpdHMgbm9ybWFsIGNhY2hlIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UoXG4gIGNhY2hlOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8Q2FjaGVTdG9yYWdlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFBlcnNpc3RlbnRTdG9yYWdlID0gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk7XG4gIGlmICghUGVyc2lzdGVudFN0b3JhZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IHBvb2w6IExha2ViYXNlUG9vbCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkUG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7IHdvcmtzcGFjZUNsaWVudDogZ2V0V29ya3NwYWNlQ2xpZW50KHt9KSB9KTtcbiAgICBwb29sID0gY3JlYXRlZFBvb2w7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBQZXJzaXN0ZW50U3RvcmFnZShjYWNoZSA/PyB7fSwgY3JlYXRlZFBvb2wpO1xuICAgIHNvZnRlbkluaXRpYWxpemUoc3RvcmFnZSwgKCkgPT4gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoc3RvcmFnZSwgY3JlYXRlZFBvb2wpKTtcbiAgICBpZiAoIShhd2FpdCBzdG9yYWdlLmhlYWx0aENoZWNrKCkpKSB7XG4gICAgICBhd2FpdCBzdG9yYWdlLmNsb3NlKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXdhaXQgc3RvcmFnZS5pbml0aWFsaXplKCk7XG4gICAgYXdhaXQgcHJvYmVTdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgdW5hdmFpbGFibGVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIGlmIChwb29sKSB7XG4gICAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -14,9 +14,9 @@
14
14
  * ```
15
15
  *
16
16
  * Auto-configuration runs BEFORE delegating so plugins see a fully populated
17
- * `process.env` during their synchronous `setup()`. Lakebase Postgres runs when
18
- * a `lakebase` plugin is present, or when {@link AutoConfigureMode} is set
19
- * explicitly on the config object.
17
+ * `process.env` during their synchronous `setup()`. Lakebase Postgres resolution
18
+ * runs when a native `lakebase` or `database` plugin is present, or when
19
+ * {@link AutoConfigureMode} is set explicitly on the config object.
20
20
  *
21
21
  * `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
22
22
  * client + request metadata; the wrappers here make it safe to call outside a
@@ -39,9 +39,11 @@ type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
39
39
  * grant the AppKit cache schema to the connecting role.
40
40
  * - `"env"`: resolve the Lakebase connection into `process.env` only.
41
41
  *
42
- * Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
43
- * set it explicitly to run regardless of the plugin list, or pass `false` to
44
- * skip auto-configuration entirely.
42
+ * Omit it to resolve database environment when a native `lakebase` or
43
+ * `database` plugin is registered. Implicit cache-schema grants remain gated on
44
+ * `lakebase`; `database` owns its own pool and does not broaden grants. Set the
45
+ * mode explicitly to run regardless of the plugin list, or pass `false` to skip
46
+ * auto-configuration entirely.
45
47
  *
46
48
  * Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
47
49
  * AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
@@ -70,9 +72,9 @@ export type CreateAppConfig<T extends AppKitPlugins = AppKitPlugins> = Omit<AppK
70
72
  * Run enabled auto-configuration steps without calling AppKit's `createApp`.
71
73
  *
72
74
  * Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
73
- * explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
74
- * cancels the resolution; it is combined with an internal boot timeout either
75
- * way.
75
+ * explicitly or a native `lakebase`/`database` plugin is listed in
76
+ * `config.plugins`. `signal` cancels the resolution; it is combined with an
77
+ * internal boot timeout either way.
76
78
  *
77
79
  * @example
78
80
  * import { appkit } from "@dbx-tools/appkit";
package/lib/src/appkit.js CHANGED
@@ -14,9 +14,9 @@
14
14
  * ```
15
15
  *
16
16
  * Auto-configuration runs BEFORE delegating so plugins see a fully populated
17
- * `process.env` during their synchronous `setup()`. Lakebase Postgres runs when
18
- * a `lakebase` plugin is present, or when {@link AutoConfigureMode} is set
19
- * explicitly on the config object.
17
+ * `process.env` during their synchronous `setup()`. Lakebase Postgres resolution
18
+ * runs when a native `lakebase` or `database` plugin is present, or when
19
+ * {@link AutoConfigureMode} is set explicitly on the config object.
20
20
  *
21
21
  * `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
22
22
  * client + request metadata; the wrappers here make it safe to call outside a
@@ -28,6 +28,7 @@
28
28
  */
29
29
  import { createApp as appkitCreateApp, getExecutionContext, InitializationError, } from "@databricks/appkit";
30
30
  import { async, log } from "@dbx-tools/shared-core";
31
+ import { resolveAutoConfigurePolicy } from "./_auto-configure.js";
31
32
  import { createSoftPersistentStorage } from "./_cache-storage.js";
32
33
  import { loadBrandContext } from "./brand.js";
33
34
  import { createInterceptorContext, lifecycleBridge, } from "./interceptor.js";
@@ -35,7 +36,6 @@ import { applyLakebaseEnv } from "./lakebase-resolver.js";
35
36
  import { provisionCacheSchema } from "./provision.js";
36
37
  const logger = log.logger("appkit");
37
38
  const LAKEBASE_PLUGIN = "lakebase";
38
- const DEFAULT_AUTO_CONFIGURE = "provision";
39
39
  /**
40
40
  * Upper bound on boot-time auto-configuration. It runs as the service principal
41
41
  * before any plugin is constructed, so it sits outside AppKit's interceptor
@@ -55,9 +55,9 @@ function pluginNames(config) {
55
55
  * Run enabled auto-configuration steps without calling AppKit's `createApp`.
56
56
  *
57
57
  * Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
58
- * explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
59
- * cancels the resolution; it is combined with an internal boot timeout either
60
- * way.
58
+ * explicitly or a native `lakebase`/`database` plugin is listed in
59
+ * `config.plugins`. `signal` cancels the resolution; it is combined with an
60
+ * internal boot timeout either way.
61
61
  *
62
62
  * @example
63
63
  * import { appkit } from "@dbx-tools/appkit";
@@ -66,42 +66,46 @@ function pluginNames(config) {
66
66
  * await appkit.autoConfigure({ autoConfigure: "env" });
67
67
  */
68
68
  export async function autoConfigure(config, signal) {
69
- const mode = config?.autoConfigure ?? DEFAULT_AUTO_CONFIGURE;
70
- const explicit = config?.autoConfigure !== undefined;
71
- const lakebasePluginPresent = usesPlugin(config, LAKEBASE_PLUGIN);
72
69
  const plugins = pluginNames(config);
70
+ const policy = resolveAutoConfigurePolicy(plugins, config?.autoConfigure);
73
71
  logger.debug("autoConfigure: start", {
74
- mode,
75
- explicit,
76
- lakebasePluginPresent,
72
+ ...policy,
77
73
  plugins,
78
74
  timeoutMs: AUTO_CONFIGURE_TIMEOUT_MS,
79
75
  callerSignal: Boolean(signal),
80
76
  });
81
- if (mode === false || !(explicit || lakebasePluginPresent)) {
82
- const skippedReason = mode === false ? "disabled" : "no lakebase plugin";
83
- logger.debug("autoConfigure: skip", { skippedReason, mode, lakebasePluginPresent, plugins });
77
+ if (!policy.shouldResolve) {
78
+ logger.debug("autoConfigure: skip", { ...policy, plugins });
84
79
  logger.info("ready", {
85
- autoConfigure: mode,
86
- lakebasePluginPresent,
80
+ autoConfigure: policy.mode,
81
+ lakebasePluginPresent: policy.lakebasePluginPresent,
82
+ databasePluginPresent: policy.databasePluginPresent,
87
83
  provisioned: false,
88
- skippedReason,
84
+ skippedReason: policy.skippedReason,
89
85
  });
90
86
  return undefined;
91
87
  }
92
88
  const controller = new AbortController();
93
89
  async.tieAbortSignal(controller, signal);
94
90
  async.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
95
- const provision = mode === "provision";
96
- logger.debug("autoConfigure: resolve lakebase", { provision, mode });
97
- const resolved = await autoConfigureLakebase(provision, controller.signal);
91
+ logger.debug("autoConfigure: resolve lakebase", {
92
+ provision: policy.provision,
93
+ mode: policy.mode,
94
+ });
95
+ const resolved = await autoConfigureLakebase(policy.provision, controller.signal);
98
96
  logger.debug("autoConfigure: done", {
99
- mode,
100
- lakebasePluginPresent,
101
- provisioned: provision,
97
+ mode: policy.mode,
98
+ lakebasePluginPresent: policy.lakebasePluginPresent,
99
+ databasePluginPresent: policy.databasePluginPresent,
100
+ provisioned: policy.provision,
102
101
  ...redactLakebaseConnection(resolved),
103
102
  });
104
- logger.info("ready", { autoConfigure: mode, lakebasePluginPresent, provisioned: provision });
103
+ logger.info("ready", {
104
+ autoConfigure: policy.mode,
105
+ lakebasePluginPresent: policy.lakebasePluginPresent,
106
+ databasePluginPresent: policy.databasePluginPresent,
107
+ provisioned: policy.provision,
108
+ });
105
109
  return resolved;
106
110
  }
107
111
  /**
@@ -304,4 +308,4 @@ export async function ensureInitialized() {
304
308
  await createApp({ plugins: [], autoConfigure: false });
305
309
  logger.debug("ensureInitialized: done");
306
310
  }
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQ0wsd0JBQXdCLEVBR3hCLGVBQWUsR0FFaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQTRDcEMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQXNCLFdBQVcsQ0FBQztBQUU5RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFFOUMsU0FBUyxVQUFVLENBQ2pCLE1BQXNDLEVBQ3RDLElBQVk7SUFFWixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsU0FBUyxXQUFXLENBQUMsTUFBbUM7SUFDdEQsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsTUFBMkIsRUFDM0IsTUFBb0I7SUFFcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLGFBQWEsSUFBSSxzQkFBc0IsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsYUFBYSxLQUFLLFNBQVMsQ0FBQztJQUNyRCxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUU7UUFDbkMsSUFBSTtRQUNKLFFBQVE7UUFDUixxQkFBcUI7UUFDckIsT0FBTztRQUNQLFNBQVMsRUFBRSx5QkFBeUI7UUFDcEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDOUIsQ0FBQyxDQUFDO0lBRUgsSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUM7UUFDekUsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNuQixhQUFhLEVBQUUsSUFBSTtZQUNuQixxQkFBcUI7WUFDckIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBRWpGLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxXQUFXLENBQUM7SUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0scUJBQXFCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO1FBQ2xDLElBQUk7UUFDSixxQkFBcUI7UUFDckIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7S0FDdEMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsU0FBa0IsRUFDbEIsTUFBbUI7SUFFbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRTtRQUNqRCxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztRQUNyQyxJQUFJO1FBQ0osR0FBRyxFQUFFO1lBQ0gsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7WUFDaEQsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtZQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQzFCLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFDbEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtZQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1NBQ2pDO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNuRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywrQkFBK0IsQ0FDdEMsTUFBbUMsRUFDbkMsUUFBd0M7SUFFeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQztJQUM1QixJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNDLElBQUksS0FBSyxFQUFFLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNqQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFFBQTRCO0lBQzVELE9BQU87UUFDTCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7UUFDM0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87S0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxjQUFjLENBQUMsUUFBd0M7SUFDOUQsT0FBTztRQUNMLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4RixDQUFDO0FBQ0osQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLGVBQWUsQ0FBQyxXQUEyQztJQUNsRSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzVCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixNQUEyQjtJQUUzQixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRCxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFO1FBQy9CLE9BQU87UUFDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDM0IsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLE1BQU07UUFDckMsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLElBQUksV0FBVztRQUNuRCxpQkFBaUIsRUFBRSxPQUFPLE1BQU0sRUFBRSxjQUFjLEtBQUssVUFBVTtLQUNoRSxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDekMsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRTtRQUNoRCxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNwRSxDQUFDLENBQUM7SUFFSCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDaEMsT0FBTyxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQy9CLE9BQU8sU0FBUyxDQUFDLFdBQVcsQ0FBQztJQUU3QixJQUFJLCtCQUErQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDakUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyw0REFBNEQsRUFBRTtZQUN6RSxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQztTQUNoQyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBSSxTQUFTLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFO1lBQ25ELFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDdEMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELCtFQUErRTtJQUMvRSwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFO1FBQzdDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLE1BQU07S0FDdEMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQXVCLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sWUFBWSxDQUFDLENBQUMsQ0FBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELCtFQUErRTtJQUMvRSxpRkFBaUY7SUFDakYsMkRBQTJEO0lBQzNELFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFpQixDQUFDO0lBQ2pHLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0VBQXNFLEVBQUU7UUFDbkYsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUM7S0FDaEMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUksU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRTtRQUNuRCxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0tBQ3RDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFtQkQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLHNCQUFzQixFQUFFLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDM0QsTUFBTSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcnVudGltZSBnbHVlOiB0aGUgYXV0by1jb25maWd1cmluZyBgY3JlYXRlQXBwYCBkcm9wLWluLCBwbHVzIHRoZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgaGVscGVycyBhbmQgdHlwZXMgZGVyaXZlZCBmcm9tIGl0LlxuICpcbiAqIGBjcmVhdGVBcHBgIHJ1bnMgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiwgdGhlbiBkZWxlZ2F0ZXMgdG8gQXBwS2l0J3Mgb3duXG4gKiBgY3JlYXRlQXBwYCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgdGhlIHNhbWUgdHlwZWQgcGx1Z2luLWV4cG9ydCBtYXAuXG4gKiBEcm9wIGl0IGluIGFzIGEgb25lLWZvci1vbmUgcmVwbGFjZW1lbnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGxha2ViYXNlLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEF1dG8tY29uZmlndXJhdGlvbiBydW5zIEJFRk9SRSBkZWxlZ2F0aW5nIHNvIHBsdWdpbnMgc2VlIGEgZnVsbHkgcG9wdWxhdGVkXG4gKiBgcHJvY2Vzcy5lbnZgIGR1cmluZyB0aGVpciBzeW5jaHJvbm91cyBgc2V0dXAoKWAuIExha2ViYXNlIFBvc3RncmVzIHJ1bnMgd2hlblxuICogYSBgbGFrZWJhc2VgIHBsdWdpbiBpcyBwcmVzZW50LCBvciB3aGVuIHtAbGluayBBdXRvQ29uZmlndXJlTW9kZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9uIHRoZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIGlzIEFwcEtpdCdzIG93biBhY2Nlc3NvciBmb3IgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gKiBjbGllbnQgKyByZXF1ZXN0IG1ldGFkYXRhOyB0aGUgd3JhcHBlcnMgaGVyZSBtYWtlIGl0IHNhZmUgdG8gY2FsbCBvdXRzaWRlIGFcbiAqIHJlcXVlc3Qgc2NvcGUgKHtAbGluayB0cnlHZXRFeGVjdXRpb25Db250ZXh0fSkgYW5kIHRvIGxhemlseSBib290IGEgYmFyZSBhcHBcbiAqICh7QGxpbmsgZW5zdXJlSW5pdGlhbGl6ZWR9KSwgYW5kIHJlLWV4cG9ydCB0aGUgZGVyaXZlZCB0eXBlcyBzbyBhZGQtb25cbiAqIHBhY2thZ2VzIGNhbiB0eXBlIGEgY29udGV4dCAvIGNsaWVudCB3aXRob3V0IHJlLWRlcml2aW5nIHRoZW0gaW5saW5lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVBcHAgYXMgYXBwa2l0Q3JlYXRlQXBwLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBJbml0aWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4vLyBBcHBLaXQncyByb290IGJhcnJlbCByZS1leHBvcnRzIGBQbHVnaW5EYXRhYCBidXQgbm90IGBQbHVnaW5NYXBgOyB0aGUgcGFja2FnZVxuLy8gcHVibGlzaGVzIHRoaXMgc3VicGF0aCBmb3IgZXhhY3RseSB0aGF0IHR5cGUuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvZGlzdC9zaGFyZWQvc3JjL3BsdWdpblwiO1xuaW1wb3J0IHsgYXN5bmMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IGNyZWF0ZVNvZnRQZXJzaXN0ZW50U3RvcmFnZSB9IGZyb20gXCIuL19jYWNoZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBsb2FkQnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vYnJhbmQudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dCxcbiAgdHlwZSBJbnRlcmNlcHRvcixcbiAgdHlwZSBJbnRlcmNlcHRvclJ1bnRpbWUsXG4gIGxpZmVjeWNsZUJyaWRnZSxcbiAgdHlwZSBSZXNvbHZlZEFwcEVudixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3IudHNcIjtcbmltcG9ydCB7IGFwcGx5TGFrZWJhc2VFbnYsIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvbkNhY2hlU2NoZW1hIH0gZnJvbSBcIi4vcHJvdmlzaW9uLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5cbnR5cGUgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgYXBwa2l0Q3JlYXRlQXBwPlswXT47XG50eXBlIEFwcEtpdFBsdWdpbnMgPSBOb25OdWxsYWJsZTxBcHBLaXRDcmVhdGVBcHBDb25maWdbXCJwbHVnaW5zXCJdPjtcblxuLyoqXG4gKiBXaGF0IGF1dG8tY29uZmlndXJhdGlvbiBkb2VzIGJlZm9yZSBBcHBLaXQgYm9vdHMuXG4gKlxuICogLSBgXCJwcm92aXNpb25cImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgLCB0aGVuXG4gKiAgIGdyYW50IHRoZSBBcHBLaXQgY2FjaGUgc2NoZW1hIHRvIHRoZSBjb25uZWN0aW5nIHJvbGUuXG4gKiAtIGBcImVudlwiYDogcmVzb2x2ZSB0aGUgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIGBwcm9jZXNzLmVudmAgb25seS5cbiAqXG4gKiBPbWl0IGl0IHRvIGdldCBgXCJwcm92aXNpb25cImAgZ2F0ZWQgb24gYSBgbGFrZWJhc2VgIHBsdWdpbiBiZWluZyByZWdpc3RlcmVkO1xuICogc2V0IGl0IGV4cGxpY2l0bHkgdG8gcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsdWdpbiBsaXN0LCBvciBwYXNzIGBmYWxzZWAgdG9cbiAqIHNraXAgYXV0by1jb25maWd1cmF0aW9uIGVudGlyZWx5LlxuICpcbiAqIFNldCBpdCBFWFBMSUNJVExZIG9uIGFuIGFwcCB0aGF0IGhhcyBubyBgbGFrZWJhc2UoKWAgcGx1Z2luIGJ1dCBzdGlsbCB3YW50c1xuICogQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZS4gQXBwS2l0IHBpY2tzIExha2ViYXNlIGZvciBgQ2FjaGVNYW5hZ2VyYCBvbmx5IHdoZW5cbiAqIGBjcmVhdGVMYWtlYmFzZVBvb2woKWAgY2FuIGJ1aWxkIGEgcG9vbCwgYW5kIHRoYXQgcmVhZHMgYExBS0VCQVNFX0VORFBPSU5UYCAvXG4gKiBgUEdIT1NUYCAvIGBQR0RBVEFCQVNFYCBzdHJhaWdodCBmcm9tIGBwcm9jZXNzLmVudmAgLSBzbyB3aXRob3V0IHRoaXMgc3RlcCB0aGVcbiAqIGNhY2hlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gaW4tbWVtb3J5LCBhbmQgYW55dGhpbmcgaXQgaG9sZHMgKGEgc2Vzc2lvblxuICogc2lnbmluZyBrZXksIGEgb25lLXRpbWUgY29kZSkgaXMgbG9zdCBvbiByZXN0YXJ0LiBgXCJlbnZcImAgaXMgdGhlIHJpZ2h0IG1vZGVcbiAqIHRoZXJlOiB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBvbiB0aGUgY2FjaGUgc2NoZW1hIGFueXdheS5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b0NvbmZpZ3VyZU1vZGUgPSBcImVudlwiIHwgXCJwcm92aXNpb25cIjtcblxuLyoqIEFwcEtpdCdzIGBjcmVhdGVBcHBgIGNvbmZpZyBwbHVzIHRoZSBkYngtdG9vbHMgYXV0by1jb25maWd1cmF0aW9uIHN3aXRjaC4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUFwcENvbmZpZzxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucyA9IEFwcEtpdFBsdWdpbnM+ID0gT21pdDxcbiAgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnLFxuICBcInBsdWdpbnNcIiB8IFwib25QbHVnaW5zUmVhZHlcIlxuPiAmIHtcbiAgcGx1Z2lucz86IFQ7XG4gIG9uUGx1Z2luc1JlYWR5PzogKGFwcGtpdDogUGx1Z2luTWFwPFQ+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEF1dG8tY29uZmlndXJhdGlvbiB0byBydW4gYmVmb3JlIEFwcEtpdCBib290cy4gRGVmYXVsdHMgdG8gYFwicHJvdmlzaW9uXCJgLiAqL1xuICBhdXRvQ29uZmlndXJlPzogQXV0b0NvbmZpZ3VyZU1vZGUgfCBmYWxzZTtcbiAgLyoqXG4gICAqIE9uZSBvciBtYW55IHtAbGluayBJbnRlcmNlcHRvcn1zIGhhbmRlZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBvbmNlXG4gICAqIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgY29tcHV0ZWQgdGhlIGVudi4gRWFjaCByZWNlaXZlcyB0aGUgcmVzb2x2ZWQgZW52LCBhblxuICAgKiBBcHBLaXQtbGlmZWN5Y2xlIGhvb2ssIGFuZCBgYmluZFByb2Nlc3NgIGZvciBjb25jdXJyZW50bHktc3R5bGUgc3VwZXJ2aXNpb24gLVxuICAgKiBzZWUgYC4vaW50ZXJjZXB0b3JgLiBUaGUgdHVubmVsIGlzIHRoZSBwcmltYXJ5IGNvbnN1bWVyLlxuICAgKi9cbiAgaW50ZXJjZXB0b3I/OiBJbnRlcmNlcHRvciB8IEludGVyY2VwdG9yW107XG59O1xuXG5jb25zdCBMQUtFQkFTRV9QTFVHSU4gPSBcImxha2ViYXNlXCI7XG5jb25zdCBERUZBVUxUX0FVVE9fQ09ORklHVVJFOiBBdXRvQ29uZmlndXJlTW9kZSA9IFwicHJvdmlzaW9uXCI7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gYm9vdC10aW1lIGF1dG8tY29uZmlndXJhdGlvbi4gSXQgcnVucyBhcyB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqIGJlZm9yZSBhbnkgcGx1Z2luIGlzIGNvbnN0cnVjdGVkLCBzbyBpdCBzaXRzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3JcbiAqIGNoYWluIGFuZCBpbmhlcml0cyBubyB0aW1lb3V0LCByZXRyeSwgb3IgdGVsZW1ldHJ5IGZyb20gaXQuIFRoZSBidWRnZXQgY292ZXJzXG4gKiB0aGUgcmVzb2x2ZXIncyBvd24gd29yc3QgY2FzZSAoY3JlYXRlIGEgcHJvamVjdCwgdGhlbiB3YWl0IGZvciBpdHMgZW5kcG9pbnQpXG4gKiBwbHVzIHRoZSBjYWNoZS1zY2hlbWEgZ3JhbnRzLlxuICovXG5jb25zdCBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TID0gMTEgKiA2MF8wMDA7XG5cbmZ1bmN0aW9uIHVzZXNQbHVnaW48VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc6IENyZWF0ZUFwcENvbmZpZzxUPiB8IHVuZGVmaW5lZCxcbiAgbmFtZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKGNvbmZpZz8ucGx1Z2lucz8uc29tZSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpKTtcbn1cblxuLyoqIFBsdWdpbiBuYW1lcyBmb3IgYm9vdCBsb2dzIChvcmRlciBwcmVzZXJ2ZWQpLiAqL1xuZnVuY3Rpb24gcGx1Z2luTmFtZXMoY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoY29uZmlnPy5wbHVnaW5zID8/IFtdKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKTtcbn1cblxuLyoqXG4gKiBSdW4gZW5hYmxlZCBhdXRvLWNvbmZpZ3VyYXRpb24gc3RlcHMgd2l0aG91dCBjYWxsaW5nIEFwcEtpdCdzIGBjcmVhdGVBcHBgLlxuICpcbiAqIExha2ViYXNlIFBvc3RncmVzIHJlc29sdmVzIHdoZW4ge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5hdXRvQ29uZmlndXJlfSBpcyBzZXRcbiAqIGV4cGxpY2l0bHkgb3IgYSBgbGFrZWJhc2VgIHBsdWdpbiBpcyBsaXN0ZWQgaW4gYGNvbmZpZy5wbHVnaW5zYC4gYHNpZ25hbGBcbiAqIGNhbmNlbHMgdGhlIHJlc29sdXRpb247IGl0IGlzIGNvbWJpbmVkIHdpdGggYW4gaW50ZXJuYWwgYm9vdCB0aW1lb3V0IGVpdGhlclxuICogd2F5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiAvLyBQb3B1bGF0ZSBQR0hPU1QgLyBQR0RBVEFCQVNFIC8gTEFLRUJBU0VfRU5EUE9JTlQgd2l0aG91dCBib290aW5nIEFwcEtpdC5cbiAqIGF3YWl0IGFwcGtpdC5hdXRvQ29uZmlndXJlKHsgYXV0b0NvbmZpZ3VyZTogXCJlbnZcIiB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dG9Db25maWd1cmU8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBERUZBVUxUX0FVVE9fQ09ORklHVVJFO1xuICBjb25zdCBleHBsaWNpdCA9IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBsYWtlYmFzZVBsdWdpblByZXNlbnQgPSB1c2VzUGx1Z2luKGNvbmZpZywgTEFLRUJBU0VfUExVR0lOKTtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbk5hbWVzKGNvbmZpZyk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IHN0YXJ0XCIsIHtcbiAgICBtb2RlLFxuICAgIGV4cGxpY2l0LFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBwbHVnaW5zLFxuICAgIHRpbWVvdXRNczogQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyxcbiAgICBjYWxsZXJTaWduYWw6IEJvb2xlYW4oc2lnbmFsKSxcbiAgfSk7XG5cbiAgaWYgKG1vZGUgPT09IGZhbHNlIHx8ICEoZXhwbGljaXQgfHwgbGFrZWJhc2VQbHVnaW5QcmVzZW50KSkge1xuICAgIGNvbnN0IHNraXBwZWRSZWFzb24gPSBtb2RlID09PSBmYWxzZSA/IFwiZGlzYWJsZWRcIiA6IFwibm8gbGFrZWJhc2UgcGx1Z2luXCI7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogc2tpcFwiLCB7IHNraXBwZWRSZWFzb24sIG1vZGUsIGxha2ViYXNlUGx1Z2luUHJlc2VudCwgcGx1Z2lucyB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGF1dG9Db25maWd1cmU6IG1vZGUsXG4gICAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgICBwcm92aXNpb25lZDogZmFsc2UsXG4gICAgICBza2lwcGVkUmVhc29uLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBhc3luYy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBzaWduYWwpO1xuICBhc3luYy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBBYm9ydFNpZ25hbC50aW1lb3V0KEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMpKTtcblxuICBjb25zdCBwcm92aXNpb24gPSBtb2RlID09PSBcInByb3Zpc2lvblwiO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiByZXNvbHZlIGxha2ViYXNlXCIsIHsgcHJvdmlzaW9uLCBtb2RlIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGF1dG9Db25maWd1cmVMYWtlYmFzZShwcm92aXNpb24sIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogZG9uZVwiLCB7XG4gICAgbW9kZSxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHByb3Zpc2lvbixcbiAgICAuLi5yZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQpLFxuICB9KTtcbiAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7IGF1dG9Db25maWd1cmU6IG1vZGUsIGxha2ViYXNlUGx1Z2luUHJlc2VudCwgcHJvdmlzaW9uZWQ6IHByb3Zpc2lvbiB9KTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiBpbmZvLCB3cml0ZSB0aGUgcmVzb2x2ZWQgdmFsdWVzIHRvXG4gKiBgcHJvY2Vzcy5lbnZgLCBhbmQgcmV0dXJuIHRoZSByZWNvcmQuIFVzZWQgYnkge0BsaW5rIGF1dG9Db25maWd1cmV9OyBjYWxsXG4gKiB7QGxpbmsgYXBwbHlMYWtlYmFzZUVudn0gZGlyZWN0bHkgd2hlbiBmaW5lciBjb250cm9sIGlzIG5lZWRlZCAoYSBkaWZmZXJlbnRcbiAqIGBhdXRvQ3JlYXRlYCBwb2xpY3ksIG9yIGEgY2FsbGVyIHRoYXQgd2FudHMgdGhlIGVudiB3aXRob3V0IGJvb3RpbmcgQXBwS2l0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0b0NvbmZpZ3VyZUxha2ViYXNlKFxuICBwcm92aXNpb246IGJvb2xlYW4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPExha2ViYXNlQ29ubmVjdGlvbj4ge1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IGFwcGx5TGFrZWJhc2VFbnZcIik7XG4gIGNvbnN0IHsgcmVzb2x2ZWQsIHVzZXIgfSA9IGF3YWl0IGFwcGx5TGFrZWJhc2VFbnYodW5kZWZpbmVkLCBzaWduYWwpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IGVudiBhcHBsaWVkXCIsIHtcbiAgICAuLi5yZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQpLFxuICAgIHVzZXIsXG4gICAgZW52OiB7XG4gICAgICBMQUtFQkFTRV9FTkRQT0lOVDogcHJvY2Vzcy5lbnYuTEFLRUJBU0VfRU5EUE9JTlQsXG4gICAgICBQR0hPU1Q6IHByb2Nlc3MuZW52LlBHSE9TVCxcbiAgICAgIFBHUE9SVDogcHJvY2Vzcy5lbnYuUEdQT1JULFxuICAgICAgUEdEQVRBQkFTRTogcHJvY2Vzcy5lbnYuUEdEQVRBQkFTRSxcbiAgICAgIFBHVVNFUjogcHJvY2Vzcy5lbnYuUEdVU0VSLFxuICAgICAgUEdTU0xNT0RFOiBwcm9jZXNzLmVudi5QR1NTTE1PREUsXG4gICAgfSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwiZW52IHVwZGF0ZWRcIiwgeyAuLi5yZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQpLCB1c2VyIH0pO1xuICBpZiAocHJvdmlzaW9uKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYVwiLCB7IHVzZXIgfSk7XG4gICAgYXdhaXQgcHJvdmlzaW9uQ2FjaGVTY2hlbWEodXNlciwgbG9nZ2VyKTtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IHByb3Zpc2lvbkNhY2hlU2NoZW1hIGRvbmVcIik7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBza2lwIHByb3Zpc2lvbiAobW9kZT1lbnYpXCIpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBjcmVhdGVBcHBgIHNob3VsZCBpbmplY3Qgc29mdC1mYWlsIExha2ViYXNlIGNhY2hlIHN0b3JhZ2UuXG4gKlxuICogU2tpcHMgd2hlbiB0aGUgY2FsbGVyIGRpc2FibGVkIHRoZSBjYWNoZSwgYWxyZWFkeSBzdXBwbGllZCBhIHN0b3JhZ2VcbiAqIGJhY2tlbmQgKGluY2x1ZGluZyBpbi1tZW1vcnkpLCBvciBMYWtlYmFzZSBpcyBub3QgaW4gcGxheS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW5qZWN0U29mdFBlcnNpc3RlbnRDYWNoZShcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQsXG4gIGxha2ViYXNlOiBMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGUgPSBjb25maWc/LmNhY2hlO1xuICBpZiAoY2FjaGU/LmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjYWNoZT8uc3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihsYWtlYmFzZSkgfHwgdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkLnByb2plY3QsXG4gICAgYnJhbmNoOiByZXNvbHZlZC5icmFuY2gsXG4gICAgZW5kcG9pbnQ6IHJlc29sdmVkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiByZXNvbHZlZC5kYXRhYmFzZSxcbiAgICBob3N0OiByZXNvbHZlZC5ob3N0LFxuICAgIHBvcnQ6IHJlc29sdmVkLnBvcnQsXG4gICAgc3NsTW9kZTogcmVzb2x2ZWQuc3NsTW9kZSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSB7QGxpbmsgUmVzb2x2ZWRBcHBFbnZ9IGludGVyY2VwdG9ycyByZWFkLCBmcm9tIHRoZSBhdXRvLWNvbmZpZyByZXN1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlZEFwcEVudihsYWtlYmFzZTogTGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRBcHBFbnYge1xuICByZXR1cm4ge1xuICAgIC4uLihsYWtlYmFzZSA/IHsgbGFrZWJhc2UgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8geyBkYXRhYnJpY2tzSG9zdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIGBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXWAgb3B0aW9uIHRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gaW50ZXJjZXB0b3JMaXN0KGludGVyY2VwdG9yOiBDcmVhdGVBcHBDb25maWdbXCJpbnRlcmNlcHRvclwiXSk6IEludGVyY2VwdG9yW10ge1xuICBpZiAoIWludGVyY2VwdG9yKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yKSA/IGludGVyY2VwdG9yIDogW2ludGVyY2VwdG9yXTtcbn1cblxuLyoqXG4gKiBBdXRvLWNvbmZpZ3VyaW5nIGRyb3AtaW4gZm9yIEFwcEtpdCdzIGBjcmVhdGVBcHBgOiBzYW1lIGNvbmZpZywgc2FtZSB0eXBlZFxuICogcGx1Z2luLWV4cG9ydCBtYXAsIHdpdGgge0BsaW5rIGF1dG9Db25maWd1cmV9IHJ1biBmaXJzdC5cbiAqXG4gKiBXaGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuaW50ZXJjZXB0b3J9cyBhcmUgZ2l2ZW4sIGVhY2ggaXMgaW52b2tlZCB3aXRoIGFuXG4gKiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZXMgdGhlIGVudiBhbmQgQkVGT1JFXG4gKiBBcHBLaXQgYm9vdHMgLSBzbyBhbiBpbnRlcmNlcHRvciBjYW4gcmVhZCB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXJcbiAqIGxpZmVjeWNsZSBoYW5kbGVycywgYW5kIGBiaW5kUHJvY2Vzc2AgYSBjaGlsZC4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGJyYW5kQ29udGV4dCA9IGF3YWl0IGxvYWRCcmFuZENvbnRleHQoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBicmFuZCBjb250ZXh0IGxvYWRlZFwiLCB7IG5hbWU6IGJyYW5kQ29udGV4dC5uYW1lIH0pO1xuICBjb25zdCBsYWtlYmFzZSA9IGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBhdXRvQ29uZmlndXJlIHJldHVybmVkXCIsIHtcbiAgICBsYWtlYmFzZTogbGFrZWJhc2UgPyByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24obGFrZWJhc2UpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBhcHBDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICBkZWxldGUgYXBwQ29uZmlnLmF1dG9Db25maWd1cmU7XG4gIGRlbGV0ZSBhcHBDb25maWcuaW50ZXJjZXB0b3I7XG5cbiAgaWYgKHNob3VsZEluamVjdFNvZnRQZXJzaXN0ZW50Q2FjaGUoY29uZmlnLCBsYWtlYmFzZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGluamVjdCBzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc3RvcmFnZVwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgY3JlYXRlU29mdFBlcnNpc3RlbnRTdG9yYWdlKGNvbmZpZz8uY2FjaGUpO1xuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBhcHBDb25maWcuY2FjaGUgPSB7IC4uLmNvbmZpZz8uY2FjaGUsIHN0b3JhZ2UgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgcmVhZHlcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgdW5hdmFpbGFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5vIGludGVyY2VwdG9yczsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbXB1dGVkIGVudiwgcnVuIGVhY2ggaW50ZXJjZXB0b3IgKHRoZXkgcmVnaXN0ZXJcbiAgLy8gbGlmZWN5Y2xlIGhhbmRsZXJzICsgYmluZCBwcm9jZXNzZXMpLCB0aGVuIGluamVjdCB0aGUgYnJpZGdlIHRoYXQgcmVsYXlzIHRoZVxuICAvLyBSRUFMIEFwcEtpdCBsaWZlY3ljbGUgaW50byBgcnVudGltZS5lbWl0TGlmZWN5Y2xlYCBkdXJpbmcgaXRzIGBzZXR1cCgpYC5cbiAgY29uc3QgZW52ID0gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2UpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGNvbnRleHRcIiwge1xuICAgIGhhc0xha2ViYXNlOiBCb29sZWFuKGVudi5sYWtlYmFzZSksXG4gICAgZGF0YWJyaWNrc0hvc3Q6IGVudi5kYXRhYnJpY2tzSG9zdCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgcnVudGltZTogSW50ZXJjZXB0b3JSdW50aW1lID0gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBydW4gaW50ZXJjZXB0b3JcIiwgeyBpbmRleDogaSwgb2Y6IGludGVyY2VwdG9ycy5sZW5ndGggfSk7XG4gICAgYXdhaXQgaW50ZXJjZXB0b3JzW2ldIShydW50aW1lLmNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgZG9uZVwiLCB7IGluZGV4OiBpIH0pO1xuICB9XG4gIC8vIEFwcGVuZCB0aGUgYnJpZGdlIHRvIHRoZSBwbHVnaW5zIHR1cGxlLiBJdCBpcyBoaWRkZW4gYW5kIGV4cG9ydHMgbm90aGluZywgc29cbiAgLy8gdGhlIHJldHVybmVkIG1hcCBzdGlsbCBtYXRjaGVzIGBQbHVnaW5NYXA8VD5gOyB0aGUgY2FzdCAodGhyb3VnaCBgdW5rbm93bmApIGlzXG4gIC8vIG9ubHkgYmVjYXVzZSBhcHBlbmRpbmcgd2lkZW5zIHRoZSB0dXBsZSB0eXBlIGJleW9uZCBgVGAuXG4gIGFwcENvbmZpZy5wbHVnaW5zID0gWy4uLihhcHBDb25maWcucGx1Z2lucyA/PyBbXSksIGxpZmVjeWNsZUJyaWRnZSh7IHJ1bnRpbWUgfSldIGFzIHVua25vd24gYXMgVDtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBsaWZlY3ljbGUgYnJpZGdlIGluamVjdGVkOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgQXBwS2l0IHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHJldHVybmVkIGJ5IGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAtIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgcGx1cyB0aGUgc3Vycm91bmRpbmcgcmVxdWVzdCBtZXRhZGF0YS5cbiAqIERlcml2ZWQgZnJvbSBBcHBLaXQncyBvd24gcmV0dXJuIHR5cGUgc28gaXQgdHJhY2tzIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgYW5kXG4gKiByZS1leHBvcnRlZCBoZXJlIHNvIGFkZC1vbiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgcGFyYW1ldGVyIHdpdGhvdXQgZWFjaFxuICogcmUtZGVyaXZpbmcgdGhlIHNhbWUgYFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+YCBpbmxpbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkNvbnRleHRMaWtlID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD47XG5cbi8qKlxuICogVGhlIGF1dGgtc2NvcGVkIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuXG4gKiBgRXhlY3V0aW9uQ29udGV4dExpa2VgIChgZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudGApLiBUeXBlZCBzdHJ1Y3R1cmFsbHlcbiAqIG9mZiBBcHBLaXQgc28gY29uc3VtZXJzIGRvbid0IHRha2UgYSBkaXJlY3QgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgXG4gKiBkZXBlbmRlbmN5IC0gdGhlIGRlcCBmbG93cyBpbiB0cmFuc2l0aXZlbHkgdGhyb3VnaCBgQGRhdGFicmlja3MvYXBwa2l0YC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IEV4ZWN1dGlvbkNvbnRleHRMaWtlW1wiY2xpZW50XCJdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBBcHBLaXQgaXNuJ3RcbiAqIGluaXRpYWxpemVkIChvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSkuIFN3YWxsb3dzIEFwcEtpdCdzXG4gKiB7QGxpbmsgSW5pdGlhbGl6YXRpb25FcnJvcn07IGFueSBvdGhlciBlcnJvciBwcm9wYWdhdGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogZG9uZVwiKTtcbn1cbiJdfQ==
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQ0wsd0JBQXdCLEVBR3hCLGVBQWUsR0FFaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQThDcEMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBRW5DOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUU5QyxTQUFTLFVBQVUsQ0FDakIsTUFBc0MsRUFDdEMsSUFBWTtJQUVaLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELG9EQUFvRDtBQUNwRCxTQUFTLFdBQVcsQ0FBQyxN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QUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUI7SUFDckMsSUFBSSxzQkFBc0IsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHJ1bnRpbWUgZ2x1ZTogdGhlIGF1dG8tY29uZmlndXJpbmcgYGNyZWF0ZUFwcGAgZHJvcC1pbiwgcGx1cyB0aGVcbiAqIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IGhlbHBlcnMgYW5kIHR5cGVzIGRlcml2ZWQgZnJvbSBpdC5cbiAqXG4gKiBgY3JlYXRlQXBwYCBydW5zIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24sIHRoZW4gZGVsZWdhdGVzIHRvIEFwcEtpdCdzIG93blxuICogYGNyZWF0ZUFwcGAgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIHRoZSBzYW1lIHR5cGVkIHBsdWdpbi1leHBvcnQgbWFwLlxuICogRHJvcCBpdCBpbiBhcyBhIG9uZS1mb3Itb25lIHJlcGxhY2VtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBBdXRvLWNvbmZpZ3VyYXRpb24gcnVucyBCRUZPUkUgZGVsZWdhdGluZyBzbyBwbHVnaW5zIHNlZSBhIGZ1bGx5IHBvcHVsYXRlZFxuICogYHByb2Nlc3MuZW52YCBkdXJpbmcgdGhlaXIgc3luY2hyb25vdXMgYHNldHVwKClgLiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHV0aW9uXG4gKiBydW5zIHdoZW4gYSBuYXRpdmUgYGxha2ViYXNlYCBvciBgZGF0YWJhc2VgIHBsdWdpbiBpcyBwcmVzZW50LCBvciB3aGVuXG4gKiB7QGxpbmsgQXV0b0NvbmZpZ3VyZU1vZGV9IGlzIHNldCBleHBsaWNpdGx5IG9uIHRoZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIGlzIEFwcEtpdCdzIG93biBhY2Nlc3NvciBmb3IgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gKiBjbGllbnQgKyByZXF1ZXN0IG1ldGFkYXRhOyB0aGUgd3JhcHBlcnMgaGVyZSBtYWtlIGl0IHNhZmUgdG8gY2FsbCBvdXRzaWRlIGFcbiAqIHJlcXVlc3Qgc2NvcGUgKHtAbGluayB0cnlHZXRFeGVjdXRpb25Db250ZXh0fSkgYW5kIHRvIGxhemlseSBib290IGEgYmFyZSBhcHBcbiAqICh7QGxpbmsgZW5zdXJlSW5pdGlhbGl6ZWR9KSwgYW5kIHJlLWV4cG9ydCB0aGUgZGVyaXZlZCB0eXBlcyBzbyBhZGQtb25cbiAqIHBhY2thZ2VzIGNhbiB0eXBlIGEgY29udGV4dCAvIGNsaWVudCB3aXRob3V0IHJlLWRlcml2aW5nIHRoZW0gaW5saW5lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVBcHAgYXMgYXBwa2l0Q3JlYXRlQXBwLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBJbml0aWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4vLyBBcHBLaXQncyByb290IGJhcnJlbCByZS1leHBvcnRzIGBQbHVnaW5EYXRhYCBidXQgbm90IGBQbHVnaW5NYXBgOyB0aGUgcGFja2FnZVxuLy8gcHVibGlzaGVzIHRoaXMgc3VicGF0aCBmb3IgZXhhY3RseSB0aGF0IHR5cGUuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvZGlzdC9zaGFyZWQvc3JjL3BsdWdpblwiO1xuaW1wb3J0IHsgYXN5bmMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IHJlc29sdmVBdXRvQ29uZmlndXJlUG9saWN5IH0gZnJvbSBcIi4vX2F1dG8tY29uZmlndXJlLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UgfSBmcm9tIFwiLi9fY2FjaGUtc3RvcmFnZS50c1wiO1xuaW1wb3J0IHsgbG9hZEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL2JyYW5kLnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQsXG4gIHR5cGUgSW50ZXJjZXB0b3IsXG4gIHR5cGUgSW50ZXJjZXB0b3JSdW50aW1lLFxuICBsaWZlY3ljbGVCcmlkZ2UsXG4gIHR5cGUgUmVzb2x2ZWRBcHBFbnYsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yLnRzXCI7XG5pbXBvcnQgeyBhcHBseUxha2ViYXNlRW52LCB0eXBlIExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3Byb3Zpc2lvbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0XCIpO1xuXG50eXBlIEFwcEtpdENyZWF0ZUFwcENvbmZpZyA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGFwcGtpdENyZWF0ZUFwcD5bMF0+O1xudHlwZSBBcHBLaXRQbHVnaW5zID0gTm9uTnVsbGFibGU8QXBwS2l0Q3JlYXRlQXBwQ29uZmlnW1wicGx1Z2luc1wiXT47XG5cbi8qKlxuICogV2hhdCBhdXRvLWNvbmZpZ3VyYXRpb24gZG9lcyBiZWZvcmUgQXBwS2l0IGJvb3RzLlxuICpcbiAqIC0gYFwicHJvdmlzaW9uXCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCwgdGhlblxuICogICBncmFudCB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSB0byB0aGUgY29ubmVjdGluZyByb2xlLlxuICogLSBgXCJlbnZcImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgIG9ubHkuXG4gKlxuICogT21pdCBpdCB0byByZXNvbHZlIGRhdGFiYXNlIGVudmlyb25tZW50IHdoZW4gYSBuYXRpdmUgYGxha2ViYXNlYCBvclxuICogYGRhdGFiYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gSW1wbGljaXQgY2FjaGUtc2NoZW1hIGdyYW50cyByZW1haW4gZ2F0ZWQgb25cbiAqIGBsYWtlYmFzZWA7IGBkYXRhYmFzZWAgb3ducyBpdHMgb3duIHBvb2wgYW5kIGRvZXMgbm90IGJyb2FkZW4gZ3JhbnRzLiBTZXQgdGhlXG4gKiBtb2RlIGV4cGxpY2l0bHkgdG8gcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsdWdpbiBsaXN0LCBvciBwYXNzIGBmYWxzZWAgdG8gc2tpcFxuICogYXV0by1jb25maWd1cmF0aW9uIGVudGlyZWx5LlxuICpcbiAqIFNldCBpdCBFWFBMSUNJVExZIG9uIGFuIGFwcCB0aGF0IGhhcyBubyBgbGFrZWJhc2UoKWAgcGx1Z2luIGJ1dCBzdGlsbCB3YW50c1xuICogQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZS4gQXBwS2l0IHBpY2tzIExha2ViYXNlIGZvciBgQ2FjaGVNYW5hZ2VyYCBvbmx5IHdoZW5cbiAqIGBjcmVhdGVMYWtlYmFzZVBvb2woKWAgY2FuIGJ1aWxkIGEgcG9vbCwgYW5kIHRoYXQgcmVhZHMgYExBS0VCQVNFX0VORFBPSU5UYCAvXG4gKiBgUEdIT1NUYCAvIGBQR0RBVEFCQVNFYCBzdHJhaWdodCBmcm9tIGBwcm9jZXNzLmVudmAgLSBzbyB3aXRob3V0IHRoaXMgc3RlcCB0aGVcbiAqIGNhY2hlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gaW4tbWVtb3J5LCBhbmQgYW55dGhpbmcgaXQgaG9sZHMgKGEgc2Vzc2lvblxuICogc2lnbmluZyBrZXksIGEgb25lLXRpbWUgY29kZSkgaXMgbG9zdCBvbiByZXN0YXJ0LiBgXCJlbnZcImAgaXMgdGhlIHJpZ2h0IG1vZGVcbiAqIHRoZXJlOiB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBvbiB0aGUgY2FjaGUgc2NoZW1hIGFueXdheS5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b0NvbmZpZ3VyZU1vZGUgPSBcImVudlwiIHwgXCJwcm92aXNpb25cIjtcblxuLyoqIEFwcEtpdCdzIGBjcmVhdGVBcHBgIGNvbmZpZyBwbHVzIHRoZSBkYngtdG9vbHMgYXV0by1jb25maWd1cmF0aW9uIHN3aXRjaC4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUFwcENvbmZpZzxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucyA9IEFwcEtpdFBsdWdpbnM+ID0gT21pdDxcbiAgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnLFxuICBcInBsdWdpbnNcIiB8IFwib25QbHVnaW5zUmVhZHlcIlxuPiAmIHtcbiAgcGx1Z2lucz86IFQ7XG4gIG9uUGx1Z2luc1JlYWR5PzogKGFwcGtpdDogUGx1Z2luTWFwPFQ+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEF1dG8tY29uZmlndXJhdGlvbiB0byBydW4gYmVmb3JlIEFwcEtpdCBib290cy4gRGVmYXVsdHMgdG8gYFwicHJvdmlzaW9uXCJgLiAqL1xuICBhdXRvQ29uZmlndXJlPzogQXV0b0NvbmZpZ3VyZU1vZGUgfCBmYWxzZTtcbiAgLyoqXG4gICAqIE9uZSBvciBtYW55IHtAbGluayBJbnRlcmNlcHRvcn1zIGhhbmRlZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBvbmNlXG4gICAqIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgY29tcHV0ZWQgdGhlIGVudi4gRWFjaCByZWNlaXZlcyB0aGUgcmVzb2x2ZWQgZW52LCBhblxuICAgKiBBcHBLaXQtbGlmZWN5Y2xlIGhvb2ssIGFuZCBgYmluZFByb2Nlc3NgIGZvciBjb25jdXJyZW50bHktc3R5bGUgc3VwZXJ2aXNpb24gLVxuICAgKiBzZWUgYC4vaW50ZXJjZXB0b3JgLiBUaGUgdHVubmVsIGlzIHRoZSBwcmltYXJ5IGNvbnN1bWVyLlxuICAgKi9cbiAgaW50ZXJjZXB0b3I/OiBJbnRlcmNlcHRvciB8IEludGVyY2VwdG9yW107XG59O1xuXG5jb25zdCBMQUtFQkFTRV9QTFVHSU4gPSBcImxha2ViYXNlXCI7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gYm9vdC10aW1lIGF1dG8tY29uZmlndXJhdGlvbi4gSXQgcnVucyBhcyB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqIGJlZm9yZSBhbnkgcGx1Z2luIGlzIGNvbnN0cnVjdGVkLCBzbyBpdCBzaXRzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3JcbiAqIGNoYWluIGFuZCBpbmhlcml0cyBubyB0aW1lb3V0LCByZXRyeSwgb3IgdGVsZW1ldHJ5IGZyb20gaXQuIFRoZSBidWRnZXQgY292ZXJzXG4gKiB0aGUgcmVzb2x2ZXIncyBvd24gd29yc3QgY2FzZSAoY3JlYXRlIGEgcHJvamVjdCwgdGhlbiB3YWl0IGZvciBpdHMgZW5kcG9pbnQpXG4gKiBwbHVzIHRoZSBjYWNoZS1zY2hlbWEgZ3JhbnRzLlxuICovXG5jb25zdCBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TID0gMTEgKiA2MF8wMDA7XG5cbmZ1bmN0aW9uIHVzZXNQbHVnaW48VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc6IENyZWF0ZUFwcENvbmZpZzxUPiB8IHVuZGVmaW5lZCxcbiAgbmFtZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKGNvbmZpZz8ucGx1Z2lucz8uc29tZSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpKTtcbn1cblxuLyoqIFBsdWdpbiBuYW1lcyBmb3IgYm9vdCBsb2dzIChvcmRlciBwcmVzZXJ2ZWQpLiAqL1xuZnVuY3Rpb24gcGx1Z2luTmFtZXMoY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoY29uZmlnPy5wbHVnaW5zID8/IFtdKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKTtcbn1cblxuLyoqXG4gKiBSdW4gZW5hYmxlZCBhdXRvLWNvbmZpZ3VyYXRpb24gc3RlcHMgd2l0aG91dCBjYWxsaW5nIEFwcEtpdCdzIGBjcmVhdGVBcHBgLlxuICpcbiAqIExha2ViYXNlIFBvc3RncmVzIHJlc29sdmVzIHdoZW4ge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5hdXRvQ29uZmlndXJlfSBpcyBzZXRcbiAqIGV4cGxpY2l0bHkgb3IgYSBuYXRpdmUgYGxha2ViYXNlYC9gZGF0YWJhc2VgIHBsdWdpbiBpcyBsaXN0ZWQgaW5cbiAqIGBjb25maWcucGx1Z2luc2AuIGBzaWduYWxgIGNhbmNlbHMgdGhlIHJlc29sdXRpb247IGl0IGlzIGNvbWJpbmVkIHdpdGggYW5cbiAqIGludGVybmFsIGJvb3QgdGltZW91dCBlaXRoZXIgd2F5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiAvLyBQb3B1bGF0ZSBQR0hPU1QgLyBQR0RBVEFCQVNFIC8gTEFLRUJBU0VfRU5EUE9JTlQgd2l0aG91dCBib290aW5nIEFwcEtpdC5cbiAqIGF3YWl0IGFwcGtpdC5hdXRvQ29uZmlndXJlKHsgYXV0b0NvbmZpZ3VyZTogXCJlbnZcIiB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dG9Db25maWd1cmU8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbk5hbWVzKGNvbmZpZyk7XG4gIGNvbnN0IHBvbGljeSA9IHJlc29sdmVBdXRvQ29uZmlndXJlUG9saWN5KHBsdWdpbnMsIGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IHN0YXJ0XCIsIHtcbiAgICAuLi5wb2xpY3ksXG4gICAgcGx1Z2lucyxcbiAgICB0aW1lb3V0TXM6IEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMsXG4gICAgY2FsbGVyU2lnbmFsOiBCb29sZWFuKHNpZ25hbCksXG4gIH0pO1xuXG4gIGlmICghcG9saWN5LnNob3VsZFJlc29sdmUpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBza2lwXCIsIHsgLi4ucG9saWN5LCBwbHVnaW5zIH0pO1xuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYXV0b0NvbmZpZ3VyZTogcG9saWN5Lm1vZGUsXG4gICAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5sYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgICBwcm92aXNpb25lZDogZmFsc2UsXG4gICAgICBza2lwcGVkUmVhc29uOiBwb2xpY3kuc2tpcHBlZFJlYXNvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgQWJvcnRTaWduYWwudGltZW91dChBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TKSk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogcmVzb2x2ZSBsYWtlYmFzZVwiLCB7XG4gICAgcHJvdmlzaW9uOiBwb2xpY3kucHJvdmlzaW9uLFxuICAgIG1vZGU6IHBvbGljeS5tb2RlLFxuICB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBhdXRvQ29uZmlndXJlTGFrZWJhc2UocG9saWN5LnByb3Zpc2lvbiwgY29udHJvbGxlci5zaWduYWwpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBkb25lXCIsIHtcbiAgICBtb2RlOiBwb2xpY3kubW9kZSxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5sYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHByb3Zpc2lvbmVkOiBwb2xpY3kucHJvdmlzaW9uLFxuICAgIC4uLnJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZCksXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICBhdXRvQ29uZmlndXJlOiBwb2xpY3kubW9kZSxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5sYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHByb3Zpc2lvbmVkOiBwb2xpY3kucHJvdmlzaW9uLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiBpbmZvLCB3cml0ZSB0aGUgcmVzb2x2ZWQgdmFsdWVzIHRvXG4gKiBgcHJvY2Vzcy5lbnZgLCBhbmQgcmV0dXJuIHRoZSByZWNvcmQuIFVzZWQgYnkge0BsaW5rIGF1dG9Db25maWd1cmV9OyBjYWxsXG4gKiB7QGxpbmsgYXBwbHlMYWtlYmFzZUVudn0gZGlyZWN0bHkgd2hlbiBmaW5lciBjb250cm9sIGlzIG5lZWRlZCAoYSBkaWZmZXJlbnRcbiAqIGBhdXRvQ3JlYXRlYCBwb2xpY3ksIG9yIGEgY2FsbGVyIHRoYXQgd2FudHMgdGhlIGVudiB3aXRob3V0IGJvb3RpbmcgQXBwS2l0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0b0NvbmZpZ3VyZUxha2ViYXNlKFxuICBwcm92aXNpb246IGJvb2xlYW4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPExha2ViYXNlQ29ubmVjdGlvbj4ge1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IGFwcGx5TGFrZWJhc2VFbnZcIik7XG4gIGNvbnN0IHsgcmVzb2x2ZWQsIHVzZXIgfSA9IGF3YWl0IGFwcGx5TGFrZWJhc2VFbnYodW5kZWZpbmVkLCBzaWduYWwpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IGVudiBhcHBsaWVkXCIsIHtcbiAgICAuLi5yZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQpLFxuICAgIHVzZXIsXG4gICAgZW52OiB7XG4gICAgICBMQUtFQkFTRV9FTkRQT0lOVDogcHJvY2Vzcy5lbnYuTEFLRUJBU0VfRU5EUE9JTlQsXG4gICAgICBQR0hPU1Q6IHByb2Nlc3MuZW52LlBHSE9TVCxcbiAgICAgIFBHUE9SVDogcHJvY2Vzcy5lbnYuUEdQT1JULFxuICAgICAgUEdEQVRBQkFTRTogcHJvY2Vzcy5lbnYuUEdEQVRBQkFTRSxcbiAgICAgIFBHVVNFUjogcHJvY2Vzcy5lbnYuUEdVU0VSLFxuICAgICAgUEdTU0xNT0RFOiBwcm9jZXNzLmVudi5QR1NTTE1PREUsXG4gICAgfSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwiZW52IHVwZGF0ZWRcIiwgeyAuLi5yZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQpLCB1c2VyIH0pO1xuICBpZiAocHJvdmlzaW9uKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYVwiLCB7IHVzZXIgfSk7XG4gICAgYXdhaXQgcHJvdmlzaW9uQ2FjaGVTY2hlbWEodXNlciwgbG9nZ2VyKTtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlTGFrZWJhc2U6IHByb3Zpc2lvbkNhY2hlU2NoZW1hIGRvbmVcIik7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBza2lwIHByb3Zpc2lvbiAobW9kZT1lbnYpXCIpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBjcmVhdGVBcHBgIHNob3VsZCBpbmplY3Qgc29mdC1mYWlsIExha2ViYXNlIGNhY2hlIHN0b3JhZ2UuXG4gKlxuICogU2tpcHMgd2hlbiB0aGUgY2FsbGVyIGRpc2FibGVkIHRoZSBjYWNoZSwgYWxyZWFkeSBzdXBwbGllZCBhIHN0b3JhZ2VcbiAqIGJhY2tlbmQgKGluY2x1ZGluZyBpbi1tZW1vcnkpLCBvciBMYWtlYmFzZSBpcyBub3QgaW4gcGxheS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW5qZWN0U29mdFBlcnNpc3RlbnRDYWNoZShcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQsXG4gIGxha2ViYXNlOiBMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGUgPSBjb25maWc/LmNhY2hlO1xuICBpZiAoY2FjaGU/LmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjYWNoZT8uc3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihsYWtlYmFzZSkgfHwgdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkLnByb2plY3QsXG4gICAgYnJhbmNoOiByZXNvbHZlZC5icmFuY2gsXG4gICAgZW5kcG9pbnQ6IHJlc29sdmVkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiByZXNvbHZlZC5kYXRhYmFzZSxcbiAgICBob3N0OiByZXNvbHZlZC5ob3N0LFxuICAgIHBvcnQ6IHJlc29sdmVkLnBvcnQsXG4gICAgc3NsTW9kZTogcmVzb2x2ZWQuc3NsTW9kZSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSB7QGxpbmsgUmVzb2x2ZWRBcHBFbnZ9IGludGVyY2VwdG9ycyByZWFkLCBmcm9tIHRoZSBhdXRvLWNvbmZpZyByZXN1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlZEFwcEVudihsYWtlYmFzZTogTGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRBcHBFbnYge1xuICByZXR1cm4ge1xuICAgIC4uLihsYWtlYmFzZSA/IHsgbGFrZWJhc2UgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8geyBkYXRhYnJpY2tzSG9zdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIGBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXWAgb3B0aW9uIHRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gaW50ZXJjZXB0b3JMaXN0KGludGVyY2VwdG9yOiBDcmVhdGVBcHBDb25maWdbXCJpbnRlcmNlcHRvclwiXSk6IEludGVyY2VwdG9yW10ge1xuICBpZiAoIWludGVyY2VwdG9yKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yKSA/IGludGVyY2VwdG9yIDogW2ludGVyY2VwdG9yXTtcbn1cblxuLyoqXG4gKiBBdXRvLWNvbmZpZ3VyaW5nIGRyb3AtaW4gZm9yIEFwcEtpdCdzIGBjcmVhdGVBcHBgOiBzYW1lIGNvbmZpZywgc2FtZSB0eXBlZFxuICogcGx1Z2luLWV4cG9ydCBtYXAsIHdpdGgge0BsaW5rIGF1dG9Db25maWd1cmV9IHJ1biBmaXJzdC5cbiAqXG4gKiBXaGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuaW50ZXJjZXB0b3J9cyBhcmUgZ2l2ZW4sIGVhY2ggaXMgaW52b2tlZCB3aXRoIGFuXG4gKiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZXMgdGhlIGVudiBhbmQgQkVGT1JFXG4gKiBBcHBLaXQgYm9vdHMgLSBzbyBhbiBpbnRlcmNlcHRvciBjYW4gcmVhZCB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXJcbiAqIGxpZmVjeWNsZSBoYW5kbGVycywgYW5kIGBiaW5kUHJvY2Vzc2AgYSBjaGlsZC4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGJyYW5kQ29udGV4dCA9IGF3YWl0IGxvYWRCcmFuZENvbnRleHQoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBicmFuZCBjb250ZXh0IGxvYWRlZFwiLCB7IG5hbWU6IGJyYW5kQ29udGV4dC5uYW1lIH0pO1xuICBjb25zdCBsYWtlYmFzZSA9IGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBhdXRvQ29uZmlndXJlIHJldHVybmVkXCIsIHtcbiAgICBsYWtlYmFzZTogbGFrZWJhc2UgPyByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24obGFrZWJhc2UpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBhcHBDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICBkZWxldGUgYXBwQ29uZmlnLmF1dG9Db25maWd1cmU7XG4gIGRlbGV0ZSBhcHBDb25maWcuaW50ZXJjZXB0b3I7XG5cbiAgaWYgKHNob3VsZEluamVjdFNvZnRQZXJzaXN0ZW50Q2FjaGUoY29uZmlnLCBsYWtlYmFzZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGluamVjdCBzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc3RvcmFnZVwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgY3JlYXRlU29mdFBlcnNpc3RlbnRTdG9yYWdlKGNvbmZpZz8uY2FjaGUpO1xuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBhcHBDb25maWcuY2FjaGUgPSB7IC4uLmNvbmZpZz8uY2FjaGUsIHN0b3JhZ2UgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgcmVhZHlcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgdW5hdmFpbGFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5vIGludGVyY2VwdG9yczsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbXB1dGVkIGVudiwgcnVuIGVhY2ggaW50ZXJjZXB0b3IgKHRoZXkgcmVnaXN0ZXJcbiAgLy8gbGlmZWN5Y2xlIGhhbmRsZXJzICsgYmluZCBwcm9jZXNzZXMpLCB0aGVuIGluamVjdCB0aGUgYnJpZGdlIHRoYXQgcmVsYXlzIHRoZVxuICAvLyBSRUFMIEFwcEtpdCBsaWZlY3ljbGUgaW50byBgcnVudGltZS5lbWl0TGlmZWN5Y2xlYCBkdXJpbmcgaXRzIGBzZXR1cCgpYC5cbiAgY29uc3QgZW52ID0gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2UpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGNvbnRleHRcIiwge1xuICAgIGhhc0xha2ViYXNlOiBCb29sZWFuKGVudi5sYWtlYmFzZSksXG4gICAgZGF0YWJyaWNrc0hvc3Q6IGVudi5kYXRhYnJpY2tzSG9zdCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgcnVudGltZTogSW50ZXJjZXB0b3JSdW50aW1lID0gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBydW4gaW50ZXJjZXB0b3JcIiwgeyBpbmRleDogaSwgb2Y6IGludGVyY2VwdG9ycy5sZW5ndGggfSk7XG4gICAgYXdhaXQgaW50ZXJjZXB0b3JzW2ldIShydW50aW1lLmNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgZG9uZVwiLCB7IGluZGV4OiBpIH0pO1xuICB9XG4gIC8vIEFwcGVuZCB0aGUgYnJpZGdlIHRvIHRoZSBwbHVnaW5zIHR1cGxlLiBJdCBpcyBoaWRkZW4gYW5kIGV4cG9ydHMgbm90aGluZywgc29cbiAgLy8gdGhlIHJldHVybmVkIG1hcCBzdGlsbCBtYXRjaGVzIGBQbHVnaW5NYXA8VD5gOyB0aGUgY2FzdCAodGhyb3VnaCBgdW5rbm93bmApIGlzXG4gIC8vIG9ubHkgYmVjYXVzZSBhcHBlbmRpbmcgd2lkZW5zIHRoZSB0dXBsZSB0eXBlIGJleW9uZCBgVGAuXG4gIGFwcENvbmZpZy5wbHVnaW5zID0gWy4uLihhcHBDb25maWcucGx1Z2lucyA/PyBbXSksIGxpZmVjeWNsZUJyaWRnZSh7IHJ1bnRpbWUgfSldIGFzIHVua25vd24gYXMgVDtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBsaWZlY3ljbGUgYnJpZGdlIGluamVjdGVkOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgQXBwS2l0IHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHJldHVybmVkIGJ5IGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAtIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgcGx1cyB0aGUgc3Vycm91bmRpbmcgcmVxdWVzdCBtZXRhZGF0YS5cbiAqIERlcml2ZWQgZnJvbSBBcHBLaXQncyBvd24gcmV0dXJuIHR5cGUgc28gaXQgdHJhY2tzIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgYW5kXG4gKiByZS1leHBvcnRlZCBoZXJlIHNvIGFkZC1vbiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgcGFyYW1ldGVyIHdpdGhvdXQgZWFjaFxuICogcmUtZGVyaXZpbmcgdGhlIHNhbWUgYFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+YCBpbmxpbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkNvbnRleHRMaWtlID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD47XG5cbi8qKlxuICogVGhlIGF1dGgtc2NvcGVkIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuXG4gKiBgRXhlY3V0aW9uQ29udGV4dExpa2VgIChgZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudGApLiBUeXBlZCBzdHJ1Y3R1cmFsbHlcbiAqIG9mZiBBcHBLaXQgc28gY29uc3VtZXJzIGRvbid0IHRha2UgYSBkaXJlY3QgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgXG4gKiBkZXBlbmRlbmN5IC0gdGhlIGRlcCBmbG93cyBpbiB0cmFuc2l0aXZlbHkgdGhyb3VnaCBgQGRhdGFicmlja3MvYXBwa2l0YC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IEV4ZWN1dGlvbkNvbnRleHRMaWtlW1wiY2xpZW50XCJdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBBcHBLaXQgaXNuJ3RcbiAqIGluaXRpYWxpemVkIChvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSkuIFN3YWxsb3dzIEFwcEtpdCdzXG4gKiB7QGxpbmsgSW5pdGlhbGl6YXRpb25FcnJvcn07IGFueSBvdGhlciBlcnJvciBwcm9wYWdhdGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogZG9uZVwiKTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Type-owned AppKit toolkit entry construction shared by dbx-tools add-ons.
3
+ *
4
+ * @module
5
+ */
6
+ import type { AgentToolDefinition, ToolkitEntry, ToolkitOptions } from "@databricks/appkit/beta";
7
+ /** Resolve one local tool name through AppKit toolkit filtering and naming options. */
8
+ export declare function name(localName: string, pluginName: string, options?: ToolkitOptions): string | null;
9
+ /** Convert AppKit tool definitions into public toolkit references. */
10
+ export declare function entries(pluginName: string, definitions: readonly AgentToolDefinition[], options?: ToolkitOptions): Record<string, ToolkitEntry>;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Type-owned AppKit toolkit entry construction shared by dbx-tools add-ons.
3
+ *
4
+ * @module
5
+ */
6
+ /** Resolve one local tool name through AppKit toolkit filtering and naming options. */
7
+ export function name(localName, pluginName, options = {}) {
8
+ if (options.only && !options.only.includes(localName))
9
+ return null;
10
+ if (options.except?.includes(localName))
11
+ return null;
12
+ return options.rename?.[localName] ?? `${options.prefix ?? `${pluginName}.`}${localName}`;
13
+ }
14
+ /** Convert AppKit tool definitions into public toolkit references. */
15
+ export function entries(pluginName, definitions, options = {}) {
16
+ return Object.fromEntries(definitions.flatMap((definition) => {
17
+ const key = name(definition.name, pluginName, options);
18
+ if (key === null)
19
+ return [];
20
+ return [
21
+ [
22
+ key,
23
+ {
24
+ __toolkitRef: true,
25
+ pluginName,
26
+ localName: definition.name,
27
+ def: { ...definition, name: key },
28
+ annotations: definition.annotations,
29
+ },
30
+ ],
31
+ ];
32
+ }));
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sa2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFJSCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLElBQUksQ0FDbEIsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBMEIsRUFBRTtJQUU1QixJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxHQUFHLFVBQVUsR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQzVGLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLE9BQU8sQ0FDckIsVUFBa0IsRUFDbEIsV0FBMkMsRUFDM0MsVUFBMEIsRUFBRTtJQUU1QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE9BQU87WUFDTDtnQkFDRSxHQUFHO2dCQUNIO29CQUNFLFlBQVksRUFBRSxJQUFhO29CQUMzQixVQUFVO29CQUNWLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSTtvQkFDMUIsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtvQkFDakMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2lCQUNiO2FBQ3pCO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlLW93bmVkIEFwcEtpdCB0b29sa2l0IGVudHJ5IGNvbnN0cnVjdGlvbiBzaGFyZWQgYnkgZGJ4LXRvb2xzIGFkZC1vbnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRGVmaW5pdGlvbiwgVG9vbGtpdEVudHJ5LCBUb29sa2l0T3B0aW9ucyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuXG4vKiogUmVzb2x2ZSBvbmUgbG9jYWwgdG9vbCBuYW1lIHRocm91Z2ggQXBwS2l0IHRvb2xraXQgZmlsdGVyaW5nIGFuZCBuYW1pbmcgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChvcHRpb25zLm9ubHkgJiYgIW9wdGlvbnMub25seS5pbmNsdWRlcyhsb2NhbE5hbWUpKSByZXR1cm4gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZXhjZXB0Py5pbmNsdWRlcyhsb2NhbE5hbWUpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG9wdGlvbnMucmVuYW1lPy5bbG9jYWxOYW1lXSA/PyBgJHtvcHRpb25zLnByZWZpeCA/PyBgJHtwbHVnaW5OYW1lfS5gfSR7bG9jYWxOYW1lfWA7XG59XG5cbi8qKiBDb252ZXJ0IEFwcEtpdCB0b29sIGRlZmluaXRpb25zIGludG8gcHVibGljIHRvb2xraXQgcmVmZXJlbmNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnRyaWVzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb25zOiByZWFkb25seSBBZ2VudFRvb2xEZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFRvb2xraXRPcHRpb25zID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBkZWZpbml0aW9ucy5mbGF0TWFwKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBuYW1lKGRlZmluaXRpb24ubmFtZSwgcGx1Z2luTmFtZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoa2V5ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF9fdG9vbGtpdFJlZjogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWUsXG4gICAgICAgICAgICBsb2NhbE5hbWU6IGRlZmluaXRpb24ubmFtZSxcbiAgICAgICAgICAgIGRlZjogeyAuLi5kZWZpbml0aW9uLCBuYW1lOiBrZXkgfSxcbiAgICAgICAgICAgIGFubm90YXRpb25zOiBkZWZpbml0aW9uLmFubm90YXRpb25zLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFRvb2xraXRFbnRyeSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/_cache-storage.ts","../src/appkit.ts","../src/brand.ts","../src/bundle.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_auto-configure.ts","../src/_cache-storage.ts","../src/appkit.ts","../src/brand.ts","../src/bundle.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../src/toolkit.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -19,19 +19,20 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@databricks/appkit": "^0.60.0",
23
- "@dbx-tools/test-polyglot": "0.6.225",
22
+ "@databricks/appkit": "0.81.0",
23
+ "@dbx-tools/test-polyglot": "0.6.227",
24
24
  "@types/bun": "1.3.14",
25
25
  "@types/node": "^24.6.0",
26
- "typescript": "^5.9.3"
26
+ "typescript": "^5.9.3",
27
+ "vitest": "3.2.4"
27
28
  },
28
29
  "peerDependencies": {
29
- "@databricks/appkit": "^0.60.0"
30
+ "@databricks/appkit": "0.81.0"
30
31
  },
31
32
  "dependencies": {
32
33
  "@databricks/sdk-experimental": "^0.17.0",
33
- "@dbx-tools/core": "0.6.225",
34
- "@dbx-tools/shared-core": "0.6.225",
34
+ "@dbx-tools/core": "0.6.227",
35
+ "@dbx-tools/shared-core": "0.6.227",
35
36
  "zod": "4.3.6"
36
37
  },
37
38
  "main": "./lib/index.js",
@@ -48,7 +49,7 @@
48
49
  "./package.json": "./package.json"
49
50
  }
50
51
  },
51
- "version": "0.6.225",
52
+ "version": "0.6.227",
52
53
  "types": "./lib/index.d.ts",
53
54
  "type": "module",
54
55
  "exports": {
@@ -0,0 +1,41 @@
1
+ import type { AutoConfigureMode } from "./appkit.ts";
2
+
3
+ const LAKEBASE_PLUGIN = "lakebase";
4
+ const DATABASE_PLUGIN = "database";
5
+
6
+ /** Resolved automatic database-environment and cache-provisioning decision. */
7
+ export interface AutoConfigurePolicy {
8
+ mode: AutoConfigureMode | false;
9
+ explicit: boolean;
10
+ lakebasePluginPresent: boolean;
11
+ databasePluginPresent: boolean;
12
+ shouldResolve: boolean;
13
+ provision: boolean;
14
+ skippedReason?: "disabled" | "no database plugin";
15
+ }
16
+
17
+ /** Resolve database demand without constructing another native plugin or pool. */
18
+ export function resolveAutoConfigurePolicy(
19
+ plugins: readonly string[],
20
+ configured: AutoConfigureMode | false | undefined,
21
+ ): AutoConfigurePolicy {
22
+ const mode = configured ?? "provision";
23
+ const explicit = configured !== undefined;
24
+ const lakebasePluginPresent = plugins.includes(LAKEBASE_PLUGIN);
25
+ const databasePluginPresent = plugins.includes(DATABASE_PLUGIN);
26
+ const shouldResolve =
27
+ mode !== false && (explicit || lakebasePluginPresent || databasePluginPresent);
28
+ return {
29
+ mode,
30
+ explicit,
31
+ lakebasePluginPresent,
32
+ databasePluginPresent,
33
+ shouldResolve,
34
+ provision: mode === "provision" && (explicit || lakebasePluginPresent),
35
+ ...(!shouldResolve
36
+ ? {
37
+ skippedReason: mode === false ? ("disabled" as const) : ("no database plugin" as const),
38
+ }
39
+ : {}),
40
+ };
41
+ }
@@ -56,7 +56,7 @@ let persistentStorageCtor: PersistentStorageConstructor | undefined | null = nul
56
56
  * Lazily resolve AppKit's internal `PersistentStorage` constructor. `null`
57
57
  * means not attempted yet; `undefined` means the lookup already failed.
58
58
  */
59
- function loadPersistentStorage(): PersistentStorageConstructor | undefined {
59
+ export function loadPersistentStorage(): PersistentStorageConstructor | undefined {
60
60
  if (persistentStorageCtor !== null) {
61
61
  return persistentStorageCtor;
62
62
  }
package/src/appkit.ts CHANGED
@@ -14,9 +14,9 @@
14
14
  * ```
15
15
  *
16
16
  * Auto-configuration runs BEFORE delegating so plugins see a fully populated
17
- * `process.env` during their synchronous `setup()`. Lakebase Postgres runs when
18
- * a `lakebase` plugin is present, or when {@link AutoConfigureMode} is set
19
- * explicitly on the config object.
17
+ * `process.env` during their synchronous `setup()`. Lakebase Postgres resolution
18
+ * runs when a native `lakebase` or `database` plugin is present, or when
19
+ * {@link AutoConfigureMode} is set explicitly on the config object.
20
20
  *
21
21
  * `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
22
22
  * client + request metadata; the wrappers here make it safe to call outside a
@@ -37,6 +37,7 @@ import {
37
37
  import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
38
38
  import { async, log } from "@dbx-tools/shared-core";
39
39
 
40
+ import { resolveAutoConfigurePolicy } from "./_auto-configure.ts";
40
41
  import { createSoftPersistentStorage } from "./_cache-storage.ts";
41
42
  import { loadBrandContext } from "./brand.ts";
42
43
  import {
@@ -61,9 +62,11 @@ type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
61
62
  * grant the AppKit cache schema to the connecting role.
62
63
  * - `"env"`: resolve the Lakebase connection into `process.env` only.
63
64
  *
64
- * Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
65
- * set it explicitly to run regardless of the plugin list, or pass `false` to
66
- * skip auto-configuration entirely.
65
+ * Omit it to resolve database environment when a native `lakebase` or
66
+ * `database` plugin is registered. Implicit cache-schema grants remain gated on
67
+ * `lakebase`; `database` owns its own pool and does not broaden grants. Set the
68
+ * mode explicitly to run regardless of the plugin list, or pass `false` to skip
69
+ * auto-configuration entirely.
67
70
  *
68
71
  * Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
69
72
  * AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
@@ -94,7 +97,6 @@ export type CreateAppConfig<T extends AppKitPlugins = AppKitPlugins> = Omit<
94
97
  };
95
98
 
96
99
  const LAKEBASE_PLUGIN = "lakebase";
97
- const DEFAULT_AUTO_CONFIGURE: AutoConfigureMode = "provision";
98
100
 
99
101
  /**
100
102
  * Upper bound on boot-time auto-configuration. It runs as the service principal
@@ -121,9 +123,9 @@ function pluginNames(config: CreateAppConfig | undefined): string[] {
121
123
  * Run enabled auto-configuration steps without calling AppKit's `createApp`.
122
124
  *
123
125
  * Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
124
- * explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
125
- * cancels the resolution; it is combined with an internal boot timeout either
126
- * way.
126
+ * explicitly or a native `lakebase`/`database` plugin is listed in
127
+ * `config.plugins`. `signal` cancels the resolution; it is combined with an
128
+ * internal boot timeout either way.
127
129
  *
128
130
  * @example
129
131
  * import { appkit } from "@dbx-tools/appkit";
@@ -135,27 +137,23 @@ export async function autoConfigure<T extends AppKitPlugins>(
135
137
  config?: CreateAppConfig<T>,
136
138
  signal?: AbortSignal,
137
139
  ): Promise<LakebaseConnection | undefined> {
138
- const mode = config?.autoConfigure ?? DEFAULT_AUTO_CONFIGURE;
139
- const explicit = config?.autoConfigure !== undefined;
140
- const lakebasePluginPresent = usesPlugin(config, LAKEBASE_PLUGIN);
141
140
  const plugins = pluginNames(config);
141
+ const policy = resolveAutoConfigurePolicy(plugins, config?.autoConfigure);
142
142
  logger.debug("autoConfigure: start", {
143
- mode,
144
- explicit,
145
- lakebasePluginPresent,
143
+ ...policy,
146
144
  plugins,
147
145
  timeoutMs: AUTO_CONFIGURE_TIMEOUT_MS,
148
146
  callerSignal: Boolean(signal),
149
147
  });
150
148
 
151
- if (mode === false || !(explicit || lakebasePluginPresent)) {
152
- const skippedReason = mode === false ? "disabled" : "no lakebase plugin";
153
- logger.debug("autoConfigure: skip", { skippedReason, mode, lakebasePluginPresent, plugins });
149
+ if (!policy.shouldResolve) {
150
+ logger.debug("autoConfigure: skip", { ...policy, plugins });
154
151
  logger.info("ready", {
155
- autoConfigure: mode,
156
- lakebasePluginPresent,
152
+ autoConfigure: policy.mode,
153
+ lakebasePluginPresent: policy.lakebasePluginPresent,
154
+ databasePluginPresent: policy.databasePluginPresent,
157
155
  provisioned: false,
158
- skippedReason,
156
+ skippedReason: policy.skippedReason,
159
157
  });
160
158
  return undefined;
161
159
  }
@@ -164,16 +162,24 @@ export async function autoConfigure<T extends AppKitPlugins>(
164
162
  async.tieAbortSignal(controller, signal);
165
163
  async.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
166
164
 
167
- const provision = mode === "provision";
168
- logger.debug("autoConfigure: resolve lakebase", { provision, mode });
169
- const resolved = await autoConfigureLakebase(provision, controller.signal);
165
+ logger.debug("autoConfigure: resolve lakebase", {
166
+ provision: policy.provision,
167
+ mode: policy.mode,
168
+ });
169
+ const resolved = await autoConfigureLakebase(policy.provision, controller.signal);
170
170
  logger.debug("autoConfigure: done", {
171
- mode,
172
- lakebasePluginPresent,
173
- provisioned: provision,
171
+ mode: policy.mode,
172
+ lakebasePluginPresent: policy.lakebasePluginPresent,
173
+ databasePluginPresent: policy.databasePluginPresent,
174
+ provisioned: policy.provision,
174
175
  ...redactLakebaseConnection(resolved),
175
176
  });
176
- logger.info("ready", { autoConfigure: mode, lakebasePluginPresent, provisioned: provision });
177
+ logger.info("ready", {
178
+ autoConfigure: policy.mode,
179
+ lakebasePluginPresent: policy.lakebasePluginPresent,
180
+ databasePluginPresent: policy.databasePluginPresent,
181
+ provisioned: policy.provision,
182
+ });
177
183
  return resolved;
178
184
  }
179
185
 
package/src/toolkit.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Type-owned AppKit toolkit entry construction shared by dbx-tools add-ons.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import type { AgentToolDefinition, ToolkitEntry, ToolkitOptions } from "@databricks/appkit/beta";
8
+
9
+ /** Resolve one local tool name through AppKit toolkit filtering and naming options. */
10
+ export function name(
11
+ localName: string,
12
+ pluginName: string,
13
+ options: ToolkitOptions = {},
14
+ ): string | null {
15
+ if (options.only && !options.only.includes(localName)) return null;
16
+ if (options.except?.includes(localName)) return null;
17
+ return options.rename?.[localName] ?? `${options.prefix ?? `${pluginName}.`}${localName}`;
18
+ }
19
+
20
+ /** Convert AppKit tool definitions into public toolkit references. */
21
+ export function entries(
22
+ pluginName: string,
23
+ definitions: readonly AgentToolDefinition[],
24
+ options: ToolkitOptions = {},
25
+ ): Record<string, ToolkitEntry> {
26
+ return Object.fromEntries(
27
+ definitions.flatMap((definition) => {
28
+ const key = name(definition.name, pluginName, options);
29
+ if (key === null) return [];
30
+ return [
31
+ [
32
+ key,
33
+ {
34
+ __toolkitRef: true as const,
35
+ pluginName,
36
+ localName: definition.name,
37
+ def: { ...definition, name: key },
38
+ annotations: definition.annotations,
39
+ } satisfies ToolkitEntry,
40
+ ],
41
+ ];
42
+ }),
43
+ );
44
+ }