@dbx-tools/databricks 0.9.154 → 0.9.158
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 +5 -4
- package/lib/index.d.ts +5 -4
- package/lib/index.js +6 -5
- package/lib/src/cloud.d.ts +3 -3
- package/lib/src/cloud.js +15 -15
- package/lib/src/databricks-fs.js +18 -18
- package/lib/src/databricks-path.d.ts +0 -3
- package/lib/src/databricks-path.js +12 -14
- package/lib/src/net.d.ts +2 -2
- package/lib/src/net.js +6 -6
- package/lib/src/workspace-client.d.ts +2 -2
- package/lib/src/workspace-client.js +11 -11
- package/package.json +8 -56
- package/src/cloud.ts +29 -16
- package/src/databricks-fs.ts +18 -18
- package/src/databricks-path.ts +17 -14
- package/src/net.ts +12 -6
- package/src/workspace-client.ts +11 -11
package/index.ts
CHANGED
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.158";
|
|
7
7
|
export * as cloud from "./src/cloud.ts";
|
|
8
8
|
export * as databricksFS from "./src/databricks-fs.ts";
|
|
9
9
|
export * as databricksPath from "./src/databricks-path.ts";
|
|
10
10
|
export * as net from "./src/net.ts";
|
|
11
11
|
export * as workspaceClient from "./src/workspace-client.ts";
|
|
12
|
-
export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
|
|
12
|
+
export { RANGE_CACHE_TTL_MS, CloudProvider, resolveCloudLocation, loadProviderRanges } from "./src/cloud.ts";
|
|
13
13
|
export type { CloudLocation } from "./src/cloud.ts";
|
|
14
14
|
export { DatabricksFileSystem } from "./src/databricks-fs.ts";
|
|
15
15
|
export type { DatabricksFileSystemClientResolver, DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
|
|
16
|
-
export {
|
|
16
|
+
export { expandHomePath, normalizeDatabricksRoot, resolveDatabricksRoot, isWorkspaceFilesPath, isVolumesPath, isDbfsPath, resolveDatabricksFilesBackend } from "./src/databricks-path.ts";
|
|
17
17
|
export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
|
|
18
|
-
export { getPublicIp } from "./src/net.ts";
|
|
18
|
+
export { getPublicIp, resolveHostIps } from "./src/net.ts";
|
|
19
|
+
export { createWorkspaceClient, refreshWorkspaceClientAuthentication, toLegacyWorkspaceClient, tryGetWorkspaceClient, getWorkspaceClient, getCurrentUserName, getWorkspaceUrl, getWorkspaceId } from "./src/workspace-client.ts";
|
|
19
20
|
export type { WorkspaceClient } from "./src/workspace-client.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.158";
|
|
3
3
|
export * as cloud from "./src/cloud.ts";
|
|
4
4
|
export * as databricksFS from "./src/databricks-fs.ts";
|
|
5
5
|
export * as databricksPath from "./src/databricks-path.ts";
|
|
6
6
|
export * as net from "./src/net.ts";
|
|
7
7
|
export * as workspaceClient from "./src/workspace-client.ts";
|
|
8
|
-
export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
|
|
8
|
+
export { RANGE_CACHE_TTL_MS, CloudProvider, resolveCloudLocation, loadProviderRanges } from "./src/cloud.ts";
|
|
9
9
|
export type { CloudLocation } from "./src/cloud.ts";
|
|
10
10
|
export { DatabricksFileSystem } from "./src/databricks-fs.ts";
|
|
11
11
|
export type { DatabricksFileSystemClientResolver, DatabricksFileSystemOptions, DatabricksStreamWriteOptions } from "./src/databricks-fs.ts";
|
|
12
|
-
export {
|
|
12
|
+
export { expandHomePath, normalizeDatabricksRoot, resolveDatabricksRoot, isWorkspaceFilesPath, isVolumesPath, isDbfsPath, resolveDatabricksFilesBackend } from "./src/databricks-path.ts";
|
|
13
13
|
export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
|
|
14
|
-
export { getPublicIp } from "./src/net.ts";
|
|
14
|
+
export { getPublicIp, resolveHostIps } from "./src/net.ts";
|
|
15
|
+
export { createWorkspaceClient, refreshWorkspaceClientAuthentication, toLegacyWorkspaceClient, tryGetWorkspaceClient, getWorkspaceClient, getCurrentUserName, getWorkspaceUrl, getWorkspaceId } from "./src/workspace-client.ts";
|
|
15
16
|
export type { WorkspaceClient } from "./src/workspace-client.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.158";
|
|
6
6
|
export * as cloud from "./src/cloud.js";
|
|
7
7
|
export * as databricksFS from "./src/databricks-fs.js";
|
|
8
8
|
export * as databricksPath from "./src/databricks-path.js";
|
|
9
9
|
export * as net from "./src/net.js";
|
|
10
10
|
export * as workspaceClient from "./src/workspace-client.js";
|
|
11
|
-
export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.js";
|
|
11
|
+
export { RANGE_CACHE_TTL_MS, CloudProvider, resolveCloudLocation, loadProviderRanges } from "./src/cloud.js";
|
|
12
12
|
export { DatabricksFileSystem } from "./src/databricks-fs.js";
|
|
13
|
-
export {
|
|
14
|
-
export { getPublicIp } from "./src/net.js";
|
|
15
|
-
|
|
13
|
+
export { expandHomePath, normalizeDatabricksRoot, resolveDatabricksRoot, isWorkspaceFilesPath, isVolumesPath, isDbfsPath, resolveDatabricksFilesBackend } from "./src/databricks-path.js";
|
|
14
|
+
export { getPublicIp, resolveHostIps } from "./src/net.js";
|
|
15
|
+
export { createWorkspaceClient, refreshWorkspaceClientAuthentication, toLegacyWorkspaceClient, tryGetWorkspaceClient, getWorkspaceClient, getCurrentUserName, getWorkspaceUrl, getWorkspaceId } from "./src/workspace-client.js";
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTFMLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQ0FBb0MsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNThcIjtcbmV4cG9ydCAqIGFzIGNsb3VkIGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0ICogYXMgZGF0YWJyaWNrc0ZTIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzUGF0aCBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlQ2xpZW50IGZyb20gXCIuL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSQU5HRV9DQUNIRV9UVExfTVMsIENsb3VkUHJvdmlkZXIsIHJlc29sdmVDbG91ZExvY2F0aW9uLCBsb2FkUHJvdmlkZXJSYW5nZXMgfSBmcm9tIFwiLi9zcmMvY2xvdWQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xvdWRMb2NhdGlvbiB9IGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0gfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbUNsaWVudFJlc29sdmVyLCBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMsIERhdGFicmlja3NTdHJlYW1Xcml0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0IHsgZXhwYW5kSG9tZVBhdGgsIG5vcm1hbGl6ZURhdGFicmlja3NSb290LCByZXNvbHZlRGF0YWJyaWNrc1Jvb3QsIGlzV29ya3NwYWNlRmlsZXNQYXRoLCBpc1ZvbHVtZXNQYXRoLCBpc0RiZnNQYXRoLCByZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCwgTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zLCBSZXNvbHZlRGF0YWJyaWNrc1Jvb3RPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtcGF0aC50c1wiO1xuZXhwb3J0IHsgZ2V0UHVibGljSXAsIHJlc29sdmVIb3N0SXBzIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHsgY3JlYXRlV29ya3NwYWNlQ2xpZW50LCByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24sIHRvTGVnYWN5V29ya3NwYWNlQ2xpZW50LCB0cnlHZXRXb3Jrc3BhY2VDbGllbnQsIGdldFdvcmtzcGFjZUNsaWVudCwgZ2V0Q3VycmVudFVzZXJOYW1lLCBnZXRXb3Jrc3BhY2VVcmwsIGdldFdvcmtzcGFjZUlkIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcbiJdfQ==
|
package/lib/src/cloud.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @module
|
|
20
20
|
*/
|
|
21
|
-
import {
|
|
21
|
+
import { type Cidr, type UrlLike } from "@dbx-tools/shared-core";
|
|
22
22
|
/** How long a fetched provider IP-range feed is reused before refetch. */
|
|
23
23
|
export declare const RANGE_CACHE_TTL_MS: number;
|
|
24
24
|
/** Cloud hyperscaler a host resolves into. */
|
|
@@ -40,7 +40,7 @@ export interface CloudLocation {
|
|
|
40
40
|
cidr: string;
|
|
41
41
|
}
|
|
42
42
|
/** A parsed CIDR block tagged with the region it belongs to. */
|
|
43
|
-
interface RegionCidr extends
|
|
43
|
+
interface RegionCidr extends Cidr {
|
|
44
44
|
region: string;
|
|
45
45
|
}
|
|
46
46
|
/** One provider's parsed, region-tagged range table. */
|
|
@@ -67,7 +67,7 @@ interface ProviderRanges {
|
|
|
67
67
|
* // { provider: CloudProvider.Aws,
|
|
68
68
|
* // region: "us-west-2", ip: "...", cidr: "..." }
|
|
69
69
|
*/
|
|
70
|
-
export declare function resolveCloudLocation(input:
|
|
70
|
+
export declare function resolveCloudLocation(input: UrlLike): Promise<CloudLocation | null>;
|
|
71
71
|
/**
|
|
72
72
|
* Load every provider's region-tagged range table, each cached for
|
|
73
73
|
* {@link RANGE_CACHE_TTL_MS}. Providers are loaded in parallel and a
|
package/lib/src/cloud.js
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
22
22
|
import { tmpdir } from "node:os";
|
|
23
23
|
import { dirname, join } from "node:path";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { statSync } from "@dbx-tools/core";
|
|
25
|
+
import { log, toError, memoize, fnvHash, id, createFetchError, parse, parseIp, findContainingCidr, parseCidr, } from "@dbx-tools/shared-core";
|
|
26
26
|
import { resolveHostIps } from "./net.js";
|
|
27
27
|
const logger = log.logger("cloud");
|
|
28
28
|
/** How long a fetched provider IP-range feed is reused before refetch. */
|
|
@@ -73,11 +73,11 @@ export async function resolveCloudLocation(input) {
|
|
|
73
73
|
}
|
|
74
74
|
const providers = await loadProviderRanges();
|
|
75
75
|
for (const ip of ips) {
|
|
76
|
-
const parsed =
|
|
76
|
+
const parsed = parseIp(ip);
|
|
77
77
|
if (!parsed)
|
|
78
78
|
continue;
|
|
79
79
|
for (const { provider, ranges } of providers) {
|
|
80
|
-
const match =
|
|
80
|
+
const match = findContainingCidr(parsed, ranges);
|
|
81
81
|
if (match) {
|
|
82
82
|
return { provider, region: match.region, ip, cidr: match.cidr };
|
|
83
83
|
}
|
|
@@ -102,7 +102,7 @@ export async function loadProviderRanges() {
|
|
|
102
102
|
out.push(result.value);
|
|
103
103
|
}
|
|
104
104
|
else {
|
|
105
|
-
logger.warn("provider range load failed", { error:
|
|
105
|
+
logger.warn("provider range load failed", { error: toError(result.reason) });
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
return out;
|
|
@@ -110,9 +110,9 @@ export async function loadProviderRanges() {
|
|
|
110
110
|
// ────────────────────────────────────────────────────────────────
|
|
111
111
|
// Per-provider cached loaders
|
|
112
112
|
// ────────────────────────────────────────────────────────────────
|
|
113
|
-
const loadAwsRanges =
|
|
114
|
-
const loadAzureRanges =
|
|
115
|
-
const loadGcpRanges =
|
|
113
|
+
const loadAwsRanges = memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
114
|
+
const loadAzureRanges = memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
115
|
+
const loadGcpRanges = memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
116
116
|
/**
|
|
117
117
|
* AWS `ip-ranges.json`: a flat list of IPv4 (`prefixes`) and IPv6
|
|
118
118
|
* (`ipv6_prefixes`) blocks, each already tagged with a `region` such
|
|
@@ -178,7 +178,7 @@ async function fetchAzureRanges() {
|
|
|
178
178
|
function addRange(ranges, cidr, region) {
|
|
179
179
|
if (!cidr || !region)
|
|
180
180
|
return;
|
|
181
|
-
const parsed =
|
|
181
|
+
const parsed = parseCidr(cidr);
|
|
182
182
|
if (parsed)
|
|
183
183
|
ranges.push({ ...parsed, region });
|
|
184
184
|
}
|
|
@@ -190,7 +190,7 @@ function addRange(ranges, cidr, region) {
|
|
|
190
190
|
*/
|
|
191
191
|
async function fetchJson(url) {
|
|
192
192
|
const text = await fetchText(url);
|
|
193
|
-
const parsed =
|
|
193
|
+
const parsed = parse(text);
|
|
194
194
|
if (parsed === undefined) {
|
|
195
195
|
throw new Error(`range feed returned non-JSON content: ${url}`);
|
|
196
196
|
}
|
|
@@ -206,7 +206,7 @@ async function fetchJson(url) {
|
|
|
206
206
|
async function fetchText(url) {
|
|
207
207
|
const cacheDir = join(tmpdir(), "dbx-tools", "shared", "cloud");
|
|
208
208
|
const cacheDirCreated = await mkdir(cacheDir, { recursive: true });
|
|
209
|
-
const cachePath = join(cacheDir, `fetch-${
|
|
209
|
+
const cachePath = join(cacheDir, `fetch-${fnvHash(url)}.txt`);
|
|
210
210
|
const createdAt = cacheDirCreated ? undefined : await getCreated(cachePath);
|
|
211
211
|
if (createdAt) {
|
|
212
212
|
const expiresAt = new Date(createdAt.getTime() + RANGE_CACHE_TTL_MS);
|
|
@@ -215,11 +215,11 @@ async function fetchText(url) {
|
|
|
215
215
|
return readFile(cachePath, "utf8");
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
|
-
let tempPath = join(cacheDir, `${
|
|
218
|
+
let tempPath = join(cacheDir, `${id()}.txt`);
|
|
219
219
|
try {
|
|
220
220
|
const response = await fetch(url);
|
|
221
221
|
if (!response.ok) {
|
|
222
|
-
throw await
|
|
222
|
+
throw await createFetchError(response, url);
|
|
223
223
|
}
|
|
224
224
|
const responseText = await response.text();
|
|
225
225
|
await mkdir(dirname(tempPath), { recursive: true });
|
|
@@ -237,6 +237,6 @@ async function fetchText(url) {
|
|
|
237
237
|
}
|
|
238
238
|
/** Birth time of `path`, or `undefined` when it doesn't exist yet. */
|
|
239
239
|
async function getCreated(path) {
|
|
240
|
-
return (await
|
|
240
|
+
return (await statSync(path))?.birthtime;
|
|
241
241
|
}
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkMsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0RCxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsa0VBQWtFO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQ3JFOzs7O0dBSUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLGdFQUFnRSxDQUFDO0FBQzdGLDhGQUE4RjtBQUM5RixNQUFNLGVBQWUsR0FDbkIsa0ZBQWtGLENBQUM7QUFFckYsOENBQThDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsNEJBQVcsQ0FBQTtJQUNYLGdD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QUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmVzdC1lZmZvcnQgZ2VvbG9jYXRpb24gb2YgYSBob3N0IHRvIHRoZSBjbG91ZCBwcm92aWRlciBhbmQgcmVnaW9uIGl0XG4gKiBydW5zIGluLiBSZXNvbHZlcyB0aGUgaG9zdCB0byBpdHMgSVAgYWRkcmVzcyhlcykgdmlhIEROUywgdGhlbiBtYXRjaGVzXG4gKiB0aG9zZSBhZGRyZXNzZXMgYWdhaW5zdCB0aGUgcHVibGljIElQLXJhbmdlIGZlZWRzIGVhY2ggaHlwZXJzY2FsZXJcbiAqIHB1Ymxpc2hlcyAoQVdTLCBBenVyZSwgR0NQKS4gSGFuZHkgZm9yIHBsYWNpbmcgYSBEYXRhYnJpY2tzIHdvcmtzcGFjZVxuICogVVJMLCBidXQgd29ya3MgZm9yIGFueSBob3N0LlxuICpcbiAqIFRoZSByYW5nZSBmZWVkcyBhcmUgbGFyZ2UgYW5kIGNoYW5nZSBzbG93bHksIHNvIGVhY2ggcHJvdmlkZXIncyBmZWVkXG4gKiBpcyBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9ICgyNCBob3VycykgYXQgdHdvIGxheWVyczogYW5cbiAqIG9uLWRpc2sgY29weSB1bmRlciB0aGUgT1MgdGVtcCBkaXIgKHN1cnZpdmVzIHByb2Nlc3MgcmVzdGFydHMsIHNoYXJlZFxuICogYWNyb3NzIHByb2Nlc3NlcykgcGx1cyBhbiBpbi1wcm9jZXNzIG1lbW9pemVkIHBhcnNlLiBBIHByb3ZpZGVyIHdob3NlXG4gKiBmZWVkIGZhaWxzIHRvIGxvYWQgaXMgc2tpcHBlZCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsb29rdXAgLVxuICogdGhlIG90aGVyIHByb3ZpZGVycyBzdGlsbCBhbnN3ZXIuXG4gKlxuICogU2VydmVyLW9ubHk6IEROUyByZXNvbHV0aW9uIG5lZWRzIGBub2RlOmRuc2AgKHZpYSBgLi9uZXQudHNgKSwgdGhlXG4gKiBkaXNrIGNhY2hlIG5lZWRzIGBub2RlOmZzYCAvIGBub2RlOm9zYCAvIGBub2RlOnBhdGhgLCBhbmQgdGhlIGZlZWRzXG4gKiBhcmUgZmV0Y2hlZCB3aXRoIHRoZSBnbG9iYWwgYGZldGNoYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBmaWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgZnVuY3Rpb25VdGlscywgaGFzaCwgaHR0cCwganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZUhvc3RJcHMgfSBmcm9tIFwiLi9uZXQudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNsb3VkXCIpO1xuXG4vKiogSG93IGxvbmcgYSBmZXRjaGVkIHByb3ZpZGVyIElQLXJhbmdlIGZlZWQgaXMgcmV1c2VkIGJlZm9yZSByZWZldGNoLiAqL1xuZXhwb3J0IGNvbnN0IFJBTkdFX0NBQ0hFX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBBV1MgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgQVdTX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vaXAtcmFuZ2VzLmFtYXpvbmF3cy5jb20vaXAtcmFuZ2VzLmpzb25cIjtcbi8qKiBHQ1AgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgR0NQX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2lwcmFuZ2VzL2Nsb3VkLmpzb25cIjtcbi8qKlxuICogQXp1cmUgaGFzIG5vIHN0YWJsZSBmZWVkIFVSTCAtIHRoZSBKU09OIGRvd25sb2FkIGxpbmsgKHdpdGggYVxuICogcm90YXRpbmcgZGF0ZSBzdGFtcCkgbGl2ZXMgb24gdGhpcyBodW1hbi1mYWNpbmcgZG93bmxvYWQgcGFnZSBhbmRcbiAqIG11c3QgYmUgc2NyYXBlZCBvdXQuIFNlZSB7QGxpbmsgZmV0Y2hBenVyZVJhbmdlc30uXG4gKi9cbmNvbnN0IEFaVVJFX0RPV05MT0FEX1BBR0UgPSBcImh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTU2NTE5XCI7XG4vKiogUmVnZXggdGhhdCBwbHVja3MgdGhlIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIEF6dXJlIHBhZ2UuICovXG5jb25zdCBBWlVSRV9KU09OX0xJTksgPVxuICAvaHR0cHM6XFwvXFwvZG93bmxvYWRcXC5taWNyb3NvZnRcXC5jb21cXC9kb3dubG9hZFxcL1teXCInXSpTZXJ2aWNlVGFnc19QdWJsaWNfXFxkK1xcLmpzb24vO1xuXG4vKiogQ2xvdWQgaHlwZXJzY2FsZXIgYSBob3N0IHJlc29sdmVzIGludG8uICovXG5leHBvcnQgZW51bSBDbG91ZFByb3ZpZGVyIHtcbiAgQXdzID0gXCJhd3NcIixcbiAgQXp1cmUgPSBcImF6dXJlXCIsXG4gIEdjcCA9IFwiZ2NwXCIsXG59XG5cbi8qKlxuICogV2hlcmUgYSBob3N0IGxpdmVzOiB0aGUge0BsaW5rIENsb3VkUHJvdmlkZXJ9LCB0aGUgcHJvdmlkZXItbmF0aXZlXG4gKiBgcmVnaW9uYCBzdHJpbmcgKHdoYXRldmVyIHRoZSBwcm92aWRlcidzIGZlZWQgY2FsbHMgaXQsIGUuZy5cbiAqIGBcInVzLWVhc3QtMVwiYCBvbiBBV1MsIGBcImVhc3R1czJcImAgb24gQXp1cmUsIGBcInVzLWVhc3QxXCJgIG9uIEdDUCksIHRoZVxuICogcmVzb2x2ZWQgYGlwYCB0aGF0IG1hdGNoZWQsIGFuZCB0aGUgYGNpZHJgIGJsb2NrIGl0IGZlbGwgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRMb2NhdGlvbiB7XG4gIHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyO1xuICByZWdpb246IHN0cmluZztcbiAgaXA6IHN0cmluZztcbiAgY2lkcjogc3RyaW5nO1xufVxuXG4vKiogQSBwYXJzZWQgQ0lEUiBibG9jayB0YWdnZWQgd2l0aCB0aGUgcmVnaW9uIGl0IGJlbG9uZ3MgdG8uICovXG5pbnRlcmZhY2UgUmVnaW9uQ2lkciBleHRlbmRzIG5ldC5DaWRyIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcHJvdmlkZXIncyBwYXJzZWQsIHJlZ2lvbi10YWdnZWQgcmFuZ2UgdGFibGUuICovXG5pbnRlcmZhY2UgUHJvdmlkZXJSYW5nZXMge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmFuZ2VzOiBSZWdpb25DaWRyW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgaW5wdXRgJ3MgaG9zdCB0byBhIHtAbGluayBDbG91ZExvY2F0aW9ufSwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBob3N0IGNhbid0IGJlIHJlc29sdmVkIG9yIG5vbmUgb2YgaXRzIElQcyBtYXRjaCBhIGtub3duIGNsb3VkIHJhbmdlLlxuICogYGlucHV0YCBpcyBhbnkge0BsaW5rIG5ldC5VcmxMaWtlfSAtIGEgVVJMLCBhIGJhcmUgaG9zdCwgb3IgYSBgeyB1cmwgfWBcbiAqIHdyYXBwZXIuXG4gKlxuICogVGhlIHByb3ZpZGVyIHJhbmdlIGZlZWRzIGFyZSBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LCBzb1xuICogb25seSB0aGUgZmlyc3QgY2FsbCBpbiBhIDI0LWhvdXIgd2luZG93IHBheXMgdGhlIGZldGNoIGNvc3Q7IHRoZSBETlNcbiAqIGxvb2t1cCBoYXBwZW5zIG9uIGV2ZXJ5IGNhbGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiaHR0cHM6Ly9hZGItMTIzNDU2Nzg5MC43LmF6dXJlZGF0YWJyaWNrcy5uZXRcIik7XG4gKiAvLyB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLFxuICogLy8gICByZWdpb246IFwiZWFzdHVzMlwiLCBpcDogXCIuLi5cIiwgY2lkcjogXCIuLi5cIiB9XG4gKlxuICogYXdhaXQgcmVzb2x2ZUNsb3VkTG9jYXRpb24oXCJkYmMtYWJjMTIzLmNsb3VkLmRhdGFicmlja3MuY29tXCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5Bd3MsXG4gKiAvLyAgIHJlZ2lvbjogXCJ1cy13ZXN0LTJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsb3VkTG9jYXRpb24oaW5wdXQ6IG5ldC5VcmxMaWtlKTogUHJvbWlzZTxDbG91ZExvY2F0aW9uIHwgbnVsbD4ge1xuICBjb25zdCBpcHMgPSBhd2FpdCByZXNvbHZlSG9zdElwcyhpbnB1dCk7XG4gIGlmIChpcHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwibm8gaXBzIHJlc29sdmVkXCIsIHsgaW5wdXQ6IFN0cmluZyhpbnB1dCkgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgbG9hZFByb3ZpZGVyUmFuZ2VzKCk7XG4gIGZvciAoY29uc3QgaXAgb2YgaXBzKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV0LnBhcnNlSXAoaXApO1xuICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvdmlkZXIsIHJhbmdlcyB9IG9mIHByb3ZpZGVycykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBuZXQuZmluZENvbnRhaW5pbmdDaWRyKHBhcnNlZCwgcmFuZ2VzKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlciwgcmVnaW9uOiBtYXRjaC5yZWdpb24sIGlwLCBjaWRyOiBtYXRjaC5jaWRyIH07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm5vIGNsb3VkIHJhbmdlIG1hdGNoZWRcIiwgeyBpcHMgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIExvYWQgZXZlcnkgcHJvdmlkZXIncyByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLCBlYWNoIGNhY2hlZCBmb3JcbiAqIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LiBQcm92aWRlcnMgYXJlIGxvYWRlZCBpbiBwYXJhbGxlbCBhbmQgYVxuICogZmVlZCB0aGF0IGZhaWxzIHRvIGZldGNoIG9yIHBhcnNlIGlzIGRyb3BwZWQgKGxvZ2dlZCwgbm90IHRocm93bikgc29cbiAqIGEgc2luZ2xlIGZsYWt5IGZlZWQgbmV2ZXIgc2lua3MgdGhlIHdob2xlIGxvb2t1cC4gRXhwb3NlZCBmb3IgY2FsbGVyc1xuICogdGhhdCB3YW50IHRvIG1hdGNoIG1hbnkgSVBzIGFnYWluc3Qgb25lIGNhY2hlZCBzbmFwc2hvdCB3aXRob3V0IGEgRE5TXG4gKiBzdGVwIHBlciBhZGRyZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVyUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXNbXT4ge1xuICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtsb2FkQXdzUmFuZ2VzKCksIGxvYWRBenVyZVJhbmdlcygpLCBsb2FkR2NwUmFuZ2VzKCldKTtcbiAgY29uc3Qgb3V0OiBQcm92aWRlclJhbmdlc1tdID0gW107XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHNldHRsZWQpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgb3V0LnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJwcm92aWRlciByYW5nZSBsb2FkIGZhaWxlZFwiLCB7IGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IocmVzdWx0LnJlYXNvbikgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGVyLXByb3ZpZGVyIGNhY2hlZCBsb2FkZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgbG9hZEF3c1JhbmdlcyA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShmZXRjaEF3c1JhbmdlcywgeyB0dGxNczogUkFOR0VfQ0FDSEVfVFRMX01TIH0pO1xuY29uc3QgbG9hZEF6dXJlUmFuZ2VzID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGZldGNoQXp1cmVSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcbmNvbnN0IGxvYWRHY3BSYW5nZXMgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoZmV0Y2hHY3BSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQcm92aWRlciBmZWVkIGZldGNoICsgcGFyc2Vcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQXdzRmVlZCB7XG4gIHByZWZpeGVzPzogeyBpcF9wcmVmaXg/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9W107XG4gIGlwdjZfcHJlZml4ZXM/OiB7IGlwdjZfcHJlZml4Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfVtdO1xufVxuXG4vKipcbiAqIEFXUyBgaXAtcmFuZ2VzLmpzb25gOiBhIGZsYXQgbGlzdCBvZiBJUHY0IChgcHJlZml4ZXNgKSBhbmQgSVB2NlxuICogKGBpcHY2X3ByZWZpeGVzYCkgYmxvY2tzLCBlYWNoIGFscmVhZHkgdGFnZ2VkIHdpdGggYSBgcmVnaW9uYCBzdWNoXG4gKiBhcyBgXCJ1cy1lYXN0LTFcImAgKG9yIGBcIkdMT0JBTFwiYCBmb3IgZWRnZSByYW5nZXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEF3c1JhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248QXdzRmVlZD4oQVdTX1JBTkdFU19VUkwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQucHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwX3ByZWZpeCwgZW50cnkucmVnaW9uKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQuaXB2Nl9wcmVmaXhlcyA/PyBbXSkge1xuICAgIGFkZFJhbmdlKHJhbmdlcywgZW50cnkuaXB2Nl9wcmVmaXgsIGVudHJ5LnJlZ2lvbik7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGF3cyByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXdzLCByYW5nZXMgfTtcbn1cblxuaW50ZXJmYWNlIEdjcEZlZWQge1xuICBwcmVmaXhlcz86IHsgaXB2NFByZWZpeD86IHN0cmluZzsgaXB2NlByZWZpeD86IHN0cmluZzsgc2NvcGU/OiBzdHJpbmcgfVtdO1xufVxuXG4vKipcbiAqIEdDUCBgY2xvdWQuanNvbmA6IGEgbGlzdCBvZiBibG9ja3MgZWFjaCBjYXJyeWluZyBhbiBgaXB2NFByZWZpeGAgb3JcbiAqIGBpcHY2UHJlZml4YCBhbmQgYSBgc2NvcGVgIHRoYXQgaXMgdGhlIHJlZ2lvbiAoYFwidXMtZWFzdDFcImApIG9yXG4gKiBgXCJnbG9iYWxcImAgZm9yIG5vbi1yZWdpb25hbCByYW5nZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoR2NwUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXM+IHtcbiAgY29uc3QgZmVlZCA9IGF3YWl0IGZldGNoSnNvbjxHY3BGZWVkPihHQ1BfUkFOR0VTX1VSTCk7XG4gIGNvbnN0IHJhbmdlczogUmVnaW9uQ2lkcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5wcmVmaXhlcyA/PyBbXSkge1xuICAgIGFkZFJhbmdlKHJhbmdlcywgZW50cnkuaXB2NFByZWZpeCA/PyBlbnRyeS5pcHY2UHJlZml4LCBlbnRyeS5zY29wZSk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGdjcCByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuR2NwLCByYW5nZXMgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlRmVlZCB7XG4gIHZhbHVlcz86IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHByb3BlcnRpZXM/OiB7IHJlZ2lvbj86IHN0cmluZzsgYWRkcmVzc1ByZWZpeGVzPzogc3RyaW5nW10gfTtcbiAgfVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIHNlcnZpY2UgdGFnczogTWljcm9zb2Z0IHNoaXBzIG5vIHN0YWJsZSBmZWVkIFVSTCwgc28gc2NyYXBlIHRoZVxuICogY3VycmVudCBgU2VydmljZVRhZ3NfUHVibGljXzxkYXRlPi5qc29uYCBsaW5rIG9mZiB0aGUgZG93bmxvYWQgcGFnZVxuICogYW5kIGZldGNoIGl0LiBPbmx5IHRoZSByZWdpb25hbCBgQXp1cmVDbG91ZC48cmVnaW9uPmAgYWdncmVnYXRlc1xuICogKHdoaWNoIGhhdmUgYSBub24tZW1wdHkgYHJlZ2lvbmApIGFyZSBrZXB0OyB0aGUgY2xvdWQtd2lkZVxuICogYEF6dXJlQ2xvdWRgIHRhZyBhbmQgcGVyLXNlcnZpY2UgdGFncyBhcmUgaWdub3JlZCBzbyBhbiBhZGRyZXNzIG1hcHNcbiAqIGNsZWFubHkgdG8gb25lIHJlZ2lvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBenVyZVJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaFRleHQoQVpVUkVfRE9XTkxPQURfUEFHRSk7XG4gIGNvbnN0IGpzb25VcmwgPSBwYWdlLm1hdGNoKEFaVVJFX0pTT05fTElOSyk/LlswXTtcbiAgaWYgKCFqc29uVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGZpbmQgU2VydmljZVRhZ3MgSlNPTiBsaW5rIG9uIEF6dXJlIGRvd25sb2FkIHBhZ2VcIik7XG4gIH1cbiAgY29uc3QgZmVlZCA9IGF3YWl0IGZldGNoSnNvbjxBenVyZUZlZWQ+KGpzb25VcmwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZlZWQudmFsdWVzID8/IFtdKSB7XG4gICAgY29uc3QgcmVnaW9uID0gdmFsdWUucHJvcGVydGllcz8ucmVnaW9uO1xuICAgIGlmICghcmVnaW9uIHx8ICF2YWx1ZS5uYW1lPy5zdGFydHNXaXRoKFwiQXp1cmVDbG91ZC5cIikpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIHZhbHVlLnByb3BlcnRpZXM/LmFkZHJlc3NQcmVmaXhlcyA/PyBbXSkge1xuICAgICAgYWRkUmFuZ2UocmFuZ2VzLCBwcmVmaXgsIHJlZ2lvbik7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBhenVyZSByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXp1cmUsIHJhbmdlcyB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUGFyc2UgYGNpZHJgIGFuZCwgd2hlbiB2YWxpZCBhbmQgYHJlZ2lvbmAgaXMgc2V0LCBwdXNoIGEgdGFnZ2VkIHJhbmdlLiAqL1xuZnVuY3Rpb24gYWRkUmFuZ2UocmFuZ2VzOiBSZWdpb25DaWRyW10sIGNpZHI/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWNpZHIgfHwgIXJlZ2lvbikgcmV0dXJuO1xuICBjb25zdCBwYXJzZWQgPSBuZXQucGFyc2VDaWRyKGNpZHIpO1xuICBpZiAocGFyc2VkKSByYW5nZXMucHVzaCh7IC4uLnBhcnNlZCwgcmVnaW9uIH0pO1xufVxuXG4vKipcbiAqIEZldGNoIGFuZCBwYXJzZSBhIHByb3ZpZGVyIGZlZWQuIEEgcGFyc2UgZmFpbHVyZSBuYW1lcyB0aGUgVVJMIHJhdGhlciB0aGFuXG4gKiBzdXJmYWNpbmcgYW4gb3BhcXVlIGBVbmV4cGVjdGVkIHRva2VuYCAtIHRoZSB0ZXh0IG1heSBjb21lIGZyb20gdGhlIG9uLWRpc2tcbiAqIGNhY2hlLCBzbyBcIndoaWNoIGZlZWRcIiBpcyB0aGUgcGFydCB3b3J0aCBrbm93aW5nLiB7QGxpbmsgbG9hZFByb3ZpZGVyUmFuZ2VzfVxuICogdHVybnMgdGhlIHRocm93IGludG8gYSBwZXItcHJvdmlkZXIgd2FybmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uPFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFRleHQodXJsKTtcbiAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZTxUPih0ZXh0KTtcbiAgaWYgKHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByYW5nZSBmZWVkIHJldHVybmVkIG5vbi1KU09OIGNvbnRlbnQ6ICR7dXJsfWApO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggYHVybGAgYXMgdGV4dCB3aXRoIGEgMjRoIG9uLWRpc2sgY2FjaGUgdW5kZXIgdGhlIE9TIHRlbXAgZGlyXG4gKiAoa2V5ZWQgYnkgYW4gRk5WIGhhc2ggb2YgdGhlIFVSTCkuIEEgZnJlc2ggY2FjaGUgZmlsZSBpcyByZXR1cm5lZFxuICogZGlyZWN0bHk7IGEgbWlzcy9leHBpcnkgZmV0Y2hlcywgd3JpdGVzIHRvIGEgdW5pcXVlIHRlbXAgZmlsZSwgYW5kXG4gKiBhdG9taWNhbGx5IHJlbmFtZXMgaXQgaW50byBwbGFjZSBzbyBjb25jdXJyZW50IGNhbGxlcnMgbmV2ZXIgb2JzZXJ2ZVxuICogYSBoYWxmLXdyaXR0ZW4gY2FjaGUgZW50cnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVGV4dCh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbih0bXBkaXIoKSwgXCJkYngtdG9vbHNcIiwgXCJzaGFyZWRcIiwgXCJjbG91ZFwiKTtcbiAgY29uc3QgY2FjaGVEaXJDcmVhdGVkID0gYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZVBhdGggPSBqb2luKGNhY2hlRGlyLCBgZmV0Y2gtJHtoYXNoLmZudkhhc2godXJsKX0udHh0YCk7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IGNhY2hlRGlyQ3JlYXRlZCA/IHVuZGVmaW5lZCA6IGF3YWl0IGdldENyZWF0ZWQoY2FjaGVQYXRoKTtcbiAgaWYgKGNyZWF0ZWRBdCkge1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IG5ldyBEYXRlKGNyZWF0ZWRBdC5nZXRUaW1lKCkgKyBSQU5HRV9DQUNIRV9UVExfTVMpO1xuICAgIGlmIChleHBpcmVzQXQgPiBuZXcgRGF0ZSgpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJjYWNoZWQgZmV0Y2ggaGl0XCIsIHsgdXJsLCBjYWNoZVBhdGggfSk7XG4gICAgICByZXR1cm4gcmVhZEZpbGUoY2FjaGVQYXRoLCBcInV0ZjhcIik7XG4gICAgfVxuICB9XG4gIGxldCB0ZW1wUGF0aDogc3RyaW5nIHwgbnVsbCA9IGpvaW4oY2FjaGVEaXIsIGAke2hhc2guaWQoKX0udHh0YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IGF3YWl0IGh0dHAuY3JlYXRlRmV0Y2hFcnJvcihyZXNwb25zZSwgdXJsKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUodGVtcFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIHJlc3BvbnNlVGV4dCk7XG5cbiAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIGNhY2hlUGF0aCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGVkIGZldGNoIGxvYWRcIiwgeyB1cmwsIGNhY2hlUGF0aCB9KTtcbiAgICB0ZW1wUGF0aCA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3BvbnNlVGV4dDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcFBhdGgpIHtcbiAgICAgIGF3YWl0IHVubGluayh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBCaXJ0aCB0aW1lIG9mIGBwYXRoYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBkb2Vzbid0IGV4aXN0IHlldC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENyZWF0ZWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiAoYXdhaXQgZmlsZS5zdGF0U3luYyhwYXRoKSk/LmJpcnRodGltZTtcbn1cbiJdfQ==
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxHQUFHLEVBQ0gsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEVBQ1AsRUFBRSxFQUNGLGdCQUFnQixFQUNoQixLQUFLLEVBR0wsT0FBTyxFQUNQLGtCQUFrQixFQUNsQixTQUFTLEdBQ1YsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkMsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0RCxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsa0VBQWtFO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQ3JFOzs7O0dBSUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLGdFQUFnRSxDQUFDO0FBQzdGLDhGQUE4RjtBQUM5RixNQUFNLGVBQWUsR0FDbkIsa0ZBQWtGLENBQUM7QUFFckYsOENBQThDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFK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QUNILENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXN0LWVmZm9ydCBnZW9sb2NhdGlvbiBvZiBhIGhvc3QgdG8gdGhlIGNsb3VkIHByb3ZpZGVyIGFuZCByZWdpb24gaXRcbiAqIHJ1bnMgaW4uIFJlc29sdmVzIHRoZSBob3N0IHRvIGl0cyBJUCBhZGRyZXNzKGVzKSB2aWEgRE5TLCB0aGVuIG1hdGNoZXNcbiAqIHRob3NlIGFkZHJlc3NlcyBhZ2FpbnN0IHRoZSBwdWJsaWMgSVAtcmFuZ2UgZmVlZHMgZWFjaCBoeXBlcnNjYWxlclxuICogcHVibGlzaGVzIChBV1MsIEF6dXJlLCBHQ1ApLiBIYW5keSBmb3IgcGxhY2luZyBhIERhdGFicmlja3Mgd29ya3NwYWNlXG4gKiBVUkwsIGJ1dCB3b3JrcyBmb3IgYW55IGhvc3QuXG4gKlxuICogVGhlIHJhbmdlIGZlZWRzIGFyZSBsYXJnZSBhbmQgY2hhbmdlIHNsb3dseSwgc28gZWFjaCBwcm92aWRlcidzIGZlZWRcbiAqIGlzIGNhY2hlZCBmb3Ige0BsaW5rIFJBTkdFX0NBQ0hFX1RUTF9NU30gKDI0IGhvdXJzKSBhdCB0d28gbGF5ZXJzOiBhblxuICogb24tZGlzayBjb3B5IHVuZGVyIHRoZSBPUyB0ZW1wIGRpciAoc3Vydml2ZXMgcHJvY2VzcyByZXN0YXJ0cywgc2hhcmVkXG4gKiBhY3Jvc3MgcHJvY2Vzc2VzKSBwbHVzIGFuIGluLXByb2Nlc3MgbWVtb2l6ZWQgcGFyc2UuIEEgcHJvdmlkZXIgd2hvc2VcbiAqIGZlZWQgZmFpbHMgdG8gbG9hZCBpcyBza2lwcGVkIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGxvb2t1cCAtXG4gKiB0aGUgb3RoZXIgcHJvdmlkZXJzIHN0aWxsIGFuc3dlci5cbiAqXG4gKiBTZXJ2ZXItb25seTogRE5TIHJlc29sdXRpb24gbmVlZHMgYG5vZGU6ZG5zYCAodmlhIGAuL25ldC50c2ApLCB0aGVcbiAqIGRpc2sgY2FjaGUgbmVlZHMgYG5vZGU6ZnNgIC8gYG5vZGU6b3NgIC8gYG5vZGU6cGF0aGAsIGFuZCB0aGUgZmVlZHNcbiAqIGFyZSBmZXRjaGVkIHdpdGggdGhlIGdsb2JhbCBgZmV0Y2hgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHJlbmFtZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHN0YXRTeW5jIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICB0b0Vycm9yLFxuICBtZW1vaXplLFxuICBmbnZIYXNoLFxuICBpZCxcbiAgY3JlYXRlRmV0Y2hFcnJvcixcbiAgcGFyc2UsXG4gIHR5cGUgQ2lkcixcbiAgdHlwZSBVcmxMaWtlLFxuICBwYXJzZUlwLFxuICBmaW5kQ29udGFpbmluZ0NpZHIsXG4gIHBhcnNlQ2lkcixcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJlc29sdmVIb3N0SXBzIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjbG91ZFwiKTtcblxuLyoqIEhvdyBsb25nIGEgZmV0Y2hlZCBwcm92aWRlciBJUC1yYW5nZSBmZWVkIGlzIHJldXNlZCBiZWZvcmUgcmVmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBSQU5HRV9DQUNIRV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogQVdTIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEFXU19SQU5HRVNfVVJMID0gXCJodHRwczovL2lwLXJhbmdlcy5hbWF6b25hd3MuY29tL2lwLXJhbmdlcy5qc29uXCI7XG4vKiogR0NQIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEdDUF9SQU5HRVNfVVJMID0gXCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9pcHJhbmdlcy9jbG91ZC5qc29uXCI7XG4vKipcbiAqIEF6dXJlIGhhcyBubyBzdGFibGUgZmVlZCBVUkwgLSB0aGUgSlNPTiBkb3dubG9hZCBsaW5rICh3aXRoIGFcbiAqIHJvdGF0aW5nIGRhdGUgc3RhbXApIGxpdmVzIG9uIHRoaXMgaHVtYW4tZmFjaW5nIGRvd25sb2FkIHBhZ2UgYW5kXG4gKiBtdXN0IGJlIHNjcmFwZWQgb3V0LiBTZWUge0BsaW5rIGZldGNoQXp1cmVSYW5nZXN9LlxuICovXG5jb25zdCBBWlVSRV9ET1dOTE9BRF9QQUdFID0gXCJodHRwczovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD01NjUxOVwiO1xuLyoqIFJlZ2V4IHRoYXQgcGx1Y2tzIHRoZSBjdXJyZW50IGBTZXJ2aWNlVGFnc19QdWJsaWNfPGRhdGU+Lmpzb25gIGxpbmsgb2ZmIHRoZSBBenVyZSBwYWdlLiAqL1xuY29uc3QgQVpVUkVfSlNPTl9MSU5LID1cbiAgL2h0dHBzOlxcL1xcL2Rvd25sb2FkXFwubWljcm9zb2Z0XFwuY29tXFwvZG93bmxvYWRcXC9bXlwiJ10qU2VydmljZVRhZ3NfUHVibGljX1xcZCtcXC5qc29uLztcblxuLyoqIENsb3VkIGh5cGVyc2NhbGVyIGEgaG9zdCByZXNvbHZlcyBpbnRvLiAqL1xuZXhwb3J0IGVudW0gQ2xvdWRQcm92aWRlciB7XG4gIEF3cyA9IFwiYXdzXCIsXG4gIEF6dXJlID0gXCJhenVyZVwiLFxuICBHY3AgPSBcImdjcFwiLFxufVxuXG4vKipcbiAqIFdoZXJlIGEgaG9zdCBsaXZlczogdGhlIHtAbGluayBDbG91ZFByb3ZpZGVyfSwgdGhlIHByb3ZpZGVyLW5hdGl2ZVxuICogYHJlZ2lvbmAgc3RyaW5nICh3aGF0ZXZlciB0aGUgcHJvdmlkZXIncyBmZWVkIGNhbGxzIGl0LCBlLmcuXG4gKiBgXCJ1cy1lYXN0LTFcImAgb24gQVdTLCBgXCJlYXN0dXMyXCJgIG9uIEF6dXJlLCBgXCJ1cy1lYXN0MVwiYCBvbiBHQ1ApLCB0aGVcbiAqIHJlc29sdmVkIGBpcGAgdGhhdCBtYXRjaGVkLCBhbmQgdGhlIGBjaWRyYCBibG9jayBpdCBmZWxsIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkTG9jYXRpb24ge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGlwOiBzdHJpbmc7XG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIEEgcGFyc2VkIENJRFIgYmxvY2sgdGFnZ2VkIHdpdGggdGhlIHJlZ2lvbiBpdCBiZWxvbmdzIHRvLiAqL1xuaW50ZXJmYWNlIFJlZ2lvbkNpZHIgZXh0ZW5kcyBDaWRyIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcHJvdmlkZXIncyBwYXJzZWQsIHJlZ2lvbi10YWdnZWQgcmFuZ2UgdGFibGUuICovXG5pbnRlcmZhY2UgUHJvdmlkZXJSYW5nZXMge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmFuZ2VzOiBSZWdpb25DaWRyW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgaW5wdXRgJ3MgaG9zdCB0byBhIHtAbGluayBDbG91ZExvY2F0aW9ufSwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBob3N0IGNhbid0IGJlIHJlc29sdmVkIG9yIG5vbmUgb2YgaXRzIElQcyBtYXRjaCBhIGtub3duIGNsb3VkIHJhbmdlLlxuICogYGlucHV0YCBpcyBhbnkge0BsaW5rIG5ldC5VcmxMaWtlfSAtIGEgVVJMLCBhIGJhcmUgaG9zdCwgb3IgYSBgeyB1cmwgfWBcbiAqIHdyYXBwZXIuXG4gKlxuICogVGhlIHByb3ZpZGVyIHJhbmdlIGZlZWRzIGFyZSBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LCBzb1xuICogb25seSB0aGUgZmlyc3QgY2FsbCBpbiBhIDI0LWhvdXIgd2luZG93IHBheXMgdGhlIGZldGNoIGNvc3Q7IHRoZSBETlNcbiAqIGxvb2t1cCBoYXBwZW5zIG9uIGV2ZXJ5IGNhbGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiaHR0cHM6Ly9hZGItMTIzNDU2Nzg5MC43LmF6dXJlZGF0YWJyaWNrcy5uZXRcIik7XG4gKiAvLyB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLFxuICogLy8gICByZWdpb246IFwiZWFzdHVzMlwiLCBpcDogXCIuLi5cIiwgY2lkcjogXCIuLi5cIiB9XG4gKlxuICogYXdhaXQgcmVzb2x2ZUNsb3VkTG9jYXRpb24oXCJkYmMtYWJjMTIzLmNsb3VkLmRhdGFicmlja3MuY29tXCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5Bd3MsXG4gKiAvLyAgIHJlZ2lvbjogXCJ1cy13ZXN0LTJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsb3VkTG9jYXRpb24oaW5wdXQ6IFVybExpa2UpOiBQcm9taXNlPENsb3VkTG9jYXRpb24gfCBudWxsPiB7XG4gIGNvbnN0IGlwcyA9IGF3YWl0IHJlc29sdmVIb3N0SXBzKGlucHV0KTtcbiAgaWYgKGlwcy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJubyBpcHMgcmVzb2x2ZWRcIiwgeyBpbnB1dDogU3RyaW5nKGlucHV0KSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCBsb2FkUHJvdmlkZXJSYW5nZXMoKTtcbiAgZm9yIChjb25zdCBpcCBvZiBpcHMpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUlwKGlwKTtcbiAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB7IHByb3ZpZGVyLCByYW5nZXMgfSBvZiBwcm92aWRlcnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZmluZENvbnRhaW5pbmdDaWRyKHBhcnNlZCwgcmFuZ2VzKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlciwgcmVnaW9uOiBtYXRjaC5yZWdpb24sIGlwLCBjaWRyOiBtYXRjaC5jaWRyIH07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm5vIGNsb3VkIHJhbmdlIG1hdGNoZWRcIiwgeyBpcHMgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIExvYWQgZXZlcnkgcHJvdmlkZXIncyByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLCBlYWNoIGNhY2hlZCBmb3JcbiAqIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LiBQcm92aWRlcnMgYXJlIGxvYWRlZCBpbiBwYXJhbGxlbCBhbmQgYVxuICogZmVlZCB0aGF0IGZhaWxzIHRvIGZldGNoIG9yIHBhcnNlIGlzIGRyb3BwZWQgKGxvZ2dlZCwgbm90IHRocm93bikgc29cbiAqIGEgc2luZ2xlIGZsYWt5IGZlZWQgbmV2ZXIgc2lua3MgdGhlIHdob2xlIGxvb2t1cC4gRXhwb3NlZCBmb3IgY2FsbGVyc1xuICogdGhhdCB3YW50IHRvIG1hdGNoIG1hbnkgSVBzIGFnYWluc3Qgb25lIGNhY2hlZCBzbmFwc2hvdCB3aXRob3V0IGEgRE5TXG4gKiBzdGVwIHBlciBhZGRyZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVyUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXNbXT4ge1xuICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtsb2FkQXdzUmFuZ2VzKCksIGxvYWRBenVyZVJhbmdlcygpLCBsb2FkR2NwUmFuZ2VzKCldKTtcbiAgY29uc3Qgb3V0OiBQcm92aWRlclJhbmdlc1tdID0gW107XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHNldHRsZWQpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgb3V0LnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJwcm92aWRlciByYW5nZSBsb2FkIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKHJlc3VsdC5yZWFzb24pIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBlci1wcm92aWRlciBjYWNoZWQgbG9hZGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGxvYWRBd3NSYW5nZXMgPSBtZW1vaXplKGZldGNoQXdzUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5jb25zdCBsb2FkQXp1cmVSYW5nZXMgPSBtZW1vaXplKGZldGNoQXp1cmVSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcbmNvbnN0IGxvYWRHY3BSYW5nZXMgPSBtZW1vaXplKGZldGNoR2NwUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXIgZmVlZCBmZXRjaCArIHBhcnNlXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEF3c0ZlZWQge1xuICBwcmVmaXhlcz86IHsgaXBfcHJlZml4Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfVtdO1xuICBpcHY2X3ByZWZpeGVzPzogeyBpcHY2X3ByZWZpeD86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBBV1MgYGlwLXJhbmdlcy5qc29uYDogYSBmbGF0IGxpc3Qgb2YgSVB2NCAoYHByZWZpeGVzYCkgYW5kIElQdjZcbiAqIChgaXB2Nl9wcmVmaXhlc2ApIGJsb2NrcywgZWFjaCBhbHJlYWR5IHRhZ2dlZCB3aXRoIGEgYHJlZ2lvbmAgc3VjaFxuICogYXMgYFwidXMtZWFzdC0xXCJgIChvciBgXCJHTE9CQUxcImAgZm9yIGVkZ2UgcmFuZ2VzKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBd3NSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBmZWVkID0gYXdhaXQgZmV0Y2hKc29uPEF3c0ZlZWQ+KEFXU19SQU5HRVNfVVJMKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLnByZWZpeGVzID8/IFtdKSB7XG4gICAgYWRkUmFuZ2UocmFuZ2VzLCBlbnRyeS5pcF9wcmVmaXgsIGVudHJ5LnJlZ2lvbik7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLmlwdjZfcHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjZfcHJlZml4LCBlbnRyeS5yZWdpb24pO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBhd3MgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF3cywgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBHY3BGZWVkIHtcbiAgcHJlZml4ZXM/OiB7IGlwdjRQcmVmaXg/OiBzdHJpbmc7IGlwdjZQcmVmaXg/OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBHQ1AgYGNsb3VkLmpzb25gOiBhIGxpc3Qgb2YgYmxvY2tzIGVhY2ggY2FycnlpbmcgYW4gYGlwdjRQcmVmaXhgIG9yXG4gKiBgaXB2NlByZWZpeGAgYW5kIGEgYHNjb3BlYCB0aGF0IGlzIHRoZSByZWdpb24gKGBcInVzLWVhc3QxXCJgKSBvclxuICogYFwiZ2xvYmFsXCJgIGZvciBub24tcmVnaW9uYWwgcmFuZ2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEdjcFJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248R2NwRmVlZD4oR0NQX1JBTkdFU19VUkwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQucHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjRQcmVmaXggPz8gZW50cnkuaXB2NlByZWZpeCwgZW50cnkuc2NvcGUpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBnY3AgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkdjcCwgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBBenVyZUZlZWQge1xuICB2YWx1ZXM/OiB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBwcm9wZXJ0aWVzPzogeyByZWdpb24/OiBzdHJpbmc7IGFkZHJlc3NQcmVmaXhlcz86IHN0cmluZ1tdIH07XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBBenVyZSBzZXJ2aWNlIHRhZ3M6IE1pY3Jvc29mdCBzaGlwcyBubyBzdGFibGUgZmVlZCBVUkwsIHNvIHNjcmFwZSB0aGVcbiAqIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIGRvd25sb2FkIHBhZ2VcbiAqIGFuZCBmZXRjaCBpdC4gT25seSB0aGUgcmVnaW9uYWwgYEF6dXJlQ2xvdWQuPHJlZ2lvbj5gIGFnZ3JlZ2F0ZXNcbiAqICh3aGljaCBoYXZlIGEgbm9uLWVtcHR5IGByZWdpb25gKSBhcmUga2VwdDsgdGhlIGNsb3VkLXdpZGVcbiAqIGBBenVyZUNsb3VkYCB0YWcgYW5kIHBlci1zZXJ2aWNlIHRhZ3MgYXJlIGlnbm9yZWQgc28gYW4gYWRkcmVzcyBtYXBzXG4gKiBjbGVhbmx5IHRvIG9uZSByZWdpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQXp1cmVSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hUZXh0KEFaVVJFX0RPV05MT0FEX1BBR0UpO1xuICBjb25zdCBqc29uVXJsID0gcGFnZS5tYXRjaChBWlVSRV9KU09OX0xJTkspPy5bMF07XG4gIGlmICghanNvblVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmaW5kIFNlcnZpY2VUYWdzIEpTT04gbGluayBvbiBBenVyZSBkb3dubG9hZCBwYWdlXCIpO1xuICB9XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248QXp1cmVGZWVkPihqc29uVXJsKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBmZWVkLnZhbHVlcyA/PyBbXSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHZhbHVlLnByb3BlcnRpZXM/LnJlZ2lvbjtcbiAgICBpZiAoIXJlZ2lvbiB8fCAhdmFsdWUubmFtZT8uc3RhcnRzV2l0aChcIkF6dXJlQ2xvdWQuXCIpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiB2YWx1ZS5wcm9wZXJ0aWVzPy5hZGRyZXNzUHJlZml4ZXMgPz8gW10pIHtcbiAgICAgIGFkZFJhbmdlKHJhbmdlcywgcHJlZml4LCByZWdpb24pO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgYXp1cmUgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLCByYW5nZXMgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFBhcnNlIGBjaWRyYCBhbmQsIHdoZW4gdmFsaWQgYW5kIGByZWdpb25gIGlzIHNldCwgcHVzaCBhIHRhZ2dlZCByYW5nZS4gKi9cbmZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlczogUmVnaW9uQ2lkcltdLCBjaWRyPzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFjaWRyIHx8ICFyZWdpb24pIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaWRyKGNpZHIpO1xuICBpZiAocGFyc2VkKSByYW5nZXMucHVzaCh7IC4uLnBhcnNlZCwgcmVnaW9uIH0pO1xufVxuXG4vKipcbiAqIEZldGNoIGFuZCBwYXJzZSBhIHByb3ZpZGVyIGZlZWQuIEEgcGFyc2UgZmFpbHVyZSBuYW1lcyB0aGUgVVJMIHJhdGhlciB0aGFuXG4gKiBzdXJmYWNpbmcgYW4gb3BhcXVlIGBVbmV4cGVjdGVkIHRva2VuYCAtIHRoZSB0ZXh0IG1heSBjb21lIGZyb20gdGhlIG9uLWRpc2tcbiAqIGNhY2hlLCBzbyBcIndoaWNoIGZlZWRcIiBpcyB0aGUgcGFydCB3b3J0aCBrbm93aW5nLiB7QGxpbmsgbG9hZFByb3ZpZGVyUmFuZ2VzfVxuICogdHVybnMgdGhlIHRocm93IGludG8gYSBwZXItcHJvdmlkZXIgd2FybmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uPFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFRleHQodXJsKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2U8VD4odGV4dCk7XG4gIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFuZ2UgZmVlZCByZXR1cm5lZCBub24tSlNPTiBjb250ZW50OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIEZldGNoIGB1cmxgIGFzIHRleHQgd2l0aCBhIDI0aCBvbi1kaXNrIGNhY2hlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpclxuICogKGtleWVkIGJ5IGFuIEZOViBoYXNoIG9mIHRoZSBVUkwpLiBBIGZyZXNoIGNhY2hlIGZpbGUgaXMgcmV0dXJuZWRcbiAqIGRpcmVjdGx5OyBhIG1pc3MvZXhwaXJ5IGZldGNoZXMsIHdyaXRlcyB0byBhIHVuaXF1ZSB0ZW1wIGZpbGUsIGFuZFxuICogYXRvbWljYWxseSByZW5hbWVzIGl0IGludG8gcGxhY2Ugc28gY29uY3VycmVudCBjYWxsZXJzIG5ldmVyIG9ic2VydmVcbiAqIGEgaGFsZi13cml0dGVuIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRleHQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiZGJ4LXRvb2xzXCIsIFwic2hhcmVkXCIsIFwiY2xvdWRcIik7XG4gIGNvbnN0IGNhY2hlRGlyQ3JlYXRlZCA9IGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVQYXRoID0gam9pbihjYWNoZURpciwgYGZldGNoLSR7Zm52SGFzaCh1cmwpfS50eHRgKTtcbiAgY29uc3QgY3JlYXRlZEF0ID0gY2FjaGVEaXJDcmVhdGVkID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0Q3JlYXRlZChjYWNoZVBhdGgpO1xuICBpZiAoY3JlYXRlZEF0KSB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUoY3JlYXRlZEF0LmdldFRpbWUoKSArIFJBTkdFX0NBQ0hFX1RUTF9NUyk7XG4gICAgaWYgKGV4cGlyZXNBdCA+IG5ldyBEYXRlKCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBoaXRcIiwgeyB1cmwsIGNhY2hlUGF0aCB9KTtcbiAgICAgIHJldHVybiByZWFkRmlsZShjYWNoZVBhdGgsIFwidXRmOFwiKTtcbiAgICB9XG4gIH1cbiAgbGV0IHRlbXBQYXRoOiBzdHJpbmcgfCBudWxsID0gam9pbihjYWNoZURpciwgYCR7aWQoKX0udHh0YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IGF3YWl0IGNyZWF0ZUZldGNoRXJyb3IocmVzcG9uc2UsIHVybCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKHRlbXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCByZXNwb25zZVRleHQpO1xuXG4gICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCBjYWNoZVBhdGgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBsb2FkXCIsIHsgdXJsLCBjYWNoZVBhdGggfSk7XG4gICAgdGVtcFBhdGggPSBudWxsO1xuICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRlbXBQYXRoKSB7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQmlydGggdGltZSBvZiBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZG9lc24ndCBleGlzdCB5ZXQuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDcmVhdGVkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKGF3YWl0IHN0YXRTeW5jKHBhdGgpKT8uYmlydGh0aW1lO1xufVxuIl19
|