@dbx-tools/auth 0.9.30 → 0.9.32
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 +3 -3
- package/lib/index.d.ts +3 -3
- package/lib/index.js +4 -4
- package/lib/src/databricks-auth.js +2 -2
- package/lib/src/{node-storage.d.ts → file-storage.d.ts} +1 -1
- package/lib/src/file-storage.js +207 -0
- package/lib/src/lifecycle.js +15 -11
- package/lib/src/storage.d.ts +12 -3
- package/lib/src/storage.js +65 -51
- package/lib/src/types.d.ts +14 -6
- package/lib/src/types.js +4 -4
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/databricks-auth.ts +1 -1
- package/src/{node-storage.ts → file-storage.ts} +4 -4
- package/src/lifecycle.ts +14 -10
- package/src/storage.ts +81 -47
- package/src/types.ts +17 -9
- package/lib/src/node-storage.js +0 -207
package/index.ts
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
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/auth";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.32";
|
|
7
7
|
export * as databricksAuth from "./src/databricks-auth.ts";
|
|
8
8
|
export * as databricksCli from "./src/databricks-cli.ts";
|
|
9
9
|
export * as errors from "./src/errors.ts";
|
|
10
|
+
export * as fileStorage from "./src/file-storage.ts";
|
|
10
11
|
export * as httpClient from "./src/http-client.ts";
|
|
11
12
|
export * as lifecycle from "./src/lifecycle.ts";
|
|
12
|
-
export * as nodeStorage from "./src/node-storage.ts";
|
|
13
13
|
export * as personalAccessToken from "./src/personal-access-token.ts";
|
|
14
14
|
export * as servicePrincipal from "./src/service-principal.ts";
|
|
15
15
|
export * as storage from "./src/storage.ts";
|
|
@@ -18,10 +18,10 @@ export type { DatabricksAuthDependencies } from "./src/databricks-auth.ts";
|
|
|
18
18
|
export { DatabricksCliProvider } from "./src/databricks-cli.ts";
|
|
19
19
|
export type { DatabricksCliResolver, DatabricksCliResolutionOptions } from "./src/databricks-cli.ts";
|
|
20
20
|
export { AuthError } from "./src/errors.ts";
|
|
21
|
+
export { FileCredentialStore } from "./src/file-storage.ts";
|
|
21
22
|
export { DatabricksClient } from "./src/http-client.ts";
|
|
22
23
|
export type { DatabricksRequestOptions } from "./src/http-client.ts";
|
|
23
24
|
export { TokenLifecycle } from "./src/lifecycle.ts";
|
|
24
|
-
export { FileCredentialStore } from "./src/node-storage.ts";
|
|
25
25
|
export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.ts";
|
|
26
26
|
export { DatabricksServicePrincipalProvider } from "./src/service-principal.ts";
|
|
27
27
|
export type { DatabricksServicePrincipalConfig } from "./src/service-principal.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.32";
|
|
3
3
|
export * as databricksAuth from "./src/databricks-auth.ts";
|
|
4
4
|
export * as databricksCli from "./src/databricks-cli.ts";
|
|
5
5
|
export * as errors from "./src/errors.ts";
|
|
6
|
+
export * as fileStorage from "./src/file-storage.ts";
|
|
6
7
|
export * as httpClient from "./src/http-client.ts";
|
|
7
8
|
export * as lifecycle from "./src/lifecycle.ts";
|
|
8
|
-
export * as nodeStorage from "./src/node-storage.ts";
|
|
9
9
|
export * as personalAccessToken from "./src/personal-access-token.ts";
|
|
10
10
|
export * as servicePrincipal from "./src/service-principal.ts";
|
|
11
11
|
export * as storage from "./src/storage.ts";
|
|
@@ -14,10 +14,10 @@ export type { DatabricksAuthDependencies } from "./src/databricks-auth.ts";
|
|
|
14
14
|
export { DatabricksCliProvider } from "./src/databricks-cli.ts";
|
|
15
15
|
export type { DatabricksCliResolver, DatabricksCliResolutionOptions } from "./src/databricks-cli.ts";
|
|
16
16
|
export { AuthError } from "./src/errors.ts";
|
|
17
|
+
export { FileCredentialStore } from "./src/file-storage.ts";
|
|
17
18
|
export { DatabricksClient } from "./src/http-client.ts";
|
|
18
19
|
export type { DatabricksRequestOptions } from "./src/http-client.ts";
|
|
19
20
|
export { TokenLifecycle } from "./src/lifecycle.ts";
|
|
20
|
-
export { FileCredentialStore } from "./src/node-storage.ts";
|
|
21
21
|
export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.ts";
|
|
22
22
|
export { DatabricksServicePrincipalProvider } from "./src/service-principal.ts";
|
|
23
23
|
export type { DatabricksServicePrincipalConfig } from "./src/service-principal.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,25 +2,25 @@
|
|
|
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/auth";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.32";
|
|
6
6
|
export * as databricksAuth from "./src/databricks-auth.js";
|
|
7
7
|
export * as databricksCli from "./src/databricks-cli.js";
|
|
8
8
|
export * as errors from "./src/errors.js";
|
|
9
|
+
export * as fileStorage from "./src/file-storage.js";
|
|
9
10
|
export * as httpClient from "./src/http-client.js";
|
|
10
11
|
export * as lifecycle from "./src/lifecycle.js";
|
|
11
|
-
export * as nodeStorage from "./src/node-storage.js";
|
|
12
12
|
export * as personalAccessToken from "./src/personal-access-token.js";
|
|
13
13
|
export * as servicePrincipal from "./src/service-principal.js";
|
|
14
14
|
export * as storage from "./src/storage.js";
|
|
15
15
|
export * as types from "./src/types.js";
|
|
16
16
|
export { DatabricksCliProvider } from "./src/databricks-cli.js";
|
|
17
17
|
export { AuthError } from "./src/errors.js";
|
|
18
|
+
export { FileCredentialStore } from "./src/file-storage.js";
|
|
18
19
|
export { DatabricksClient } from "./src/http-client.js";
|
|
19
20
|
export { TokenLifecycle } from "./src/lifecycle.js";
|
|
20
|
-
export { FileCredentialStore } from "./src/node-storage.js";
|
|
21
21
|
export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.js";
|
|
22
22
|
export { DatabricksServicePrincipalProvider } from "./src/service-principal.js";
|
|
23
23
|
export { MemoryLockAdapter, MemoryCredentialStore } from "./src/storage.js";
|
|
24
24
|
export { AuthKind, TargetKind, Storage, FileLayout, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCOUNTS_HOST, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP } from "./src/types.js";
|
|
25
25
|
export * from "./exports.js";
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpPLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hdXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMzJcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NBdXRoIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWF1dGgudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NDbGkgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBlcnJvcnMgZnJvbSBcIi4vc3JjL2Vycm9ycy50c1wiO1xuZXhwb3J0ICogYXMgZmlsZVN0b3JhZ2UgZnJvbSBcIi4vc3JjL2ZpbGUtc3RvcmFnZS50c1wiO1xuZXhwb3J0ICogYXMgaHR0cENsaWVudCBmcm9tIFwiLi9zcmMvaHR0cC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGxpZmVjeWNsZSBmcm9tIFwiLi9zcmMvbGlmZWN5Y2xlLnRzXCI7XG5leHBvcnQgKiBhcyBwZXJzb25hbEFjY2Vzc1Rva2VuIGZyb20gXCIuL3NyYy9wZXJzb25hbC1hY2Nlc3MtdG9rZW4udHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpY2VQcmluY2lwYWwgZnJvbSBcIi4vc3JjL3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuL3NyYy9zdG9yYWdlLnRzXCI7XG5leHBvcnQgKiBhcyB0eXBlcyBmcm9tIFwiLi9zcmMvdHlwZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1hdXRoLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1jbGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0NsaVJlc29sdmVyLCBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1jbGkudHNcIjtcbmV4cG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL3NyYy9lcnJvcnMudHNcIjtcbmV4cG9ydCB7IEZpbGVDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9zcmMvZmlsZS1zdG9yYWdlLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzQ2xpZW50IH0gZnJvbSBcIi4vc3JjL2h0dHAtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9odHRwLWNsaWVudC50c1wiO1xuZXhwb3J0IHsgVG9rZW5MaWZlY3ljbGUgfSBmcm9tIFwiLi9zcmMvbGlmZWN5Y2xlLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL3BlcnNvbmFsLWFjY2Vzcy10b2tlbi50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NlcnZpY2VQcmluY2lwYWxQcm92aWRlciB9IGZyb20gXCIuL3NyYy9zZXJ2aWNlLXByaW5jaXBhbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbENvbmZpZyB9IGZyb20gXCIuL3NyYy9zZXJ2aWNlLXByaW5jaXBhbC50c1wiO1xuZXhwb3J0IHsgTWVtb3J5TG9ja0FkYXB0ZXIsIE1lbW9yeUNyZWRlbnRpYWxTdG9yZSB9IGZyb20gXCIuL3NyYy9zdG9yYWdlLnRzXCI7XG5leHBvcnQgeyBBdXRoS2luZCwgVGFyZ2V0S2luZCwgU3RvcmFnZSwgRmlsZUxheW91dCwgREVGQVVMVF9DTElFTlRfSUQsIERFRkFVTFRfQ09ORklHX0ZJTEUsIERFRkFVTFRfQUNDT1VOVFNfSE9TVCwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSLCBBVVRIX1RZUEVfQVBQX09CTywgQVVUSF9UWVBFX0FQUF9TUCB9IGZyb20gXCIuL3NyYy90eXBlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbiwgQWNjZXNzVG9rZW4sIERhdGFicmlja3NQcm9maWxlU3VtbWFyeSwgRGF0YWJyaWNrc0F1dGhTdGF0dXMsIERhdGFicmlja3NQcm9maWxlLCBMb2NrQWRhcHRlciwgQ3JlZGVudGlhbFN0b3JlLCBUb2tlblByb3ZpZGVyLCBBdXRoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3R5cGVzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
|
@@ -5,7 +5,7 @@ import { authLogger, tokenMetadata } from "./_logging.js";
|
|
|
5
5
|
import { AuthError } from "./errors.js";
|
|
6
6
|
import { DatabricksCliProvider, resolveDatabricksCli } from "./databricks-cli.js";
|
|
7
7
|
import { publicToken, TokenLifecycle } from "./lifecycle.js";
|
|
8
|
-
import { FileCredentialStore } from "./
|
|
8
|
+
import { FileCredentialStore } from "./file-storage.js";
|
|
9
9
|
import { DatabricksPersonalAccessTokenProvider } from "./personal-access-token.js";
|
|
10
10
|
import { listDatabricksProfiles, machineScopes, resolveConfigFile, resolveDatabricksProfile, } from "./_profile.js";
|
|
11
11
|
import { DatabricksServicePrincipalProvider } from "./service-principal.js";
|
|
@@ -311,4 +311,4 @@ function cliEnvironment(profile, configFile) {
|
|
|
311
311
|
function stringValue(value) {
|
|
312
312
|
return typeof value === "string" && value.trim() ? value : undefined;
|
|
313
313
|
}
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDBDQUEwQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsd0JBQXdCLEdBQ3pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsUUFBUSxFQUVSLFdBQVcsRUFLWCwyQkFBMkIsRUFDM0IsT0FBTyxFQUNQLFVBQVUsRUFHVixtQkFBbUIsR0FDcEIsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBU3hDLDZFQUE2RTtBQUM3RSxNQUFNLGNBQWM7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFObkIsWUFDbUIsWUFBK0IsRUFDL0IsWUFBcUIsRUFDckIsT0FBOEIsRUFDOUIsV0FBeUQsRUFDekQsTUFBdUIsRUFDdkIsWUFBb0I7UUFMcEIsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUFTO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUE4QztRQUN6RCxXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBUTtJQUNwQyxDQUFDO0lBRUosS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDZCxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSwrREFBK0QsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFlO1FBQ25CLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUU7WUFDekMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLEtBQUssRUFBRSxLQUFLLElBQUksTUFBTTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXO1NBQ3BELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVk7WUFDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFlO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRztZQUNkLENBQUMsMkJBQTJCLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN4RSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXO2dCQUMvQixDQUFDLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUU7Z0JBQzFELENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRTtZQUMxRCxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDO1NBQzVCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQzdCLFVBQWtCLEVBQ2xCLEtBQWU7UUFFZixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQWtCLEVBQUUsS0FBZTtRQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2hFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUU7Z0JBQzFELEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDakIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUM3QixnQkFBZ0I7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRTtZQUN6RCxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1NBQzlCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUk7UUFDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkYsT0FBTyxJQUFJLENBQUMsWUFBWTtZQUN0QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxnQkFBd0IsRUFBRSxLQUFLLEdBQUcsSUFBSTtRQUN6RCxNQUFNLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFO1lBQzFELEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixLQUFLO1lBQ0wsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVk7WUFDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7WUFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTtZQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBYTtRQUNuQixNQUFNLE9BQU8sR0FDWCxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUNuQixDQUFDLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRixPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQU8sR0FBRyxLQUFLO1FBQzFCLE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1FBQzVGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU8sT0FBTztRQUNiLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7WUFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDMUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztTQUN2RCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsVUFBaUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFDOUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQ3RCLGVBQTJDLEVBQUU7SUFFN0MsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxPQUE4QixFQUM5QixPQUFnQixFQUNoQixZQUF3QztJQUV4QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sS0FBSyxHQUNULE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLGFBQWE7UUFDM0MsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsbUJBQW1CLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNwRSxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO1FBQ2xELE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNyQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsZUFBZSxFQUFFLE9BQU87UUFDeEIsS0FBSztLQUNOLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUNULE9BQU8sS0FBSyxPQUFPLENBQUMsTUFBTTtRQUN4QixDQUFDLENBQUMsSUFBSSxxQkFBcUIsRUFBRTtRQUM3QixDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sK0JBQStCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsS0FBSyxVQUFVLCtCQUErQixDQUM1QyxPQUE4QixFQUM5QixLQUFzQixFQUN0QixPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFDbkUsZUFBMkMsRUFBRSxFQUM3QyxlQUFtQztJQUVuQyxNQUFNLE9BQU8sR0FDWCxlQUFlLElBQUksd0JBQXdCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hHLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRTtZQUM1RCxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDckIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLGNBQWMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUM3QyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksY0FBYyxDQUN2QixPQUFPLEVBQ1AsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLEVBQ1AsWUFBWSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUN2QyxTQUFTLEVBQ1Q7WUFDRSxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVk7WUFDakMsU0FBUyxFQUFFLFFBQVE7WUFDbkIsTUFBTSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQzVCLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUMvQixPQUFPLENBQUMsUUFBUSxFQUNoQixRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUNqQyxDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxjQUFjLENBQ25DLE9BQU8sRUFDUCxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQ2xFLE9BQU8sRUFDUCxZQUFZLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQ3ZDLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRTtRQUMxRCxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDckIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU87S0FDckMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELEtBQUssVUFBVSxXQUFXLENBQ3hCLE9BQTBCLEVBQzFCLE9BQThCLEVBQzlCLFlBQXdDO0lBRXhDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1RCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN0RSxRQUFRLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixLQUFLLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDO1lBQzNELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUU7Z0JBQy9DLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDckIsS0FBSztnQkFDTCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLHFCQUFxQixDQUM5QixPQUFPLENBQUMsSUFBSSxFQUNaLEdBQUcsRUFBRSxDQUNILFlBQVksQ0FBQyxVQUFVO2dCQUNyQixDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN0QyxDQUFDLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFDcEQsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQzVFLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxRQUFRLENBQUMsbUJBQW1CO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkYsT0FBTyxJQUFJLHFDQUFxQyxDQUFDLE9BQU8sQ0FBQyxXQUFZLENBQUMsQ0FBQztRQUN6RSxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQixLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDbEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTthQUN2QixDQUFDLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0UsT0FBTyxJQUFJLGtDQUFrQyxDQUFDO2dCQUM1QyxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWE7Z0JBQ3RDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFhO2dCQUNuQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQscUJBQXFCLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSzthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxRQUFRLENBQUMsYUFBYTtZQUN6QixNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7QUFDSCxDQUFDO0FBTUQsS0FBSyxVQUFVLHFCQUFxQixDQUNsQyxPQUEwQixFQUMxQixVQUFtQyxVQUFVLENBQUMsS0FBSztJQUVuRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0MsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLGFBQWEsRUFBRSxHQUFHLElBQUksa0JBQWtCLE9BQU8sQ0FBQyxTQUFTLFdBQVc7U0FDckUsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUU7WUFDOUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTTtTQUNyRCxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQ2IsT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsT0FBTztRQUNuQyxDQUFDLENBQUMsR0FBRyxJQUFJLGtCQUFrQixpQkFBaUIsQ0FBQyxPQUFPLENBQUMseUNBQXlDO1FBQzlGLENBQUMsQ0FBQyxHQUFHLElBQUksOENBQThDLENBQUM7SUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRTtRQUN6QyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFNBQVM7S0FDVixDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFO1FBQ2hELE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07S0FDeEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUc7UUFDekIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsNkJBQTZCLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsaUNBQWlDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQTRCLENBQUM7SUFDakUsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUMsYUFBYTtRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7SUFDM0YsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRTtRQUM1QyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDckIsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU07S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQTBCO0lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7SUFDNUYsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFZO0lBQ25DLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsT0FBMEI7SUFDaEQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO0tBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLE9BQTBCLEVBQUUsVUFBa0I7SUFDcEUsT0FBTztRQUNMLHNCQUFzQixFQUFFLFVBQVU7UUFDbEMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDdkMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7WUFDbkQsQ0FBQyxDQUFDO2dCQUNFLG9CQUFvQixFQUFFLEtBQUs7Z0JBQzNCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxXQUFZO2FBQ3ZDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgdG9rZW5NZXRhZGF0YSB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NDbGlQcm92aWRlciwgcmVzb2x2ZURhdGFicmlja3NDbGkgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLWNsaS50c1wiO1xuaW1wb3J0IHsgcHVibGljVG9rZW4sIFRva2VuTGlmZWN5Y2xlIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLnRzXCI7XG5pbXBvcnQgeyBGaWxlQ3JlZGVudGlhbFN0b3JlIH0gZnJvbSBcIi4vbm9kZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vcGVyc29uYWwtYWNjZXNzLXRva2VuLnRzXCI7XG5pbXBvcnQge1xuICBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzLFxuICBtYWNoaW5lU2NvcGVzLFxuICByZXNvbHZlQ29uZmlnRmlsZSxcbiAgcmVzb2x2ZURhdGFicmlja3NQcm9maWxlLFxufSBmcm9tIFwiLi9fcHJvZmlsZS50c1wiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc1NlcnZpY2VQcmluY2lwYWxQcm92aWRlciB9IGZyb20gXCIuL3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5pbXBvcnQgeyBNZW1vcnlDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9zdG9yYWdlLnRzXCI7XG5pbXBvcnQge1xuICBBdXRoS2luZCxcbiAgdHlwZSBBdXRoQ2xpZW50LFxuICBBdXRoT3B0aW9ucyxcbiAgdHlwZSBDcmVkZW50aWFsU3RvcmUsXG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICB0eXBlIERhdGFicmlja3NBdXRoU3RhdHVzLFxuICB0eXBlIERhdGFicmlja3NQcm9maWxlLFxuICBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIsXG4gIFN0b3JhZ2UsXG4gIFRhcmdldEtpbmQsXG4gIHR5cGUgVG9rZW4sXG4gIHR5cGUgVG9rZW5Qcm92aWRlcixcbiAgV09SS1NQQUNFX0lEX0hFQURFUixcbn0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImRhdGFicmlja3NcIik7XG5cbi8qKiBJbmplY3RhYmxlIGhvc3QgY2FwYWJpbGl0aWVzIGZvciBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyB7XG4gIGVudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZldGNoPzogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIHJlc29sdmVDbGk/OiAob3B0aW9uczogeyBpbnN0YWxsOiBib29sZWFuIH0pID0+IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqIFBlcnNpc3RlbnQgRGF0YWJyaWNrcyBhdXRoIGZhY2FkZSBvdmVyIHRoZSBwcm92aWRlci1uZXV0cmFsIGxpZmVjeWNsZS4gKi9cbmNsYXNzIFBlcnNpc3RlbnRBdXRoIGltcGxlbWVudHMgQXV0aENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZmlsZVZhbHVlOiBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VWYWx1ZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudD86IFRva2VuTGlmZWN5Y2xlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdFRva2VuPzogVG9rZW4sXG4gICkge31cblxuICBhc3luYyBjaGFsbGVuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudClcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcImFwcF9vYm8gdXNlcyB0aGUgY3VycmVudCByZXF1ZXN0IHRva2VuIGFuZCBjYW5ub3Qgc3RhcnQgbG9naW5cIik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlcXVlc3RlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQubG9naW4oKTtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgY29tcGxldGVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgfVxuXG4gIHRva2VuKGxvZ2luPzogYm9vbGVhbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgdG9rZW4gcmVxdWVzdGVkXCIsIHtcbiAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgbG9naW46IGxvZ2luID8/IFwiYXV0b1wiLFxuICAgICAgc291cmNlOiB0aGlzLnJlcXVlc3RUb2tlbiA/IFwicmVxdWVzdFwiIDogXCJsaWZlY3ljbGVcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0VG9rZW5cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHB1YmxpY1Rva2VuKHRoaXMucmVxdWVzdFRva2VuKSlcbiAgICAgIDogdGhpcy5yZXF1aXJlZENsaWVudCgpLnRva2VuV2l0aExvZ2luKGxvZ2luKTtcbiAgfVxuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW4obG9naW4pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBbREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSXTogYCR7dG9rZW4udG9rZW5UeXBlfSAke3Rva2VuLmFjY2Vzc1Rva2VufWAsXG4gICAgICAuLi4odGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWRcbiAgICAgICAgPyB7IFtXT1JLU1BBQ0VfSURfSEVBREVSXTogdGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWQgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcImdlbmVyYXRlZCBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnNcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICBoZWFkZXJOYW1lczogT2JqZWN0LmtleXMoaGVhZGVycyksXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBhdXRob3JpemF0aW9uSGVhZGVyRm9yVXJsKFxuICAgIHJlcXVlc3RVcmw6IHN0cmluZyxcbiAgICBsb2dpbj86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnJlcXVlc3RIZWFkZXJzRm9yVXJsKHJlcXVlc3RVcmwsIGxvZ2luKSlbREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSXTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3RIZWFkZXJzRm9yVXJsKHJlcXVlc3RVcmw6IHN0cmluZywgbG9naW4/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBVUkwocmVxdWVzdFVybCk7XG4gICAgY29uc3QgY3JlZGVudGlhbE9yaWdpbiA9IG5ldyBVUkwodGhpcy5wcm9maWxlVmFsdWUuaG9zdCkub3JpZ2luO1xuICAgIGlmIChyZXF1ZXN0Lm9yaWdpbiAhPT0gY3JlZGVudGlhbE9yaWdpbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwic2tpcHBlZCBhdXRoZW50aWNhdGlvbiBmb3IgZGlmZmVyZW50IG9yaWdpblwiLCB7XG4gICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICByZXF1ZXN0T3JpZ2luOiByZXF1ZXN0Lm9yaWdpbixcbiAgICAgICAgY3JlZGVudGlhbE9yaWdpbixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJhcHBseWluZyBhdXRoZW50aWNhdGlvbiB0byBtYXRjaGluZyBvcmlnaW5cIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICByZXF1ZXN0T3JpZ2luOiByZXF1ZXN0Lm9yaWdpbixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGUobG9naW4pO1xuICB9XG5cbiAgZm9yY2VSZWZyZXNoVG9rZW4obG9naW4gPSB0cnVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyB0b2tlbiBmb3JjZSByZWZyZXNoIHJlcXVlc3RlZFwiLCB7IC4uLnRoaXMuY29udGV4dCgpLCBsb2dpbiB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0VG9rZW5cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHB1YmxpY1Rva2VuKHRoaXMucmVxdWVzdFRva2VuKSlcbiAgICAgIDogdGhpcy5yZXF1aXJlZENsaWVudCgpLmZvcmNlUmVmcmVzaChsb2dpbik7XG4gIH1cblxuICByZWZyZXNoUmVqZWN0ZWRUb2tlbihzdGFsZUFjY2Vzc1Rva2VuOiBzdHJpbmcsIGxvZ2luID0gdHJ1ZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgcmVqZWN0ZWQgdG9rZW4gcmVmcmVzaCByZXF1ZXN0ZWRcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICBsb2dpbixcbiAgICAgIHJlcXVlc3RUb2tlbjogQm9vbGVhbih0aGlzLnJlcXVlc3RUb2tlbiksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFRva2VuXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShwdWJsaWNUb2tlbih0aGlzLnJlcXVlc3RUb2tlbikpXG4gICAgICA6IHRoaXMucmVxdWlyZWRDbGllbnQoKS5yZWZyZXNoUmVqZWN0ZWRUb2tlbihzdGFsZUFjY2Vzc1Rva2VuLCBsb2dpbik7XG4gIH1cblxuICBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyBsb2dvdXQgcmVxdWVzdGVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ/LmxvZ291dCgpID8/IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IERhdGFicmlja3NBdXRoU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlVmFsdWUubmFtZSxcbiAgICAgIGhvc3Q6IHRoaXMucHJvZmlsZVZhbHVlLmhvc3QsXG4gICAgICBzdG9yYWdlOiB0aGlzLnN0b3JhZ2VWYWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZVZhbHVlLnByaW5jaXBhbDtcbiAgfVxuXG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkO1xuICB9XG5cbiAgYXV0aEtpbmQoKTogQXV0aEtpbmQge1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGVWYWx1ZS5hdXRoS2luZDtcbiAgfVxuXG4gIHByb2ZpbGUobmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgIW5hbWUgfHwgbmFtZSA9PT0gdGhpcy5wcm9maWxlVmFsdWUubmFtZVxuICAgICAgICA/IHRoaXMucHJvZmlsZVZhbHVlXG4gICAgICAgIDogcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKHsgLi4udGhpcy5vcHRpb25zLCBwcm9maWxlOiBuYW1lIH0sIHRoaXMuZW52aXJvbm1lbnQpO1xuICAgIHJldHVybiBwcm9maWxlU3VtbWFyeShwcm9maWxlKTtcbiAgfVxuXG4gIGxpc3RQcm9maWxlcyhyZWZyZXNoID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbGlzdERhdGFicmlja3NQcm9maWxlcyh0aGlzLm9wdGlvbnMuY29uZmlnRmlsZSwgcmVmcmVzaCwgdGhpcy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVkQ2xpZW50KCk6IFRva2VuTGlmZWN5Y2xlIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgXCJBdXRoZW50aWNhdGlvbiBsaWZlY3ljbGUgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHQoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGVWYWx1ZS5uYW1lLFxuICAgICAgaG9zdDogdGhpcy5wcm9maWxlVmFsdWUuaG9zdCxcbiAgICAgIGF1dGhLaW5kOiB0aGlzLnByb2ZpbGVWYWx1ZS5hdXRoS2luZCxcbiAgICAgIHN0b3JhZ2U6IHRoaXMuc3RvcmFnZVZhbHVlLFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4odGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWQpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhDbGllbnQoXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyA9IHsgcHJlZmVyVXNlclRvTWFjaGluZTogdHJ1ZSB9LFxuICBzdG9yYWdlID0gU3RvcmFnZS5BdXRvLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPEF1dGhDbGllbnQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbnRBdXRoKG9wdGlvbnMsIHN0b3JhZ2UsIGRlcGVuZGVuY2llcyk7XG59XG5cbi8qKiBSZXNvbHZlIGEgRGF0YWJyaWNrcyBwcm9maWxlIGFuZCBvcGVuIGJ1aWx0LWluIGNyZWRlbnRpYWwgc3RvcmFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBlcnNpc3RlbnRBdXRoKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIGRlcGVuZGVuY2llczogRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMsXG4pOiBQcm9taXNlPFBlcnNpc3RlbnRBdXRoPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBwcm9maWxlID0gcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKG9wdGlvbnMsIGVudmlyb25tZW50KTtcbiAgY29uc3QgaW5BcHAgPVxuICAgIHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLkFwcE9uQmVoYWxmT2YgfHxcbiAgICBwcm9maWxlLmF1dGhLaW5kID09PSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsO1xuICBjb25zdCBiYWNrZW5kID0gc3RvcmFnZSA9PT0gU3RvcmFnZS5BdXRvID8gU3RvcmFnZS5NZW1vcnkgOiBzdG9yYWdlO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGluZyBwZXJzaXN0ZW50IERhdGFicmlja3MgYXV0aFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICBhdXRoS2luZDogcHJvZmlsZS5hdXRoS2luZCxcbiAgICByZXF1ZXN0ZWRTdG9yYWdlOiBzdG9yYWdlLFxuICAgIHJlc29sdmVkU3RvcmFnZTogYmFja2VuZCxcbiAgICBpbkFwcCxcbiAgfSk7XG4gIGNvbnN0IHN0b3JlID1cbiAgICBiYWNrZW5kID09PSBTdG9yYWdlLk1lbW9yeVxuICAgICAgPyBuZXcgTWVtb3J5Q3JlZGVudGlhbFN0b3JlKClcbiAgICAgIDogbmV3IEZpbGVDcmVkZW50aWFsU3RvcmUob3B0aW9ucy5jYWNoZURpciA/PyBqb2luKGhvbWVkaXIoKSwgXCIuZGF0YWJyaWNrc1wiKSk7XG4gIHJldHVybiBjcmVhdGVQZXJzaXN0ZW50QXV0aFdpdGhTdG9yYWdlKG9wdGlvbnMsIHN0b3JlLCBzdG9yYWdlLCBkZXBlbmRlbmNpZXMsIHByb2ZpbGUpO1xufVxuXG4vKiogUmVzb2x2ZSBhIERhdGFicmlja3MgcHJvZmlsZSB1c2luZyBjYWxsZXItb3duZWQgZ2VuZXJpYyBzdG9yYWdlLiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGVyc2lzdGVudEF1dGhXaXRoU3RvcmFnZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBzdG9yZTogQ3JlZGVudGlhbFN0b3JlLFxuICBzdG9yYWdlID0gc3RvcmUubmFtZSgpID09PSBcIm1lbW9yeVwiID8gU3RvcmFnZS5NZW1vcnkgOiBTdG9yYWdlLkZpbGUsXG4gIGRlcGVuZGVuY2llczogRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgPSB7fSxcbiAgcmVzb2x2ZWRQcm9maWxlPzogRGF0YWJyaWNrc1Byb2ZpbGUsXG4pOiBQcm9taXNlPFBlcnNpc3RlbnRBdXRoPiB7XG4gIGNvbnN0IHByb2ZpbGUgPVxuICAgIHJlc29sdmVkUHJvZmlsZSA/PyByZXNvbHZlRGF0YWJyaWNrc1Byb2ZpbGUob3B0aW9ucywgZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52KTtcbiAgaWYgKHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLkFwcE9uQmVoYWxmT2YpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVkIHJlcXVlc3Qtc2NvcGVkIEFwcCBPQk8gYXV0aGVudGljYXRpb25cIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgaG9zdDogcHJvZmlsZS5ob3N0LFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4ocHJvZmlsZS53b3Jrc3BhY2VJZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXV0aChcbiAgICAgIHByb2ZpbGUsXG4gICAgICBTdG9yYWdlLk1lbW9yeSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBkZXBlbmRlbmNpZXMuZW52aXJvbm1lbnQgPz8gcHJvY2Vzcy5lbnYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiBwcm9maWxlLmFjY2Vzc1Rva2VuISxcbiAgICAgICAgdG9rZW5UeXBlOiBcIkJlYXJlclwiLFxuICAgICAgICBzY29wZXM6IFsuLi5wcm9maWxlLnNjb3Blc10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXIgPSBhd2FpdCBwcm92aWRlckZvcihwcm9maWxlLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgVG9rZW5MaWZlY3ljbGUoXG4gICAgcHJvZmlsZS5jYWNoZUtleSxcbiAgICBwcm92aWRlcixcbiAgICBzdG9yZSxcbiAgICBBdXRoT3B0aW9ucy5jcmVhdGUob3B0aW9ucy5hdXRoKSxcbiAgKTtcbiAgY29uc3QgcGVyc2lzdGVudCA9IG5ldyBQZXJzaXN0ZW50QXV0aChcbiAgICBwcm9maWxlLFxuICAgIHN0b3JhZ2UgPT09IFN0b3JhZ2UuQXV0byA/IHN0b3JhZ2VGcm9tTmFtZShzdG9yZS5uYW1lKCkpIDogc3RvcmFnZSxcbiAgICBvcHRpb25zLFxuICAgIGRlcGVuZGVuY2llcy5lbnZpcm9ubWVudCA/PyBwcm9jZXNzLmVudixcbiAgICBjbGllbnQsXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZWQgcGVyc2lzdGVudCBhdXRoZW50aWNhdGlvbiBsaWZlY3ljbGVcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICBob3N0OiBwcm9maWxlLmhvc3QsXG4gICAgYXV0aEtpbmQ6IHByb2ZpbGUuYXV0aEtpbmQsXG4gICAgc3RvcmFnZTogcGVyc2lzdGVudC5zdGF0dXMoKS5zdG9yYWdlLFxuICB9KTtcbiAgcmV0dXJuIHBlcnNpc3RlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb3ZpZGVyRm9yKFxuICBwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxUb2tlblByb3ZpZGVyPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBpbkFwcCA9IGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KHsgLi4uZW52aXJvbm1lbnQgfSk7XG4gIHN3aXRjaCAocHJvZmlsZS5hdXRoS2luZCkge1xuICAgIGNhc2UgQXV0aEtpbmQuVXNlclRvTWFjaGluZToge1xuICAgICAgY29uc3QgaW5zdGFsbCA9ICFpbkFwcCB8fCBvcHRpb25zLmluc3RhbGxDbGlJbkFwcCA9PT0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgQ0xJIHByb3ZpZGVyXCIsIHtcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBpbkFwcCxcbiAgICAgICAgaW5zdGFsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIoXG4gICAgICAgIHByb2ZpbGUubmFtZSxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaVxuICAgICAgICAgICAgPyBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaSh7IGluc3RhbGwgfSlcbiAgICAgICAgICAgIDogcmVzb2x2ZURhdGFicmlja3NDbGkoZW52aXJvbm1lbnQsIHsgaW5zdGFsbCB9KSxcbiAgICAgICAgY2xpRW52aXJvbm1lbnQocHJvZmlsZSwgcmVzb2x2ZUNvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWdGaWxlLCBlbnZpcm9ubWVudCkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSBBdXRoS2luZC5QZXJzb25hbEFjY2Vzc1Rva2VuOlxuICAgICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgcGVyc29uYWwgYWNjZXNzIHRva2VuIHByb3ZpZGVyXCIsIHsgcHJvZmlsZTogcHJvZmlsZS5uYW1lIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyKHByb2ZpbGUuYWNjZXNzVG9rZW4hKTtcbiAgICBjYXNlIEF1dGhLaW5kLk1hY2hpbmVUb01hY2hpbmU6XG4gICAgY2FzZSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsOiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBzZXJ2aWNlLXByaW5jaXBhbCBwcm92aWRlclwiLCB7XG4gICAgICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgYXV0aEtpbmQ6IHByb2ZpbGUuYXV0aEtpbmQsXG4gICAgICAgIHRhcmdldDogcHJvZmlsZS50YXJnZXQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IHJlc29sdmVPQXV0aEVuZHBvaW50cyhwcm9maWxlLCBkZXBlbmRlbmNpZXMuZmV0Y2gpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbFByb3ZpZGVyKHtcbiAgICAgICAgdG9rZW5FbmRwb2ludDogZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQsXG4gICAgICAgIGNsaWVudElkOiBwcm9maWxlLmNsaWVudElkLFxuICAgICAgICBjbGllbnRTZWNyZXQ6IHByb2ZpbGUuY2xpZW50U2VjcmV0ISxcbiAgICAgICAgc2NvcGVzOiBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKSxcbiAgICAgICAgLi4uKHByb2ZpbGUuZ3JvdXBJZCA/IHsgZ3JvdXBJZDogcHJvZmlsZS5ncm91cElkIH0gOiB7fSksXG4gICAgICAgIGFsbG93SW5zZWN1cmVSZXF1ZXN0czogaXNMb29wYmFja0h0dHAocHJvZmlsZS5ob3N0KSxcbiAgICAgICAgZmV0Y2g6IGRlcGVuZGVuY2llcy5mZXRjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIEF1dGhLaW5kLkFwcE9uQmVoYWxmT2Y6XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQXBwIE9CTyB0b2tlbnMgZG8gbm90IHVzZSBhIHBlcnNpc3RlbnQgcHJvdmlkZXJcIik7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEF1dGhvcml6YXRpb25TZXJ2ZXIge1xuICB0b2tlbkVuZHBvaW50OiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPQXV0aEVuZHBvaW50cyhcbiAgcHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUsXG4gIGZldGNoZXI6IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoID0gZ2xvYmFsVGhpcy5mZXRjaCxcbik6IFByb21pc2U8QXV0aG9yaXphdGlvblNlcnZlcj4ge1xuICBjb25zdCBob3N0ID0gcHJvZmlsZS5ob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgaWYgKHByb2ZpbGUudGFyZ2V0ID09PSBUYXJnZXRLaW5kLkFjY291bnQpIHtcbiAgICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQWNjb3VudCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB7XG4gICAgICB0b2tlbkVuZHBvaW50OiBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cHJvZmlsZS5hY2NvdW50SWR9L3YxL3Rva2VuYCxcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGFjY291bnQgT0F1dGggZW5kcG9pbnRcIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgdG9rZW5PcmlnaW46IG5ldyBVUkwoZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xuICB9XG4gIGNvbnN0IGRpc2NvdmVyeSA9XG4gICAgcHJvZmlsZS50YXJnZXQgPT09IFRhcmdldEtpbmQuVW5pZmllZFxuICAgICAgPyBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZSl9Ly53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYFxuICAgICAgOiBgJHtob3N0fS9vaWRjLy53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYDtcbiAgbG9nZ2VyLmRlYnVnKFwicmVxdWVzdGluZyBPQXV0aCBkaXNjb3ZlcnlcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGRpc2NvdmVyeSxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hlcihkaXNjb3ZlcnksIHsgcmVkaXJlY3Q6IFwibWFudWFsXCIgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIE9BdXRoIGRpc2NvdmVyeSByZXNwb25zZVwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBgT0F1dGggaXMgbm90IHN1cHBvcnRlZCBhdCAke2Rpc2NvdmVyeX1gKTtcbiAgaWYgKCFyZXNwb25zZS5vaylcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgYE9BdXRoIGRpc2NvdmVyeSByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICBjb25zdCB2YWx1ZSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0b2tlbkVuZHBvaW50ID0gc3RyaW5nVmFsdWUodmFsdWUudG9rZW5fZW5kcG9pbnQpO1xuICBpZiAoIXRva2VuRW5kcG9pbnQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIk9BdXRoIGRpc2NvdmVyeSByZXNwb25zZSBpcyBpbmNvbXBsZXRlXCIpO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBPQXV0aCB0b2tlbiBlbmRwb2ludFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHRva2VuT3JpZ2luOiBuZXcgVVJMKHRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgfSk7XG4gIHJldHVybiB7IHRva2VuRW5kcG9pbnQgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUpOiBzdHJpbmcge1xuICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiVW5pZmllZCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgcmV0dXJuIHByb2ZpbGUuYWNjb3VudElkO1xufVxuXG5mdW5jdGlvbiBzdG9yYWdlRnJvbU5hbWUobmFtZTogc3RyaW5nKTogU3RvcmFnZSB7XG4gIHJldHVybiBuYW1lID09PSBcIm1lbW9yeVwiID8gU3RvcmFnZS5NZW1vcnkgOiBTdG9yYWdlLkZpbGU7XG59XG5cbmZ1bmN0aW9uIHByb2ZpbGVTdW1tYXJ5KHByb2ZpbGU6IERhdGFicmlja3NQcm9maWxlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICAuLi4ocHJvZmlsZS5hY2NvdW50SWQgPyB7IGFjY291bnRJZDogcHJvZmlsZS5hY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4ocHJvZmlsZS53b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQ6IHByb2ZpbGUud29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGF1dGhLaW5kOiBwcm9maWxlLmF1dGhLaW5kLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0xvb3BiYWNrSHR0cChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChob3N0KTtcbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiICYmIFtcIjEyNy4wLjAuMVwiLCBcImxvY2FsaG9zdFwiXS5pbmNsdWRlcyh1cmwuaG9zdG5hbWUpO1xufVxuXG5mdW5jdGlvbiBjbGlFbnZpcm9ubWVudChwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSwgY29uZmlnRmlsZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgREFUQUJSSUNLU19DT05GSUdfRklMRTogY29uZmlnRmlsZSxcbiAgICBEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFOiBwcm9maWxlLm5hbWUsXG4gICAgREFUQUJSSUNLU19IT1NUOiBwcm9maWxlLmhvc3QsXG4gICAgLi4uKHByb2ZpbGUuYWNjb3VudElkID8geyBEQVRBQlJJQ0tTX0FDQ09VTlRfSUQ6IHByb2ZpbGUuYWNjb3VudElkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUud29ya3NwYWNlSWQgPyB7IERBVEFCUklDS1NfV09SS1NQQUNFX0lEOiBwcm9maWxlLndvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLlBlcnNvbmFsQWNjZXNzVG9rZW5cbiAgICAgID8ge1xuICAgICAgICAgIERBVEFCUklDS1NfQVVUSF9UWVBFOiBcInBhdFwiLFxuICAgICAgICAgIERBVEFCUklDS1NfVE9LRU46IHByb2ZpbGUuYWNjZXNzVG9rZW4hLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuIl19
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDBDQUEwQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsd0JBQXdCLEdBQ3pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsUUFBUSxFQUVSLFdBQVcsRUFLWCwyQkFBMkIsRUFDM0IsT0FBTyxFQUNQLFVBQVUsRUFHVixtQkFBbUIsR0FDcEIsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBU3hDLDZFQUE2RTtBQUM3RSxNQUFNLGNBQWM7SUFFQztJQUNBO0lBQ0E7SUFDQTtJQUNB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dkMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7WUFDbkQsQ0FBQyxDQUFDO2dCQUNFLG9CQUFvQixFQUFFLEtBQUs7Z0JBQzNCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxXQUFZO2FBQ3ZDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgdG9rZW5NZXRhZGF0YSB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NDbGlQcm92aWRlciwgcmVzb2x2ZURhdGFicmlja3NDbGkgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLWNsaS50c1wiO1xuaW1wb3J0IHsgcHVibGljVG9rZW4sIFRva2VuTGlmZWN5Y2xlIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLnRzXCI7XG5pbXBvcnQgeyBGaWxlQ3JlZGVudGlhbFN0b3JlIH0gZnJvbSBcIi4vZmlsZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vcGVyc29uYWwtYWNjZXNzLXRva2VuLnRzXCI7XG5pbXBvcnQge1xuICBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzLFxuICBtYWNoaW5lU2NvcGVzLFxuICByZXNvbHZlQ29uZmlnRmlsZSxcbiAgcmVzb2x2ZURhdGFicmlja3NQcm9maWxlLFxufSBmcm9tIFwiLi9fcHJvZmlsZS50c1wiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc1NlcnZpY2VQcmluY2lwYWxQcm92aWRlciB9IGZyb20gXCIuL3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5pbXBvcnQgeyBNZW1vcnlDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9zdG9yYWdlLnRzXCI7XG5pbXBvcnQge1xuICBBdXRoS2luZCxcbiAgdHlwZSBBdXRoQ2xpZW50LFxuICBBdXRoT3B0aW9ucyxcbiAgdHlwZSBDcmVkZW50aWFsU3RvcmUsXG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICB0eXBlIERhdGFicmlja3NBdXRoU3RhdHVzLFxuICB0eXBlIERhdGFicmlja3NQcm9maWxlLFxuICBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIsXG4gIFN0b3JhZ2UsXG4gIFRhcmdldEtpbmQsXG4gIHR5cGUgVG9rZW4sXG4gIHR5cGUgVG9rZW5Qcm92aWRlcixcbiAgV09SS1NQQUNFX0lEX0hFQURFUixcbn0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImRhdGFicmlja3NcIik7XG5cbi8qKiBJbmplY3RhYmxlIGhvc3QgY2FwYWJpbGl0aWVzIGZvciBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyB7XG4gIGVudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZldGNoPzogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIHJlc29sdmVDbGk/OiAob3B0aW9uczogeyBpbnN0YWxsOiBib29sZWFuIH0pID0+IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqIFBlcnNpc3RlbnQgRGF0YWJyaWNrcyBhdXRoIGZhY2FkZSBvdmVyIHRoZSBwcm92aWRlci1uZXV0cmFsIGxpZmVjeWNsZS4gKi9cbmNsYXNzIFBlcnNpc3RlbnRBdXRoIGltcGxlbWVudHMgQXV0aENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZmlsZVZhbHVlOiBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VWYWx1ZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudD86IFRva2VuTGlmZWN5Y2xlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdFRva2VuPzogVG9rZW4sXG4gICkge31cblxuICBhc3luYyBjaGFsbGVuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudClcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcImFwcF9vYm8gdXNlcyB0aGUgY3VycmVudCByZXF1ZXN0IHRva2VuIGFuZCBjYW5ub3Qgc3RhcnQgbG9naW5cIik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlcXVlc3RlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQubG9naW4oKTtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgY29tcGxldGVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgfVxuXG4gIHRva2VuKGxvZ2luPzogYm9vbGVhbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgdG9rZW4gcmVxdWVzdGVkXCIsIHtcbiAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgbG9naW46IGxvZ2luID8/IFwiYXV0b1wiLFxuICAgICAgc291cmNlOiB0aGlzLnJlcXVlc3RUb2tlbiA/IFwicmVxdWVzdFwiIDogXCJsaWZlY3ljbGVcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0VG9rZW5cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHB1YmxpY1Rva2VuKHRoaXMucmVxdWVzdFRva2VuKSlcbiAgICAgIDogdGhpcy5yZXF1aXJlZENsaWVudCgpLnRva2VuV2l0aExvZ2luKGxvZ2luKTtcbiAgfVxuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW4obG9naW4pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBbREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSXTogYCR7dG9rZW4udG9rZW5UeXBlfSAke3Rva2VuLmFjY2Vzc1Rva2VufWAsXG4gICAgICAuLi4odGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWRcbiAgICAgICAgPyB7IFtXT1JLU1BBQ0VfSURfSEVBREVSXTogdGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWQgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcImdlbmVyYXRlZCBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnNcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICBoZWFkZXJOYW1lczogT2JqZWN0LmtleXMoaGVhZGVycyksXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBhdXRob3JpemF0aW9uSGVhZGVyRm9yVXJsKFxuICAgIHJlcXVlc3RVcmw6IHN0cmluZyxcbiAgICBsb2dpbj86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnJlcXVlc3RIZWFkZXJzRm9yVXJsKHJlcXVlc3RVcmwsIGxvZ2luKSlbREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSXTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3RIZWFkZXJzRm9yVXJsKHJlcXVlc3RVcmw6IHN0cmluZywgbG9naW4/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBVUkwocmVxdWVzdFVybCk7XG4gICAgY29uc3QgY3JlZGVudGlhbE9yaWdpbiA9IG5ldyBVUkwodGhpcy5wcm9maWxlVmFsdWUuaG9zdCkub3JpZ2luO1xuICAgIGlmIChyZXF1ZXN0Lm9yaWdpbiAhPT0gY3JlZGVudGlhbE9yaWdpbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwic2tpcHBlZCBhdXRoZW50aWNhdGlvbiBmb3IgZGlmZmVyZW50IG9yaWdpblwiLCB7XG4gICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICByZXF1ZXN0T3JpZ2luOiByZXF1ZXN0Lm9yaWdpbixcbiAgICAgICAgY3JlZGVudGlhbE9yaWdpbixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJhcHBseWluZyBhdXRoZW50aWNhdGlvbiB0byBtYXRjaGluZyBvcmlnaW5cIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICByZXF1ZXN0T3JpZ2luOiByZXF1ZXN0Lm9yaWdpbixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGUobG9naW4pO1xuICB9XG5cbiAgZm9yY2VSZWZyZXNoVG9rZW4obG9naW4gPSB0cnVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyB0b2tlbiBmb3JjZSByZWZyZXNoIHJlcXVlc3RlZFwiLCB7IC4uLnRoaXMuY29udGV4dCgpLCBsb2dpbiB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0VG9rZW5cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHB1YmxpY1Rva2VuKHRoaXMucmVxdWVzdFRva2VuKSlcbiAgICAgIDogdGhpcy5yZXF1aXJlZENsaWVudCgpLmZvcmNlUmVmcmVzaChsb2dpbik7XG4gIH1cblxuICByZWZyZXNoUmVqZWN0ZWRUb2tlbihzdGFsZUFjY2Vzc1Rva2VuOiBzdHJpbmcsIGxvZ2luID0gdHJ1ZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgcmVqZWN0ZWQgdG9rZW4gcmVmcmVzaCByZXF1ZXN0ZWRcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICBsb2dpbixcbiAgICAgIHJlcXVlc3RUb2tlbjogQm9vbGVhbih0aGlzLnJlcXVlc3RUb2tlbiksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFRva2VuXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShwdWJsaWNUb2tlbih0aGlzLnJlcXVlc3RUb2tlbikpXG4gICAgICA6IHRoaXMucmVxdWlyZWRDbGllbnQoKS5yZWZyZXNoUmVqZWN0ZWRUb2tlbihzdGFsZUFjY2Vzc1Rva2VuLCBsb2dpbik7XG4gIH1cblxuICBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyBsb2dvdXQgcmVxdWVzdGVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ/LmxvZ291dCgpID8/IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IERhdGFicmlja3NBdXRoU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlVmFsdWUubmFtZSxcbiAgICAgIGhvc3Q6IHRoaXMucHJvZmlsZVZhbHVlLmhvc3QsXG4gICAgICBzdG9yYWdlOiB0aGlzLnN0b3JhZ2VWYWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZVZhbHVlLnByaW5jaXBhbDtcbiAgfVxuXG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkO1xuICB9XG5cbiAgYXV0aEtpbmQoKTogQXV0aEtpbmQge1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGVWYWx1ZS5hdXRoS2luZDtcbiAgfVxuXG4gIHByb2ZpbGUobmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgIW5hbWUgfHwgbmFtZSA9PT0gdGhpcy5wcm9maWxlVmFsdWUubmFtZVxuICAgICAgICA/IHRoaXMucHJvZmlsZVZhbHVlXG4gICAgICAgIDogcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKHsgLi4udGhpcy5vcHRpb25zLCBwcm9maWxlOiBuYW1lIH0sIHRoaXMuZW52aXJvbm1lbnQpO1xuICAgIHJldHVybiBwcm9maWxlU3VtbWFyeShwcm9maWxlKTtcbiAgfVxuXG4gIGxpc3RQcm9maWxlcyhyZWZyZXNoID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbGlzdERhdGFicmlja3NQcm9maWxlcyh0aGlzLm9wdGlvbnMuY29uZmlnRmlsZSwgcmVmcmVzaCwgdGhpcy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVkQ2xpZW50KCk6IFRva2VuTGlmZWN5Y2xlIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgXCJBdXRoZW50aWNhdGlvbiBsaWZlY3ljbGUgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHQoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGVWYWx1ZS5uYW1lLFxuICAgICAgaG9zdDogdGhpcy5wcm9maWxlVmFsdWUuaG9zdCxcbiAgICAgIGF1dGhLaW5kOiB0aGlzLnByb2ZpbGVWYWx1ZS5hdXRoS2luZCxcbiAgICAgIHN0b3JhZ2U6IHRoaXMuc3RvcmFnZVZhbHVlLFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4odGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWQpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhDbGllbnQoXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyA9IHsgcHJlZmVyVXNlclRvTWFjaGluZTogdHJ1ZSB9LFxuICBzdG9yYWdlID0gU3RvcmFnZS5BdXRvLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPEF1dGhDbGllbnQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbnRBdXRoKG9wdGlvbnMsIHN0b3JhZ2UsIGRlcGVuZGVuY2llcyk7XG59XG5cbi8qKiBSZXNvbHZlIGEgRGF0YWJyaWNrcyBwcm9maWxlIGFuZCBvcGVuIGJ1aWx0LWluIGNyZWRlbnRpYWwgc3RvcmFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBlcnNpc3RlbnRBdXRoKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIGRlcGVuZGVuY2llczogRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMsXG4pOiBQcm9taXNlPFBlcnNpc3RlbnRBdXRoPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBwcm9maWxlID0gcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKG9wdGlvbnMsIGVudmlyb25tZW50KTtcbiAgY29uc3QgaW5BcHAgPVxuICAgIHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLkFwcE9uQmVoYWxmT2YgfHxcbiAgICBwcm9maWxlLmF1dGhLaW5kID09PSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsO1xuICBjb25zdCBiYWNrZW5kID0gc3RvcmFnZSA9PT0gU3RvcmFnZS5BdXRvID8gU3RvcmFnZS5NZW1vcnkgOiBzdG9yYWdlO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGluZyBwZXJzaXN0ZW50IERhdGFicmlja3MgYXV0aFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICBhdXRoS2luZDogcHJvZmlsZS5hdXRoS2luZCxcbiAgICByZXF1ZXN0ZWRTdG9yYWdlOiBzdG9yYWdlLFxuICAgIHJlc29sdmVkU3RvcmFnZTogYmFja2VuZCxcbiAgICBpbkFwcCxcbiAgfSk7XG4gIGNvbnN0IHN0b3JlID1cbiAgICBiYWNrZW5kID09PSBTdG9yYWdlLk1lbW9yeVxuICAgICAgPyBuZXcgTWVtb3J5Q3JlZGVudGlhbFN0b3JlKClcbiAgICAgIDogbmV3IEZpbGVDcmVkZW50aWFsU3RvcmUob3B0aW9ucy5jYWNoZURpciA/PyBqb2luKGhvbWVkaXIoKSwgXCIuZGF0YWJyaWNrc1wiKSk7XG4gIHJldHVybiBjcmVhdGVQZXJzaXN0ZW50QXV0aFdpdGhTdG9yYWdlKG9wdGlvbnMsIHN0b3JlLCBzdG9yYWdlLCBkZXBlbmRlbmNpZXMsIHByb2ZpbGUpO1xufVxuXG4vKiogUmVzb2x2ZSBhIERhdGFicmlja3MgcHJvZmlsZSB1c2luZyBjYWxsZXItb3duZWQgZ2VuZXJpYyBzdG9yYWdlLiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGVyc2lzdGVudEF1dGhXaXRoU3RvcmFnZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBzdG9yZTogQ3JlZGVudGlhbFN0b3JlLFxuICBzdG9yYWdlID0gc3RvcmUubmFtZSgpID09PSBcIm1lbW9yeVwiID8gU3RvcmFnZS5NZW1vcnkgOiBTdG9yYWdlLkZpbGUsXG4gIGRlcGVuZGVuY2llczogRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgPSB7fSxcbiAgcmVzb2x2ZWRQcm9maWxlPzogRGF0YWJyaWNrc1Byb2ZpbGUsXG4pOiBQcm9taXNlPFBlcnNpc3RlbnRBdXRoPiB7XG4gIGNvbnN0IHByb2ZpbGUgPVxuICAgIHJlc29sdmVkUHJvZmlsZSA/PyByZXNvbHZlRGF0YWJyaWNrc1Byb2ZpbGUob3B0aW9ucywgZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52KTtcbiAgaWYgKHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLkFwcE9uQmVoYWxmT2YpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVkIHJlcXVlc3Qtc2NvcGVkIEFwcCBPQk8gYXV0aGVudGljYXRpb25cIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgaG9zdDogcHJvZmlsZS5ob3N0LFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4ocHJvZmlsZS53b3Jrc3BhY2VJZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXV0aChcbiAgICAgIHByb2ZpbGUsXG4gICAgICBTdG9yYWdlLk1lbW9yeSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBkZXBlbmRlbmNpZXMuZW52aXJvbm1lbnQgPz8gcHJvY2Vzcy5lbnYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiBwcm9maWxlLmFjY2Vzc1Rva2VuISxcbiAgICAgICAgdG9rZW5UeXBlOiBcIkJlYXJlclwiLFxuICAgICAgICBzY29wZXM6IFsuLi5wcm9maWxlLnNjb3Blc10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXIgPSBhd2FpdCBwcm92aWRlckZvcihwcm9maWxlLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgVG9rZW5MaWZlY3ljbGUoXG4gICAgcHJvZmlsZS5jYWNoZUtleSxcbiAgICBwcm92aWRlcixcbiAgICBzdG9yZSxcbiAgICBBdXRoT3B0aW9ucy5jcmVhdGUob3B0aW9ucy5hdXRoKSxcbiAgKTtcbiAgY29uc3QgcGVyc2lzdGVudCA9IG5ldyBQZXJzaXN0ZW50QXV0aChcbiAgICBwcm9maWxlLFxuICAgIHN0b3JhZ2UgPT09IFN0b3JhZ2UuQXV0byA/IHN0b3JhZ2VGcm9tTmFtZShzdG9yZS5uYW1lKCkpIDogc3RvcmFnZSxcbiAgICBvcHRpb25zLFxuICAgIGRlcGVuZGVuY2llcy5lbnZpcm9ubWVudCA/PyBwcm9jZXNzLmVudixcbiAgICBjbGllbnQsXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZWQgcGVyc2lzdGVudCBhdXRoZW50aWNhdGlvbiBsaWZlY3ljbGVcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICBob3N0OiBwcm9maWxlLmhvc3QsXG4gICAgYXV0aEtpbmQ6IHByb2ZpbGUuYXV0aEtpbmQsXG4gICAgc3RvcmFnZTogcGVyc2lzdGVudC5zdGF0dXMoKS5zdG9yYWdlLFxuICB9KTtcbiAgcmV0dXJuIHBlcnNpc3RlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb3ZpZGVyRm9yKFxuICBwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxUb2tlblByb3ZpZGVyPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBpbkFwcCA9IGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KHsgLi4uZW52aXJvbm1lbnQgfSk7XG4gIHN3aXRjaCAocHJvZmlsZS5hdXRoS2luZCkge1xuICAgIGNhc2UgQXV0aEtpbmQuVXNlclRvTWFjaGluZToge1xuICAgICAgY29uc3QgaW5zdGFsbCA9ICFpbkFwcCB8fCBvcHRpb25zLmluc3RhbGxDbGlJbkFwcCA9PT0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgQ0xJIHByb3ZpZGVyXCIsIHtcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBpbkFwcCxcbiAgICAgICAgaW5zdGFsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIoXG4gICAgICAgIHByb2ZpbGUubmFtZSxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaVxuICAgICAgICAgICAgPyBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaSh7IGluc3RhbGwgfSlcbiAgICAgICAgICAgIDogcmVzb2x2ZURhdGFicmlja3NDbGkoZW52aXJvbm1lbnQsIHsgaW5zdGFsbCB9KSxcbiAgICAgICAgY2xpRW52aXJvbm1lbnQocHJvZmlsZSwgcmVzb2x2ZUNvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWdGaWxlLCBlbnZpcm9ubWVudCkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSBBdXRoS2luZC5QZXJzb25hbEFjY2Vzc1Rva2VuOlxuICAgICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgcGVyc29uYWwgYWNjZXNzIHRva2VuIHByb3ZpZGVyXCIsIHsgcHJvZmlsZTogcHJvZmlsZS5uYW1lIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyKHByb2ZpbGUuYWNjZXNzVG9rZW4hKTtcbiAgICBjYXNlIEF1dGhLaW5kLk1hY2hpbmVUb01hY2hpbmU6XG4gICAgY2FzZSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsOiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBzZXJ2aWNlLXByaW5jaXBhbCBwcm92aWRlclwiLCB7XG4gICAgICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgYXV0aEtpbmQ6IHByb2ZpbGUuYXV0aEtpbmQsXG4gICAgICAgIHRhcmdldDogcHJvZmlsZS50YXJnZXQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IHJlc29sdmVPQXV0aEVuZHBvaW50cyhwcm9maWxlLCBkZXBlbmRlbmNpZXMuZmV0Y2gpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbFByb3ZpZGVyKHtcbiAgICAgICAgdG9rZW5FbmRwb2ludDogZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQsXG4gICAgICAgIGNsaWVudElkOiBwcm9maWxlLmNsaWVudElkLFxuICAgICAgICBjbGllbnRTZWNyZXQ6IHByb2ZpbGUuY2xpZW50U2VjcmV0ISxcbiAgICAgICAgc2NvcGVzOiBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKSxcbiAgICAgICAgLi4uKHByb2ZpbGUuZ3JvdXBJZCA/IHsgZ3JvdXBJZDogcHJvZmlsZS5ncm91cElkIH0gOiB7fSksXG4gICAgICAgIGFsbG93SW5zZWN1cmVSZXF1ZXN0czogaXNMb29wYmFja0h0dHAocHJvZmlsZS5ob3N0KSxcbiAgICAgICAgZmV0Y2g6IGRlcGVuZGVuY2llcy5mZXRjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIEF1dGhLaW5kLkFwcE9uQmVoYWxmT2Y6XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQXBwIE9CTyB0b2tlbnMgZG8gbm90IHVzZSBhIHBlcnNpc3RlbnQgcHJvdmlkZXJcIik7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEF1dGhvcml6YXRpb25TZXJ2ZXIge1xuICB0b2tlbkVuZHBvaW50OiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPQXV0aEVuZHBvaW50cyhcbiAgcHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUsXG4gIGZldGNoZXI6IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoID0gZ2xvYmFsVGhpcy5mZXRjaCxcbik6IFByb21pc2U8QXV0aG9yaXphdGlvblNlcnZlcj4ge1xuICBjb25zdCBob3N0ID0gcHJvZmlsZS5ob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgaWYgKHByb2ZpbGUudGFyZ2V0ID09PSBUYXJnZXRLaW5kLkFjY291bnQpIHtcbiAgICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQWNjb3VudCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB7XG4gICAgICB0b2tlbkVuZHBvaW50OiBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cHJvZmlsZS5hY2NvdW50SWR9L3YxL3Rva2VuYCxcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGFjY291bnQgT0F1dGggZW5kcG9pbnRcIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgdG9rZW5PcmlnaW46IG5ldyBVUkwoZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xuICB9XG4gIGNvbnN0IGRpc2NvdmVyeSA9XG4gICAgcHJvZmlsZS50YXJnZXQgPT09IFRhcmdldEtpbmQuVW5pZmllZFxuICAgICAgPyBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZSl9Ly53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYFxuICAgICAgOiBgJHtob3N0fS9vaWRjLy53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYDtcbiAgbG9nZ2VyLmRlYnVnKFwicmVxdWVzdGluZyBPQXV0aCBkaXNjb3ZlcnlcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGRpc2NvdmVyeSxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hlcihkaXNjb3ZlcnksIHsgcmVkaXJlY3Q6IFwibWFudWFsXCIgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIE9BdXRoIGRpc2NvdmVyeSByZXNwb25zZVwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBgT0F1dGggaXMgbm90IHN1cHBvcnRlZCBhdCAke2Rpc2NvdmVyeX1gKTtcbiAgaWYgKCFyZXNwb25zZS5vaylcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgYE9BdXRoIGRpc2NvdmVyeSByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICBjb25zdCB2YWx1ZSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0b2tlbkVuZHBvaW50ID0gc3RyaW5nVmFsdWUodmFsdWUudG9rZW5fZW5kcG9pbnQpO1xuICBpZiAoIXRva2VuRW5kcG9pbnQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIk9BdXRoIGRpc2NvdmVyeSByZXNwb25zZSBpcyBpbmNvbXBsZXRlXCIpO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBPQXV0aCB0b2tlbiBlbmRwb2ludFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHRva2VuT3JpZ2luOiBuZXcgVVJMKHRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgfSk7XG4gIHJldHVybiB7IHRva2VuRW5kcG9pbnQgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUpOiBzdHJpbmcge1xuICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiVW5pZmllZCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgcmV0dXJuIHByb2ZpbGUuYWNjb3VudElkO1xufVxuXG5mdW5jdGlvbiBzdG9yYWdlRnJvbU5hbWUobmFtZTogc3RyaW5nKTogU3RvcmFnZSB7XG4gIHJldHVybiBuYW1lID09PSBcIm1lbW9yeVwiID8gU3RvcmFnZS5NZW1vcnkgOiBTdG9yYWdlLkZpbGU7XG59XG5cbmZ1bmN0aW9uIHByb2ZpbGVTdW1tYXJ5KHByb2ZpbGU6IERhdGFicmlja3NQcm9maWxlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICAuLi4ocHJvZmlsZS5hY2NvdW50SWQgPyB7IGFjY291bnRJZDogcHJvZmlsZS5hY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4ocHJvZmlsZS53b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQ6IHByb2ZpbGUud29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGF1dGhLaW5kOiBwcm9maWxlLmF1dGhLaW5kLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0xvb3BiYWNrSHR0cChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChob3N0KTtcbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiICYmIFtcIjEyNy4wLjAuMVwiLCBcImxvY2FsaG9zdFwiXS5pbmNsdWRlcyh1cmwuaG9zdG5hbWUpO1xufVxuXG5mdW5jdGlvbiBjbGlFbnZpcm9ubWVudChwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSwgY29uZmlnRmlsZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgREFUQUJSSUNLU19DT05GSUdfRklMRTogY29uZmlnRmlsZSxcbiAgICBEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFOiBwcm9maWxlLm5hbWUsXG4gICAgREFUQUJSSUNLU19IT1NUOiBwcm9maWxlLmhvc3QsXG4gICAgLi4uKHByb2ZpbGUuYWNjb3VudElkID8geyBEQVRBQlJJQ0tTX0FDQ09VTlRfSUQ6IHByb2ZpbGUuYWNjb3VudElkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUud29ya3NwYWNlSWQgPyB7IERBVEFCUklDS1NfV09SS1NQQUNFX0lEOiBwcm9maWxlLndvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLlBlcnNvbmFsQWNjZXNzVG9rZW5cbiAgICAgID8ge1xuICAgICAgICAgIERBVEFCUklDS1NfQVVUSF9UWVBFOiBcInBhdFwiLFxuICAgICAgICAgIERBVEFCUklDS1NfVE9LRU46IHByb2ZpbGUuYWNjZXNzVG9rZW4hLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -10,7 +10,7 @@ export declare class FileCredentialStore implements CredentialStore {
|
|
|
10
10
|
prepareWrite(): Promise<void>;
|
|
11
11
|
save(key: string, token: Token): Promise<void>;
|
|
12
12
|
remove(key: string): Promise<void>;
|
|
13
|
-
acquireLock(key: string, timeoutMs
|
|
13
|
+
acquireLock(key: string, timeoutMs?: number): Promise<string>;
|
|
14
14
|
releaseLock(lease: string): Promise<void>;
|
|
15
15
|
name(): string;
|
|
16
16
|
private forKey;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { basename, dirname, join } from "node:path";
|
|
5
|
+
import { acquireFileLock } from "@dbx-tools/core/file-lock";
|
|
6
|
+
import { authLogger, credentialId, tokenMetadata } from "./_logging.js";
|
|
7
|
+
import { AuthError } from "./errors.js";
|
|
8
|
+
import { FileLayout } from "./types.js";
|
|
9
|
+
const logger = authLogger("file-storage");
|
|
10
|
+
class FileLocks {
|
|
11
|
+
lockDirectory;
|
|
12
|
+
leases = new Map();
|
|
13
|
+
constructor(lockDirectory) {
|
|
14
|
+
this.lockDirectory = lockDirectory;
|
|
15
|
+
}
|
|
16
|
+
async acquire(key, timeoutMs) {
|
|
17
|
+
logger.debug("waiting for file lock", {
|
|
18
|
+
credential: credentialId(key),
|
|
19
|
+
timeoutMs,
|
|
20
|
+
});
|
|
21
|
+
const lease = await acquireFileLock(key, { dir: this.lockDirectory, timeoutMs });
|
|
22
|
+
const id = randomUUID();
|
|
23
|
+
this.leases.set(id, lease);
|
|
24
|
+
logger.debug("file lock acquired", {
|
|
25
|
+
credential: credentialId(key),
|
|
26
|
+
backend: lease.backend,
|
|
27
|
+
});
|
|
28
|
+
return id;
|
|
29
|
+
}
|
|
30
|
+
async release(id) {
|
|
31
|
+
const lease = this.leases.get(id);
|
|
32
|
+
if (!lease)
|
|
33
|
+
return;
|
|
34
|
+
this.leases.delete(id);
|
|
35
|
+
await lease.release();
|
|
36
|
+
logger.debug("file lock released", { backend: lease.backend });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** File-backed credential store preserving unrelated Databricks CLI entries. */
|
|
40
|
+
export class FileCredentialStore {
|
|
41
|
+
root;
|
|
42
|
+
layout;
|
|
43
|
+
locks;
|
|
44
|
+
constructor(root = join(homedir(), ".databricks"), layout = FileLayout.Single, locks) {
|
|
45
|
+
this.root = root;
|
|
46
|
+
this.layout = layout;
|
|
47
|
+
this.locks = locks ?? new FileLocks(join(root, "locks"));
|
|
48
|
+
}
|
|
49
|
+
async load(key) {
|
|
50
|
+
const store = this.forKey(key);
|
|
51
|
+
return store.withCacheLock(async () => {
|
|
52
|
+
const token = deserializeToken((await store.readCache()).tokens[key]);
|
|
53
|
+
logger.debug("loaded file credential", {
|
|
54
|
+
credential: credentialId(key),
|
|
55
|
+
layout: this.layout,
|
|
56
|
+
token: tokenMetadata(token),
|
|
57
|
+
});
|
|
58
|
+
return token;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async prepareWrite() {
|
|
62
|
+
await ensureDirectory(this.root, 0o700);
|
|
63
|
+
logger.debug("prepared credential directory", { layout: this.layout });
|
|
64
|
+
}
|
|
65
|
+
async save(key, token) {
|
|
66
|
+
const store = this.forKey(key);
|
|
67
|
+
await store.withCacheLock(async () => {
|
|
68
|
+
const cache = await store.readCache();
|
|
69
|
+
cache.tokens[key] = serializeToken(token);
|
|
70
|
+
await store.writeCache(cache);
|
|
71
|
+
logger.debug("saved file credential", {
|
|
72
|
+
credential: credentialId(key),
|
|
73
|
+
layout: this.layout,
|
|
74
|
+
token: tokenMetadata(token),
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async remove(key) {
|
|
79
|
+
const store = this.forKey(key);
|
|
80
|
+
await store.withCacheLock(async () => {
|
|
81
|
+
const cache = await store.readCache();
|
|
82
|
+
delete cache.tokens[key];
|
|
83
|
+
await store.writeCache(cache);
|
|
84
|
+
logger.debug("removed file credential", {
|
|
85
|
+
credential: credentialId(key),
|
|
86
|
+
layout: this.layout,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
acquireLock(key, timeoutMs) {
|
|
91
|
+
return this.locks.acquire(this.layout === FileLayout.Single ? `${this.root}:refresh` : `${this.root}:${key}:refresh`, timeoutMs);
|
|
92
|
+
}
|
|
93
|
+
releaseLock(lease) {
|
|
94
|
+
return this.locks.release(lease);
|
|
95
|
+
}
|
|
96
|
+
name() {
|
|
97
|
+
return "file";
|
|
98
|
+
}
|
|
99
|
+
forKey(key) {
|
|
100
|
+
if (this.layout === FileLayout.Single)
|
|
101
|
+
return this;
|
|
102
|
+
const digest = createHash("sha256").update(key).digest("hex");
|
|
103
|
+
return new FileCredentialStore(join(this.root, digest), FileLayout.Single, this.locks);
|
|
104
|
+
}
|
|
105
|
+
async withCacheLock(action) {
|
|
106
|
+
await ensureDirectory(this.root, 0o700);
|
|
107
|
+
const lease = await this.locks.acquire(`${this.root}:cache`, 30_000);
|
|
108
|
+
try {
|
|
109
|
+
return await action();
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
await this.locks.release(lease);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async readCache() {
|
|
116
|
+
try {
|
|
117
|
+
const source = await readTextFile(join(this.root, "token-cache.json"));
|
|
118
|
+
const cache = source ? JSON.parse(source) : { version: 1, tokens: {} };
|
|
119
|
+
if (cache.version !== 1 || typeof cache.tokens !== "object" || !cache.tokens) {
|
|
120
|
+
throw new AuthError("storage", "Token cache must use version 1");
|
|
121
|
+
}
|
|
122
|
+
logger.debug("read token cache", {
|
|
123
|
+
exists: Boolean(source),
|
|
124
|
+
credentialCount: Object.keys(cache.tokens).length,
|
|
125
|
+
});
|
|
126
|
+
return cache;
|
|
127
|
+
}
|
|
128
|
+
catch (cause) {
|
|
129
|
+
if (cause instanceof AuthError)
|
|
130
|
+
throw cause;
|
|
131
|
+
throw new AuthError("storage", "Could not read Databricks token cache", { cause });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async writeCache(cache) {
|
|
135
|
+
try {
|
|
136
|
+
await atomicWriteTextFile(join(this.root, "token-cache.json"), `${JSON.stringify(cache, null, 2)}\n`, 0o600);
|
|
137
|
+
logger.debug("wrote token cache", { credentialCount: Object.keys(cache.tokens).length });
|
|
138
|
+
}
|
|
139
|
+
catch (cause) {
|
|
140
|
+
throw new AuthError("storage", "Could not write Databricks token cache", { cause });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function ensureDirectory(path, mode) {
|
|
145
|
+
await mkdir(path, { recursive: true, mode });
|
|
146
|
+
await chmod(path, mode);
|
|
147
|
+
}
|
|
148
|
+
async function readTextFile(path) {
|
|
149
|
+
try {
|
|
150
|
+
return await readFile(path, "utf8");
|
|
151
|
+
}
|
|
152
|
+
catch (cause) {
|
|
153
|
+
if (cause.code === "ENOENT")
|
|
154
|
+
return undefined;
|
|
155
|
+
throw cause;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function atomicWriteTextFile(path, content, mode) {
|
|
159
|
+
const parent = dirname(path);
|
|
160
|
+
await ensureDirectory(parent, 0o700);
|
|
161
|
+
const temporary = join(parent, `.${basename(path)}-${randomUUID()}.tmp`);
|
|
162
|
+
try {
|
|
163
|
+
await writeFile(temporary, content, { mode, flag: "wx" });
|
|
164
|
+
await chmod(temporary, mode);
|
|
165
|
+
await rename(temporary, path);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
await unlink(temporary).catch((cause) => {
|
|
169
|
+
if (cause.code !== "ENOENT")
|
|
170
|
+
throw cause;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function serializeToken(token) {
|
|
175
|
+
return {
|
|
176
|
+
access_token: token.accessToken,
|
|
177
|
+
token_type: token.tokenType,
|
|
178
|
+
...(token.refreshToken ? { refresh_token: token.refreshToken } : {}),
|
|
179
|
+
...(token.expiry ? { expiry: token.expiry } : {}),
|
|
180
|
+
...(token.scopes.length ? { scopes: token.scopes } : {}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function deserializeToken(value) {
|
|
184
|
+
if (!value || typeof value !== "object")
|
|
185
|
+
return undefined;
|
|
186
|
+
const record = value;
|
|
187
|
+
const accessToken = stringValue(record.access_token ?? record.accessToken);
|
|
188
|
+
if (!accessToken)
|
|
189
|
+
return undefined;
|
|
190
|
+
return {
|
|
191
|
+
accessToken,
|
|
192
|
+
tokenType: stringValue(record.token_type ?? record.tokenType) ?? "Bearer",
|
|
193
|
+
...(stringValue(record.refresh_token ?? record.refreshToken)
|
|
194
|
+
? { refreshToken: stringValue(record.refresh_token ?? record.refreshToken) }
|
|
195
|
+
: {}),
|
|
196
|
+
...(stringValue(record.expiry ?? record.expires_at)
|
|
197
|
+
? { expiry: stringValue(record.expiry ?? record.expires_at) }
|
|
198
|
+
: {}),
|
|
199
|
+
scopes: Array.isArray(record.scopes)
|
|
200
|
+
? record.scopes.filter((scope) => typeof scope === "string")
|
|
201
|
+
: [],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function stringValue(value) {
|
|
205
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbGUtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBTzFDLE1BQU0sU0FBUztJQUdnQjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUUzRCxZQUE2QixhQUFxQjtRQUFyQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsU0FBa0I7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtZQUNwQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUs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cnQgeyBjcmVhdGVIYXNoLCByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGFjcXVpcmVGaWxlTG9jaywgdHlwZSBGaWxlTG9ja0xlYXNlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9maWxlLWxvY2tcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgY3JlZGVudGlhbElkLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBDcmVkZW50aWFsU3RvcmUsIExvY2tBZGFwdGVyLCBUb2tlbiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5pbXBvcnQgeyBGaWxlTGF5b3V0IH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImZpbGUtc3RvcmFnZVwiKTtcblxuaW50ZXJmYWNlIFRva2VuQ2FjaGUge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHRva2VuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNsYXNzIEZpbGVMb2NrcyBpbXBsZW1lbnRzIExvY2tBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWFzZXMgPSBuZXcgTWFwPHN0cmluZywgRmlsZUxvY2tMZWFzZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2tEaXJlY3Rvcnk6IHN0cmluZykge31cblxuICBhc3luYyBhY3F1aXJlKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIndhaXRpbmcgZm9yIGZpbGUgbG9ja1wiLCB7XG4gICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsSWQoa2V5KSxcbiAgICAgIHRpbWVvdXRNcyxcbiAgICB9KTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IGFjcXVpcmVGaWxlTG9jayhrZXksIHsgZGlyOiB0aGlzLmxvY2tEaXJlY3RvcnksIHRpbWVvdXRNcyB9KTtcbiAgICBjb25zdCBpZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmxlYXNlcy5zZXQoaWQsIGxlYXNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlIGxvY2sgYWNxdWlyZWRcIiwge1xuICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICBiYWNrZW5kOiBsZWFzZS5iYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2UoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxlYXNlID0gdGhpcy5sZWFzZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWxlYXNlKSByZXR1cm47XG4gICAgdGhpcy5sZWFzZXMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBsZWFzZS5yZWxlYXNlKCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZSBsb2NrIHJlbGVhc2VkXCIsIHsgYmFja2VuZDogbGVhc2UuYmFja2VuZCB9KTtcbiAgfVxufVxuXG4vKiogRmlsZS1iYWNrZWQgY3JlZGVudGlhbCBzdG9yZSBwcmVzZXJ2aW5nIHVucmVsYXRlZCBEYXRhYnJpY2tzIENMSSBlbnRyaWVzLiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDcmVkZW50aWFsU3RvcmUgaW1wbGVtZW50cyBDcmVkZW50aWFsU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tzOiBMb2NrQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvb3QgPSBqb2luKGhvbWVkaXIoKSwgXCIuZGF0YWJyaWNrc1wiKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dCA9IEZpbGVMYXlvdXQuU2luZ2xlLFxuICAgIGxvY2tzPzogTG9ja0FkYXB0ZXIsXG4gICkge1xuICAgIHRoaXMubG9ja3MgPSBsb2NrcyA/PyBuZXcgRmlsZUxvY2tzKGpvaW4ocm9vdCwgXCJsb2Nrc1wiKSk7XG4gIH1cblxuICBhc3luYyBsb2FkKGtleTogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICByZXR1cm4gc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGRlc2VyaWFsaXplVG9rZW4oKGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpKS50b2tlbnNba2V5XSk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdyaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBsb2dnZXIuZGVidWcoXCJwcmVwYXJlZCBjcmVkZW50aWFsIGRpcmVjdG9yeVwiLCB7IGxheW91dDogdGhpcy5sYXlvdXQgfSk7XG4gIH1cblxuICBhc3luYyBzYXZlKGtleTogc3RyaW5nLCB0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZm9yS2V5KGtleSk7XG4gICAgYXdhaXQgc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpO1xuICAgICAgY2FjaGUudG9rZW5zW2tleV0gPSBzZXJpYWxpemVUb2tlbih0b2tlbik7XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNhdmVkIGZpbGUgY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZChrZXkpLFxuICAgICAgICBsYXlvdXQ6IHRoaXMubGF5b3V0LFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICBhd2FpdCBzdG9yZS53aXRoQ2FjaGVMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgc3RvcmUucmVhZENhY2hlKCk7XG4gICAgICBkZWxldGUgY2FjaGUudG9rZW5zW2tleV07XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlbW92ZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjcXVpcmVMb2NrKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tzLmFjcXVpcmUoXG4gICAgICB0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUgPyBgJHt0aGlzLnJvb3R9OnJlZnJlc2hgIDogYCR7dGhpcy5yb290fToke2tleX06cmVmcmVzaGAsXG4gICAgICB0aW1lb3V0TXMsXG4gICAgKTtcbiAgfVxuXG4gIHJlbGVhc2VMb2NrKGxlYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2Nrcy5yZWxlYXNlKGxlYXNlKTtcbiAgfVxuXG4gIG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cblxuICBwcml2YXRlIGZvcktleShrZXk6IHN0cmluZyk6IEZpbGVDcmVkZW50aWFsU3RvcmUge1xuICAgIGlmICh0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGtleSkuZGlnZXN0KFwiaGV4XCIpO1xuICAgIHJldHVybiBuZXcgRmlsZUNyZWRlbnRpYWxTdG9yZShqb2luKHRoaXMucm9vdCwgZGlnZXN0KSwgRmlsZUxheW91dC5TaW5nbGUsIHRoaXMubG9ja3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2FjaGVMb2NrPFQ+KGFjdGlvbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IHRoaXMubG9ja3MuYWNxdWlyZShgJHt0aGlzLnJvb3R9OmNhY2hlYCwgMzBfMDAwKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmxvY2tzLnJlbGVhc2UobGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZENhY2hlKCk6IFByb21pc2U8VG9rZW5DYWNoZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkVGV4dEZpbGUoam9pbih0aGlzLnJvb3QsIFwidG9rZW4tY2FjaGUuanNvblwiKSk7XG4gICAgICBjb25zdCBjYWNoZSA9IHNvdXJjZSA/IChKU09OLnBhcnNlKHNvdXJjZSkgYXMgVG9rZW5DYWNoZSkgOiB7IHZlcnNpb246IDEsIHRva2Vuczoge30gfTtcbiAgICAgIGlmIChjYWNoZS52ZXJzaW9uICE9PSAxIHx8IHR5cGVvZiBjYWNoZS50b2tlbnMgIT09IFwib2JqZWN0XCIgfHwgIWNhY2hlLnRva2Vucykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwic3RvcmFnZVwiLCBcIlRva2VuIGNhY2hlIG11c3QgdXNlIHZlcnNpb24gMVwiKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlYWQgdG9rZW4gY2FjaGVcIiwge1xuICAgICAgICBleGlzdHM6IEJvb2xlYW4oc291cmNlKSxcbiAgICAgICAgY3JlZGVudGlhbENvdW50OiBPYmplY3Qua2V5cyhjYWNoZS50b2tlbnMpLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBdXRoRXJyb3IpIHRocm93IGNhdXNlO1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcInN0b3JhZ2VcIiwgXCJDb3VsZCBub3QgcmVhZCBEYXRhYnJpY2tzIHRva2VuIGNhY2hlXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUNhY2hlKGNhY2hlOiBUb2tlbkNhY2hlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF0b21pY1dyaXRlVGV4dEZpbGUoXG4gICAgICAgIGpvaW4odGhpcy5yb290LCBcInRva2VuLWNhY2hlLmpzb25cIiksXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGNhY2hlLCBudWxsLCAyKX1cXG5gLFxuICAgICAgICAwbzYwMCxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ3cm90ZSB0b2tlbiBjYWNoZVwiLCB7IGNyZWRlbnRpYWxDb3VudDogT2JqZWN0LmtleXMoY2FjaGUudG9rZW5zKS5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJzdG9yYWdlXCIsIFwiQ291bGQgbm90IHdyaXRlIERhdGFicmlja3MgdG9rZW4gY2FjaGVcIiwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KHBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBtb2RlIH0pO1xuICBhd2FpdCBjaG1vZChwYXRoLCBtb2RlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBpZiAoKGNhdXNlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0aHJvdyBjYXVzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdG9taWNXcml0ZVRleHRGaWxlKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFyZW50ID0gZGlybmFtZShwYXRoKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHBhcmVudCwgMG83MDApO1xuICBjb25zdCB0ZW1wb3JhcnkgPSBqb2luKHBhcmVudCwgYC4ke2Jhc2VuYW1lKHBhdGgpfS0ke3JhbmRvbVVVSUQoKX0udG1wYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeSwgY29udGVudCwgeyBtb2RlLCBmbGFnOiBcInd4XCIgfSk7XG4gICAgYXdhaXQgY2htb2QodGVtcG9yYXJ5LCBtb2RlKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5LCBwYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCB1bmxpbmsodGVtcG9yYXJ5KS5jYXRjaCgoY2F1c2U6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGNhdXNlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGNhdXNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRva2VuKHRva2VuOiBUb2tlbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NfdG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgIHRva2VuX3R5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICAuLi4odG9rZW4ucmVmcmVzaFRva2VuID8geyByZWZyZXNoX3Rva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAuLi4odG9rZW4uZXhwaXJ5ID8geyBleHBpcnk6IHRva2VuLmV4cGlyeSB9IDoge30pLFxuICAgIC4uLih0b2tlbi5zY29wZXMubGVuZ3RoID8geyBzY29wZXM6IHRva2VuLnNjb3BlcyB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVRva2VuKHZhbHVlOiB1bmtub3duKTogVG9rZW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVjb3JkID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gc3RyaW5nVmFsdWUocmVjb3JkLmFjY2Vzc190b2tlbiA/PyByZWNvcmQuYWNjZXNzVG9rZW4pO1xuICBpZiAoIWFjY2Vzc1Rva2VuKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHRva2VuVHlwZTogc3RyaW5nVmFsdWUocmVjb3JkLnRva2VuX3R5cGUgPz8gcmVjb3JkLnRva2VuVHlwZSkgPz8gXCJCZWFyZXJcIixcbiAgICAuLi4oc3RyaW5nVmFsdWUocmVjb3JkLnJlZnJlc2hfdG9rZW4gPz8gcmVjb3JkLnJlZnJlc2hUb2tlbilcbiAgICAgID8geyByZWZyZXNoVG9rZW46IHN0cmluZ1ZhbHVlKHJlY29yZC5yZWZyZXNoX3Rva2VuID8/IHJlY29yZC5yZWZyZXNoVG9rZW4pIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHJpbmdWYWx1ZShyZWNvcmQuZXhwaXJ5ID8/IHJlY29yZC5leHBpcmVzX2F0KVxuICAgICAgPyB7IGV4cGlyeTogc3RyaW5nVmFsdWUocmVjb3JkLmV4cGlyeSA/PyByZWNvcmQuZXhwaXJlc19hdCkgfVxuICAgICAgOiB7fSksXG4gICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHJlY29yZC5zY29wZXMpXG4gICAgICA/IHJlY29yZC5zY29wZXMuZmlsdGVyKChzY29wZSk6IHNjb3BlIGlzIHN0cmluZyA9PiB0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpXG4gICAgICA6IFtdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|