@dbx-tools/shared-core 0.9.54 → 0.9.58
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 -2
- package/lib/index.d.ts +3 -2
- package/lib/index.js +4 -3
- package/lib/src/environment-utils.d.ts +1 -1
- package/lib/src/environment-utils.js +4 -4
- package/lib/src/net.d.ts +2 -0
- package/lib/src/net.js +3 -1
- package/lib/src/options.d.ts +1 -2
- package/lib/src/options.js +3 -4
- package/package.json +1 -1
- package/src/environment-utils.ts +3 -3
- package/src/net.ts +3 -0
- package/src/options.ts +3 -4
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/shared-core";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.58";
|
|
7
7
|
export * as asyncUtils from "./src/async-utils.ts";
|
|
8
8
|
export * as bindings from "./src/bindings.ts";
|
|
9
9
|
export * as brandUtils from "./src/brand-utils.ts";
|
|
@@ -30,9 +30,10 @@ export type { ExecutionResult, Executor, ExecutionFailure, RunOptions } from "./
|
|
|
30
30
|
export type { MemoizeOptions } from "./src/function-utils.ts";
|
|
31
31
|
export type { HeaderLike } from "./src/http.ts";
|
|
32
32
|
export type { LogLevel, Logger } from "./src/log.ts";
|
|
33
|
+
export { MAX_TCP_PORT } from "./src/net.ts";
|
|
33
34
|
export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
|
|
34
35
|
export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
|
|
35
|
-
export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames,
|
|
36
|
+
export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.ts";
|
|
36
37
|
export type { DatabricksEnvironmentNames, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenScheme, TcpListenAddress, UnixListenAddress, ListenAddress, ListenAddressOptions, ListenAddressInput } from "./src/options.ts";
|
|
37
38
|
export type { PatternOptions } from "./src/pattern.ts";
|
|
38
39
|
export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.58";
|
|
3
3
|
export * as asyncUtils from "./src/async-utils.ts";
|
|
4
4
|
export * as bindings from "./src/bindings.ts";
|
|
5
5
|
export * as brandUtils from "./src/brand-utils.ts";
|
|
@@ -26,9 +26,10 @@ export type { ExecutionResult, Executor, ExecutionFailure, RunOptions } from "./
|
|
|
26
26
|
export type { MemoizeOptions } from "./src/function-utils.ts";
|
|
27
27
|
export type { HeaderLike } from "./src/http.ts";
|
|
28
28
|
export type { LogLevel, Logger } from "./src/log.ts";
|
|
29
|
+
export { MAX_TCP_PORT } from "./src/net.ts";
|
|
29
30
|
export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
|
|
30
31
|
export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
|
|
31
|
-
export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames,
|
|
32
|
+
export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.ts";
|
|
32
33
|
export type { DatabricksEnvironmentNames, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenScheme, TcpListenAddress, UnixListenAddress, ListenAddress, ListenAddressOptions, ListenAddressInput } from "./src/options.ts";
|
|
33
34
|
export type { PatternOptions } from "./src/pattern.ts";
|
|
34
35
|
export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.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/shared-core";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.58";
|
|
6
6
|
export * as asyncUtils from "./src/async-utils.js";
|
|
7
7
|
export * as bindings from "./src/bindings.js";
|
|
8
8
|
export * as brandUtils from "./src/brand-utils.js";
|
|
@@ -22,6 +22,7 @@ export * as predicate from "./src/predicate.js";
|
|
|
22
22
|
export * as stringUtils from "./src/string-utils.js";
|
|
23
23
|
export * as token from "./src/token.js";
|
|
24
24
|
export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.js";
|
|
25
|
-
export {
|
|
25
|
+
export { MAX_TCP_PORT } from "./src/net.js";
|
|
26
|
+
export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.js";
|
|
26
27
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwwQkFBMEIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt6TSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNThcIjtcbmV4cG9ydCAqIGFzIGFzeW5jVXRpbHMgZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBiaW5kaW5ncyBmcm9tIFwiLi9zcmMvYmluZGluZ3MudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgb3B0aW9ucyBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hLCBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcywgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLCBEYXRhYnJpY2tzT3B0aW9ucywgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCwgTGFrZWJhc2VPcHRpb25zLCBPcHRpb25WYWx1ZU1hcCwgTGlzdGVuU2NoZW1lLCBUY3BMaXN0ZW5BZGRyZXNzLCBVbml4TGlzdGVuQWRkcmVzcywgTGlzdGVuQWRkcmVzcywgTGlzdGVuQWRkcmVzc09wdGlvbnMsIExpc3RlbkFkZHJlc3NJbnB1dCB9IGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBhdHRlcm5PcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJlZGljYXRlRnVuY3Rpb24sIFR5cGVQcmVkaWNhdGVGdW5jdGlvbiwgUHJlZGljYXRlSW5wdXQsIFByZWRpY2F0ZSB9IGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgVG9rZW5pemVPcHRpb25zLCBLZXlPcHRpb25zLCBJZGVudGlmaWVyT3B0aW9ucywgRGVkZW50T3B0aW9ucywgRGVzY3JpcHRpb24gfSBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBBQ0NFU1NfVE9LRU5fSEVBREVSLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIgfSBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/** Detect a Databricks App runtime from its required
|
|
1
|
+
/** Detect a Databricks App runtime from its required host and App-specific port. */
|
|
2
2
|
export declare function isDatabricksAppEnv(source?: Record<string, string | undefined>): boolean;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { MAX_TCP_PORT } from "./net.js";
|
|
1
2
|
import { toBoolean } from "./object.js";
|
|
2
|
-
import { MAX_TCP_PORT } from "./options.js";
|
|
3
3
|
function runtimeEnvironment() {
|
|
4
4
|
return (globalThis.process?.env ?? {});
|
|
5
5
|
}
|
|
6
|
-
/** Detect a Databricks App runtime from its required
|
|
6
|
+
/** Detect a Databricks App runtime from its required host and App-specific port. */
|
|
7
7
|
export function isDatabricksAppEnv(source = runtimeEnvironment()) {
|
|
8
8
|
const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
|
|
9
9
|
if (override !== undefined)
|
|
@@ -11,7 +11,7 @@ export function isDatabricksAppEnv(source = runtimeEnvironment()) {
|
|
|
11
11
|
const name = source.DATABRICKS_APP_NAME?.trim();
|
|
12
12
|
const host = source.DATABRICKS_HOST?.trim();
|
|
13
13
|
const port = source.DATABRICKS_APP_PORT?.trim();
|
|
14
|
-
if (
|
|
14
|
+
if ((name && /\$\{[^}]+\}/.test(name)) || !host || !port || !/^\d+$/.test(port))
|
|
15
15
|
return false;
|
|
16
16
|
const parsedPort = Number(port);
|
|
17
17
|
if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > MAX_TCP_PORT)
|
|
@@ -24,4 +24,4 @@ export function isDatabricksAppEnv(source = runtimeEnvironment()) {
|
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sQ0FFSCxVQUdELENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsU0FBNkMsa0JBQWtCLEVBQUU7SUFFakUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hFLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsR0FBRyxZQUFZO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDL0YsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BWF9UQ1BfUE9SVCB9IGZyb20gXCIuL25ldC50c1wiO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5cbmZ1bmN0aW9uIHJ1bnRpbWVFbnZpcm9ubWVudCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIChcbiAgICAoXG4gICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICBwcm9jZXNzPzogeyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH07XG4gICAgICB9XG4gICAgKS5wcm9jZXNzPy5lbnYgPz8ge31cbiAgKTtcbn1cblxuLyoqIERldGVjdCBhIERhdGFicmlja3MgQXBwIHJ1bnRpbWUgZnJvbSBpdHMgcmVxdWlyZWQgaG9zdCBhbmQgQXBwLXNwZWNpZmljIHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBydW50aW1lRW52aXJvbm1lbnQoKSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvdmVycmlkZSA9IHRvQm9vbGVhbihzb3VyY2UuREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVik7XG4gIGlmIChvdmVycmlkZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3ZlcnJpZGU7XG4gIGNvbnN0IG5hbWUgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfTkFNRT8udHJpbSgpO1xuICBjb25zdCBob3N0ID0gc291cmNlLkRBVEFCUklDS1NfSE9TVD8udHJpbSgpO1xuICBjb25zdCBwb3J0ID0gc291cmNlLkRBVEFCUklDS1NfQVBQX1BPUlQ/LnRyaW0oKTtcbiAgaWYgKChuYW1lICYmIC9cXCRcXHtbXn1dK1xcfS8udGVzdChuYW1lKSkgfHwgIWhvc3QgfHwgIXBvcnQgfHwgIS9eXFxkKyQvLnRlc3QocG9ydCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFyc2VkUG9ydCA9IE51bWJlcihwb3J0KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZFBvcnQpIHx8IHBhcnNlZFBvcnQgPCAxIHx8IHBhcnNlZFBvcnQgPiBNQVhfVENQX1BPUlQpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGhvc3QpO1xuICAgIHJldHVybiAodXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiKSAmJiBCb29sZWFuKHVybC5ob3N0bmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
package/lib/src/net.d.ts
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* @module
|
|
17
17
|
*/
|
|
18
18
|
import type { NonFunctionKeys } from "./object.ts";
|
|
19
|
+
/** Highest valid TCP port number. */
|
|
20
|
+
export declare const MAX_TCP_PORT = 65535;
|
|
19
21
|
/**
|
|
20
22
|
* Anything {@link urlBuilder} (and {@link pathMatch}) know how to coerce
|
|
21
23
|
* into a URL:
|
package/lib/src/net.js
CHANGED
|
@@ -20,6 +20,8 @@ const URL_SCHEME_DEFAULT = "https";
|
|
|
20
20
|
const URL_SCHEME_PREFIX = /^([A-Za-z][A-Za-z0-9+.-]*:\/\/)/;
|
|
21
21
|
const URL_PATH_SEGMENT_TRIM = /^\/+|\/+$/g;
|
|
22
22
|
const URL_SCHEME_SEPARATOR = "://";
|
|
23
|
+
/** Highest valid TCP port number. */
|
|
24
|
+
export const MAX_TCP_PORT = 65_535;
|
|
23
25
|
/** Total bit width of an address of each {@link IpVersion}. */
|
|
24
26
|
const IP_BITS = { 4: 32, 6: 128 };
|
|
25
27
|
const IPV4_OCTET = /^\d{1,3}$/;
|
|
@@ -464,4 +466,4 @@ function hextetsToValue(hextets) {
|
|
|
464
466
|
value = (value << 16n) | BigInt(hextet);
|
|
465
467
|
return value;
|
|
466
468
|
}
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUEyQixHQUFNLEVBQUUsS0FBd0I7UUFDN0QsTUFBTSxJQUFJ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QUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBuZXR3b3JraW5nIGhlbHBlcnMgYnVpbHQgYXJvdW5kIHtAbGluayB1cmxCdWlsZGVyfTogYVxuICogdG9sZXJhbnQgYFVSTGAgY29lcmNpb24gKyBjaGFpbmFibGUgYnVpbGRlciB0aGF0IGdyYWNlZnVsbHkgaGFuZGxlc1xuICogcGFydGlhbCBpbnB1dHMgKGJhcmUgaG9zdHMsIHBhdGgtb25seSBzdHJpbmdzLCBgeyB1cmwgfWAgd3JhcHBlcnMpLFxuICogYSBzbWFsbCBJUHY0IC8gSVB2NiBhZGRyZXNzICsgQ0lEUiB0b29sa2l0IChwYXJzaW5nIGFuZCBtZW1iZXJzaGlwXG4gKiBsb29rdXBzKSwgYW5kIGVtYWlsLWFkZHJlc3MgcGFyc2luZyAoe0BsaW5rIHBhcnNlRW1haWxzfSAvXG4gKiB7QGxpbmsgaXNFbWFpbH0pIHRoYXQgbm9ybWFsaXplcyB0aGUgQ1NWIC8gc2luZ2xlLXN0cmluZyAvIGFycmF5XG4gKiBpbnB1dHMgZW1haWwgcmVjaXBpZW50IGFuZCBhbGxvdy1saXN0IGZpZWxkcyBhY2NlcHQgaW50byBhIGNsZWFuXG4gKiBgc3RyaW5nW11gLiBObyBub2RlLW9ubHkgaW1wb3J0cywgc28gdGhpcyBtb2R1bGUgaXMgdGhlIGNhbm9uaWNhbFxuICogaG9tZSBmb3IgYW55dGhpbmcgVVJMLSwgSVAtLCBvciBlbWFpbC1zaGFwZWQgdGhhdCBhbHNvIGhhcyB0byBydW4gaW5cbiAqIGEgVml0ZSAvIFdlYnBhY2sgLyBlc2J1aWxkIGNsaWVudCBidW5kbGUuIE5vZGUtb25seSBuZXR3b3JrIGhlbHBlcnNcbiAqIChlLmcuIEROUyByZXNvbHV0aW9uKSBiZWxvbmcgaW4gYSBub2RlLXRhZ2dlZCBwYWNrYWdlLCBub3QgaGVyZS5cbiAqIFJldXNlIHRoaXMgbW9kdWxlIGZvciBVUkwsIElQL0NJRFIsIGFuZCBlbWFpbCBwYXJzaW5nIGluc3RlYWQgb2YgaW50cm9kdWNpbmdcbiAqIHBhY2thZ2UtbG9jYWwgbm9ybWFsaXplcnMgd2l0aCBzdWJ0bHkgZGlmZmVyZW50IHJ1bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5vbkZ1bmN0aW9uS2V5cyB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG5jb25zdCBMT0NBTF9IT1NUX1VSTCA9IG5ldyBVUkwoXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuY29uc3QgVVJMX1NDSEVNRV9ERUZBVUxUID0gXCJodHRwc1wiO1xuY29uc3QgVVJMX1NDSEVNRV9QUkVGSVggPSAvXihbQS1aYS16XVtBLVphLXowLTkrLi1dKjpcXC9cXC8pLztcbmNvbnN0IFVSTF9QQVRIX1NFR01FTlRfVFJJTSA9IC9eXFwvK3xcXC8rJC9nO1xuY29uc3QgVVJMX1NDSEVNRV9TRVBBUkFUT1IgPSBcIjovL1wiO1xuXG4vKiogVG90YWwgYml0IHdpZHRoIG9mIGFuIGFkZHJlc3Mgb2YgZWFjaCB7QGxpbmsgSXBWZXJzaW9ufS4gKi9cbmNvbnN0IElQX0JJVFM6IFJlYWRvbmx5PFJlY29yZDxJcFZlcnNpb24sIG51bWJlcj4+ID0geyA0OiAzMiwgNjogMTI4IH07XG5jb25zdCBJUFY0X09DVEVUID0gL15cXGR7MSwzfSQvO1xuY29uc3QgSVBWNl9IRVhURVQgPSAvXlswLTlhLWZBLUZdezEsNH0kLztcblxuLyoqIERlbGltaXRlcnMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gYSBmcmVlLXRleHQgLyBDU1YgZW1haWwgbGlzdC4gKi9cbmNvbnN0IEVNQUlMX0xJU1RfU0VQQVJBVE9SID0gL1tcXHMsO10rLztcbi8qKiBQcmFnbWF0aWMgYGxvY2FsQGRvbWFpbi50bGRgIHNoYXBlIGNoZWNrIChub3QgZnVsbCBSRkMgNTMyMikuICovXG5jb25zdCBFTUFJTF9BRERSRVNTID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfSAoYW5kIHtAbGluayBwYXRoTWF0Y2h9KSBrbm93IGhvdyB0byBjb2VyY2VcbiAqIGludG8gYSBVUkw6XG4gKlxuICogLSBBIHN0cmluZzogYSBob3N0LCBhIGZ1bGwgVVJMLCBvciBhIHBhdGggLyBxdWVyeSAvIGhhc2ggZnJhZ21lbnQuXG4gKiAtIEEgV0hBVFdHIGBVUkxgIGluc3RhbmNlLlxuICogLSBBbnkgb2JqZWN0IHdpdGggYSBgdXJsYCBmaWVsZCAoZS5nLiBhIGZldGNoIGBSZXF1ZXN0YCwgYSBEYXRhYnJpY2tzXG4gKiAgIGBXb3Jrc3BhY2VDbGllbnRgIGNvbmZpZykuXG4gKi9cbmV4cG9ydCB0eXBlIFVybExpa2UgPSBzdHJpbmcgfCBVUkwgfCB7IHVybDogc3RyaW5nIH07XG5cbi8qKiBJUCBwcm90b2NvbCBmYW1pbHk6IGA0YCBmb3IgSVB2NCwgYDZgIGZvciBJUHY2LiAqL1xuZXhwb3J0IHR5cGUgSXBWZXJzaW9uID0gNCB8IDY7XG5cbi8qKlxuICogQSBwYXJzZWQgSVAgYWRkcmVzcy4gYHZhbHVlYCBpcyB0aGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4gKiAoYSAzMi1iaXQgcmFuZ2UgZm9yIHY0LCAxMjgtYml0IGZvciB2NikgaGVsZCBpbiBhIGBiaWdpbnRgIHNvIGJvdGhcbiAqIGZhbWlsaWVzIHNoYXJlIG9uZSBjb21wYXJpc29uIC8gbWFza2luZyBwYXRoLiBQcm9kdWNlIG9uZSB3aXRoXG4gKiB7QGxpbmsgcGFyc2VJcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkSXAge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBUaGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIChgYmlnaW50YCBmb3IgdW5pZm9ybSB2NC92NiBtYXRoKS4gKi9cbiAgdmFsdWU6IGJpZ2ludDtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBDSURSIGJsb2NrIChgMTAuMC4wLjAvOGAsIGAyMDAxOmRiODo6LzMyYCkuIGBiYXNlYCBpcyB0aGVcbiAqIG5ldHdvcmsgYWRkcmVzcyB3aXRoIGFsbCBob3N0IGJpdHMgY2xlYXJlZCwgc28gbWVtYmVyc2hpcCBpcyBhXG4gKiBzaW5nbGUgbWFza2VkIGNvbXBhcmUgKHNlZSB7QGxpbmsgaXBJbkNpZHJ9KS4gUHJvZHVjZSBvbmUgd2l0aFxuICoge0BsaW5rIHBhcnNlQ2lkcn0uIENhcnJpZXMgdGhlIG5vcm1hbGl6ZWQgYGNpZHJgIHN0cmluZyBmb3IgbG9nZ2luZ1xuICogYW5kIHRvIGtleSBiYWNrIHRvIGNhbGxlci1zaWRlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENpZHIge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBOZXR3b3JrIGFkZHJlc3MgKGhvc3QgYml0cyB6ZXJvZWQpIGFzIGFuIHVuc2lnbmVkIGBiaWdpbnRgLiAqL1xuICBiYXNlOiBiaWdpbnQ7XG4gIC8qKiBQcmVmaXggbGVuZ3RoIGluIGJpdHMgKHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvYCkuICovXG4gIHByZWZpeDogbnVtYmVyO1xuICAvKiogTm9ybWFsaXplZCBgPGFkZHJlc3M+LzxwcmVmaXg+YCBzdHJpbmcuICovXG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIFNldHRhYmxlLCBub24tbWV0aG9kIGBVUkxgIHByb3BlcnRpZXMgLSB0aGUga2V5cyB7QGxpbmsgVXJsQnVpbGRlci53aXRofSBhY2NlcHRzLiAqL1xudHlwZSBVcmxQcm9wZXJ0eUtleSA9IE5vbkZ1bmN0aW9uS2V5czxVcmxCdWlsZGVySW1wbD47XG5cbi8qKlxuICogQSBgVVJMYCBzdWJjbGFzcyB3aXRoIGNoYWluYWJsZSwgY29weS1vbi13cml0ZSBoZWxwZXJzLiBFdmVyeSBtdXRhdGluZ1xuICogbWV0aG9kIHJldHVybnMgYSBmcmVzaCBidWlsZGVyIHJhdGhlciB0aGFuIGVkaXRpbmcgaW4gcGxhY2UsIHNvIGEgYmFzZVxuICogYnVpbGRlciBjYW4gYmUgc2FmZWx5IHJldXNlZC4gQ29uc3RydWN0IG9uZSB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9LlxuICovXG5jbGFzcyBVcmxCdWlsZGVySW1wbCBleHRlbmRzIFVSTCB7XG4gIGNvbnN0cnVjdG9yKHVybDogVVJMKSB7XG4gICAgc3VwZXIodXJsKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2NoZW1lIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbG9uIChgaHR0cHNgLCBub3QgYGh0dHBzOmApLiAqL1xuICBnZXQgc2NoZW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgc2V0IHNjaGVtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm90b2NvbCA9IHZhbHVlICsgXCI6XCI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aXRoIGEgc2luZ2xlIGBVUkxgIHByb3BlcnR5IChgcGF0aG5hbWVgLCBgc2VhcmNoYCxcbiAgICogYGhvc3RuYW1lYCwgYHNjaGVtZWAsIC4uLikgc2V0IHRvIGB2YWx1ZWAsIGxlYXZpbmcgdGhpcyBidWlsZGVyXG4gICAqIHVudG91Y2hlZC5cbiAgICovXG4gIHdpdGg8SyBleHRlbmRzIFVybFByb3BlcnR5S2V5PihrZXk6IEssIHZhbHVlOiBVcmxCdWlsZGVySW1wbFtLXSk6IFVybEJ1aWxkZXIge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVXJsQnVpbGRlckltcGwodGhpcyk7XG4gICAgKG5leHQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVySW1wbChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdpdGggYHBhdGhTZWdtZW50c2AgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aG5hbWUuXG4gICAqIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZyBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZlxuICAgKiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQgYmVmb3JlIGpvaW5pbmcgd2l0aCBgL2AuXG4gICAqL1xuICB3aXRoUGF0aEFwcGVuZCguLi5wYXRoU2VnbWVudHM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFVybEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLndpdGhQYXRoUmVwbGFjZSh0aGlzLnBhdGhuYW1lLCAuLi5wYXRoU2VnbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2hvc2UgcGF0aG5hbWUgaXMgYHBhdGhTZWdtZW50c2Agam9pbmVkIHdpdGggYC9gLFxuICAgKiByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHBhdGguIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZ1xuICAgKiBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQuXG4gICAqL1xuICB3aXRoUGF0aFJlcGxhY2UoLi4ucGF0aFNlZ21lbnRzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10pOiBVcmxCdWlsZGVyIHtcbiAgICBjb25zdCBwYXRobmFtZVBhcnRzOiBzdHJpbmdbXSA9IFsuLi5wYXRoU2VnbWVudHNdLmZsYXRNYXAoKHApID0+IChBcnJheS5pc0FycmF5KHApID8gcCA6IFtwXSkpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aG5hbWVQYXJ0c1xuICAgICAgLm1hcCgocCkgPT4gcC5yZXBsYWNlKFVSTF9QQVRIX1NFR01FTlRfVFJJTSwgXCJcIikpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIi9cIik7XG4gICAgcmV0dXJuIHRoaXMud2l0aChcInBhdGhuYW1lXCIsIFwiL1wiICsgcGF0aG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciB0aGlzIFVSTCdzIHBhdGhuYW1lIGlzIGBwYXRoYCBvciBsaXZlcyBiZW5lYXRoIGl0LFxuICAgKiBtYXRjaGluZyBvbiBzZWdtZW50IGJvdW5kYXJpZXMgc28gYC9hcGlgIG1hdGNoZXMgYC9hcGlgIGFuZFxuICAgKiBgL2FwaS9jb29sYCBidXQgbm90IGAvYXBpY29vbGAuIEEgbWlzc2luZyBsZWFkaW5nIHNsYXNoIG9uIGBwYXRoYFxuICAgKiBpcyB0b2xlcmF0ZWQ7IHF1ZXJ5IGFuZCBoYXNoIGFyZSBpZ25vcmVkICh0aGV5IGFyZW4ndCBwYXJ0IG9mXG4gICAqIGBwYXRobmFtZWApLiBNYXRjaGluZyBpcyBleGFjdCBvdGhlcndpc2UgLSB0cmFpbGluZyBzbGFzaGVzIGFyZVxuICAgKiBub3Qgbm9ybWFsaXplZCBhbmQgYC9gIG1hdGNoZXMgb25seSB0aGUgcm9vdC5cbiAgICovXG4gIHBhdGhNYXRjaGVzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZTtcbiAgICBpZiAocGF0aG5hbWUgPT0gcGF0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIvXCIgKyBwYXRoO1xuICAgIGlmIChwYXRobmFtZSA9PSBwYXRoKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gcGF0aG5hbWUuc3RhcnRzV2l0aChwYXRoICsgXCIvXCIpO1xuICB9XG59XG5cbi8qKiBQdWJsaWMgdHlwZSBmb3IgdGhlIHtAbGluayB1cmxCdWlsZGVyfSByZXR1cm4gdmFsdWUuICovXG5leHBvcnQgdHlwZSBVcmxCdWlsZGVyID0gVXJsQnVpbGRlckltcGw7XG5cbi8qKiBXaXRoIG5vIGFyZ3VtZW50LCByZXNvbHZlcyB0byB0aGUgYmFzZSBvcmlnaW4gKG5ldmVyIGBudWxsYCkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcigpOiBVcmxCdWlsZGVyO1xuXG4vKipcbiAqIENvZXJjZSBhIHtAbGluayBVcmxMaWtlfSBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBVcmxCdWlsZGVyfSwgb3IgYG51bGxgXG4gKiB3aGVuIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYSBVUkwuIE5ldmVyIHRocm93cy5cbiAqXG4gKiAtIEEgYFVSTGAgaW5zdGFuY2Ugb3IgYHsgdXJsIH1gIHdyYXBwZXIgaXMgYWRvcHRlZCBhcy1pcy5cbiAqIC0gQSBiYXJlIGhvc3RuYW1lIChgXCJleGFtcGxlLmNvbVwiYCkgaXMgdXBncmFkZWQgdG8gYGh0dHBzOi8vYDsgYW5cbiAqICAgZXhwbGljaXQgc2NoZW1lIGlzIHByZXNlcnZlZC5cbiAqIC0gQSBwYXRoIC8gcXVlcnkgLyBoYXNoIGZyYWdtZW50IChgXCIvYXBpXCJgLCBgXCI/cT0xXCJgLCBgXCIjeFwiYCkgaXNcbiAqICAgcmVzb2x2ZWQgYWdhaW5zdCB7QGxpbmsgZGVmYXVsdFVybH0gKHRoZSBicm93c2VyIG9yaWdpbiwgZWxzZVxuICogICBgaHR0cDovL2xvY2FsaG9zdGApLlxuICogLSBBbiBlbXB0eSAvIGJsYW5rIHN0cmluZyBvciBvbWl0dGVkIGlucHV0IHJlc29sdmVzIHRvIHRoZSBiYXNlXG4gKiAgIG9yaWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogdXJsQnVpbGRlcihcImV4YW1wbGUuY29tXCIpOyAgICAgICAgICAvLyBodHRwczovL2V4YW1wbGUuY29tL1xuICogdXJsQnVpbGRlcihcImh0dHA6Ly94L3BhdGhcIik7ICAgICAgICAvLyBodHRwOi8veC9wYXRoXG4gKiB1cmxCdWlsZGVyKFwiL2FwaS92MlwiKTsgICAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3QvYXBpL3YyXG4gKiB1cmxCdWlsZGVyKHsgdXJsOiBcImh0dHA6Ly95XCIgfSk7ICAgIC8vIGh0dHA6Ly95L1xuICogdXJsQnVpbGRlcigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdC9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiBuZXcgVXJsQnVpbGRlckltcGwoaW5wdXQpO1xuICB9XG4gIGlmIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgXCJ1cmxcIiBpbiBpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQudXJsO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcbiAgfVxuICBpZiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcIi9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIj9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFVybCA9IGRlZmF1bHRVcmwoKS50b1N0cmluZygpLnNsaWNlKDAsIC0xKSArIGlucHV0O1xuICAgICAgcmV0dXJuIHVybEJ1aWxkZXIoam9pbmVkVXJsKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH0ke2lucHV0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goVVJMX1NDSEVNRV9QUkVGSVgpO1xuICAgICAgY29uc3Qgc2NoZW1lUHJlZml4ID0gbWF0Y2g/LlsxXTtcbiAgICAgIGlmIChzY2hlbWVQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKHNjaGVtZVByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpbnB1dCA9IGAke3NjaGVtZVByZWZpeH0ke3Jlc3QgfHwgZGVmYXVsdFVybCgpLmhvc3RuYW1lfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH06Ly8ke2lucHV0fWA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1cmxCdWlsZGVyKGRlZmF1bHRVcmwoKSk7XG4gIH1cbiAgY29uc3QgdXJsID0gcGFyc2VVcmwoaW5wdXQpO1xuICByZXR1cm4gdXJsID8gdXJsQnVpbGRlcih1cmwpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciB7QGxpbmsgVXJsQnVpbGRlci5wYXRoTWF0Y2hlc306IGNvZXJjZVxuICogYGlucHV0YCB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9IGFuZCB0ZXN0IGl0cyBwYXRobmFtZSBhZ2FpbnN0IGBwYXRoYC5cbiAqIFJldHVybnMgYGZhbHNlYCBmb3IgaW5wdXQgdGhhdCBjYW4ndCBiZSBwYXJzZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGF0aE1hdGNoKFwiL2FwaS9jb29sP3E9MVwiLCBcIi9hcGlcIik7ICAgICAgLy8gdHJ1ZVxuICogcGF0aE1hdGNoKFwiL2FwaWNvb2xcIiwgXCIvYXBpXCIpOyAgICAgICAgICAgLy8gZmFsc2VcbiAqIHBhdGhNYXRjaChcImh0dHBzOi8vaG9zdC9hcGlcIiwgXCIvYXBpXCIpOyAgIC8vIHRydWVcbiAqIHBhdGhNYXRjaChyZXF1ZXN0LCBcIi9hcGkvdjJcIik7ICAgICAgICAgICAvLyBmZXRjaCBSZXF1ZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoTWF0Y2goaW5wdXQ6IFVybExpa2UsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxiID0gdXJsQnVpbGRlcihpbnB1dCk7XG4gIGlmICghdXJsYikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdXJsYi5wYXRoTWF0Y2hlcyhwYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlIG9yaWdpbiBmb3IgcmVzb2x2aW5nIHBhdGgtb25seSBpbnB1dHMuIEluIGEgYnJvd3NlciB0aGlzIGlzIHRoZVxuICogY3VycmVudCBwYWdlJ3Mgb3JpZ2luIChgd2luZG93LmxvY2F0aW9uLm9yaWdpbmApLCBzbyBgdXJsQnVpbGRlcihcIi9hcGlcIilgXG4gKiByZWZsZWN0cyB3aGVyZSB0aGUgYXBwIGlzIGFjdHVhbGx5IHNlcnZlZCBmcm9tOyBvbiB0aGUgc2VydmVyIC8gaW5cbiAqIHRlc3RzIChubyBgd2luZG93YCwgb3IgYW4gb3BhcXVlIGBcIm51bGxcImAgb3JpZ2luKSBpdCBmYWxscyBiYWNrIHRvXG4gKiBgaHR0cDovL2xvY2FsaG9zdGAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRVcmwoKTogVVJMIHtcbiAgLy8gUmVhY2ggYHdpbmRvd2AgdmlhIGBnbG9iYWxUaGlzYCBzbyB0aGlzIGNvbXBpbGVzIHdpdGhvdXQgdGhlIERPTVxuICAvLyBsaWIgKGl0J3MgYHVuZGVmaW5lZGAgb24gdGhlIHNlcnZlciAvIGluIHdvcmtlcnMgd2l0aG91dCBvbmUpLlxuICBjb25zdCBvcmlnaW4gPSAoZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgbG9jYXRpb24/OiB7IG9yaWdpbj86IHN0cmluZyB9IH0gfSkud2luZG93Py5sb2NhdGlvblxuICAgID8ub3JpZ2luO1xuICBpZiAob3JpZ2luICYmIG9yaWdpbiAhPT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBvcmlnaW5VcmwgPSBwYXJzZVVybChvcmlnaW4pO1xuICAgIGlmIChvcmlnaW5VcmwpIHtcbiAgICAgIHJldHVybiBvcmlnaW5Vcmw7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgVVJMKExPQ0FMX0hPU1RfVVJMKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVcmwoaW5wdXQ6IHN0cmluZyk6IFVSTCB8IG51bGwge1xuICBpZiAoaW5wdXQgJiYgaW5wdXQuaW5jbHVkZXMoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGlucHV0KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRW1haWwgYWRkcmVzc2VzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBwYXJzZUVtYWlsc30uICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRW1haWxzT3B0aW9ucyB7XG4gIC8qKiBMb3dlci1jYXNlIGV2ZXJ5IGFkZHJlc3MgKHVzZWZ1bCBmb3IgYWxsb3ctbGlzdHMgLyBtYXRjaGluZykuIE9mZiBieSBkZWZhdWx0LiAqL1xuICBsb3dlcmNhc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogRHJvcCBsYXRlciBjYXNlLWluc2Vuc2l0aXZlIGR1cGxpY2F0ZXMsIGtlZXBpbmcgZmlyc3Qtc2VlbiBjYXNpbmcuXG4gICAqIE9uIGJ5IGRlZmF1bHQgLSBhIHJlY2lwaWVudCBvciBwYXR0ZXJuIGxpc3QgcmFyZWx5IHdhbnRzIHJlcGVhdHMuXG4gICAqL1xuICBkZWR1cGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2hhcGVzIGFuIGVtYWlsIGFkZHJlc3MgZmllbGQgYWNjZXB0cyAtIGEgc2luZ2xlIHN0cmluZyxcbiAqIGEgY29tbWEgLyBzZW1pY29sb24gLyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0LCBhbiBhcnJheSBvZiBlaXRoZXIsXG4gKiBvciBub3RoaW5nIC0gaW50byBhIGNsZWFuIGBzdHJpbmdbXWAuIEVhY2ggZW50cnkgaXMgc3BsaXQgb24gdGhlIGxpc3RcbiAqIHNlcGFyYXRvcnMsIHRyaW1tZWQsIGFuZCBkZS1lbXB0aWVkOyBibGFua3MgYW5kIG5vbi1zdHJpbmcgYXJyYXlcbiAqIG1lbWJlcnMgYXJlIGRyb3BwZWQuIEJ5IGRlZmF1bHQgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5IChmaXJzdC1zZWVuIGNhc2luZyB3aW5zKSBhbmQgY2FzaW5nIGlzIG90aGVyd2lzZVxuICogcHJlc2VydmVkOyBwYXNzIGBsb3dlcmNhc2VgIHRvIGZvbGQgZXZlcnl0aGluZyB0byBsb3dlciBjYXNlIChlLmcuIGZvclxuICogYW4gYWxsb3ctbGlzdCkuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSByZWNpcGllbnQgbGlzdHMsIENDL0JDQyBpbnB1dHMsXG4gKiBhbmQgc2VuZGVyIGFsbG93LWxpc3RzIGFjcm9zcyB0aGUgcmVwbyBhZ3JlZSBvbiBob3cgZnJlZS10ZXh0IGVtYWlsXG4gKiBpbnB1dCBpcyByZWFkLiBOZXZlciB0aHJvd3M7IGRvZXMgbm90IHZhbGlkYXRlIC0gcGFpciB3aXRoXG4gKiB7QGxpbmsgaXNFbWFpbH0gd2hlbiB5b3UgbmVlZCB0byByZWplY3QgbWFsZm9ybWVkIGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VFbWFpbHMoXCJhQHguY29tLCBiQHkuY29tOyBhQHguY29tXCIpOyAvLyBbXCJhQHguY29tXCIsIFwiYkB5LmNvbVwiXVxuICogcGFyc2VFbWFpbHMoW1wiQUB4LmNvbVwiLCBcIiBiQHkuY29tIFwiXSk7ICAgICAgLy8gW1wiQUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFwiKkBjb3JwLmNvbVwiLCB7IGxvd2VyY2FzZTogdHJ1ZSB9KTsgLy8gW1wiKkBjb3JwLmNvbVwiXVxuICogcGFyc2VFbWFpbHModW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAgICAvLyBbXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbWFpbHMoXG4gIGlucHV0OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFBhcnNlRW1haWxzT3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBjb25zdCB7IGxvd2VyY2FzZSA9IGZhbHNlLCBkZWR1cGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dCBhcyBzdHJpbmddO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbnRyeS5zcGxpdChFTUFJTF9MSVNUX1NFUEFSQVRPUikpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0b2tlbi50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxvd2VyY2FzZSA/IHRyaW1tZWQudG9Mb3dlckNhc2UoKSA6IHRyaW1tZWQ7XG4gICAgICBpZiAoZGVkdXBlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goYWRkcmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjazogbm9uLWVtcHR5IGxvY2FsIGFuZCBkb21haW5cbiAqIHBhcnRzIGFyb3VuZCBhIHNpbmdsZSBgQGAsIHdpdGggYSBkb3R0ZWQgZG9tYWluIGFuZCBubyB3aGl0ZXNwYWNlLlxuICogRGVsaWJlcmF0ZWx5IGxvb3NlIChub3QgZnVsbCBSRkMgNTMyMikgLSBlbm91Z2ggdG8gY2F0Y2ggb2J2aW91cyB0eXBvc1xuICogYW5kIGdpdmUgQ0xJIC8gZm9ybSBmZWVkYmFjaywgbm90IHRvIGdhdGUgZGVsaXZlcnkuIFRyaW1zIGZpcnN0LiBUaGlzXG4gKiBpcyBhIHB1cmVseSBzeW50YWN0aWMgdGVzdCwgc28gYSB3aWxkY2FyZCBhbGxvdy1saXN0IHBhdHRlcm4gbGlrZVxuICogYCpAZXhhbXBsZS5jb21gIHBhc3NlczsgZGlzdGluZ3Vpc2hpbmcgYSBwYXR0ZXJuIGZyb20gYSByZWFsIGFkZHJlc3NcbiAqIGlzIHRoZSBzZW5kZXIgcG9saWN5J3Mgam9iLCBub3QgdGhpcyB2YWxpZGF0b3Incy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXNFbWFpbChcImFsaWNlQGV4YW1wbGUuY29tXCIpOyAvLyB0cnVlXG4gKiBpc0VtYWlsKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIGZhbHNlIChubyBAKVxuICogaXNFbWFpbChcIm5vQGRvbWFpblwiKTsgICAgICAgICAvLyBmYWxzZSAobm8gZG90dGVkIGRvbWFpbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1haWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1BSUxfQUREUkVTUy50ZXN0KHZhbHVlLnRyaW0oKSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSVAgYWRkcmVzc2VzIGFuZCBDSURSIGJsb2Nrc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NCAoYFwiMS4yLjMuNFwiYCkgb3IgSVB2NiAoYFwiMjAwMTpkYjg6OjFcImAsXG4gKiBgXCI6OmZmZmY6MS4yLjMuNFwiYCwgYFwiOjoxXCJgKSBhZGRyZXNzIGludG8gYSB7QGxpbmsgUGFyc2VkSXB9LCBvclxuICogYG51bGxgIHdoZW4gdGhlIGlucHV0IGlzbid0IGEgdmFsaWQgbGl0ZXJhbC4gTmV2ZXIgdGhyb3dzLiBTdXJyb3VuZGluZ1xuICogd2hpdGVzcGFjZSwgYFsuLi5dYCBicmFja2V0cyBhcm91bmQgYW4gSVB2NiBsaXRlcmFsLCBhbmQgYW4gSVB2NiB6b25lXG4gKiBpZCAoYGZlODA6OjElZXRoMGApIGFyZSBhbGwgdG9sZXJhdGVkLiBUaGUgYHZhbHVlYCBpcyByZXR1cm5lZCBhcyBhXG4gKiBgYmlnaW50YCBzbyB2NCBhbmQgdjYgc2hhcmUgb25lIGNvbXBhcmlzb24gcGF0aC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VJcChcIjEwLjAuMC4xXCIpOyAgICAgICAgLy8geyB2ZXJzaW9uOiA0LCB2YWx1ZTogMTY3NzcyMTYxbiB9XG4gKiBwYXJzZUlwKFwiMjAwMTpkYjg6OjFcIik7ICAgICAvLyB7IHZlcnNpb246IDYsIHZhbHVlOiAuLi4gfVxuICogcGFyc2VJcChcIm5vdC1hbi1pcFwiKTsgICAgICAgLy8gbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJcChpbnB1dDogc3RyaW5nKTogUGFyc2VkSXAgfCBudWxsIHtcbiAgbGV0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHRleHQuZW5kc1dpdGgoXCJdXCIpKSB0ZXh0ID0gdGV4dC5zbGljZSgxLCAtMSk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIC8vIERyb3AgYW4gSVB2NiB6b25lIGlkIChgZmU4MDo6MSVldGgwYCkgLSBpdCBpc24ndCBwYXJ0IG9mIHRoZSBhZGRyZXNzLlxuICAgIGNvbnN0IHpvbmUgPSB0ZXh0LmluZGV4T2YoXCIlXCIpO1xuICAgIGlmICh6b25lID49IDApIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHpvbmUpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY2KHRleHQpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDYsIHZhbHVlIH07XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwYXJzZUlwdjQodGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDQsIHZhbHVlIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSBDSURSIGJsb2NrIChgXCIxMC4wLjAuMC84XCJgLCBgXCIyMDAxOmRiODo6LzMyXCJgKSBpbnRvIGFcbiAqIHtAbGluayBDaWRyfSB3aXRoIGhvc3QgYml0cyBjbGVhcmVkIGZyb20gYGJhc2VgLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIGlucHV0IGlzbid0IGEgdmFsaWQgYmxvY2sgKGJhZCBhZGRyZXNzLCBtaXNzaW5nIC8gb3V0LW9mLXJhbmdlXG4gKiBwcmVmaXgpLiBOZXZlciB0aHJvd3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzhcIik/LmJhc2U7ICAgLy8gMTY3NzcyMTYwbiAoMTAuMC4wLjApXG4gKiBwYXJzZUNpZHIoXCIxMC4xLjIuMy84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKGhvc3QgYml0cyBkcm9wcGVkKVxuICogcGFyc2VDaWRyKFwiMTAuMC4wLjAvNDBcIik7ICAgICAgICAvLyBudWxsIChwcmVmaXggPiAzMiBmb3IgdjQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNpZHIoaW5wdXQ6IHN0cmluZyk6IENpZHIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnRyaW0oKTtcbiAgY29uc3Qgc2xhc2ggPSB0ZXh0Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoIDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeFRleHQgPSB0ZXh0LnNsaWNlKHNsYXNoICsgMSk7XG4gIGlmICghSVBWNF9PQ1RFVC50ZXN0KHByZWZpeFRleHQpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaXAgPSBwYXJzZUlwKHRleHQuc2xpY2UoMCwgc2xhc2gpKTtcbiAgaWYgKCFpcCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeCA9IE51bWJlcihwcmVmaXhUZXh0KTtcbiAgY29uc3QgYml0cyA9IElQX0JJVFNbaXAudmVyc2lvbl07XG4gIGlmIChwcmVmaXggPiBiaXRzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYmFzZSA9IGlwLnZhbHVlICYgbmV0d29ya01hc2soYml0cywgcHJlZml4KTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBpcC52ZXJzaW9uLFxuICAgIGJhc2UsXG4gICAgcHJlZml4LFxuICAgIGNpZHI6IGAke3RleHQuc2xpY2UoMCwgc2xhc2gpfS8ke3ByZWZpeH1gLFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3Qgd2hldGhlciBgaXBgIGZhbGxzIGluc2lkZSBgY2lkcmAuIEJvdGggYXJndW1lbnRzIGFjY2VwdCBlaXRoZXJcbiAqIGEgc3RyaW5nIChwYXJzZWQgb24gdGhlIGZseSB2aWEge0BsaW5rIHBhcnNlSXB9IC8ge0BsaW5rIHBhcnNlQ2lkcn0pXG4gKiBvciBhbiBhbHJlYWR5LXBhcnNlZCB2YWx1ZSAtIHBhc3MgcGFyc2VkIHZhbHVlcyBpbiBob3QgbG9vcHMgdG8gc2tpcFxuICogcmUtcGFyc2luZy4gUmV0dXJucyBgZmFsc2VgIGZvciB1bnBhcnNlYWJsZSBpbnB1dCBvciBhIHZlcnNpb25cbiAqIG1pc21hdGNoIChhbiBJUHY0IGFkZHJlc3MgaXMgbmV2ZXIgaW5zaWRlIGFuIElQdjYgYmxvY2spLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpcEluQ2lkcihcIjEwLjEuMi4zXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyB0cnVlXG4gKiBpcEluQ2lkcihcIjExLjAuMC4xXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXBJbkNpZHIoaXA6IHN0cmluZyB8IFBhcnNlZElwLCBjaWRyOiBzdHJpbmcgfCBDaWRyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgY29uc3QgcGFyc2VkQ2lkciA9IHR5cGVvZiBjaWRyID09PSBcInN0cmluZ1wiID8gcGFyc2VDaWRyKGNpZHIpIDogY2lkcjtcbiAgaWYgKCFwYXJzZWRJcCB8fCAhcGFyc2VkQ2lkciB8fCBwYXJzZWRJcC52ZXJzaW9uICE9PSBwYXJzZWRDaWRyLnZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbcGFyc2VkQ2lkci52ZXJzaW9uXSwgcGFyc2VkQ2lkci5wcmVmaXgpO1xuICByZXR1cm4gKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IHBhcnNlZENpZHIuYmFzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZpcnN0IENJRFIgaW4gYGNpZHJzYCB0aGF0IGNvbnRhaW5zIGBpcGAsIG9yIGBudWxsYCB3aGVuXG4gKiBub25lIG1hdGNoLiBgY2lkcnNgIGhvbGRzIHByZS1wYXJzZWQge0BsaW5rIENpZHJ9IHZhbHVlcyAob3IgYW55XG4gKiBvYmplY3QgZXh0ZW5kaW5nIGl0KSwgc28gY2FsbGVycyBjYW4gY2Fycnkgc2lkZSBtZXRhZGF0YSBvbiBlYWNoXG4gKiBlbnRyeSAoZS5nLiBhIHJlZ2lvbiB0YWcpIGFuZCByZWFkIGl0IHN0cmFpZ2h0IG9mZiB0aGUgcmV0dXJuZWRcbiAqIG1hdGNoLiBMaW5lYXIgc2NhbjsgcGFyc2UgdGhlIGFkZHJlc3Mgb25jZSBieSBwYXNzaW5nIGFcbiAqIHtAbGluayBQYXJzZWRJcH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IFtcIjEwLjAuMC4wLzhcIiwgXCIxOTIuMTY4LjAuMC8xNlwiXVxuICogICAubWFwKHBhcnNlQ2lkcilcbiAqICAgLmZpbHRlcigoYyk6IGMgaXMgQ2lkciA9PiBjICE9PSBudWxsKTtcbiAqIGZpbmRDb250YWluaW5nQ2lkcihcIjEwLjEuMi4zXCIsIHJhbmdlcyk/LmNpZHI7IC8vIFwiMTAuMC4wLjAvOFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29udGFpbmluZ0NpZHI8VCBleHRlbmRzIENpZHI+KFxuICBpcDogc3RyaW5nIHwgUGFyc2VkSXAsXG4gIGNpZHJzOiBJdGVyYWJsZTxUPixcbik6IFQgfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkSXAgPSB0eXBlb2YgaXAgPT09IFwic3RyaW5nXCIgPyBwYXJzZUlwKGlwKSA6IGlwO1xuICBpZiAoIXBhcnNlZElwKSByZXR1cm4gbnVsbDtcbiAgZm9yIChjb25zdCBjaWRyIG9mIGNpZHJzKSB7XG4gICAgaWYgKGNpZHIudmVyc2lvbiAhPT0gcGFyc2VkSXAudmVyc2lvbikgY29udGludWU7XG4gICAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbY2lkci52ZXJzaW9uXSwgY2lkci5wcmVmaXgpO1xuICAgIGlmICgocGFyc2VkSXAudmFsdWUgJiBtYXNrKSA9PT0gY2lkci5iYXNlKSByZXR1cm4gY2lkcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBpbnB1dGAncyBob3N0IGlzIGEgbG9vcGJhY2sgYWRkcmVzcyAtIGBsb2NhbGhvc3RgLCBhbiBJUHY0XG4gKiBgMTI3LjAuMC4wLzhgIGFkZHJlc3MsIG9yIElQdjYgYDo6MWAgLSBpLmUuIGEgc2VydmljZSBydW5uaW5nIG9uIHRoaXNcbiAqIG1hY2hpbmUgKGUuZy4gYSBsb2NhbCByZWdpc3RyeSkuIEFjY2VwdHMgYW55dGhpbmcge0BsaW5rIHVybEJ1aWxkZXJ9XG4gKiBjb2VyY2VzIChhIFVSTCBzdHJpbmcsIGBVUkxgLCBvciBgeyB1cmwgfWApOyByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGVcbiAqIGlucHV0IGhhcyBubyByZXNvbHZhYmxlIGhvc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cDovL2xvY2FsaG9zdDo0ODczXCIpOyAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly8xMjcuMC4wLjFcIik7ICAgICAgIC8vIHRydWVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmdcIik7IC8vIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb3BiYWNrSG9zdChpbnB1dDogVXJsTGlrZSk6IGJvb2xlYW4ge1xuICBjb25zdCBob3N0ID0gdXJsQnVpbGRlcihpbnB1dCk/Lmhvc3RuYW1lO1xuICBpZiAoIWhvc3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKGhvc3QgPT09IFwibG9jYWxob3N0XCIpIHJldHVybiB0cnVlO1xuICAvLyBgVVJMYCBicmFja2V0cyBhbiBJUHY2IGhvc3QgKGBbOjoxXWApOyBzdHJpcCB0aGVtIGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBpcCA9IGhvc3QucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gaXBJbkNpZHIoaXAsIFwiMTI3LjAuMC4wLzhcIikgfHwgaXBJbkNpZHIoaXAsIFwiOjoxLzEyOFwiKTtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIG1hc2sgZm9yIGBwcmVmaXhgIGxlYWRpbmcgYml0cyBvZiBhIGBiaXRzYC13aWRlIGFkZHJlc3MgYXMgYVxuICogYGJpZ2ludGA6IHRoZSB0b3AgYHByZWZpeGAgYml0cyBzZXQsIHRoZSBsb3cgaG9zdCBiaXRzIGNsZWFyZWQuXG4gKiBgcHJlZml4ID09PSAwYCB5aWVsZHMgYDBuYCAobWF0Y2hlcyBldmVyeXRoaW5nKTsgYHByZWZpeCA9PT0gYml0c2BcbiAqIHlpZWxkcyB0aGUgYWxsLW9uZXMgbWFzayAobWF0Y2hlcyBhIHNpbmdsZSBhZGRyZXNzKS5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya01hc2soYml0czogbnVtYmVyLCBwcmVmaXg6IG51bWJlcik6IGJpZ2ludCB7XG4gIGNvbnN0IGhvc3RCaXRzID0gQmlnSW50KGJpdHMgLSBwcmVmaXgpO1xuICBjb25zdCBmdWxsID0gKDFuIDw8IEJpZ0ludChiaXRzKSkgLSAxbjtcbiAgcmV0dXJuIGZ1bGwgXiAoKDFuIDw8IGhvc3RCaXRzKSAtIDFuKTtcbn1cblxuLyoqIFBhcnNlIGEgZG90dGVkLXF1YWQgSVB2NCBsaXRlcmFsIGludG8gYSAzMi1iaXQgdmFsdWUsIGVsc2UgYG51bGxgLiAqL1xuZnVuY3Rpb24gcGFyc2VJcHY0KGlucHV0OiBzdHJpbmcpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKCFJUFY0X09DVEVULnRlc3QocGFydCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9jdGV0ID0gTnVtYmVyKHBhcnQpO1xuICAgIGlmIChvY3RldCA+IDI1NSkgcmV0dXJuIG51bGw7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOG4pIHwgQmlnSW50KG9jdGV0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NiBsaXRlcmFsIGludG8gYSAxMjgtYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gSGFuZGxlcyBgOjpgXG4gKiB6ZXJvLWNvbXByZXNzaW9uIChhdCBtb3N0IG9uY2UpIGFuZCBhIHRyYWlsaW5nIGVtYmVkZGVkIElQdjQgZ3JvdXBcbiAqIChgOjpmZmZmOjEuMi4zLjRgKS4gVGhlIHpvbmUgaWQsIGlmIGFueSwgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaXBwZWRcbiAqIGJ5IHtAbGluayBwYXJzZUlwfSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NihpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IGhhbHZlcyA9IGlucHV0LnNwbGl0KFwiOjpcIik7XG4gIGlmIChoYWx2ZXMubGVuZ3RoID4gMikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgaGVhZCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMF0hKTtcbiAgaWYgKGhlYWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGlmIChoYWx2ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgdGFpbCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMV0hKTtcbiAgICBpZiAodGFpbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gXCI6OlwiIG11c3Qgc3RhbmQgaW4gZm9yIGF0IGxlYXN0IG9uZSBhbGwtemVybyBoZXh0ZXQuXG4gICAgY29uc3QgbWlzc2luZyA9IDggLSBoZWFkLmxlbmd0aCAtIHRhaWwubGVuZ3RoO1xuICAgIGlmIChtaXNzaW5nIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKFsuLi5oZWFkLCAuLi5BcnJheShtaXNzaW5nKS5maWxsKDApLCAuLi50YWlsXSk7XG4gIH1cblxuICBpZiAoaGVhZC5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGV4dGV0c1RvVmFsdWUoaGVhZCk7XG59XG5cbi8qKlxuICogUGFyc2Ugb25lIGNvbG9uLXNlcGFyYXRlZCBydW4gb2YgSVB2NiBoZXh0ZXRzLCBleHBhbmRpbmcgYSB0cmFpbGluZ1xuICogZW1iZWRkZWQgSVB2NCBncm91cCBpbnRvIGl0cyB0d28gaGV4dGV0cy4gQW4gZW1wdHkgc3RyaW5nIHlpZWxkcyBhblxuICogZW1wdHkgbGlzdCAodGhlIHNpZGUgb2YgYSBsZWFkaW5nIC8gdHJhaWxpbmcgYDo6YCkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGV4dGV0cyhwYXJ0OiBzdHJpbmcpOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAocGFydCA9PT0gXCJcIikgcmV0dXJuIFtdO1xuICBjb25zdCB0b2tlbnMgPSBwYXJ0LnNwbGl0KFwiOlwiKTtcbiAgY29uc3QgaGV4dGV0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXSE7XG4gICAgaWYgKHRva2VuLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLy8gQSBkb3R0ZWQtcXVhZCBpcyBvbmx5IGxlZ2FsIGFzIHRoZSBmaW5hbCBncm91cC5cbiAgICAgIGlmIChpICE9PSB0b2tlbnMubGVuZ3RoIC0gMSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCB2NCA9IHBhcnNlSXB2NCh0b2tlbik7XG4gICAgICBpZiAodjQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKE51bWJlcigodjQgPj4gMTZuKSAmIDB4ZmZmZm4pLCBOdW1iZXIodjQgJiAweGZmZmZuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghSVBWNl9IRVhURVQudGVzdCh0b2tlbikpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKHBhcnNlSW50KHRva2VuLCAxNikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGV4dGV0cztcbn1cblxuLyoqIEZvbGQgZXhhY3RseSA4IGhleHRldHMgaW50byBhIHNpbmdsZSAxMjgtYml0IGBiaWdpbnRgLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIGhleHRldHNUb1ZhbHVlKGhleHRldHM6IG51bWJlcltdKTogYmlnaW50IHwgbnVsbCB7XG4gIGlmIChoZXh0ZXRzLmxlbmd0aCAhPT0gOCkgcmV0dXJuIG51bGw7XG4gIGxldCB2YWx1ZSA9IDBuO1xuICBmb3IgKGNvbnN0IGhleHRldCBvZiBoZXh0ZXRzKSB2YWx1ZSA9ICh2YWx1ZSA8PCAxNm4pIHwgQmlnSW50KGhleHRldCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7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SyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBuZXR3b3JraW5nIGhlbHBlcnMgYnVpbHQgYXJvdW5kIHtAbGluayB1cmxCdWlsZGVyfTogYVxuICogdG9sZXJhbnQgYFVSTGAgY29lcmNpb24gKyBjaGFpbmFibGUgYnVpbGRlciB0aGF0IGdyYWNlZnVsbHkgaGFuZGxlc1xuICogcGFydGlhbCBpbnB1dHMgKGJhcmUgaG9zdHMsIHBhdGgtb25seSBzdHJpbmdzLCBgeyB1cmwgfWAgd3JhcHBlcnMpLFxuICogYSBzbWFsbCBJUHY0IC8gSVB2NiBhZGRyZXNzICsgQ0lEUiB0b29sa2l0IChwYXJzaW5nIGFuZCBtZW1iZXJzaGlwXG4gKiBsb29rdXBzKSwgYW5kIGVtYWlsLWFkZHJlc3MgcGFyc2luZyAoe0BsaW5rIHBhcnNlRW1haWxzfSAvXG4gKiB7QGxpbmsgaXNFbWFpbH0pIHRoYXQgbm9ybWFsaXplcyB0aGUgQ1NWIC8gc2luZ2xlLXN0cmluZyAvIGFycmF5XG4gKiBpbnB1dHMgZW1haWwgcmVjaXBpZW50IGFuZCBhbGxvdy1saXN0IGZpZWxkcyBhY2NlcHQgaW50byBhIGNsZWFuXG4gKiBgc3RyaW5nW11gLiBObyBub2RlLW9ubHkgaW1wb3J0cywgc28gdGhpcyBtb2R1bGUgaXMgdGhlIGNhbm9uaWNhbFxuICogaG9tZSBmb3IgYW55dGhpbmcgVVJMLSwgSVAtLCBvciBlbWFpbC1zaGFwZWQgdGhhdCBhbHNvIGhhcyB0byBydW4gaW5cbiAqIGEgVml0ZSAvIFdlYnBhY2sgLyBlc2J1aWxkIGNsaWVudCBidW5kbGUuIE5vZGUtb25seSBuZXR3b3JrIGhlbHBlcnNcbiAqIChlLmcuIEROUyByZXNvbHV0aW9uKSBiZWxvbmcgaW4gYSBub2RlLXRhZ2dlZCBwYWNrYWdlLCBub3QgaGVyZS5cbiAqIFJldXNlIHRoaXMgbW9kdWxlIGZvciBVUkwsIElQL0NJRFIsIGFuZCBlbWFpbCBwYXJzaW5nIGluc3RlYWQgb2YgaW50cm9kdWNpbmdcbiAqIHBhY2thZ2UtbG9jYWwgbm9ybWFsaXplcnMgd2l0aCBzdWJ0bHkgZGlmZmVyZW50IHJ1bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5vbkZ1bmN0aW9uS2V5cyB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG5jb25zdCBMT0NBTF9IT1NUX1VSTCA9IG5ldyBVUkwoXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuY29uc3QgVVJMX1NDSEVNRV9ERUZBVUxUID0gXCJodHRwc1wiO1xuY29uc3QgVVJMX1NDSEVNRV9QUkVGSVggPSAvXihbQS1aYS16XVtBLVphLXowLTkrLi1dKjpcXC9cXC8pLztcbmNvbnN0IFVSTF9QQVRIX1NFR01FTlRfVFJJTSA9IC9eXFwvK3xcXC8rJC9nO1xuY29uc3QgVVJMX1NDSEVNRV9TRVBBUkFUT1IgPSBcIjovL1wiO1xuXG4vKiogSGlnaGVzdCB2YWxpZCBUQ1AgcG9ydCBudW1iZXIuICovXG5leHBvcnQgY29uc3QgTUFYX1RDUF9QT1JUID0gNjVfNTM1O1xuXG4vKiogVG90YWwgYml0IHdpZHRoIG9mIGFuIGFkZHJlc3Mgb2YgZWFjaCB7QGxpbmsgSXBWZXJzaW9ufS4gKi9cbmNvbnN0IElQX0JJVFM6IFJlYWRvbmx5PFJlY29yZDxJcFZlcnNpb24sIG51bWJlcj4+ID0geyA0OiAzMiwgNjogMTI4IH07XG5jb25zdCBJUFY0X09DVEVUID0gL15cXGR7MSwzfSQvO1xuY29uc3QgSVBWNl9IRVhURVQgPSAvXlswLTlhLWZBLUZdezEsNH0kLztcblxuLyoqIERlbGltaXRlcnMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gYSBmcmVlLXRleHQgLyBDU1YgZW1haWwgbGlzdC4gKi9cbmNvbnN0IEVNQUlMX0xJU1RfU0VQQVJBVE9SID0gL1tcXHMsO10rLztcbi8qKiBQcmFnbWF0aWMgYGxvY2FsQGRvbWFpbi50bGRgIHNoYXBlIGNoZWNrIChub3QgZnVsbCBSRkMgNTMyMikuICovXG5jb25zdCBFTUFJTF9BRERSRVNTID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfSAoYW5kIHtAbGluayBwYXRoTWF0Y2h9KSBrbm93IGhvdyB0byBjb2VyY2VcbiAqIGludG8gYSBVUkw6XG4gKlxuICogLSBBIHN0cmluZzogYSBob3N0LCBhIGZ1bGwgVVJMLCBvciBhIHBhdGggLyBxdWVyeSAvIGhhc2ggZnJhZ21lbnQuXG4gKiAtIEEgV0hBVFdHIGBVUkxgIGluc3RhbmNlLlxuICogLSBBbnkgb2JqZWN0IHdpdGggYSBgdXJsYCBmaWVsZCAoZS5nLiBhIGZldGNoIGBSZXF1ZXN0YCwgYSBEYXRhYnJpY2tzXG4gKiAgIGBXb3Jrc3BhY2VDbGllbnRgIGNvbmZpZykuXG4gKi9cbmV4cG9ydCB0eXBlIFVybExpa2UgPSBzdHJpbmcgfCBVUkwgfCB7IHVybDogc3RyaW5nIH07XG5cbi8qKiBJUCBwcm90b2NvbCBmYW1pbHk6IGA0YCBmb3IgSVB2NCwgYDZgIGZvciBJUHY2LiAqL1xuZXhwb3J0IHR5cGUgSXBWZXJzaW9uID0gNCB8IDY7XG5cbi8qKlxuICogQSBwYXJzZWQgSVAgYWRkcmVzcy4gYHZhbHVlYCBpcyB0aGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4gKiAoYSAzMi1iaXQgcmFuZ2UgZm9yIHY0LCAxMjgtYml0IGZvciB2NikgaGVsZCBpbiBhIGBiaWdpbnRgIHNvIGJvdGhcbiAqIGZhbWlsaWVzIHNoYXJlIG9uZSBjb21wYXJpc29uIC8gbWFza2luZyBwYXRoLiBQcm9kdWNlIG9uZSB3aXRoXG4gKiB7QGxpbmsgcGFyc2VJcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkSXAge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBUaGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIChgYmlnaW50YCBmb3IgdW5pZm9ybSB2NC92NiBtYXRoKS4gKi9cbiAgdmFsdWU6IGJpZ2ludDtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBDSURSIGJsb2NrIChgMTAuMC4wLjAvOGAsIGAyMDAxOmRiODo6LzMyYCkuIGBiYXNlYCBpcyB0aGVcbiAqIG5ldHdvcmsgYWRkcmVzcyB3aXRoIGFsbCBob3N0IGJpdHMgY2xlYXJlZCwgc28gbWVtYmVyc2hpcCBpcyBhXG4gKiBzaW5nbGUgbWFza2VkIGNvbXBhcmUgKHNlZSB7QGxpbmsgaXBJbkNpZHJ9KS4gUHJvZHVjZSBvbmUgd2l0aFxuICoge0BsaW5rIHBhcnNlQ2lkcn0uIENhcnJpZXMgdGhlIG5vcm1hbGl6ZWQgYGNpZHJgIHN0cmluZyBmb3IgbG9nZ2luZ1xuICogYW5kIHRvIGtleSBiYWNrIHRvIGNhbGxlci1zaWRlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENpZHIge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBOZXR3b3JrIGFkZHJlc3MgKGhvc3QgYml0cyB6ZXJvZWQpIGFzIGFuIHVuc2lnbmVkIGBiaWdpbnRgLiAqL1xuICBiYXNlOiBiaWdpbnQ7XG4gIC8qKiBQcmVmaXggbGVuZ3RoIGluIGJpdHMgKHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvYCkuICovXG4gIHByZWZpeDogbnVtYmVyO1xuICAvKiogTm9ybWFsaXplZCBgPGFkZHJlc3M+LzxwcmVmaXg+YCBzdHJpbmcuICovXG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIFNldHRhYmxlLCBub24tbWV0aG9kIGBVUkxgIHByb3BlcnRpZXMgLSB0aGUga2V5cyB7QGxpbmsgVXJsQnVpbGRlci53aXRofSBhY2NlcHRzLiAqL1xudHlwZSBVcmxQcm9wZXJ0eUtleSA9IE5vbkZ1bmN0aW9uS2V5czxVcmxCdWlsZGVySW1wbD47XG5cbi8qKlxuICogQSBgVVJMYCBzdWJjbGFzcyB3aXRoIGNoYWluYWJsZSwgY29weS1vbi13cml0ZSBoZWxwZXJzLiBFdmVyeSBtdXRhdGluZ1xuICogbWV0aG9kIHJldHVybnMgYSBmcmVzaCBidWlsZGVyIHJhdGhlciB0aGFuIGVkaXRpbmcgaW4gcGxhY2UsIHNvIGEgYmFzZVxuICogYnVpbGRlciBjYW4gYmUgc2FmZWx5IHJldXNlZC4gQ29uc3RydWN0IG9uZSB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9LlxuICovXG5jbGFzcyBVcmxCdWlsZGVySW1wbCBleHRlbmRzIFVSTCB7XG4gIGNvbnN0cnVjdG9yKHVybDogVVJMKSB7XG4gICAgc3VwZXIodXJsKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2NoZW1lIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbG9uIChgaHR0cHNgLCBub3QgYGh0dHBzOmApLiAqL1xuICBnZXQgc2NoZW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgc2V0IHNjaGVtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm90b2NvbCA9IHZhbHVlICsgXCI6XCI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aXRoIGEgc2luZ2xlIGBVUkxgIHByb3BlcnR5IChgcGF0aG5hbWVgLCBgc2VhcmNoYCxcbiAgICogYGhvc3RuYW1lYCwgYHNjaGVtZWAsIC4uLikgc2V0IHRvIGB2YWx1ZWAsIGxlYXZpbmcgdGhpcyBidWlsZGVyXG4gICAqIHVudG91Y2hlZC5cbiAgICovXG4gIHdpdGg8SyBleHRlbmRzIFVybFByb3BlcnR5S2V5PihrZXk6IEssIHZhbHVlOiBVcmxCdWlsZGVySW1wbFtLXSk6IFVybEJ1aWxkZXIge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVXJsQnVpbGRlckltcGwodGhpcyk7XG4gICAgKG5leHQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVySW1wbChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdpdGggYHBhdGhTZWdtZW50c2AgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aG5hbWUuXG4gICAqIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZyBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZlxuICAgKiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQgYmVmb3JlIGpvaW5pbmcgd2l0aCBgL2AuXG4gICAqL1xuICB3aXRoUGF0aEFwcGVuZCguLi5wYXRoU2VnbWVudHM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFVybEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLndpdGhQYXRoUmVwbGFjZSh0aGlzLnBhdGhuYW1lLCAuLi5wYXRoU2VnbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2hvc2UgcGF0aG5hbWUgaXMgYHBhdGhTZWdtZW50c2Agam9pbmVkIHdpdGggYC9gLFxuICAgKiByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHBhdGguIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZ1xuICAgKiBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQuXG4gICAqL1xuICB3aXRoUGF0aFJlcGxhY2UoLi4ucGF0aFNlZ21lbnRzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10pOiBVcmxCdWlsZGVyIHtcbiAgICBjb25zdCBwYXRobmFtZVBhcnRzOiBzdHJpbmdbXSA9IFsuLi5wYXRoU2VnbWVudHNdLmZsYXRNYXAoKHApID0+IChBcnJheS5pc0FycmF5KHApID8gcCA6IFtwXSkpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aG5hbWVQYXJ0c1xuICAgICAgLm1hcCgocCkgPT4gcC5yZXBsYWNlKFVSTF9QQVRIX1NFR01FTlRfVFJJTSwgXCJcIikpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIi9cIik7XG4gICAgcmV0dXJuIHRoaXMud2l0aChcInBhdGhuYW1lXCIsIFwiL1wiICsgcGF0aG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciB0aGlzIFVSTCdzIHBhdGhuYW1lIGlzIGBwYXRoYCBvciBsaXZlcyBiZW5lYXRoIGl0LFxuICAgKiBtYXRjaGluZyBvbiBzZWdtZW50IGJvdW5kYXJpZXMgc28gYC9hcGlgIG1hdGNoZXMgYC9hcGlgIGFuZFxuICAgKiBgL2FwaS9jb29sYCBidXQgbm90IGAvYXBpY29vbGAuIEEgbWlzc2luZyBsZWFkaW5nIHNsYXNoIG9uIGBwYXRoYFxuICAgKiBpcyB0b2xlcmF0ZWQ7IHF1ZXJ5IGFuZCBoYXNoIGFyZSBpZ25vcmVkICh0aGV5IGFyZW4ndCBwYXJ0IG9mXG4gICAqIGBwYXRobmFtZWApLiBNYXRjaGluZyBpcyBleGFjdCBvdGhlcndpc2UgLSB0cmFpbGluZyBzbGFzaGVzIGFyZVxuICAgKiBub3Qgbm9ybWFsaXplZCBhbmQgYC9gIG1hdGNoZXMgb25seSB0aGUgcm9vdC5cbiAgICovXG4gIHBhdGhNYXRjaGVzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZTtcbiAgICBpZiAocGF0aG5hbWUgPT0gcGF0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIvXCIgKyBwYXRoO1xuICAgIGlmIChwYXRobmFtZSA9PSBwYXRoKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gcGF0aG5hbWUuc3RhcnRzV2l0aChwYXRoICsgXCIvXCIpO1xuICB9XG59XG5cbi8qKiBQdWJsaWMgdHlwZSBmb3IgdGhlIHtAbGluayB1cmxCdWlsZGVyfSByZXR1cm4gdmFsdWUuICovXG5leHBvcnQgdHlwZSBVcmxCdWlsZGVyID0gVXJsQnVpbGRlckltcGw7XG5cbi8qKiBXaXRoIG5vIGFyZ3VtZW50LCByZXNvbHZlcyB0byB0aGUgYmFzZSBvcmlnaW4gKG5ldmVyIGBudWxsYCkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcigpOiBVcmxCdWlsZGVyO1xuXG4vKipcbiAqIENvZXJjZSBhIHtAbGluayBVcmxMaWtlfSBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBVcmxCdWlsZGVyfSwgb3IgYG51bGxgXG4gKiB3aGVuIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYSBVUkwuIE5ldmVyIHRocm93cy5cbiAqXG4gKiAtIEEgYFVSTGAgaW5zdGFuY2Ugb3IgYHsgdXJsIH1gIHdyYXBwZXIgaXMgYWRvcHRlZCBhcy1pcy5cbiAqIC0gQSBiYXJlIGhvc3RuYW1lIChgXCJleGFtcGxlLmNvbVwiYCkgaXMgdXBncmFkZWQgdG8gYGh0dHBzOi8vYDsgYW5cbiAqICAgZXhwbGljaXQgc2NoZW1lIGlzIHByZXNlcnZlZC5cbiAqIC0gQSBwYXRoIC8gcXVlcnkgLyBoYXNoIGZyYWdtZW50IChgXCIvYXBpXCJgLCBgXCI/cT0xXCJgLCBgXCIjeFwiYCkgaXNcbiAqICAgcmVzb2x2ZWQgYWdhaW5zdCB7QGxpbmsgZGVmYXVsdFVybH0gKHRoZSBicm93c2VyIG9yaWdpbiwgZWxzZVxuICogICBgaHR0cDovL2xvY2FsaG9zdGApLlxuICogLSBBbiBlbXB0eSAvIGJsYW5rIHN0cmluZyBvciBvbWl0dGVkIGlucHV0IHJlc29sdmVzIHRvIHRoZSBiYXNlXG4gKiAgIG9yaWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogdXJsQnVpbGRlcihcImV4YW1wbGUuY29tXCIpOyAgICAgICAgICAvLyBodHRwczovL2V4YW1wbGUuY29tL1xuICogdXJsQnVpbGRlcihcImh0dHA6Ly94L3BhdGhcIik7ICAgICAgICAvLyBodHRwOi8veC9wYXRoXG4gKiB1cmxCdWlsZGVyKFwiL2FwaS92MlwiKTsgICAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3QvYXBpL3YyXG4gKiB1cmxCdWlsZGVyKHsgdXJsOiBcImh0dHA6Ly95XCIgfSk7ICAgIC8vIGh0dHA6Ly95L1xuICogdXJsQnVpbGRlcigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdC9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiBuZXcgVXJsQnVpbGRlckltcGwoaW5wdXQpO1xuICB9XG4gIGlmIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgXCJ1cmxcIiBpbiBpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQudXJsO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcbiAgfVxuICBpZiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcIi9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIj9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFVybCA9IGRlZmF1bHRVcmwoKS50b1N0cmluZygpLnNsaWNlKDAsIC0xKSArIGlucHV0O1xuICAgICAgcmV0dXJuIHVybEJ1aWxkZXIoam9pbmVkVXJsKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH0ke2lucHV0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goVVJMX1NDSEVNRV9QUkVGSVgpO1xuICAgICAgY29uc3Qgc2NoZW1lUHJlZml4ID0gbWF0Y2g/LlsxXTtcbiAgICAgIGlmIChzY2hlbWVQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKHNjaGVtZVByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpbnB1dCA9IGAke3NjaGVtZVByZWZpeH0ke3Jlc3QgfHwgZGVmYXVsdFVybCgpLmhvc3RuYW1lfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH06Ly8ke2lucHV0fWA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1cmxCdWlsZGVyKGRlZmF1bHRVcmwoKSk7XG4gIH1cbiAgY29uc3QgdXJsID0gcGFyc2VVcmwoaW5wdXQpO1xuICByZXR1cm4gdXJsID8gdXJsQnVpbGRlcih1cmwpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciB7QGxpbmsgVXJsQnVpbGRlci5wYXRoTWF0Y2hlc306IGNvZXJjZVxuICogYGlucHV0YCB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9IGFuZCB0ZXN0IGl0cyBwYXRobmFtZSBhZ2FpbnN0IGBwYXRoYC5cbiAqIFJldHVybnMgYGZhbHNlYCBmb3IgaW5wdXQgdGhhdCBjYW4ndCBiZSBwYXJzZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGF0aE1hdGNoKFwiL2FwaS9jb29sP3E9MVwiLCBcIi9hcGlcIik7ICAgICAgLy8gdHJ1ZVxuICogcGF0aE1hdGNoKFwiL2FwaWNvb2xcIiwgXCIvYXBpXCIpOyAgICAgICAgICAgLy8gZmFsc2VcbiAqIHBhdGhNYXRjaChcImh0dHBzOi8vaG9zdC9hcGlcIiwgXCIvYXBpXCIpOyAgIC8vIHRydWVcbiAqIHBhdGhNYXRjaChyZXF1ZXN0LCBcIi9hcGkvdjJcIik7ICAgICAgICAgICAvLyBmZXRjaCBSZXF1ZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoTWF0Y2goaW5wdXQ6IFVybExpa2UsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxiID0gdXJsQnVpbGRlcihpbnB1dCk7XG4gIGlmICghdXJsYikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdXJsYi5wYXRoTWF0Y2hlcyhwYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlIG9yaWdpbiBmb3IgcmVzb2x2aW5nIHBhdGgtb25seSBpbnB1dHMuIEluIGEgYnJvd3NlciB0aGlzIGlzIHRoZVxuICogY3VycmVudCBwYWdlJ3Mgb3JpZ2luIChgd2luZG93LmxvY2F0aW9uLm9yaWdpbmApLCBzbyBgdXJsQnVpbGRlcihcIi9hcGlcIilgXG4gKiByZWZsZWN0cyB3aGVyZSB0aGUgYXBwIGlzIGFjdHVhbGx5IHNlcnZlZCBmcm9tOyBvbiB0aGUgc2VydmVyIC8gaW5cbiAqIHRlc3RzIChubyBgd2luZG93YCwgb3IgYW4gb3BhcXVlIGBcIm51bGxcImAgb3JpZ2luKSBpdCBmYWxscyBiYWNrIHRvXG4gKiBgaHR0cDovL2xvY2FsaG9zdGAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRVcmwoKTogVVJMIHtcbiAgLy8gUmVhY2ggYHdpbmRvd2AgdmlhIGBnbG9iYWxUaGlzYCBzbyB0aGlzIGNvbXBpbGVzIHdpdGhvdXQgdGhlIERPTVxuICAvLyBsaWIgKGl0J3MgYHVuZGVmaW5lZGAgb24gdGhlIHNlcnZlciAvIGluIHdvcmtlcnMgd2l0aG91dCBvbmUpLlxuICBjb25zdCBvcmlnaW4gPSAoZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgbG9jYXRpb24/OiB7IG9yaWdpbj86IHN0cmluZyB9IH0gfSkud2luZG93Py5sb2NhdGlvblxuICAgID8ub3JpZ2luO1xuICBpZiAob3JpZ2luICYmIG9yaWdpbiAhPT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBvcmlnaW5VcmwgPSBwYXJzZVVybChvcmlnaW4pO1xuICAgIGlmIChvcmlnaW5VcmwpIHtcbiAgICAgIHJldHVybiBvcmlnaW5Vcmw7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgVVJMKExPQ0FMX0hPU1RfVVJMKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVcmwoaW5wdXQ6IHN0cmluZyk6IFVSTCB8IG51bGwge1xuICBpZiAoaW5wdXQgJiYgaW5wdXQuaW5jbHVkZXMoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGlucHV0KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRW1haWwgYWRkcmVzc2VzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBwYXJzZUVtYWlsc30uICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRW1haWxzT3B0aW9ucyB7XG4gIC8qKiBMb3dlci1jYXNlIGV2ZXJ5IGFkZHJlc3MgKHVzZWZ1bCBmb3IgYWxsb3ctbGlzdHMgLyBtYXRjaGluZykuIE9mZiBieSBkZWZhdWx0LiAqL1xuICBsb3dlcmNhc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogRHJvcCBsYXRlciBjYXNlLWluc2Vuc2l0aXZlIGR1cGxpY2F0ZXMsIGtlZXBpbmcgZmlyc3Qtc2VlbiBjYXNpbmcuXG4gICAqIE9uIGJ5IGRlZmF1bHQgLSBhIHJlY2lwaWVudCBvciBwYXR0ZXJuIGxpc3QgcmFyZWx5IHdhbnRzIHJlcGVhdHMuXG4gICAqL1xuICBkZWR1cGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2hhcGVzIGFuIGVtYWlsIGFkZHJlc3MgZmllbGQgYWNjZXB0cyAtIGEgc2luZ2xlIHN0cmluZyxcbiAqIGEgY29tbWEgLyBzZW1pY29sb24gLyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0LCBhbiBhcnJheSBvZiBlaXRoZXIsXG4gKiBvciBub3RoaW5nIC0gaW50byBhIGNsZWFuIGBzdHJpbmdbXWAuIEVhY2ggZW50cnkgaXMgc3BsaXQgb24gdGhlIGxpc3RcbiAqIHNlcGFyYXRvcnMsIHRyaW1tZWQsIGFuZCBkZS1lbXB0aWVkOyBibGFua3MgYW5kIG5vbi1zdHJpbmcgYXJyYXlcbiAqIG1lbWJlcnMgYXJlIGRyb3BwZWQuIEJ5IGRlZmF1bHQgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5IChmaXJzdC1zZWVuIGNhc2luZyB3aW5zKSBhbmQgY2FzaW5nIGlzIG90aGVyd2lzZVxuICogcHJlc2VydmVkOyBwYXNzIGBsb3dlcmNhc2VgIHRvIGZvbGQgZXZlcnl0aGluZyB0byBsb3dlciBjYXNlIChlLmcuIGZvclxuICogYW4gYWxsb3ctbGlzdCkuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSByZWNpcGllbnQgbGlzdHMsIENDL0JDQyBpbnB1dHMsXG4gKiBhbmQgc2VuZGVyIGFsbG93LWxpc3RzIGFjcm9zcyB0aGUgcmVwbyBhZ3JlZSBvbiBob3cgZnJlZS10ZXh0IGVtYWlsXG4gKiBpbnB1dCBpcyByZWFkLiBOZXZlciB0aHJvd3M7IGRvZXMgbm90IHZhbGlkYXRlIC0gcGFpciB3aXRoXG4gKiB7QGxpbmsgaXNFbWFpbH0gd2hlbiB5b3UgbmVlZCB0byByZWplY3QgbWFsZm9ybWVkIGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VFbWFpbHMoXCJhQHguY29tLCBiQHkuY29tOyBhQHguY29tXCIpOyAvLyBbXCJhQHguY29tXCIsIFwiYkB5LmNvbVwiXVxuICogcGFyc2VFbWFpbHMoW1wiQUB4LmNvbVwiLCBcIiBiQHkuY29tIFwiXSk7ICAgICAgLy8gW1wiQUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFwiKkBjb3JwLmNvbVwiLCB7IGxvd2VyY2FzZTogdHJ1ZSB9KTsgLy8gW1wiKkBjb3JwLmNvbVwiXVxuICogcGFyc2VFbWFpbHModW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAgICAvLyBbXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbWFpbHMoXG4gIGlucHV0OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFBhcnNlRW1haWxzT3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBjb25zdCB7IGxvd2VyY2FzZSA9IGZhbHNlLCBkZWR1cGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dCBhcyBzdHJpbmddO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbnRyeS5zcGxpdChFTUFJTF9MSVNUX1NFUEFSQVRPUikpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0b2tlbi50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxvd2VyY2FzZSA/IHRyaW1tZWQudG9Mb3dlckNhc2UoKSA6IHRyaW1tZWQ7XG4gICAgICBpZiAoZGVkdXBlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goYWRkcmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjazogbm9uLWVtcHR5IGxvY2FsIGFuZCBkb21haW5cbiAqIHBhcnRzIGFyb3VuZCBhIHNpbmdsZSBgQGAsIHdpdGggYSBkb3R0ZWQgZG9tYWluIGFuZCBubyB3aGl0ZXNwYWNlLlxuICogRGVsaWJlcmF0ZWx5IGxvb3NlIChub3QgZnVsbCBSRkMgNTMyMikgLSBlbm91Z2ggdG8gY2F0Y2ggb2J2aW91cyB0eXBvc1xuICogYW5kIGdpdmUgQ0xJIC8gZm9ybSBmZWVkYmFjaywgbm90IHRvIGdhdGUgZGVsaXZlcnkuIFRyaW1zIGZpcnN0LiBUaGlzXG4gKiBpcyBhIHB1cmVseSBzeW50YWN0aWMgdGVzdCwgc28gYSB3aWxkY2FyZCBhbGxvdy1saXN0IHBhdHRlcm4gbGlrZVxuICogYCpAZXhhbXBsZS5jb21gIHBhc3NlczsgZGlzdGluZ3Vpc2hpbmcgYSBwYXR0ZXJuIGZyb20gYSByZWFsIGFkZHJlc3NcbiAqIGlzIHRoZSBzZW5kZXIgcG9saWN5J3Mgam9iLCBub3QgdGhpcyB2YWxpZGF0b3Incy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXNFbWFpbChcImFsaWNlQGV4YW1wbGUuY29tXCIpOyAvLyB0cnVlXG4gKiBpc0VtYWlsKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIGZhbHNlIChubyBAKVxuICogaXNFbWFpbChcIm5vQGRvbWFpblwiKTsgICAgICAgICAvLyBmYWxzZSAobm8gZG90dGVkIGRvbWFpbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1haWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1BSUxfQUREUkVTUy50ZXN0KHZhbHVlLnRyaW0oKSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSVAgYWRkcmVzc2VzIGFuZCBDSURSIGJsb2Nrc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NCAoYFwiMS4yLjMuNFwiYCkgb3IgSVB2NiAoYFwiMjAwMTpkYjg6OjFcImAsXG4gKiBgXCI6OmZmZmY6MS4yLjMuNFwiYCwgYFwiOjoxXCJgKSBhZGRyZXNzIGludG8gYSB7QGxpbmsgUGFyc2VkSXB9LCBvclxuICogYG51bGxgIHdoZW4gdGhlIGlucHV0IGlzbid0IGEgdmFsaWQgbGl0ZXJhbC4gTmV2ZXIgdGhyb3dzLiBTdXJyb3VuZGluZ1xuICogd2hpdGVzcGFjZSwgYFsuLi5dYCBicmFja2V0cyBhcm91bmQgYW4gSVB2NiBsaXRlcmFsLCBhbmQgYW4gSVB2NiB6b25lXG4gKiBpZCAoYGZlODA6OjElZXRoMGApIGFyZSBhbGwgdG9sZXJhdGVkLiBUaGUgYHZhbHVlYCBpcyByZXR1cm5lZCBhcyBhXG4gKiBgYmlnaW50YCBzbyB2NCBhbmQgdjYgc2hhcmUgb25lIGNvbXBhcmlzb24gcGF0aC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VJcChcIjEwLjAuMC4xXCIpOyAgICAgICAgLy8geyB2ZXJzaW9uOiA0LCB2YWx1ZTogMTY3NzcyMTYxbiB9XG4gKiBwYXJzZUlwKFwiMjAwMTpkYjg6OjFcIik7ICAgICAvLyB7IHZlcnNpb246IDYsIHZhbHVlOiAuLi4gfVxuICogcGFyc2VJcChcIm5vdC1hbi1pcFwiKTsgICAgICAgLy8gbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJcChpbnB1dDogc3RyaW5nKTogUGFyc2VkSXAgfCBudWxsIHtcbiAgbGV0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHRleHQuZW5kc1dpdGgoXCJdXCIpKSB0ZXh0ID0gdGV4dC5zbGljZSgxLCAtMSk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIC8vIERyb3AgYW4gSVB2NiB6b25lIGlkIChgZmU4MDo6MSVldGgwYCkgLSBpdCBpc24ndCBwYXJ0IG9mIHRoZSBhZGRyZXNzLlxuICAgIGNvbnN0IHpvbmUgPSB0ZXh0LmluZGV4T2YoXCIlXCIpO1xuICAgIGlmICh6b25lID49IDApIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHpvbmUpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY2KHRleHQpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDYsIHZhbHVlIH07XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwYXJzZUlwdjQodGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDQsIHZhbHVlIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSBDSURSIGJsb2NrIChgXCIxMC4wLjAuMC84XCJgLCBgXCIyMDAxOmRiODo6LzMyXCJgKSBpbnRvIGFcbiAqIHtAbGluayBDaWRyfSB3aXRoIGhvc3QgYml0cyBjbGVhcmVkIGZyb20gYGJhc2VgLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIGlucHV0IGlzbid0IGEgdmFsaWQgYmxvY2sgKGJhZCBhZGRyZXNzLCBtaXNzaW5nIC8gb3V0LW9mLXJhbmdlXG4gKiBwcmVmaXgpLiBOZXZlciB0aHJvd3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzhcIik/LmJhc2U7ICAgLy8gMTY3NzcyMTYwbiAoMTAuMC4wLjApXG4gKiBwYXJzZUNpZHIoXCIxMC4xLjIuMy84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKGhvc3QgYml0cyBkcm9wcGVkKVxuICogcGFyc2VDaWRyKFwiMTAuMC4wLjAvNDBcIik7ICAgICAgICAvLyBudWxsIChwcmVmaXggPiAzMiBmb3IgdjQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNpZHIoaW5wdXQ6IHN0cmluZyk6IENpZHIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnRyaW0oKTtcbiAgY29uc3Qgc2xhc2ggPSB0ZXh0Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoIDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeFRleHQgPSB0ZXh0LnNsaWNlKHNsYXNoICsgMSk7XG4gIGlmICghSVBWNF9PQ1RFVC50ZXN0KHByZWZpeFRleHQpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaXAgPSBwYXJzZUlwKHRleHQuc2xpY2UoMCwgc2xhc2gpKTtcbiAgaWYgKCFpcCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeCA9IE51bWJlcihwcmVmaXhUZXh0KTtcbiAgY29uc3QgYml0cyA9IElQX0JJVFNbaXAudmVyc2lvbl07XG4gIGlmIChwcmVmaXggPiBiaXRzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYmFzZSA9IGlwLnZhbHVlICYgbmV0d29ya01hc2soYml0cywgcHJlZml4KTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBpcC52ZXJzaW9uLFxuICAgIGJhc2UsXG4gICAgcHJlZml4LFxuICAgIGNpZHI6IGAke3RleHQuc2xpY2UoMCwgc2xhc2gpfS8ke3ByZWZpeH1gLFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3Qgd2hldGhlciBgaXBgIGZhbGxzIGluc2lkZSBgY2lkcmAuIEJvdGggYXJndW1lbnRzIGFjY2VwdCBlaXRoZXJcbiAqIGEgc3RyaW5nIChwYXJzZWQgb24gdGhlIGZseSB2aWEge0BsaW5rIHBhcnNlSXB9IC8ge0BsaW5rIHBhcnNlQ2lkcn0pXG4gKiBvciBhbiBhbHJlYWR5LXBhcnNlZCB2YWx1ZSAtIHBhc3MgcGFyc2VkIHZhbHVlcyBpbiBob3QgbG9vcHMgdG8gc2tpcFxuICogcmUtcGFyc2luZy4gUmV0dXJucyBgZmFsc2VgIGZvciB1bnBhcnNlYWJsZSBpbnB1dCBvciBhIHZlcnNpb25cbiAqIG1pc21hdGNoIChhbiBJUHY0IGFkZHJlc3MgaXMgbmV2ZXIgaW5zaWRlIGFuIElQdjYgYmxvY2spLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpcEluQ2lkcihcIjEwLjEuMi4zXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyB0cnVlXG4gKiBpcEluQ2lkcihcIjExLjAuMC4xXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXBJbkNpZHIoaXA6IHN0cmluZyB8IFBhcnNlZElwLCBjaWRyOiBzdHJpbmcgfCBDaWRyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgY29uc3QgcGFyc2VkQ2lkciA9IHR5cGVvZiBjaWRyID09PSBcInN0cmluZ1wiID8gcGFyc2VDaWRyKGNpZHIpIDogY2lkcjtcbiAgaWYgKCFwYXJzZWRJcCB8fCAhcGFyc2VkQ2lkciB8fCBwYXJzZWRJcC52ZXJzaW9uICE9PSBwYXJzZWRDaWRyLnZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbcGFyc2VkQ2lkci52ZXJzaW9uXSwgcGFyc2VkQ2lkci5wcmVmaXgpO1xuICByZXR1cm4gKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IHBhcnNlZENpZHIuYmFzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZpcnN0IENJRFIgaW4gYGNpZHJzYCB0aGF0IGNvbnRhaW5zIGBpcGAsIG9yIGBudWxsYCB3aGVuXG4gKiBub25lIG1hdGNoLiBgY2lkcnNgIGhvbGRzIHByZS1wYXJzZWQge0BsaW5rIENpZHJ9IHZhbHVlcyAob3IgYW55XG4gKiBvYmplY3QgZXh0ZW5kaW5nIGl0KSwgc28gY2FsbGVycyBjYW4gY2Fycnkgc2lkZSBtZXRhZGF0YSBvbiBlYWNoXG4gKiBlbnRyeSAoZS5nLiBhIHJlZ2lvbiB0YWcpIGFuZCByZWFkIGl0IHN0cmFpZ2h0IG9mZiB0aGUgcmV0dXJuZWRcbiAqIG1hdGNoLiBMaW5lYXIgc2NhbjsgcGFyc2UgdGhlIGFkZHJlc3Mgb25jZSBieSBwYXNzaW5nIGFcbiAqIHtAbGluayBQYXJzZWRJcH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IFtcIjEwLjAuMC4wLzhcIiwgXCIxOTIuMTY4LjAuMC8xNlwiXVxuICogICAubWFwKHBhcnNlQ2lkcilcbiAqICAgLmZpbHRlcigoYyk6IGMgaXMgQ2lkciA9PiBjICE9PSBudWxsKTtcbiAqIGZpbmRDb250YWluaW5nQ2lkcihcIjEwLjEuMi4zXCIsIHJhbmdlcyk/LmNpZHI7IC8vIFwiMTAuMC4wLjAvOFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29udGFpbmluZ0NpZHI8VCBleHRlbmRzIENpZHI+KFxuICBpcDogc3RyaW5nIHwgUGFyc2VkSXAsXG4gIGNpZHJzOiBJdGVyYWJsZTxUPixcbik6IFQgfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkSXAgPSB0eXBlb2YgaXAgPT09IFwic3RyaW5nXCIgPyBwYXJzZUlwKGlwKSA6IGlwO1xuICBpZiAoIXBhcnNlZElwKSByZXR1cm4gbnVsbDtcbiAgZm9yIChjb25zdCBjaWRyIG9mIGNpZHJzKSB7XG4gICAgaWYgKGNpZHIudmVyc2lvbiAhPT0gcGFyc2VkSXAudmVyc2lvbikgY29udGludWU7XG4gICAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbY2lkci52ZXJzaW9uXSwgY2lkci5wcmVmaXgpO1xuICAgIGlmICgocGFyc2VkSXAudmFsdWUgJiBtYXNrKSA9PT0gY2lkci5iYXNlKSByZXR1cm4gY2lkcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBpbnB1dGAncyBob3N0IGlzIGEgbG9vcGJhY2sgYWRkcmVzcyAtIGBsb2NhbGhvc3RgLCBhbiBJUHY0XG4gKiBgMTI3LjAuMC4wLzhgIGFkZHJlc3MsIG9yIElQdjYgYDo6MWAgLSBpLmUuIGEgc2VydmljZSBydW5uaW5nIG9uIHRoaXNcbiAqIG1hY2hpbmUgKGUuZy4gYSBsb2NhbCByZWdpc3RyeSkuIEFjY2VwdHMgYW55dGhpbmcge0BsaW5rIHVybEJ1aWxkZXJ9XG4gKiBjb2VyY2VzIChhIFVSTCBzdHJpbmcsIGBVUkxgLCBvciBgeyB1cmwgfWApOyByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGVcbiAqIGlucHV0IGhhcyBubyByZXNvbHZhYmxlIGhvc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cDovL2xvY2FsaG9zdDo0ODczXCIpOyAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly8xMjcuMC4wLjFcIik7ICAgICAgIC8vIHRydWVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmdcIik7IC8vIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb3BiYWNrSG9zdChpbnB1dDogVXJsTGlrZSk6IGJvb2xlYW4ge1xuICBjb25zdCBob3N0ID0gdXJsQnVpbGRlcihpbnB1dCk/Lmhvc3RuYW1lO1xuICBpZiAoIWhvc3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKGhvc3QgPT09IFwibG9jYWxob3N0XCIpIHJldHVybiB0cnVlO1xuICAvLyBgVVJMYCBicmFja2V0cyBhbiBJUHY2IGhvc3QgKGBbOjoxXWApOyBzdHJpcCB0aGVtIGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBpcCA9IGhvc3QucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gaXBJbkNpZHIoaXAsIFwiMTI3LjAuMC4wLzhcIikgfHwgaXBJbkNpZHIoaXAsIFwiOjoxLzEyOFwiKTtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIG1hc2sgZm9yIGBwcmVmaXhgIGxlYWRpbmcgYml0cyBvZiBhIGBiaXRzYC13aWRlIGFkZHJlc3MgYXMgYVxuICogYGJpZ2ludGA6IHRoZSB0b3AgYHByZWZpeGAgYml0cyBzZXQsIHRoZSBsb3cgaG9zdCBiaXRzIGNsZWFyZWQuXG4gKiBgcHJlZml4ID09PSAwYCB5aWVsZHMgYDBuYCAobWF0Y2hlcyBldmVyeXRoaW5nKTsgYHByZWZpeCA9PT0gYml0c2BcbiAqIHlpZWxkcyB0aGUgYWxsLW9uZXMgbWFzayAobWF0Y2hlcyBhIHNpbmdsZSBhZGRyZXNzKS5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya01hc2soYml0czogbnVtYmVyLCBwcmVmaXg6IG51bWJlcik6IGJpZ2ludCB7XG4gIGNvbnN0IGhvc3RCaXRzID0gQmlnSW50KGJpdHMgLSBwcmVmaXgpO1xuICBjb25zdCBmdWxsID0gKDFuIDw8IEJpZ0ludChiaXRzKSkgLSAxbjtcbiAgcmV0dXJuIGZ1bGwgXiAoKDFuIDw8IGhvc3RCaXRzKSAtIDFuKTtcbn1cblxuLyoqIFBhcnNlIGEgZG90dGVkLXF1YWQgSVB2NCBsaXRlcmFsIGludG8gYSAzMi1iaXQgdmFsdWUsIGVsc2UgYG51bGxgLiAqL1xuZnVuY3Rpb24gcGFyc2VJcHY0KGlucHV0OiBzdHJpbmcpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKCFJUFY0X09DVEVULnRlc3QocGFydCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9jdGV0ID0gTnVtYmVyKHBhcnQpO1xuICAgIGlmIChvY3RldCA+IDI1NSkgcmV0dXJuIG51bGw7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOG4pIHwgQmlnSW50KG9jdGV0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NiBsaXRlcmFsIGludG8gYSAxMjgtYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gSGFuZGxlcyBgOjpgXG4gKiB6ZXJvLWNvbXByZXNzaW9uIChhdCBtb3N0IG9uY2UpIGFuZCBhIHRyYWlsaW5nIGVtYmVkZGVkIElQdjQgZ3JvdXBcbiAqIChgOjpmZmZmOjEuMi4zLjRgKS4gVGhlIHpvbmUgaWQsIGlmIGFueSwgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaXBwZWRcbiAqIGJ5IHtAbGluayBwYXJzZUlwfSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NihpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IGhhbHZlcyA9IGlucHV0LnNwbGl0KFwiOjpcIik7XG4gIGlmIChoYWx2ZXMubGVuZ3RoID4gMikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgaGVhZCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMF0hKTtcbiAgaWYgKGhlYWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGlmIChoYWx2ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgdGFpbCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMV0hKTtcbiAgICBpZiAodGFpbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gXCI6OlwiIG11c3Qgc3RhbmQgaW4gZm9yIGF0IGxlYXN0IG9uZSBhbGwtemVybyBoZXh0ZXQuXG4gICAgY29uc3QgbWlzc2luZyA9IDggLSBoZWFkLmxlbmd0aCAtIHRhaWwubGVuZ3RoO1xuICAgIGlmIChtaXNzaW5nIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKFsuLi5oZWFkLCAuLi5BcnJheShtaXNzaW5nKS5maWxsKDApLCAuLi50YWlsXSk7XG4gIH1cblxuICBpZiAoaGVhZC5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGV4dGV0c1RvVmFsdWUoaGVhZCk7XG59XG5cbi8qKlxuICogUGFyc2Ugb25lIGNvbG9uLXNlcGFyYXRlZCBydW4gb2YgSVB2NiBoZXh0ZXRzLCBleHBhbmRpbmcgYSB0cmFpbGluZ1xuICogZW1iZWRkZWQgSVB2NCBncm91cCBpbnRvIGl0cyB0d28gaGV4dGV0cy4gQW4gZW1wdHkgc3RyaW5nIHlpZWxkcyBhblxuICogZW1wdHkgbGlzdCAodGhlIHNpZGUgb2YgYSBsZWFkaW5nIC8gdHJhaWxpbmcgYDo6YCkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGV4dGV0cyhwYXJ0OiBzdHJpbmcpOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAocGFydCA9PT0gXCJcIikgcmV0dXJuIFtdO1xuICBjb25zdCB0b2tlbnMgPSBwYXJ0LnNwbGl0KFwiOlwiKTtcbiAgY29uc3QgaGV4dGV0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXSE7XG4gICAgaWYgKHRva2VuLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLy8gQSBkb3R0ZWQtcXVhZCBpcyBvbmx5IGxlZ2FsIGFzIHRoZSBmaW5hbCBncm91cC5cbiAgICAgIGlmIChpICE9PSB0b2tlbnMubGVuZ3RoIC0gMSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCB2NCA9IHBhcnNlSXB2NCh0b2tlbik7XG4gICAgICBpZiAodjQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKE51bWJlcigodjQgPj4gMTZuKSAmIDB4ZmZmZm4pLCBOdW1iZXIodjQgJiAweGZmZmZuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghSVBWNl9IRVhURVQudGVzdCh0b2tlbikpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKHBhcnNlSW50KHRva2VuLCAxNikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGV4dGV0cztcbn1cblxuLyoqIEZvbGQgZXhhY3RseSA4IGhleHRldHMgaW50byBhIHNpbmdsZSAxMjgtYml0IGBiaWdpbnRgLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIGhleHRldHNUb1ZhbHVlKGhleHRldHM6IG51bWJlcltdKTogYmlnaW50IHwgbnVsbCB7XG4gIGlmIChoZXh0ZXRzLmxlbmd0aCAhPT0gOCkgcmV0dXJuIG51bGw7XG4gIGxldCB2YWx1ZSA9IDBuO1xuICBmb3IgKGNvbnN0IGhleHRldCBvZiBoZXh0ZXRzKSB2YWx1ZSA9ICh2YWx1ZSA8PCAxNm4pIHwgQmlnSW50KGhleHRldCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
|
package/lib/src/options.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
|
+
export { MAX_TCP_PORT } from "./net.ts";
|
|
7
8
|
export declare const DatabricksEnvironmentNamesSchema: z.ZodObject<{
|
|
8
9
|
profile: z.ZodDefault<z.ZodLiteral<"DATABRICKS_CONFIG_PROFILE">>;
|
|
9
10
|
host: z.ZodDefault<z.ZodLiteral<"DATABRICKS_HOST">>;
|
|
@@ -36,8 +37,6 @@ export declare const databricksEnvironmentNames: Readonly<{
|
|
|
36
37
|
appPort: "DATABRICKS_APP_PORT";
|
|
37
38
|
lakebaseEndpoint: "LAKEBASE_ENDPOINT";
|
|
38
39
|
}>;
|
|
39
|
-
/** Highest valid TCP port number. */
|
|
40
|
-
export declare const MAX_TCP_PORT = 65535;
|
|
41
40
|
export declare const tcpPortSchema: z.ZodCoercedNumber<number>;
|
|
42
41
|
export declare const tcpPortOrZeroSchema: z.ZodCoercedNumber<number>;
|
|
43
42
|
export declare const normalizedUrlSchema: z.ZodString;
|
package/lib/src/options.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
import { isLoopbackHost, urlBuilder } from "./net.js";
|
|
7
|
+
import { isLoopbackHost, MAX_TCP_PORT, urlBuilder } from "./net.js";
|
|
8
8
|
import { isRecord, toBoolean } from "./object.js";
|
|
9
9
|
import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.js";
|
|
10
|
+
export { MAX_TCP_PORT } from "./net.js";
|
|
10
11
|
const environmentName = (name, description) => z.literal(name).default(name).describe(description);
|
|
11
12
|
export const DatabricksEnvironmentNamesSchema = z
|
|
12
13
|
.object({
|
|
@@ -28,8 +29,6 @@ export const DatabricksEnvironmentNamesSchema = z
|
|
|
28
29
|
.describe("Canonical Databricks CLI, SDK, Apps, and Lakebase environment names.");
|
|
29
30
|
/** Canonical Databricks environment names derived from the owning schema. */
|
|
30
31
|
export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
|
|
31
|
-
/** Highest valid TCP port number. */
|
|
32
|
-
export const MAX_TCP_PORT = 65_535;
|
|
33
32
|
export const tcpPortSchema = z.coerce
|
|
34
33
|
.number()
|
|
35
34
|
.int()
|
|
@@ -294,4 +293,4 @@ function normalizeUrl(value) {
|
|
|
294
293
|
const normalized = url.toString();
|
|
295
294
|
return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
|
|
296
295
|
}
|
|
297
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixFQUFFLHNDQUFzQyxDQUFDO0lBQ3hGLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsUUFBUSxFQUFFLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxtQ0FBbUMsQ0FBQztJQUN0RixPQUFPLEVBQUUsZUFBZSxDQUFDLHFCQUFxQixFQUFFLGtDQUFrQyxDQUFDO0lBQ25GLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGdDQUFnQyxDQUFDO0NBQ3pGLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsc0VBQXNFLENBQUMsQ0FBQztBQUlwRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUVuQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU07S0FDbEMsTUFBTSxFQUFVO0tBQ2hCLEdBQUcsRUFBRTtLQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixHQUFHLENBQUMsWUFBWSxDQUFDO0tBQ2pCLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNO0tBQ3hDLE1BQU0sRUFBVTtLQUNoQixHQUFHLEVBQUU7S0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQztLQUNqQixRQUFRLENBQUMsMEVBQTBFLENBQUMsQ0FBQztBQUV4RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDO0tBQ2pDLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7SUFDbEQsT0FBTyxFQUFFLCtCQUErQjtDQUN6QyxDQUFDO0tBQ0QsU0FBUyxDQUFDLFlBQVksQ0FBQztLQUN2QixRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQztBQUU5RCxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUM3QyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1RCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsR0FBRztJQUNILElBQUk7SUFDSixXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQ3JELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUN6RDtJQUNELElBQUksRUFBRSxtQkFBbUI7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1NBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsU0FBUyxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FDdEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUNsRTtJQUNELFdBQVcsRUFBRSxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQzFELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FDcEU7SUFDRCxVQUFVLEVBQUUsY0FBYyxDQUFDLDZCQUE2QixDQUFDLENBQUMsSUFBSSxDQUM1RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQ25FO0lBQ0QsUUFBUSxFQUFFLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLElBQUksQ0FDMUQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUNqRTtJQUNELFlBQVksRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQ2xFLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FDckU7SUFDRCxXQUFXLEVBQUUsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUMxRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQ3BFO0lBQ0QsT0FBTyxFQUFFLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FDbEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUNoRTtJQUNELFFBQVEsRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQzlELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FDakU7SUFDRCxPQUFPLEVBQUUsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUNsRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQ2hFO0lBQ0QsT0FBTyxFQUFFLGFBQWE7U0FDbkIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1NBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUN6RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FDekU7Q0FDRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFjdkUscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxhQUFhLENBQzNCLE1BQXNCLEVBQ3RCLE1BQStCLEVBQy9CLE1BQWlDO0lBRWpDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQXNCLEVBQ3RCLE1BQStCO0lBRS9CLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxRSxHQUFHO1FBQ0gsc0JBQXNCLENBQUMsS0FBSyxDQUFDO0tBQzlCLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixNQUFzQixFQUN0QixNQUErQixFQUMvQixNQUFpQztJQUVqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBc0MsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUM1RCxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQ1AsTUFBTSxLQUFLLE1BQU07WUFDZixDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBVSxDQUFDLENBQUM7SUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUN4RCxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFdkYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQztLQUNuQyxNQUFNLENBQUM7SUFDTixnQkFBZ0IsRUFBRSxZQUFZLENBQzVCLGdEQUFnRCxFQUNoRCwwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FDNUM7Q0FDRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFPeEMsMkZBQTJGO0FBQzNGLE1BQU0sVUFBVSxTQUFTLENBQ3ZCLE1BQXNCLEVBQ3RCLFFBQXdCLElBQUksRUFDNUIsY0FBOEIsSUFBSTtJQUVsQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUEwQixDQUFDLENBQUMsQ0FBQyxDQUMzQyxDQUFDO0FBQ3pDLENBQUM7QUFxREQsaUdBQWlHO0FBQ2pHLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBNkI7SUFFN0IsTUFBTSxRQUFRLEdBQXFCO1FBQ2pDLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVztRQUNqQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7S0FDbkIsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFlLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLENBQUM7U0FDYixVQUFVLENBQ1QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFDdkUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtRQUM3QixDQUFDO2FBQ0UsTUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ25FLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUNqRCxDQUFDO2FBQ0QsTUFBTSxFQUFFO1FBQ1gsQ0FBQzthQUNFLE1BQU0sQ0FBQztZQUNOLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUN6QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0IsQ0FBQzthQUNELE1BQU0sRUFBRTtLQUNaLENBQUMsQ0FDSDtTQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsaUNBQWlDLENBQUM7U0FDbkYsTUFBTSxDQUNMLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDMUYsaUNBQWlDLENBQ2xDO1NBQ0EsUUFBUSxDQUFDLHNDQUFzQyxDQUFzQyxDQUFDO0lBQ3pGLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFzQjtJQUN4RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUIsT0FBTyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM3RSxPQUFPLFNBQVMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsS0FBYyxFQUNkLFFBQTBCLEVBQzFCLGFBQTJCO0lBRTNCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0QsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxhQUFhLEtBQUssS0FBSztZQUM1QixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDckQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsSUFBSSxhQUFhLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNoRixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FB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T0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3pELElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0UsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFzQixFQUFFLElBQXVCO0lBQ3ZFLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBvcHRpb24gcHJpbWl0aXZlcyBzaGFyZWQgYWNyb3NzIGRieC10b29scyBwYWNrYWdlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGlzTG9vcGJhY2tIb3N0LCB1cmxCdWlsZGVyIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRvSWRlbnRpZmllcldpdGhPcHRpb25zLCB0b1NsdWcgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHMudHNcIjtcblxuY29uc3QgZW52aXJvbm1lbnROYW1lID0gPFQgZXh0ZW5kcyBzdHJpbmc+KG5hbWU6IFQsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHoubGl0ZXJhbChuYW1lKS5kZWZhdWx0KG5hbWUpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFXCIsIFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZSBlbnZpcm9ubWVudC5cIiksXG4gICAgaG9zdDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19IT1NUXCIsIFwiRGF0YWJyaWNrcyBob3N0IGVudmlyb25tZW50LlwiKSxcbiAgICBhY2NvdW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiLCBcIkRhdGFicmlja3MgYWNjb3VudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgd29ya3NwYWNlSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfV09SS1NQQUNFX0lEXCIsIFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNvbmZpZ0ZpbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DT05GSUdfRklMRVwiLFxuICAgICAgXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZSBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGNsaWVudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiLCBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjbGllbnRTZWNyZXQ6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DTElFTlRfU0VDUkVUXCIsXG4gICAgICBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IHNlY3JldCBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1RPS0VOXCIsIFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4gZW52aXJvbm1lbnQuXCIpLFxuICAgIGdyb3VwSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfR1JPVVBfSURcIiwgXCJEYXRhYnJpY2tzIGdyb3VwIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBhdXRoVHlwZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIiwgXCJEYXRhYnJpY2tzIGF1dGggdHlwZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwTmFtZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfTkFNRVwiLCBcIkRhdGFicmlja3MgQXBwIG5hbWUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcFBvcnQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX1BPUlRcIiwgXCJEYXRhYnJpY2tzIEFwcCBwb3J0IGVudmlyb25tZW50LlwiKSxcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBlbnZpcm9ubWVudE5hbWUoXCJMQUtFQkFTRV9FTkRQT0lOVFwiLCBcIkxha2ViYXNlIGVuZHBvaW50IGVudmlyb25tZW50LlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2UgZW52aXJvbm1lbnQgbmFtZXMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYT47XG5cbi8qKiBDYW5vbmljYWwgRGF0YWJyaWNrcyBlbnZpcm9ubWVudCBuYW1lcyBkZXJpdmVkIGZyb20gdGhlIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgY29uc3QgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSBPYmplY3QuZnJlZXplKERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbi8qKiBIaWdoZXN0IHZhbGlkIFRDUCBwb3J0IG51bWJlci4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVENQX1BPUlQgPSA2NV81MzU7XG5cbmV4cG9ydCBjb25zdCB0Y3BQb3J0U2NoZW1hID0gei5jb2VyY2VcbiAgLm51bWJlcjxudW1iZXI+KClcbiAgLmludCgpXG4gIC5taW4oMSlcbiAgLm1heChNQVhfVENQX1BPUlQpXG4gIC5kZXNjcmliZShcIlRDUCBwb3J0IGZyb20gMSB0aHJvdWdoIDY1NTM1LlwiKTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRPclplcm9TY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigwKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAwIHRocm91Z2ggNjU1MzUsIHdoZXJlIHplcm8gcmVxdWVzdHMgYXV0b21hdGljIGFsbG9jYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplZFVybFNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmltKClcbiAgLm1pbigxKVxuICAucmVmaW5lKCh2YWx1ZSkgPT4gdXJsQnVpbGRlcih2YWx1ZSkgIT09IHVuZGVmaW5lZCwge1xuICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgYSB2YWxpZCBVUkwgb3IgaG9zdC5cIixcbiAgfSlcbiAgLm92ZXJ3cml0ZShub3JtYWxpemVVcmwpXG4gIC5kZXNjcmliZShcIlVSTCBub3JtYWxpemVkIHRocm91Z2ggdGhlIHNoYXJlZCBVUkwgYnVpbGRlci5cIik7XG5cbmNvbnN0IGRhdGFicmlja3NUZXh0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcbmNvbnN0IGRhdGFicmlja3NPcHRpb25NZXRhID0gKGVudjogc3RyaW5nLCBmbGFnID0gdHJ1ZSkgPT4gKHtcbiAgZW52LFxuICBmbGFnLFxuICBoZWxwRGVmYXVsdDogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5wcm9maWxlKSxcbiAgICApLFxuICAgIGhvc3Q6IG5vcm1hbGl6ZWRVcmxTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGhvc3QuXCIpXG4gICAgICAubWV0YShkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5ob3N0LCBmYWxzZSkpLFxuICAgIGFjY291bnRJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGFjY291bnQgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hY2NvdW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIHdvcmtzcGFjZUlkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3Mgd29ya3NwYWNlIElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMud29ya3NwYWNlSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNvbmZpZ0ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgY29uZmlnIGZpbGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jb25maWdGaWxlLCBmYWxzZSksXG4gICAgKSxcbiAgICBjbGllbnRJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNsaWVudElkLCBmYWxzZSksXG4gICAgKSxcbiAgICBjbGllbnRTZWNyZXQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0LlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50U2VjcmV0LCBmYWxzZSksXG4gICAgKSxcbiAgICBhY2Nlc3NUb2tlbjogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGFjY2VzcyB0b2tlbi5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY2Vzc1Rva2VuLCBmYWxzZSksXG4gICAgKSxcbiAgICBncm91cElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgZ3JvdXAgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5ncm91cElkLCBmYWxzZSksXG4gICAgKSxcbiAgICBhdXRoVHlwZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIHR5cGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hdXRoVHlwZSwgZmFsc2UpLFxuICAgICksXG4gICAgYXBwTmFtZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIEFwcCBuYW1lLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXBwTmFtZSwgZmFsc2UpLFxuICAgICksXG4gICAgYXBwUG9ydDogdGNwUG9ydFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgQXBwIHBvcnQuXCIpXG4gICAgICAubWV0YShkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBQb3J0LCBmYWxzZSkpLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGRhdGFicmlja3NUZXh0KFwiTGFrZWJhc2UgZW5kcG9pbnQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LCBmYWxzZSksXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNvbW1vbiBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIERhdGFicmlja3NPcHRpb25zID0gei5pbnB1dDx0eXBlb2YgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWE+O1xuXG4vKiogS2V5IGZvcm1hdCBlbWl0dGVkIGJ5IHtAbGluayBzZXJpYWxpemVPcHRzfS4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQgPSBcImZsYWdcIiB8IFwiZW52XCI7XG5cbmludGVyZmFjZSBPcHRpb25Qcm9wZXJ0eSB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZmxhZz86IGJvb2xlYW47XG59XG5cbi8qKiBTZXJpYWxpemUgY29tcGxldGUgcGFyc2VkIG9wdGlvbnMgYXMgSlNPTiBrZXllZCBieSBmbGFncyBvciBlbnZpcm9ubWVudCBuYW1lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRPcHRzKHNjaGVtYSwgdmFsdWVzLCBmb3JtYXQpLCBudWxsLCAyKTtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBhIHByb2Nlc3MgZW52aXJvbm1lbnQgbWFwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHNFbnZpcm9ubWVudDxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIFwiZW52XCIpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25WYWx1ZSh2YWx1ZSksXG4gICAgXSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGNwTGlzdGVuQWRkcmVzcyB7XG4gIHJlYWRvbmx5IHNjaGVtZTogXCJ0Y3BcIjtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXhMaXN0ZW5BZGRyZXNzIHtcbiAgcmVhZG9ubHkgc2NoZW1lOiBcInVuaXhcIjtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICBzY2hlbWU6IHoubGl0ZXJhbChcInRjcFwiKSxcbiAgICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNjaGVtZTogei5saXRlcmFsKFwidW5peFwiKSxcbiAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdHJpY3QoKSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixFQUFFLHNDQUFzQyxDQUFDO0lBQ3hGLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsUUFBUSxFQUFFLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxtQ0FBbUMsQ0FBQztJQUN0RixPQUFPLEVBQUUsZUFBZSxDQUFDLHFCQUFxQixFQUFFLGtDQUFrQyxDQUFDO0lBQ25GLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGdDQUFnQyxDQUFDO0NBQ3pGLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsc0VBQXNFLENBQUMsQ0FBQztBQUlwRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU07S0FDbEMsTUFBTSxFQUFVO0tBQ2hCLEdBQUcsRUFBRTtLQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixHQUFHLENBQUMsWUFBWSxDQUFDO0tBQ2pCLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNO0tBQ3hDLE1BQU0sRUFBVTtLQUNoQixHQUFHLEVBQUU7S0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQztLQUNqQixRQUFRLENBQUMsMEVBQTBFLENBQUMsQ0FBQztBQUV4RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDO0tBQ2pDLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7SUFDbEQsT0FBTyxFQUFFLCtCQUErQjtDQUN6QyxDQUFDO0tBQ0QsU0FBUyxDQUFDLFlBQVksQ0FBQztLQUN2QixRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQztBQUU5RCxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUM3QyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1RCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsR0FBRztJQUNILElBQUk7SUFDSixXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQ3JELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUN6RDtJQUNELElBQUksRUFBRSxtQkFBbUI7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1NBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsU0FBUyxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FDdEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUNsRTtJQUNELFdBQVcsRUFBRSxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQzFELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FDcEU7SUFDRCxVQUFVLEVBQUUsY0FBYyxDQUFDLDZCQUE2QixDQUFDLENBQUMsSUFBSSxDQUM1RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQ25FO0lBQ0QsUUFBUSxFQUFFLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLElBQUksQ0FDMUQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUNqRTtJQUNELFlBQVksRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQ2xFLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FDckU7SUFDRCxXQUFXLEVBQUUsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUMxRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQ3BFO0lBQ0QsT0FBTyxFQUFFLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FDbEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUNoRTtJQUNELFFBQVEsRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQzlELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FDakU7SUFDRCxPQUFPLEVBQUUsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUNsRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQ2hFO0lBQ0QsT0FBTyxFQUFFLGFBQWE7U0FDbkIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1NBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUN6RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FDekU7Q0FDRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFjdkUscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxhQUFhLENBQzNCLE1BQXNCLEVBQ3RCLE1BQStCLEVBQy9CLE1BQWlDO0lBRWpDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQXNCLEVBQ3RCLE1BQStCO0lBRS9CLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxRSxHQUFHO1FBQ0gsc0JBQXNCLENBQUMsS0FBSyxDQUFDO0tBQzlCLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixNQUFzQixFQUN0QixNQUErQixFQUMvQixNQUFpQztJQUVqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBc0MsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUM1RCxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQ1AsTUFBTSxLQUFLLE1BQU07WUFDZixDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBVSxDQUFDLENBQUM7SUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUN4RCxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFdkYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQztLQUNuQyxNQUFNLENBQUM7SUFDTixnQkFBZ0IsRUFBRSxZQUFZLENBQzVCLGdEQUFnRCxFQUNoRCwwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FDNUM7Q0FDRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFPeEMsMkZBQTJGO0FBQzNGLE1BQU0sVUFBVSxTQUFTLENBQ3ZCLE1BQXNCLEVBQ3RCLFFBQXdCLElBQUksRUFDNUIsY0FBOEIsSUFBSTtJQUVsQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUEwQixDQUFDLENBQUMsQ0FBQyxDQUMzQyxDQUFDO0FBQ3pDLENBQUM7QUFxREQsaUdBQWlHO0FBQ2pHLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBNkI7SUFFN0IsTUFBTSxRQUFRLEdBQXFCO1FBQ2pDLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVztRQUNqQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7S0FDbkIsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFlLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLENBQUM7U0FDYixVQUFVLENBQ1QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFDdkUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtRQUM3QixDQUFDO2FBQ0UsTUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ25FLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUNqRCxDQUFDO2FBQ0QsTUFBTSxFQUFFO1FBQ1gsQ0FBQzthQUNFLE1BQU0sQ0FBQztZQUNOLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUN6QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0IsQ0FBQzthQUNELE1BQU0sRUFBRTtLQUNaLENBQUMsQ0FDSDtTQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsaUNBQWlDLENBQUM7U0FDbkYsTUFBTSxDQUNMLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDMUYsaUNBQWlDLENBQ2xDO1NBQ0EsUUFBUSxDQUFDLHNDQUFzQyxDQUFzQyxDQUFDO0lBQ3pGLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFzQjtJQUN4RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUIsT0FBTyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM3RSxPQUFPLFNBQVMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsS0FBYyxFQUNkLFFBQTBCLEVBQzFCLGFBQTJCO0lBRTNCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0QsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxhQUFhLEtBQUssS0FBSztZQUM1QixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDckQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsSUFBSSxhQUFhLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNoRixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxD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TyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3pELElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0UsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFzQixFQUFFLElBQXVCO0lBQ3ZFLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBvcHRpb24gcHJpbWl0aXZlcyBzaGFyZWQgYWNyb3NzIGRieC10b29scyBwYWNrYWdlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGlzTG9vcGJhY2tIb3N0LCBNQVhfVENQX1BPUlQsIHVybEJ1aWxkZXIgfSBmcm9tIFwiLi9uZXQudHNcIjtcbmltcG9ydCB7IGlzUmVjb3JkLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcbmltcG9ydCB7IHBhcnNlTGlzdCwgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMsIHRvU2x1ZyB9IGZyb20gXCIuL3N0cmluZy11dGlscy50c1wiO1xuXG5leHBvcnQgeyBNQVhfVENQX1BPUlQgfSBmcm9tIFwiLi9uZXQudHNcIjtcblxuY29uc3QgZW52aXJvbm1lbnROYW1lID0gPFQgZXh0ZW5kcyBzdHJpbmc+KG5hbWU6IFQsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHoubGl0ZXJhbChuYW1lKS5kZWZhdWx0KG5hbWUpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFXCIsIFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZSBlbnZpcm9ubWVudC5cIiksXG4gICAgaG9zdDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19IT1NUXCIsIFwiRGF0YWJyaWNrcyBob3N0IGVudmlyb25tZW50LlwiKSxcbiAgICBhY2NvdW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiLCBcIkRhdGFicmlja3MgYWNjb3VudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgd29ya3NwYWNlSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfV09SS1NQQUNFX0lEXCIsIFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNvbmZpZ0ZpbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DT05GSUdfRklMRVwiLFxuICAgICAgXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZSBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGNsaWVudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiLCBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjbGllbnRTZWNyZXQ6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DTElFTlRfU0VDUkVUXCIsXG4gICAgICBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IHNlY3JldCBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1RPS0VOXCIsIFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4gZW52aXJvbm1lbnQuXCIpLFxuICAgIGdyb3VwSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfR1JPVVBfSURcIiwgXCJEYXRhYnJpY2tzIGdyb3VwIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBhdXRoVHlwZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIiwgXCJEYXRhYnJpY2tzIGF1dGggdHlwZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwTmFtZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfTkFNRVwiLCBcIkRhdGFicmlja3MgQXBwIG5hbWUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcFBvcnQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX1BPUlRcIiwgXCJEYXRhYnJpY2tzIEFwcCBwb3J0IGVudmlyb25tZW50LlwiKSxcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBlbnZpcm9ubWVudE5hbWUoXCJMQUtFQkFTRV9FTkRQT0lOVFwiLCBcIkxha2ViYXNlIGVuZHBvaW50IGVudmlyb25tZW50LlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2UgZW52aXJvbm1lbnQgbmFtZXMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYT47XG5cbi8qKiBDYW5vbmljYWwgRGF0YWJyaWNrcyBlbnZpcm9ubWVudCBuYW1lcyBkZXJpdmVkIGZyb20gdGhlIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgY29uc3QgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSBPYmplY3QuZnJlZXplKERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbmV4cG9ydCBjb25zdCB0Y3BQb3J0U2NoZW1hID0gei5jb2VyY2VcbiAgLm51bWJlcjxudW1iZXI+KClcbiAgLmludCgpXG4gIC5taW4oMSlcbiAgLm1heChNQVhfVENQX1BPUlQpXG4gIC5kZXNjcmliZShcIlRDUCBwb3J0IGZyb20gMSB0aHJvdWdoIDY1NTM1LlwiKTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRPclplcm9TY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigwKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAwIHRocm91Z2ggNjU1MzUsIHdoZXJlIHplcm8gcmVxdWVzdHMgYXV0b21hdGljIGFsbG9jYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplZFVybFNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmltKClcbiAgLm1pbigxKVxuICAucmVmaW5lKCh2YWx1ZSkgPT4gdXJsQnVpbGRlcih2YWx1ZSkgIT09IHVuZGVmaW5lZCwge1xuICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgYSB2YWxpZCBVUkwgb3IgaG9zdC5cIixcbiAgfSlcbiAgLm92ZXJ3cml0ZShub3JtYWxpemVVcmwpXG4gIC5kZXNjcmliZShcIlVSTCBub3JtYWxpemVkIHRocm91Z2ggdGhlIHNoYXJlZCBVUkwgYnVpbGRlci5cIik7XG5cbmNvbnN0IGRhdGFicmlja3NUZXh0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcbmNvbnN0IGRhdGFicmlja3NPcHRpb25NZXRhID0gKGVudjogc3RyaW5nLCBmbGFnID0gdHJ1ZSkgPT4gKHtcbiAgZW52LFxuICBmbGFnLFxuICBoZWxwRGVmYXVsdDogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5wcm9maWxlKSxcbiAgICApLFxuICAgIGhvc3Q6IG5vcm1hbGl6ZWRVcmxTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGhvc3QuXCIpXG4gICAgICAubWV0YShkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5ob3N0LCBmYWxzZSkpLFxuICAgIGFjY291bnRJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGFjY291bnQgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hY2NvdW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIHdvcmtzcGFjZUlkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3Mgd29ya3NwYWNlIElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMud29ya3NwYWNlSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNvbmZpZ0ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgY29uZmlnIGZpbGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jb25maWdGaWxlLCBmYWxzZSksXG4gICAgKSxcbiAgICBjbGllbnRJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNsaWVudElkLCBmYWxzZSksXG4gICAgKSxcbiAgICBjbGllbnRTZWNyZXQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0LlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50U2VjcmV0LCBmYWxzZSksXG4gICAgKSxcbiAgICBhY2Nlc3NUb2tlbjogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGFjY2VzcyB0b2tlbi5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY2Vzc1Rva2VuLCBmYWxzZSksXG4gICAgKSxcbiAgICBncm91cElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgZ3JvdXAgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5ncm91cElkLCBmYWxzZSksXG4gICAgKSxcbiAgICBhdXRoVHlwZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIHR5cGUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hdXRoVHlwZSwgZmFsc2UpLFxuICAgICksXG4gICAgYXBwTmFtZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIEFwcCBuYW1lLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXBwTmFtZSwgZmFsc2UpLFxuICAgICksXG4gICAgYXBwUG9ydDogdGNwUG9ydFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgQXBwIHBvcnQuXCIpXG4gICAgICAubWV0YShkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBQb3J0LCBmYWxzZSkpLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGRhdGFicmlja3NUZXh0KFwiTGFrZWJhc2UgZW5kcG9pbnQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LCBmYWxzZSksXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNvbW1vbiBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIERhdGFicmlja3NPcHRpb25zID0gei5pbnB1dDx0eXBlb2YgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWE+O1xuXG4vKiogS2V5IGZvcm1hdCBlbWl0dGVkIGJ5IHtAbGluayBzZXJpYWxpemVPcHRzfS4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQgPSBcImZsYWdcIiB8IFwiZW52XCI7XG5cbmludGVyZmFjZSBPcHRpb25Qcm9wZXJ0eSB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZmxhZz86IGJvb2xlYW47XG59XG5cbi8qKiBTZXJpYWxpemUgY29tcGxldGUgcGFyc2VkIG9wdGlvbnMgYXMgSlNPTiBrZXllZCBieSBmbGFncyBvciBlbnZpcm9ubWVudCBuYW1lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRPcHRzKHNjaGVtYSwgdmFsdWVzLCBmb3JtYXQpLCBudWxsLCAyKTtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBhIHByb2Nlc3MgZW52aXJvbm1lbnQgbWFwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHNFbnZpcm9ubWVudDxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIFwiZW52XCIpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25WYWx1ZSh2YWx1ZSksXG4gICAgXSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGNwTGlzdGVuQWRkcmVzcyB7XG4gIHJlYWRvbmx5IHNjaGVtZTogXCJ0Y3BcIjtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXhMaXN0ZW5BZGRyZXNzIHtcbiAgcmVhZG9ubHkgc2NoZW1lOiBcInVuaXhcIjtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICBzY2hlbWU6IHoubGl0ZXJhbChcInRjcFwiKSxcbiAgICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNjaGVtZTogei5saXRlcmFsKFwidW5peFwiKSxcbiAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdHJpY3QoKSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
|
package/package.json
CHANGED
package/src/environment-utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { MAX_TCP_PORT } from "./net.ts";
|
|
1
2
|
import { toBoolean } from "./object.ts";
|
|
2
|
-
import { MAX_TCP_PORT } from "./options.ts";
|
|
3
3
|
|
|
4
4
|
function runtimeEnvironment(): Record<string, string | undefined> {
|
|
5
5
|
return (
|
|
@@ -11,7 +11,7 @@ function runtimeEnvironment(): Record<string, string | undefined> {
|
|
|
11
11
|
);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
/** Detect a Databricks App runtime from its required
|
|
14
|
+
/** Detect a Databricks App runtime from its required host and App-specific port. */
|
|
15
15
|
export function isDatabricksAppEnv(
|
|
16
16
|
source: Record<string, string | undefined> = runtimeEnvironment(),
|
|
17
17
|
): boolean {
|
|
@@ -20,7 +20,7 @@ export function isDatabricksAppEnv(
|
|
|
20
20
|
const name = source.DATABRICKS_APP_NAME?.trim();
|
|
21
21
|
const host = source.DATABRICKS_HOST?.trim();
|
|
22
22
|
const port = source.DATABRICKS_APP_PORT?.trim();
|
|
23
|
-
if (
|
|
23
|
+
if ((name && /\$\{[^}]+\}/.test(name)) || !host || !port || !/^\d+$/.test(port)) return false;
|
|
24
24
|
const parsedPort = Number(port);
|
|
25
25
|
if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > MAX_TCP_PORT) return false;
|
|
26
26
|
try {
|
package/src/net.ts
CHANGED
|
@@ -24,6 +24,9 @@ const URL_SCHEME_PREFIX = /^([A-Za-z][A-Za-z0-9+.-]*:\/\/)/;
|
|
|
24
24
|
const URL_PATH_SEGMENT_TRIM = /^\/+|\/+$/g;
|
|
25
25
|
const URL_SCHEME_SEPARATOR = "://";
|
|
26
26
|
|
|
27
|
+
/** Highest valid TCP port number. */
|
|
28
|
+
export const MAX_TCP_PORT = 65_535;
|
|
29
|
+
|
|
27
30
|
/** Total bit width of an address of each {@link IpVersion}. */
|
|
28
31
|
const IP_BITS: Readonly<Record<IpVersion, number>> = { 4: 32, 6: 128 };
|
|
29
32
|
const IPV4_OCTET = /^\d{1,3}$/;
|
package/src/options.ts
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import { isLoopbackHost, urlBuilder } from "./net.ts";
|
|
8
|
+
import { isLoopbackHost, MAX_TCP_PORT, urlBuilder } from "./net.ts";
|
|
9
9
|
import { isRecord, toBoolean } from "./object.ts";
|
|
10
10
|
import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.ts";
|
|
11
11
|
|
|
12
|
+
export { MAX_TCP_PORT } from "./net.ts";
|
|
13
|
+
|
|
12
14
|
const environmentName = <T extends string>(name: T, description: string) =>
|
|
13
15
|
z.literal(name).default(name).describe(description);
|
|
14
16
|
|
|
@@ -42,9 +44,6 @@ export type DatabricksEnvironmentNames = z.output<typeof DatabricksEnvironmentNa
|
|
|
42
44
|
/** Canonical Databricks environment names derived from the owning schema. */
|
|
43
45
|
export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
|
|
44
46
|
|
|
45
|
-
/** Highest valid TCP port number. */
|
|
46
|
-
export const MAX_TCP_PORT = 65_535;
|
|
47
|
-
|
|
48
47
|
export const tcpPortSchema = z.coerce
|
|
49
48
|
.number<number>()
|
|
50
49
|
.int()
|