@dbx-tools/databricks 0.9.93 → 0.9.99

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/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/databricks";
6
- export const PACKAGE_VERSION = "0.9.93";
6
+ export const PACKAGE_VERSION = "0.9.99";
7
7
  export * as cloud from "./src/cloud.ts";
8
8
  export * as databricksFS from "./src/databricks-fs.ts";
9
9
  export * as databricksPath from "./src/databricks-path.ts";
@@ -12,7 +12,7 @@ export * as workspaceClient from "./src/workspace-client.ts";
12
12
  export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
13
13
  export type { CloudLocation } from "./src/cloud.ts";
14
14
  export { DatabricksFileSystem } from "./src/databricks-fs.ts";
15
- export type { DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
15
+ export type { DatabricksFileSystemClientResolver, DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
16
16
  export { isHomeRelativePath } from "./src/databricks-path.ts";
17
17
  export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
18
18
  export { getPublicIp } from "./src/net.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
2
- export declare const PACKAGE_VERSION = "0.9.93";
2
+ export declare const PACKAGE_VERSION = "0.9.99";
3
3
  export * as cloud from "./src/cloud.ts";
4
4
  export * as databricksFS from "./src/databricks-fs.ts";
5
5
  export * as databricksPath from "./src/databricks-path.ts";
@@ -8,7 +8,7 @@ export * as workspaceClient from "./src/workspace-client.ts";
8
8
  export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
9
9
  export type { CloudLocation } from "./src/cloud.ts";
10
10
  export { DatabricksFileSystem } from "./src/databricks-fs.ts";
11
- export type { DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
11
+ export type { DatabricksFileSystemClientResolver, DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
12
12
  export { isHomeRelativePath } from "./src/databricks-path.ts";
13
13
  export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
14
14
  export { getPublicIp } from "./src/net.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/databricks";
5
- export const PACKAGE_VERSION = "0.9.93";
5
+ export const PACKAGE_VERSION = "0.9.99";
6
6
  export * as cloud from "./src/cloud.js";
7
7
  export * as databricksFS from "./src/databricks-fs.js";
8
8
  export * as databricksPath from "./src/databricks-path.js";
@@ -12,4 +12,4 @@ export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.js";
12
12
  export { DatabricksFileSystem } from "./src/databricks-fs.js";
13
13
  export { isHomeRelativePath } from "./src/databricks-path.js";
14
14
  export { getPublicIp } from "./src/net.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS45M1wiO1xuZXhwb3J0ICogYXMgY2xvdWQgZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzRlMgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtZnMudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NQYXRoIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VDbGllbnQgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcbmV4cG9ydCB7IFJBTkdFX0NBQ0hFX1RUTF9NUywgQ2xvdWRQcm92aWRlciB9IGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbG91ZExvY2F0aW9uIH0gZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucywgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgeyBpc0hvbWVSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlc0JhY2tlbmQsIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucywgUmVzb2x2ZURhdGFicmlja3NSb290T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCB7IGdldFB1YmxpY0lwIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLWNsaWVudC50c1wiO1xuIl19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS45OVwiO1xuZXhwb3J0ICogYXMgY2xvdWQgZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzRlMgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtZnMudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NQYXRoIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VDbGllbnQgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcbmV4cG9ydCB7IFJBTkdFX0NBQ0hFX1RUTF9NUywgQ2xvdWRQcm92aWRlciB9IGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbG91ZExvY2F0aW9uIH0gZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXIsIERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucywgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgeyBpc0hvbWVSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlc0JhY2tlbmQsIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucywgUmVzb2x2ZURhdGFicmlja3NSb290T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCB7IGdldFB1YmxpY0lwIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLWNsaWVudC50c1wiO1xuIl19
@@ -14,6 +14,8 @@
14
14
  */
15
15
  import { BaseFileSystem, type CopyOptions, type FileEntry, type FileStat, type WriteFileOptions } from "@dbx-tools/shared-fs";
16
16
  import { type WorkspaceClient } from "./workspace-client.ts";
17
+ /** Resolve the Databricks client used for the current filesystem operation. */
18
+ export type DatabricksFileSystemClientResolver = () => WorkspaceClient | Promise<WorkspaceClient>;
17
19
  /** Options for {@link DatabricksFileSystem}. */
18
20
  export interface DatabricksFileSystemOptions {
19
21
  /** Unique identifier. Defaults to a stable hash of the normalized root. */
@@ -38,7 +40,7 @@ export interface DatabricksFileSystemOptions {
38
40
  * Databricks workspace client. Defaults to `tryGetWorkspaceClient()`, otherwise
39
41
  * a default {@link WorkspaceClient} from env / profile auth.
40
42
  */
41
- client?: WorkspaceClient;
43
+ client?: WorkspaceClient | DatabricksFileSystemClientResolver;
42
44
  /** Block all write operations. Defaults to false. */
43
45
  readOnly?: boolean;
44
46
  /**
@@ -20,6 +20,12 @@ const DBFS_READ_CHUNK_BYTES = 1024 * 1024;
20
20
  const DBFS_PUT_MAX_BYTES = 1024 * 1024;
21
21
  /** Segments in `/Volumes/<catalog>/<schema>/<volume>`, provisioned out of band. */
22
22
  const VOLUME_ROOT_DEPTH = 4;
23
+ /** Resolve a static, operation-scoped, or ambient Databricks client. */
24
+ async function resolveClientOption(client) {
25
+ if (typeof client === "function")
26
+ return client();
27
+ return client ?? (await getWorkspaceClient());
28
+ }
23
29
  /**
24
30
  * {@link FileSystem} implementation over Databricks workspace files, UC
25
31
  * volumes, and DBFS.
@@ -46,7 +52,7 @@ export class DatabricksFileSystem extends BaseFileSystem {
46
52
  createRoot: options.createRoot ?? false,
47
53
  });
48
54
  this.clientOption = options.client;
49
- this.client = options.client;
55
+ this.client = typeof options.client === "function" ? undefined : options.client;
50
56
  }
51
57
  /**
52
58
  * Construct a {@link DatabricksFileSystem}, resolving `~` roots via the
@@ -56,9 +62,13 @@ export class DatabricksFileSystem extends BaseFileSystem {
56
62
  if (!isHomeRelativePath(options.root) || options.userName?.trim()) {
57
63
  return new DatabricksFileSystem(options);
58
64
  }
59
- const client = options.client ?? (await getWorkspaceClient());
65
+ const client = await resolveClientOption(options.client);
60
66
  const root = await resolveDatabricksRoot(options.root, { client });
61
- return new DatabricksFileSystem({ ...options, root, client });
67
+ return new DatabricksFileSystem({
68
+ ...options,
69
+ root,
70
+ client: options.client ?? client,
71
+ });
62
72
  }
63
73
  /**
64
74
  * Open a UC Volume file as a web stream without buffering it in memory.
@@ -114,14 +124,15 @@ export class DatabricksFileSystem extends BaseFileSystem {
114
124
  }
115
125
  }
116
126
  async onInit() {
117
- this.client = this.clientOption ?? (await getWorkspaceClient());
127
+ this.client = await resolveClientOption(this.clientOption);
118
128
  }
119
129
  /** Run the handler for `absolutePath`'s Databricks API with the live client. */
120
- dispatch(absolutePath, handlers) {
121
- if (!this.client) {
130
+ async dispatch(absolutePath, handlers) {
131
+ const client = typeof this.clientOption === "function" ? await this.clientOption() : this.client;
132
+ if (!client) {
122
133
  throw new FileSystemError("IO_ERROR", "Databricks filesystem is not initialized (no WorkspaceClient)", absolutePath);
123
134
  }
124
- return handlers[resolveDatabricksFilesBackend(absolutePath)](this.client);
135
+ return handlers[resolveDatabricksFilesBackend(absolutePath)](client);
125
136
  }
126
137
  /* ------------------------------------------------------------------ */
127
138
  /* Primitives */
@@ -382,4 +393,4 @@ function bufferToReadableStream(buffer) {
382
393
  },
383
394
  });
384
395
  }
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBcUQ1Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBNEI7SUFDNUQsTUFBTSxDQUE4QjtJQUMzQixZQUFZLENBQThCO0lBRTNELFlBQVksT0FBb0M7UUFDOUMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRixLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEQsT0FBTyxFQUFFLFlBQVk7WUFDckIsSUFBSTtZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixVQUFVLEVB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QUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEMsTUFBTSxNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUNoQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxJQUFJLElBQUk7WUFBRSxNQUFNO1FBQ2hCLElBQUksS0FBSztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxjQUFjLENBQWE7UUFDcEMsS0FBSyxDQUFDLFVBQVU7WUFDZCxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0MsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEYXRhYnJpY2tzIHtAbGluayBGaWxlU3lzdGVtfSBiYWNrZWQgYnkge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0uXG4gKlxuICogRXh0ZW5kcyB7QGxpbmsgQmFzZUZpbGVTeXN0ZW19LiBSb3V0ZXMgSS9PIGJ5IGFic29sdXRlIHBhdGg6XG4gKiAtIGAvV29ya3NwYWNlYCwgYC9Vc2Vyc2AsIGAvUmVwb3NgLCBgL1NoYXJlZGAg4oaSIHdvcmtzcGFjZSBvYmplY3RzIEFQSVxuICogLSBgL1ZvbHVtZXMvLi4uYCAob3IgYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAgcm9vdHMpIOKGkiBVbml0eSBDYXRhbG9nIEZpbGVzIEFQSVxuICogLSBgL2RiZnMvLi4uYCDihpIgREJGUyBBUElcbiAqXG4gKiBFdmVyeSBwcmltaXRpdmUgcGlja3MgaXRzIEFQSSB0aHJvdWdoIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbS5kaXNwYXRjaH1cbiAqIHJhdGhlciB0aGFuIHJlLWJyYW5jaGluZyBieSBoYW5kLCBhbmQgZXJyb3Igbm9ybWFsaXphdGlvbiBpcyBpbmhlcml0ZWQgZnJvbVxuICoge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSwgc28gYSBwcmltaXRpdmUgaGVyZSBpcyBqdXN0IHRoZSBTREsgY2FsbC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaGFzaCwgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIEJhc2VGaWxlU3lzdGVtLFxuICBiYXNlRlMsXG4gIEZpbGVTeXN0ZW1FcnJvcixcbiAgcG9zaXhQYXRoLFxuICB0eXBlIENvcHlPcHRpb25zLFxuICB0eXBlIEZpbGVFbnRyeSxcbiAgdHlwZSBGaWxlU3RhdCxcbiAgdHlwZSBXcml0ZUZpbGVPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB7XG4gIGlzSG9tZVJlbGF0aXZlUGF0aCxcbiAgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3QsXG4gIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLFxuICByZXNvbHZlRGF0YWJyaWNrc1Jvb3QsXG4gIHR5cGUgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCxcbn0gZnJvbSBcIi4vZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VDbGllbnQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIi4vd29ya3NwYWNlLWNsaWVudC50c1wiO1xuXG5jb25zdCBEQkZTX1JFQURfQ0hVTktfQllURVMgPSAxMDI0ICogMTAyNDtcbmNvbnN0IERCRlNfUFVUX01BWF9CWVRFUyA9IDEwMjQgKiAxMDI0O1xuXG4vKiogU2VnbWVudHMgaW4gYC9Wb2x1bWVzLzxjYXRhbG9nPi88c2NoZW1hPi88dm9sdW1lPmAsIHByb3Zpc2lvbmVkIG91dCBvZiBiYW5kLiAqL1xuY29uc3QgVk9MVU1FX1JPT1RfREVQVEggPSA0O1xuXG4vKipcbiAqIE9uZSBoYW5kbGVyIHBlciBEYXRhYnJpY2tzIEFQSSwga2V5ZWQgYnkge0BsaW5rIERhdGFicmlja3NGaWxlc0JhY2tlbmR9IHNvXG4gKiBhZGRpbmcgYSBiYWNrZW5kIGlzIGEgY29tcGlsZSBlcnJvciB1bnRpbCBldmVyeSBjYWxsIHNpdGUgaGFuZGxlcyBpdC5cbiAqL1xudHlwZSBCYWNrZW5kSGFuZGxlcnM8VD4gPSBSZWNvcmQ8RGF0YWJyaWNrc0ZpbGVzQmFja2VuZCwgKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KSA9PiBQcm9taXNlPFQ+PjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX0uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucyB7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllci4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaGFzaCBvZiB0aGUgbm9ybWFsaXplZCByb290LiAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZXN5c3RlbSByb290LiBBY2NlcHRzOlxuICAgKiAtIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgIChhbHNvIGAvVm9sdW1lLy4uLmApXG4gICAqIC0gYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWBcbiAgICogLSBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmAgKG5lZWRzIHtAbGluayB1c2VyTmFtZX0sXG4gICAqICAgb3IgdXNlIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGV9KVxuICAgKiAtIGAvV29ya3NwYWNlLy4uLmAsIGAvVXNlcnMvLi4uYCwgYC9SZXBvcy8uLi5gLCBgL1NoYXJlZC8uLi5gXG4gICAqIC0gYC9kYmZzLy4uLmBcbiAgICovXG4gIHJvb3Q6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlcm5hbWUgZm9yIGV4cGFuZGluZyBgfmAuIFdoZW4gb21pdHRlZCBhbmQge0BsaW5rIHJvb3R9IGlzIGhvbWUtcmVsYXRpdmUsXG4gICAqIHByZWZlciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlfSB3aGljaCByZXNvbHZlcyBpdCB2aWFcbiAgICogYGdldEN1cnJlbnRVc2VyTmFtZWAuXG4gICAqL1xuICB1c2VyTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LiBEZWZhdWx0cyB0byBgdHJ5R2V0V29ya3NwYWNlQ2xpZW50KClgLCBvdGhlcndpc2VcbiAgICogYSBkZWZhdWx0IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IGZyb20gZW52IC8gcHJvZmlsZSBhdXRoLlxuICAgKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xuXG4gIC8qKiBCbG9jayBhbGwgd3JpdGUgb3BlcmF0aW9ucy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIHtAbGluayByb290fSAoYW5kIHBhcmVudHMpIGR1cmluZyBpbml0LiBEZWZhdWx0cyB0byBmYWxzZSAodm9sdW1lXG4gICAqIGFuZCB3b3Jrc3BhY2Ugcm9vdHMgYXJlIHVzdWFsbHkgcHJvdmlzaW9uZWQgb3V0IG9mIGJhbmQpLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG59XG5cbi8qKiBFeGlzdGluZy1maWxlIGJlaGF2aW9yIGZvciBhIHN0cmVhbWVkIFVDIFZvbHVtZSB1cGxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NTdHJlYW1Xcml0ZU9wdGlvbnMge1xuICAvKiogUmVwbGFjZSBhbiBleGlzdGluZyBmaWxlLiBEZWZhdWx0cyB0byB0cnVlLiAqL1xuICBvdmVyd3JpdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIHtAbGluayBGaWxlU3lzdGVtfSBpbXBsZW1lbnRhdGlvbiBvdmVyIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGVzLCBVQ1xuICogdm9sdW1lcywgYW5kIERCRlMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7IHJvb3Q6IFwibWFpbi5kZWZhdWx0LmFzc2V0c1wiIH0pO1xuICogYXdhaXQgZnMud3JpdGVGaWxlKFwibm90ZXMvaGVsbG8udHh0XCIsIFwiaGlcIik7XG4gKlxuICogY29uc3QgaG9tZSA9IGF3YWl0IERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZSh7IHJvb3Q6IFwiflwiIH0pO1xuICogY29uc3QgbGlzdGluZyA9IGF3YWl0IGhvbWUucmVhZGRpcihcIi5cIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NGaWxlU3lzdGVtIGV4dGVuZHMgQmFzZUZpbGVTeXN0ZW08XCJkYXRhYnJpY2tzXCI+IHtcbiAgcHJpdmF0ZSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRPcHRpb246IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMpIHtcbiAgICBjb25zdCByb290ID0gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3Qob3B0aW9ucy5yb290LCB7IHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lIH0pO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBkYXRhYnJpY2tzLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImRhdGFicmlja3NcIixcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogb3B0aW9ucy5yZWFkT25seSxcbiAgICAgIGNyZWF0ZVJvb3Q6IG9wdGlvbnMuY3JlYXRlUm9vdCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmNsaWVudE9wdGlvbiA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSwgcmVzb2x2aW5nIGB+YCByb290cyB2aWEgdGhlXG4gICAqIHdvcmtzcGFjZSBjdXJyZW50IHVzZXIgd2hlbiBuZWVkZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucyk6IFByb21pc2U8RGF0YWJyaWNrc0ZpbGVTeXN0ZW0+IHtcbiAgICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChvcHRpb25zLnJvb3QpIHx8IG9wdGlvbnMudXNlck5hbWU/LnRyaW0oKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbShvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCByb290ID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyBjbGllbnQgfSk7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7IC4uLm9wdGlvbnMsIHJvb3QsIGNsaWVudCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgVUMgVm9sdW1lIGZpbGUgYXMgYSB3ZWIgc3RyZWFtIHdpdGhvdXQgYnVmZmVyaW5nIGl0IGluIG1lbW9yeS5cbiAgICpcbiAgICogUmV1c2UgdGhpcyBmb3IgbGFyZ2UgVm9sdW1lIHRyYW5zZmVycy4gV29ya3NwYWNlIGZpbGVzIGFuZCBEQkZTIHJldGFpblxuICAgKiB0aGVpciBleGlzdGluZyBidWZmZXJlZCBBUElzIGJlY2F1c2UgdGhlaXIgU0RLIHN1cmZhY2VzIGFyZSBub3QgcmF3IHN0cmVhbXMuXG4gICAqL1xuICBhc3luYyByZWFkU3RyZWFtKGlucHV0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlRm9yKGlucHV0UGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRpc3BhdGNoKHJlc29sdmVkUGF0aCwge1xuICAgICAgICBkYmZzOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgICB2b2x1bWVzOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZmlsZXMuZG93bmxvYWQoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHJlc3BvbnNlLmNvbnRlbnRzIGFzIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICAgICAgXCJJT19FUlJPUlwiLFxuICAgICAgICAgICAgICBcIlZvbHVtZSBkb3dubG9hZCByZXR1cm5lZCBubyBjb250ZW50XCIsXG4gICAgICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb250ZW50cztcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGVycm9yLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gYSBmaWxlIHRvIGEgVUMgVm9sdW1lIHdpdGhvdXQgbG9hZGluZyBpdCBjb21wbGV0ZWx5IGludG8gbWVtb3J5LlxuICAgKlxuICAgKiBQYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgY29uc2lzdGVudGx5IHdpdGgge0BsaW5rIHdyaXRlRmlsZX0uIFRoZVxuICAgKiBGaWxlcyBBUEkgb3ducyB0cmFuc2ZlciByZXRyaWVzIGFuZCBhdXRoZW50aWNhdGlvbiB0aHJvdWdoIHRoZSBpbmplY3RlZFxuICAgKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fS5cbiAgICovXG4gIGFzeW5jIHdyaXRlU3RyZWFtKFxuICAgIGlucHV0UGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4gICAgb3B0aW9uczogRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5hc3NlcnRXcml0YWJsZShcIndyaXRlIHN0cmVhbVwiKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVBhcmVudERpcmVjdG9yeShpbnB1dFBhdGgpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IHRoaXMucmVzb2x2ZUZvcihpbnB1dFBhdGgsIHsgYWxsb3dNaXNzaW5nOiB0cnVlIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoKHJlc29sdmVkUGF0aCwge1xuICAgICAgICBkYmZzOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PlxuICAgICAgICAgIGNsaWVudC5maWxlcy51cGxvYWQoe1xuICAgICAgICAgICAgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgICBjb250ZW50czogY29udGVudCBhcyBuZXZlcixcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogb3B0aW9ucy5vdmVyd3JpdGUgPz8gdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGVycm9yLCByZXNvbHZlZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGllbnQgPSB0aGlzLmNsaWVudE9wdGlvbiA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpO1xuICB9XG5cbiAgLyoqIFJ1biB0aGUgaGFuZGxlciBmb3IgYGFic29sdXRlUGF0aGAncyBEYXRhYnJpY2tzIEFQSSB3aXRoIHRoZSBsaXZlIGNsaWVudC4gKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaDxUPihhYnNvbHV0ZVBhdGg6IHN0cmluZywgaGFuZGxlcnM6IEJhY2tlbmRIYW5kbGVyczxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5jbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgIFwiSU9fRVJST1JcIixcbiAgICAgICAgXCJEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gaXMgbm90IGluaXRpYWxpemVkIChubyBXb3Jrc3BhY2VDbGllbnQpXCIsXG4gICAgICAgIGFic29sdXRlUGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyc1tyZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZChhYnNvbHV0ZVBhdGgpXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyogUHJpbWl0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVSb290RGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5QXQodGhpcy5yb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQnl0ZXNBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMuZGlzcGF0Y2g8QnVmZmVyPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IHRoaXMucmVhZERiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICAgIHdvcmtzcGFjZTogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZXhwb3J0KHsgcGF0aDogcmVzb2x2ZWRQYXRoLCBmb3JtYXQ6IFwiQVVUT1wiIH0pO1xuICAgICAgICByZXR1cm4gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmNvbnRlbnQpO1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZmlsZXMuZG93bmxvYWQoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHJlYWRSZXNwb25zZUJvZHkoXG4gICAgICAgICAgcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgd3JpdGVCeXRlc0F0KFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFVpbnQ4QXJyYXksXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8V3JpdGVGaWxlT3B0aW9ucz4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQpO1xuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdGlvbnMub3ZlcndyaXRlO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLndyaXRlRGJmc0ZpbGUoY2xpZW50LCByZXNvbHZlZFBhdGgsIGJ1ZmZlciwgb3ZlcndyaXRlKSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LndvcmtzcGFjZS5pbXBvcnQoe1xuICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiQVVUT1wiLFxuICAgICAgICAgIGNvbnRlbnQ6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgY29udGVudHM6IGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyKSBhcyBuZXZlcixcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUZpbGVBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZSh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLm1rZGlycyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiB0aGlzLmNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZURpcmVjdG9yeSh7IGRpcmVjdG9yeV9wYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoPEZpbGVFbnRyeVtdPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LmRiZnMubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC53b3Jrc3BhY2UubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICAgIG1vZGlmaWVkQXQ6IGluZm8ubW9kaWZpZWRfYXQsXG4gICAgICAgICAgICBvYmplY3RJZDogaW5mby5vYmplY3RfaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQuZmlsZXMubGlzdERpcmVjdG9yeUNvbnRlbnRzKHsgZGlyZWN0b3J5X3BhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGVudHJ5KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUgPz8gcG9zaXhQYXRoLmJhc2VuYW1lKGVudHJ5LnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogZW50cnkuaXNfZGlyZWN0b3J5ID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGVudHJ5LmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgZmFsbGJhY2tOYW1lID0gcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcG9zaXhQYXRoLmJhc2VuYW1lKHRoaXMucm9vdCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2g8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5kYmZzLmdldFN0YXR1cyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpY2F0aW9uX3RpbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5vYmplY3RfdHlwZSA9PT0gXCJESVJFQ1RPUllcIiA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBjcmVhdGVkQXQ6IG9iamVjdC50b0RhdGUoaW5mby5jcmVhdGVkX2F0KSxcbiAgICAgICAgICBtb2RpZmllZEF0OiBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpZWRfYXQpLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuc3RhdFZvbHVtZVBhdGgoY2xpZW50LCByZXNvbHZlZFBhdGgsIGZhbGxiYWNrTmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5TW92ZUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gT25seSBEQkZTIGV4cG9zZXMgYSBzZXJ2ZXItc2lkZSBtb3ZlOyBldmVyeXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGVcbiAgICAvLyBwb3J0YWJsZSBjb3B5ICsgZGVsZXRlIGluIEJhc2VGaWxlU3lzdGVtLlxuICAgIGlmIChcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKHNvdXJjZVBhdGgpICE9PSBcImRiZnNcIiB8fFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoZGVzdGluYXRpb25QYXRoKSAhPT0gXCJkYmZzXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihzb3VyY2VQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZGJmcy5tb3ZlKHsgc291cmNlX3BhdGg6IHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uX3BhdGg6IGRlc3RpbmF0aW9uUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgdm9sdW1lczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIEJhY2tlbmQtc3BlY2lmaWMgSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogVUMgYGNyZWF0ZURpcmVjdG9yeWAgaXMgc2luZ2xlLWxldmVsLCBzbyB3YWxrIHRoZSBwYXRoIGNyZWF0aW5nIGVhY2ggbGV2ZWxcbiAgICogYmVsb3cgdGhlIHZvbHVtZSBpdHNlbGYuIEEgbGV2ZWwgdGhhdCBhbHJlYWR5IGV4aXN0cyBpcyBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGFic29sdXRlUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gYCR7Y3VycmVudH0vJHtwYXJ0c1tpXX1gO1xuICAgICAgaWYgKGkgPCBWT0xVTUVfUk9PVF9ERVBUSCkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGlzIGZpbmU7IGFueXRoaW5nIGVsc2UgaXMgYSByZWFsIGZhaWx1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGF0IGEgVUMgcGF0aDogZmlsZSBtZXRhZGF0YSBmaXJzdCwgdGhlbiBhIGRpcmVjdG9yeSBwcm9iZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGF0Vm9sdW1lUGF0aChcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBmYWxsYmFja05hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0TWV0YWRhdGEoeyBmaWxlX3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIGNvbnN0IG1vZGlmaWVkID0gb2JqZWN0LnRvRGF0ZShtZXRhZGF0YVtcImxhc3QtbW9kaWZpZWRcIl0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmFsbGJhY2tOYW1lLFxuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgc2l6ZTogTnVtYmVyKG1ldGFkYXRhW1wiY29udGVudC1sZW5ndGhcIl0gPz8gMCksXG4gICAgICAgIGNyZWF0ZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1vZGlmaWVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICBtaW1lVHlwZTogbWV0YWRhdGFbXCJjb250ZW50LXR5cGVcIl0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGZpbGVFcnIpIHtcbiAgICAgIC8vIEEgZGlyZWN0b3J5IGhhcyBubyBmaWxlIG1ldGFkYXRhLCBhbmQgYW4gdW5yZWFkYWJsZSBvbmUgcmVwb3J0cyBhc1xuICAgICAgLy8gbWlzc2luZyAvIGRlbmllZCAtIGJvdGggYXJlIHdvcnRoIGEgZGlyZWN0b3J5IHByb2JlIGJlZm9yZSBmYWlsaW5nLlxuICAgICAgY29uc3QgY29kZSA9IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZmlsZUVyciwgYWJzb2x1dGVQYXRoKS5jb2RlO1xuICAgICAgaWYgKGNvZGUgIT09IFwiTk9UX0ZPVU5EXCIgJiYgY29kZSAhPT0gXCJQRVJNSVNTSU9OX0RFTklFRFwiKSB0aHJvdyBmaWxlRXJyO1xuICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGZhbGxiYWNrTmFtZSwgdHlwZTogXCJkaXJlY3RvcnlcIiB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZERiZnNGaWxlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5kYmZzLnJlYWQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiBEQkZTX1JFQURfQ0hVTktfQllURVMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNodW5rID0gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA8IERCRlNfUkVBRF9DSFVOS19CWVRFUykgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlRGJmc0ZpbGUoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgb3ZlcndyaXRlOiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA8PSBEQkZTX1BVVF9NQVhfQllURVMpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLnB1dCh7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudHM6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuZGJmcy5jcmVhdGUoeyBwYXRoOiBhYnNvbHV0ZVBhdGgsIG92ZXJ3cml0ZSB9KTtcbiAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVkLmhhbmRsZTtcbiAgICBpZiAoaGFuZGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJJT19FUlJPUlwiLCBcIkRCRlMgdXBsb2FkIGhhbmRsZSBtaXNzaW5nXCIsIGFic29sdXRlUGF0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBidWZmZXIubGVuZ3RoOyBvZmZzZXQgKz0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgREJGU19QVVRfTUFYX0JZVEVTKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LmRiZnMuYWRkQmxvY2soeyBoYW5kbGUsIGRhdGE6IHNsaWNlLnRvU3RyaW5nKFwiYmFzZTY0XCIpIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBEcmFpbiBhbiBTREsgYXN5bmMgaXRlcmFibGUgaW50byBhIG1hcHBlZCBhcnJheS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3Q8UywgVD4oc291cmNlOiBBc3luY0l0ZXJhYmxlPFM+LCBtYXA6IChpdGVtOiBTKSA9PiBUKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSBpdGVtcy5wdXNoKG1hcChpdGVtKSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxuLyoqIEhhbmRsZXIgZm9yIGEgYmFja2VuZCBhIGNhbGwgc2l0ZSBoYXMgYWxyZWFkeSBydWxlZCBvdXQuICovXG5mdW5jdGlvbiB1bnJlYWNoYWJsZUJhY2tlbmQoKTogUHJvbWlzZTxuZXZlcj4ge1xuICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiTk9UX1NVUFBPUlRFRFwiLCBcIlVuc3VwcG9ydGVkIERhdGFicmlja3MgYmFja2VuZCBmb3IgdGhpcyBvcGVyYXRpb25cIik7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NChkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdWZmZXIge1xuICBpZiAoIWRhdGEpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkYXRhLCBcImJhc2U2NFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlQm9keShcbiAgY29udGVudHM6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBpZiAoIWNvbnRlbnRzKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICBjb25zdCByZWFkZXIgPSBjb250ZW50cy5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBpZiAodmFsdWUpIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MubWFwKChjaHVuaykgPT4gQnVmZmVyLmZyb20oY2h1bmspKSk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyOiBCdWZmZXIpOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBd0Q1Qix3RUFBd0U7QUFDeEUsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxNQUF3RTtJQUV4RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLE1BQU0sRUFBRSxDQUFDO0lBQ2xELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUE0QjtJQUM1RCxNQUFNLENBQThCO0lBQzNCLFlBQVksQ0FBbUU7SUFFaEcsWUFBWSxPQUFvQztRQUM5QyxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFD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QUNyQixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyB7QGxpbmsgRmlsZVN5c3RlbX0gYmFja2VkIGJ5IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIEJhc2VGaWxlU3lzdGVtfS4gUm91dGVzIEkvTyBieSBhYnNvbHV0ZSBwYXRoOlxuICogLSBgL1dvcmtzcGFjZWAsIGAvVXNlcnNgLCBgL1JlcG9zYCwgYC9TaGFyZWRgIOKGkiB3b3Jrc3BhY2Ugb2JqZWN0cyBBUElcbiAqIC0gYC9Wb2x1bWVzLy4uLmAgKG9yIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIHJvb3RzKSDihpIgVW5pdHkgQ2F0YWxvZyBGaWxlcyBBUElcbiAqIC0gYC9kYmZzLy4uLmAg4oaSIERCRlMgQVBJXG4gKlxuICogRXZlcnkgcHJpbWl0aXZlIHBpY2tzIGl0cyBBUEkgdGhyb3VnaCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uZGlzcGF0Y2h9XG4gKiByYXRoZXIgdGhhbiByZS1icmFuY2hpbmcgYnkgaGFuZCwgYW5kIGVycm9yIG5vcm1hbGl6YXRpb24gaXMgaW5oZXJpdGVkIGZyb21cbiAqIHtAbGluayBCYXNlRmlsZVN5c3RlbX0sIHNvIGEgcHJpbWl0aXZlIGhlcmUgaXMganVzdCB0aGUgU0RLIGNhbGwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGhhc2gsIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgYmFzZUZTLFxuICBGaWxlU3lzdGVtRXJyb3IsXG4gIHBvc2l4UGF0aCxcbiAgdHlwZSBDb3B5T3B0aW9ucyxcbiAgdHlwZSBGaWxlRW50cnksXG4gIHR5cGUgRmlsZVN0YXQsXG4gIHR5cGUgV3JpdGVGaWxlT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQge1xuICBpc0hvbWVSZWxhdGl2ZVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFicmlja3NSb290LFxuICByZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCxcbiAgcmVzb2x2ZURhdGFicmlja3NSb290LFxuICB0eXBlIERhdGFicmlja3NGaWxlc0JhY2tlbmQsXG59IGZyb20gXCIuL2RhdGFicmlja3MtcGF0aC50c1wiO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlQ2xpZW50LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcblxuY29uc3QgREJGU19SRUFEX0NIVU5LX0JZVEVTID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBEQkZTX1BVVF9NQVhfQllURVMgPSAxMDI0ICogMTAyNDtcblxuLyoqIFNlZ21lbnRzIGluIGAvVm9sdW1lcy88Y2F0YWxvZz4vPHNjaGVtYT4vPHZvbHVtZT5gLCBwcm92aXNpb25lZCBvdXQgb2YgYmFuZC4gKi9cbmNvbnN0IFZPTFVNRV9ST09UX0RFUFRIID0gNDtcblxuLyoqXG4gKiBPbmUgaGFuZGxlciBwZXIgRGF0YWJyaWNrcyBBUEksIGtleWVkIGJ5IHtAbGluayBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kfSBzb1xuICogYWRkaW5nIGEgYmFja2VuZCBpcyBhIGNvbXBpbGUgZXJyb3IgdW50aWwgZXZlcnkgY2FsbCBzaXRlIGhhbmRsZXMgaXQuXG4gKi9cbnR5cGUgQmFja2VuZEhhbmRsZXJzPFQ+ID0gUmVjb3JkPERhdGFicmlja3NGaWxlc0JhY2tlbmQsIChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCkgPT4gUHJvbWlzZTxUPj47XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIGNsaWVudCB1c2VkIGZvciB0aGUgY3VycmVudCBmaWxlc3lzdGVtIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXIgPSAoKSA9PiBXb3Jrc3BhY2VDbGllbnQgfCBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD47XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIG5vcm1hbGl6ZWQgcm9vdC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGVzeXN0ZW0gcm9vdC4gQWNjZXB0czpcbiAgICogLSBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYCAoYWxzbyBgL1ZvbHVtZS8uLi5gKVxuICAgKiAtIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgXG4gICAqIC0gYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gIChuZWVkcyB7QGxpbmsgdXNlck5hbWV9LFxuICAgKiAgIG9yIHVzZSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlfSlcbiAgICogLSBgL1dvcmtzcGFjZS8uLi5gLCBgL1VzZXJzLy4uLmAsIGAvUmVwb3MvLi4uYCwgYC9TaGFyZWQvLi4uYFxuICAgKiAtIGAvZGJmcy8uLi5gXG4gICAqL1xuICByb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXJuYW1lIGZvciBleHBhbmRpbmcgYH5gLiBXaGVuIG9taXR0ZWQgYW5kIHtAbGluayByb290fSBpcyBob21lLXJlbGF0aXZlLFxuICAgKiBwcmVmZXIge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZX0gd2hpY2ggcmVzb2x2ZXMgaXQgdmlhXG4gICAqIGBnZXRDdXJyZW50VXNlck5hbWVgLlxuICAgKi9cbiAgdXNlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudC4gRGVmYXVsdHMgdG8gYHRyeUdldFdvcmtzcGFjZUNsaWVudCgpYCwgb3RoZXJ3aXNlXG4gICAqIGEgZGVmYXVsdCB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAgICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCB8IERhdGFicmlja3NGaWxlU3lzdGVtQ2xpZW50UmVzb2x2ZXI7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIGZhbHNlICh2b2x1bWVcbiAgICogYW5kIHdvcmtzcGFjZSByb290cyBhcmUgdXN1YWxseSBwcm92aXNpb25lZCBvdXQgb2YgYmFuZCkuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbn1cblxuLyoqIEV4aXN0aW5nLWZpbGUgYmVoYXZpb3IgZm9yIGEgc3RyZWFtZWQgVUMgVm9sdW1lIHVwbG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB7XG4gIC8qKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKiBSZXNvbHZlIGEgc3RhdGljLCBvcGVyYXRpb24tc2NvcGVkLCBvciBhbWJpZW50IERhdGFicmlja3MgY2xpZW50LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsaWVudE9wdGlvbihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCBEYXRhYnJpY2tzRmlsZVN5c3RlbUNsaWVudFJlc29sdmVyIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgaWYgKHR5cGVvZiBjbGllbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNsaWVudCgpO1xuICByZXR1cm4gY2xpZW50ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIG92ZXIgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZXMsIFVDXG4gKiB2b2x1bWVzLCBhbmQgREJGUy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHsgcm9vdDogXCJtYWluLmRlZmF1bHQuYXNzZXRzXCIgfSk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJub3Rlcy9oZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gYXdhaXQgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlKHsgcm9vdDogXCJ+XCIgfSk7XG4gKiBjb25zdCBsaXN0aW5nID0gYXdhaXQgaG9tZS5yZWFkZGlyKFwiLlwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0gZXh0ZW5kcyBCYXNlRmlsZVN5c3RlbTxcImRhdGFicmlja3NcIj4ge1xuICBwcml2YXRlIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudE9wdGlvbjogV29ya3NwYWNlQ2xpZW50IHwgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1DbGllbnRSZXNvbHZlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMpIHtcbiAgICBjb25zdCByb290ID0gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3Qob3B0aW9ucy5yb290LCB7IHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lIH0pO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBkYXRhYnJpY2tzLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImRhdGFicmlja3NcIixcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogb3B0aW9ucy5yZWFkT25seSxcbiAgICAgIGNyZWF0ZVJvb3Q6IG9wdGlvbnMuY3JlYXRlUm9vdCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmNsaWVudE9wdGlvbiA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LCByZXNvbHZpbmcgYH5gIHJvb3RzIHZpYSB0aGVcbiAgICogd29ya3NwYWNlIGN1cnJlbnQgdXNlciB3aGVuIG5lZWRlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0aW9uczogRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbT4ge1xuICAgIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKG9wdGlvbnMucm9vdCkgfHwgb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCByZXNvbHZlQ2xpZW50T3B0aW9uKG9wdGlvbnMuY2xpZW50KTtcbiAgICBjb25zdCByb290ID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyBjbGllbnQgfSk7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcm9vdCxcbiAgICAgIGNsaWVudDogb3B0aW9ucy5jbGllbnQgPz8gY2xpZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBVQyBWb2x1bWUgZmlsZSBhcyBhIHdlYiBzdHJlYW0gd2l0aG91dCBidWZmZXJpbmcgaXQgaW4gbWVtb3J5LlxuICAgKlxuICAgKiBSZXVzZSB0aGlzIGZvciBsYXJnZSBWb2x1bWUgdHJhbnNmZXJzLiBXb3Jrc3BhY2UgZmlsZXMgYW5kIERCRlMgcmV0YWluXG4gICAqIHRoZWlyIGV4aXN0aW5nIGJ1ZmZlcmVkIEFQSXMgYmVjYXVzZSB0aGVpciBTREsgc3VyZmFjZXMgYXJlIG5vdCByYXcgc3RyZWFtcy5cbiAgICovXG4gIGFzeW5jIHJlYWRTdHJlYW0oaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVGb3IoaW5wdXRQYXRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5maWxlcy5kb3dubG9hZCh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgICAgICBcIklPX0VSUk9SXCIsXG4gICAgICAgICAgICAgIFwiVm9sdW1lIGRvd25sb2FkIHJldHVybmVkIG5vIGNvbnRlbnRcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBhIGZpbGUgdG8gYSBVQyBWb2x1bWUgd2l0aG91dCBsb2FkaW5nIGl0IGNvbXBsZXRlbHkgaW50byBtZW1vcnkuXG4gICAqXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBjb25zaXN0ZW50bHkgd2l0aCB7QGxpbmsgd3JpdGVGaWxlfS4gVGhlXG4gICAqIEZpbGVzIEFQSSBvd25zIHRyYW5zZmVyIHJldHJpZXMgYW5kIGF1dGhlbnRpY2F0aW9uIHRocm91Z2ggdGhlIGluamVjdGVkXG4gICAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICAgKi9cbiAgYXN5bmMgd3JpdGVTdHJlYW0oXG4gICAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PixcbiAgICBvcHRpb25zOiBEYXRhYnJpY2tzU3RyZWFtV3JpdGVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLmFzc2VydFdyaXRhYmxlKFwid3JpdGUgc3RyZWFtXCIpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50RGlyZWN0b3J5KGlucHV0UGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlRm9yKGlucHV0UGF0aCwgeyBhbGxvd01pc3Npbmc6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgICBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50IGFzIG5ldmVyLFxuICAgICAgICAgICAgb3ZlcndyaXRlOiBvcHRpb25zLm92ZXJ3cml0ZSA/PyB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWVudCA9IGF3YWl0IHJlc29sdmVDbGllbnRPcHRpb24odGhpcy5jbGllbnRPcHRpb24pO1xuICB9XG5cbiAgLyoqIFJ1biB0aGUgaGFuZGxlciBmb3IgYGFic29sdXRlUGF0aGAncyBEYXRhYnJpY2tzIEFQSSB3aXRoIHRoZSBsaXZlIGNsaWVudC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaDxUPihhYnNvbHV0ZVBhdGg6IHN0cmluZywgaGFuZGxlcnM6IEJhY2tlbmRIYW5kbGVyczxUPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICB0eXBlb2YgdGhpcy5jbGllbnRPcHRpb24gPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMuY2xpZW50T3B0aW9uKCkgOiB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgXCJJT19FUlJPUlwiLFxuICAgICAgICBcIkRhdGFicmlja3MgZmlsZXN5c3RlbSBpcyBub3QgaW5pdGlhbGl6ZWQgKG5vIFdvcmtzcGFjZUNsaWVudClcIixcbiAgICAgICAgYWJzb2x1dGVQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXJzW3Jlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aCldKGNsaWVudCk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyogUHJpbWl0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVSb290RGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5QXQodGhpcy5yb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQnl0ZXNBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMuZGlzcGF0Y2g8QnVmZmVyPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IHRoaXMucmVhZERiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICAgIHdvcmtzcGFjZTogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZXhwb3J0KHsgcGF0aDogcmVzb2x2ZWRQYXRoLCBmb3JtYXQ6IFwiQVVUT1wiIH0pO1xuICAgICAgICByZXR1cm4gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmNvbnRlbnQpO1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZmlsZXMuZG93bmxvYWQoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHJlYWRSZXNwb25zZUJvZHkoXG4gICAgICAgICAgcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgd3JpdGVCeXRlc0F0KFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFVpbnQ4QXJyYXksXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8V3JpdGVGaWxlT3B0aW9ucz4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQpO1xuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdGlvbnMub3ZlcndyaXRlO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLndyaXRlRGJmc0ZpbGUoY2xpZW50LCByZXNvbHZlZFBhdGgsIGJ1ZmZlciwgb3ZlcndyaXRlKSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LndvcmtzcGFjZS5pbXBvcnQoe1xuICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiQVVUT1wiLFxuICAgICAgICAgIGNvbnRlbnQ6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgY29udGVudHM6IGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyKSBhcyBuZXZlcixcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUZpbGVBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZSh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLm1rZGlycyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiB0aGlzLmNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZURpcmVjdG9yeSh7IGRpcmVjdG9yeV9wYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoPEZpbGVFbnRyeVtdPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LmRiZnMubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC53b3Jrc3BhY2UubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICAgIG1vZGlmaWVkQXQ6IGluZm8ubW9kaWZpZWRfYXQsXG4gICAgICAgICAgICBvYmplY3RJZDogaW5mby5vYmplY3RfaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQuZmlsZXMubGlzdERpcmVjdG9yeUNvbnRlbnRzKHsgZGlyZWN0b3J5X3BhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGVudHJ5KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUgPz8gcG9zaXhQYXRoLmJhc2VuYW1lKGVudHJ5LnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogZW50cnkuaXNfZGlyZWN0b3J5ID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGVudHJ5LmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgZmFsbGJhY2tOYW1lID0gcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcG9zaXhQYXRoLmJhc2VuYW1lKHRoaXMucm9vdCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2g8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5kYmZzLmdldFN0YXR1cyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpY2F0aW9uX3RpbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5vYmplY3RfdHlwZSA9PT0gXCJESVJFQ1RPUllcIiA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBjcmVhdGVkQXQ6IG9iamVjdC50b0RhdGUoaW5mby5jcmVhdGVkX2F0KSxcbiAgICAgICAgICBtb2RpZmllZEF0OiBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpZWRfYXQpLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuc3RhdFZvbHVtZVBhdGgoY2xpZW50LCByZXNvbHZlZFBhdGgsIGZhbGxiYWNrTmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5TW92ZUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gT25seSBEQkZTIGV4cG9zZXMgYSBzZXJ2ZXItc2lkZSBtb3ZlOyBldmVyeXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGVcbiAgICAvLyBwb3J0YWJsZSBjb3B5ICsgZGVsZXRlIGluIEJhc2VGaWxlU3lzdGVtLlxuICAgIGlmIChcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKHNvdXJjZVBhdGgpICE9PSBcImRiZnNcIiB8fFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoZGVzdGluYXRpb25QYXRoKSAhPT0gXCJkYmZzXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihzb3VyY2VQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZGJmcy5tb3ZlKHsgc291cmNlX3BhdGg6IHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uX3BhdGg6IGRlc3RpbmF0aW9uUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgdm9sdW1lczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIEJhY2tlbmQtc3BlY2lmaWMgSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogVUMgYGNyZWF0ZURpcmVjdG9yeWAgaXMgc2luZ2xlLWxldmVsLCBzbyB3YWxrIHRoZSBwYXRoIGNyZWF0aW5nIGVhY2ggbGV2ZWxcbiAgICogYmVsb3cgdGhlIHZvbHVtZSBpdHNlbGYuIEEgbGV2ZWwgdGhhdCBhbHJlYWR5IGV4aXN0cyBpcyBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGFic29sdXRlUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gYCR7Y3VycmVudH0vJHtwYXJ0c1tpXX1gO1xuICAgICAgaWYgKGkgPCBWT0xVTUVfUk9PVF9ERVBUSCkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGlzIGZpbmU7IGFueXRoaW5nIGVsc2UgaXMgYSByZWFsIGZhaWx1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGF0IGEgVUMgcGF0aDogZmlsZSBtZXRhZGF0YSBmaXJzdCwgdGhlbiBhIGRpcmVjdG9yeSBwcm9iZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGF0Vm9sdW1lUGF0aChcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBmYWxsYmFja05hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0TWV0YWRhdGEoeyBmaWxlX3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIGNvbnN0IG1vZGlmaWVkID0gb2JqZWN0LnRvRGF0ZShtZXRhZGF0YVtcImxhc3QtbW9kaWZpZWRcIl0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmFsbGJhY2tOYW1lLFxuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgc2l6ZTogTnVtYmVyKG1ldGFkYXRhW1wiY29udGVudC1sZW5ndGhcIl0gPz8gMCksXG4gICAgICAgIGNyZWF0ZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1vZGlmaWVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICBtaW1lVHlwZTogbWV0YWRhdGFbXCJjb250ZW50LXR5cGVcIl0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGZpbGVFcnIpIHtcbiAgICAgIC8vIEEgZGlyZWN0b3J5IGhhcyBubyBmaWxlIG1ldGFkYXRhLCBhbmQgYW4gdW5yZWFkYWJsZSBvbmUgcmVwb3J0cyBhc1xuICAgICAgLy8gbWlzc2luZyAvIGRlbmllZCAtIGJvdGggYXJlIHdvcnRoIGEgZGlyZWN0b3J5IHByb2JlIGJlZm9yZSBmYWlsaW5nLlxuICAgICAgY29uc3QgY29kZSA9IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZmlsZUVyciwgYWJzb2x1dGVQYXRoKS5jb2RlO1xuICAgICAgaWYgKGNvZGUgIT09IFwiTk9UX0ZPVU5EXCIgJiYgY29kZSAhPT0gXCJQRVJNSVNTSU9OX0RFTklFRFwiKSB0aHJvdyBmaWxlRXJyO1xuICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGZhbGxiYWNrTmFtZSwgdHlwZTogXCJkaXJlY3RvcnlcIiB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZERiZnNGaWxlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5kYmZzLnJlYWQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiBEQkZTX1JFQURfQ0hVTktfQllURVMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNodW5rID0gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA8IERCRlNfUkVBRF9DSFVOS19CWVRFUykgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlRGJmc0ZpbGUoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgb3ZlcndyaXRlOiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA8PSBEQkZTX1BVVF9NQVhfQllURVMpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLnB1dCh7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudHM6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuZGJmcy5jcmVhdGUoeyBwYXRoOiBhYnNvbHV0ZVBhdGgsIG92ZXJ3cml0ZSB9KTtcbiAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVkLmhhbmRsZTtcbiAgICBpZiAoaGFuZGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJJT19FUlJPUlwiLCBcIkRCRlMgdXBsb2FkIGhhbmRsZSBtaXNzaW5nXCIsIGFic29sdXRlUGF0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBidWZmZXIubGVuZ3RoOyBvZmZzZXQgKz0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgREJGU19QVVRfTUFYX0JZVEVTKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LmRiZnMuYWRkQmxvY2soeyBoYW5kbGUsIGRhdGE6IHNsaWNlLnRvU3RyaW5nKFwiYmFzZTY0XCIpIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBEcmFpbiBhbiBTREsgYXN5bmMgaXRlcmFibGUgaW50byBhIG1hcHBlZCBhcnJheS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3Q8UywgVD4oc291cmNlOiBBc3luY0l0ZXJhYmxlPFM+LCBtYXA6IChpdGVtOiBTKSA9PiBUKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSBpdGVtcy5wdXNoKG1hcChpdGVtKSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxuLyoqIEhhbmRsZXIgZm9yIGEgYmFja2VuZCBhIGNhbGwgc2l0ZSBoYXMgYWxyZWFkeSBydWxlZCBvdXQuICovXG5mdW5jdGlvbiB1bnJlYWNoYWJsZUJhY2tlbmQoKTogUHJvbWlzZTxuZXZlcj4ge1xuICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiTk9UX1NVUFBPUlRFRFwiLCBcIlVuc3VwcG9ydGVkIERhdGFicmlja3MgYmFja2VuZCBmb3IgdGhpcyBvcGVyYXRpb25cIik7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NChkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdWZmZXIge1xuICBpZiAoIWRhdGEpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkYXRhLCBcImJhc2U2NFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlQm9keShcbiAgY29udGVudHM6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBpZiAoIWNvbnRlbnRzKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICBjb25zdCByZWFkZXIgPSBjb250ZW50cy5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBpZiAodmFsdWUpIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MubWFwKChjaHVuaykgPT4gQnVmZmVyLmZyb20oY2h1bmspKSk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyOiBCdWZmZXIpOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
package/package.json CHANGED
@@ -24,12 +24,12 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@databricks/appkit": "0.81.0",
27
- "@dbx-tools/appkit": "^0.9.93",
28
- "@dbx-tools/auth": "^0.9.93",
29
- "@dbx-tools/cli-service": "^0.9.93",
30
- "@dbx-tools/core": "^0.9.93",
31
- "@dbx-tools/shared-core": "^0.9.93",
32
- "@dbx-tools/shared-fs": "^0.9.93"
27
+ "@dbx-tools/appkit": "^0.9.99",
28
+ "@dbx-tools/auth": "^0.9.99",
29
+ "@dbx-tools/cli-service": "^0.9.99",
30
+ "@dbx-tools/core": "^0.9.99",
31
+ "@dbx-tools/shared-core": "^0.9.99",
32
+ "@dbx-tools/shared-fs": "^0.9.99"
33
33
  },
34
34
  "main": "./lib/index.js",
35
35
  "license": "Apache-2.0",
@@ -65,7 +65,7 @@
65
65
  "./package.json": "./package.json"
66
66
  }
67
67
  },
68
- "version": "0.9.93",
68
+ "version": "0.9.99",
69
69
  "types": "./lib/index.d.ts",
70
70
  "dbxToolsConfig": {
71
71
  "tags": [
@@ -45,6 +45,9 @@ const VOLUME_ROOT_DEPTH = 4;
45
45
  */
46
46
  type BackendHandlers<T> = Record<DatabricksFilesBackend, (client: WorkspaceClient) => Promise<T>>;
47
47
 
48
+ /** Resolve the Databricks client used for the current filesystem operation. */
49
+ export type DatabricksFileSystemClientResolver = () => WorkspaceClient | Promise<WorkspaceClient>;
50
+
48
51
  /** Options for {@link DatabricksFileSystem}. */
49
52
  export interface DatabricksFileSystemOptions {
50
53
  /** Unique identifier. Defaults to a stable hash of the normalized root. */
@@ -72,7 +75,7 @@ export interface DatabricksFileSystemOptions {
72
75
  * Databricks workspace client. Defaults to `tryGetWorkspaceClient()`, otherwise
73
76
  * a default {@link WorkspaceClient} from env / profile auth.
74
77
  */
75
- client?: WorkspaceClient;
78
+ client?: WorkspaceClient | DatabricksFileSystemClientResolver;
76
79
 
77
80
  /** Block all write operations. Defaults to false. */
78
81
  readOnly?: boolean;
@@ -90,6 +93,14 @@ export interface DatabricksStreamWriteOptions {
90
93
  overwrite?: boolean;
91
94
  }
92
95
 
96
+ /** Resolve a static, operation-scoped, or ambient Databricks client. */
97
+ async function resolveClientOption(
98
+ client: WorkspaceClient | DatabricksFileSystemClientResolver | undefined,
99
+ ): Promise<WorkspaceClient> {
100
+ if (typeof client === "function") return client();
101
+ return client ?? (await getWorkspaceClient());
102
+ }
103
+
93
104
  /**
94
105
  * {@link FileSystem} implementation over Databricks workspace files, UC
95
106
  * volumes, and DBFS.
@@ -105,7 +116,7 @@ export interface DatabricksStreamWriteOptions {
105
116
  */
106
117
  export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
107
118
  private client: WorkspaceClient | undefined;
108
- private readonly clientOption: WorkspaceClient | undefined;
119
+ private readonly clientOption: WorkspaceClient | DatabricksFileSystemClientResolver | undefined;
109
120
 
110
121
  constructor(options: DatabricksFileSystemOptions) {
111
122
  const root = normalizeDatabricksRoot(options.root, { userName: options.userName });
@@ -117,7 +128,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
117
128
  createRoot: options.createRoot ?? false,
118
129
  });
119
130
  this.clientOption = options.client;
120
- this.client = options.client;
131
+ this.client = typeof options.client === "function" ? undefined : options.client;
121
132
  }
122
133
 
123
134
  /**
@@ -128,9 +139,13 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
128
139
  if (!isHomeRelativePath(options.root) || options.userName?.trim()) {
129
140
  return new DatabricksFileSystem(options);
130
141
  }
131
- const client = options.client ?? (await getWorkspaceClient());
142
+ const client = await resolveClientOption(options.client);
132
143
  const root = await resolveDatabricksRoot(options.root, { client });
133
- return new DatabricksFileSystem({ ...options, root, client });
144
+ return new DatabricksFileSystem({
145
+ ...options,
146
+ root,
147
+ client: options.client ?? client,
148
+ });
134
149
  }
135
150
 
136
151
  /**
@@ -196,19 +211,21 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
196
211
  }
197
212
 
198
213
  protected override async onInit(): Promise<void> {
199
- this.client = this.clientOption ?? (await getWorkspaceClient());
214
+ this.client = await resolveClientOption(this.clientOption);
200
215
  }
201
216
 
202
217
  /** Run the handler for `absolutePath`'s Databricks API with the live client. */
203
- private dispatch<T>(absolutePath: string, handlers: BackendHandlers<T>): Promise<T> {
204
- if (!this.client) {
218
+ private async dispatch<T>(absolutePath: string, handlers: BackendHandlers<T>): Promise<T> {
219
+ const client =
220
+ typeof this.clientOption === "function" ? await this.clientOption() : this.client;
221
+ if (!client) {
205
222
  throw new FileSystemError(
206
223
  "IO_ERROR",
207
224
  "Databricks filesystem is not initialized (no WorkspaceClient)",
208
225
  absolutePath,
209
226
  );
210
227
  }
211
- return handlers[resolveDatabricksFilesBackend(absolutePath)](this.client);
228
+ return handlers[resolveDatabricksFilesBackend(absolutePath)](client);
212
229
  }
213
230
 
214
231
  /* ------------------------------------------------------------------ */