@dollhousemcp/mcp-server 2.0.20 → 2.0.22

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.22] - 2026-04-16
4
+
5
+ - Fix legacy console leader takeover so new authenticated sessions can replace older incompatible port owners and register correctly.
6
+
7
+ ## [2.0.21] - 2026-04-16
8
+
9
+ - Sanitize OAuth and PAT helper logging to restore SonarCloud security quality
10
+
3
11
  ## [2.0.20] - 2026-04-16
4
12
 
5
13
  Point release for console leader bind authority and follower registration recovery.
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "2.0.20";
6
- export declare const BUILD_TIMESTAMP = "2026-04-16T14:53:41.093Z";
5
+ export declare const PACKAGE_VERSION = "2.0.22";
6
+ export declare const BUILD_TIMESTAMP = "2026-04-16T16:14:18.747Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '2.0.20';
6
- export const BUILD_TIMESTAMP = '2026-04-16T14:53:41.093Z';
5
+ export const PACKAGE_VERSION = '2.0.22';
6
+ export const BUILD_TIMESTAMP = '2026-04-16T16:14:18.747Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMjAnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTE2VDE0OjUzOjQxLjA5M1onO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMjInO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTE2VDE2OjE0OjE4Ljc0N1onO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
@@ -17,6 +17,9 @@ export interface KillStaleProcessOutcome {
17
17
  parentCommand?: string;
18
18
  detail?: string;
19
19
  }
20
+ export interface KillStaleProcessOptions {
21
+ allowActiveHostParent?: boolean;
22
+ }
20
23
  export declare function isRecognizedMcpHostParent(command: string): boolean;
21
24
  /**
22
25
  * Find the PID of the process listening on a given port.
@@ -36,7 +39,7 @@ export declare function findPidOnPort(port: number): Promise<number | null>;
36
39
  * before escalating to SIGKILL. Total worst case: ~4s.
37
40
  */
38
41
  export declare function killStaleProcess(pid: number, port: number): Promise<boolean>;
39
- export declare function killStaleProcessDetailed(pid: number, port: number): Promise<KillStaleProcessOutcome>;
42
+ export declare function killStaleProcessDetailed(pid: number, port: number, options?: KillStaleProcessOptions): Promise<KillStaleProcessOutcome>;
40
43
  /**
41
44
  * Detect and recover from a stale process squatting on the port.
42
45
  * Compares the port holder's PID against the leader lock file to determine
@@ -1 +1 @@
1
- {"version":3,"file":"StaleProcessRecovery.d.ts","sourceRoot":"","sources":["../../../src/web/console/StaleProcessRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8DH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EACF,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,eAAe,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGlE;AA8LD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlF;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAyB1G;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCrE"}
1
+ {"version":3,"file":"StaleProcessRecovery.d.ts","sourceRoot":"","sources":["../../../src/web/console/StaleProcessRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8DH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EACF,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,eAAe,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGlE;AA+LD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlF;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAyBlC;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCrE"}
@@ -105,7 +105,7 @@ function buildKillOutcome(killed, reason, processInfo, parentCommand, detail) {
105
105
  ...(detail ? { detail } : {}),
106
106
  };
107
107
  }
108
- async function getKillGuardFailure(processInfo, port) {
108
+ async function getKillGuardFailure(processInfo, port, options = {}) {
109
109
  const currentUser = (await import('node:os')).userInfo().username;
110
110
  if (processInfo.user !== currentUser) {
111
111
  await logger.warn(`[WebUI] Port ${port} held by different user (pid ${processInfo.pid}) — not killing`);
@@ -121,7 +121,7 @@ async function getKillGuardFailure(processInfo, port) {
121
121
  return null;
122
122
  }
123
123
  const parentCommand = (await getProcessCommand(processInfo.parentPid)) ?? undefined;
124
- if (parentCommand && isRecognizedMcpHostParent(parentCommand)) {
124
+ if (!options.allowActiveHostParent && parentCommand && isRecognizedMcpHostParent(parentCommand)) {
125
125
  await logger.warn(`[WebUI] Port ${port} held by active client-backed DollhouseMCP process (pid ${processInfo.pid}) — not killing`, {
126
126
  cmdLine: processInfo.command,
127
127
  parentPid: processInfo.parentPid,
@@ -269,13 +269,13 @@ export async function killStaleProcess(pid, port) {
269
269
  const outcome = await killStaleProcessDetailed(pid, port);
270
270
  return outcome.killed;
271
271
  }
272
- export async function killStaleProcessDetailed(pid, port) {
272
+ export async function killStaleProcessDetailed(pid, port, options = {}) {
273
273
  const processInfo = await inspectProcess(pid);
274
274
  if (!processInfo) {
275
275
  await logger.debug(`[WebUI] Cannot verify process ${pid} — skipping kill`);
276
276
  return { killed: false, reason: 'inspect_failed', pid };
277
277
  }
278
- const guardFailure = await getKillGuardFailure(processInfo, port);
278
+ const guardFailure = await getKillGuardFailure(processInfo, port, options);
279
279
  if (guardFailure) {
280
280
  return guardFailure;
281
281
  }
@@ -338,4 +338,4 @@ export async function recoverStalePort(port) {
338
338
  }
339
339
  return outcome.killed;
340
340
  }
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFakYsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxrREFBa0Q7QUFDbEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixtREFBbUQ7QUFDbkQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLCtDQUErQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsOERBQThEO0FBQzlELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLHdGQUF3RjtBQUN4RixNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUNoQyx5RkFBeUY7QUFDekYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLG9GQUFvRjtBQUNwRixNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQztBQUV6QyxJQUFJLE9BQU8sR0FBeUQsSUFBSSxDQUFDO0FBQ3pFLEtBQUssVUFBVSxTQUFTO0lBQ3RCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQztZQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFDRCxNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtRQUNqQyxNQUFNLENBQUMsR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQztZQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7UUFDakMsTUFBTSxDQUFDLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUM7WUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDckMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDO1lBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLHdCQUF3QixHQUFHO0lBQy9CLDZDQUE2QztJQUM3QyxvREFBb0Q7SUFDcEQsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtDQUNuQixDQUFDO0FBMkJGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxPQUFlO0lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ2hGLE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxPQUFlO0lBQ2hELE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ2hGLE1BQU0sY0FBYyxHQUFHLDhCQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMzRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDbEUsb0RBQW9ELENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0UsT0FBTyxjQUFjLElBQUksY0FBYyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFhO0lBQ2xDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEdBQUcsRUFBRSxJQUFJLFNBQVMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsT0FBTyxLQUFLLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNqSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBZSxFQUNmLE1BQXlDLEVBQ3pDLFdBQThCLEVBQzlCLGFBQXNCLEVBQ3RCLE1BQWU7SUFFZixPQUFPO1FBQ0wsTUFBTTtRQUNOLE1BQU07UUFDTixHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7UUFDcEIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1FBQ2hDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztRQUM1QixhQUFhO1FBQ2IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzlCLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxXQUE4QixFQUM5QixJQUFZO0lBRVosTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUNsRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLGdDQUFnQyxXQUFXLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hHLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLDBDQUEwQyxXQUFXLENBQUMsR0FBRyxpQkFBaUIsRUFBRTtZQUNoSCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbkYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUNwRixJQUFJLGFBQWEsSUFBSSx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSwyREFBMkQsV0FBVyxDQUFDLEdBQUcsaUJBQWlCLEVBQUU7WUFDakksT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO1lBQzVCLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztZQUNoQyxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLFdBQThCLEVBQzlCLElBQVksRUFDWixhQUFzQjtJQUV0QixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsV0FBVyxDQUFDLEdBQUcsWUFBWSxJQUFJLEVBQUUsRUFBRTtRQUN0RixPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87UUFDNUIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1FBQ2hDLGFBQWE7S0FDZCxDQUFDLENBQUM7SUFFSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsV0FBVyxDQUFDLEdBQUcsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNoQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxJQUFZO0lBQ2hELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFakYsT0FBTyxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLDhCQUE4QixHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNGLE9BQU8sS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7UUFDRCxJQUFJLEtBQUssSUFBSSxjQUFjLENBQUMsTUFBTTtZQUFFLE1BQU07UUFFMUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMxRSxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBQ3ZDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNwRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTVDLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FDcEMsSUFBSSxFQUNKLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLENBQUMsRUFDdEQsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FDaEMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELElBQUksU0FBUyxLQUFLLElBQUksSUFBSSxlQUFlLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWhFLE9BQU87WUFDTCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQjtZQUN4RCxHQUFHLEVBQUUsU0FBUztZQUNkLFNBQVMsRUFBRSxlQUFlO1lBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsaUJBQWlCO1NBQy9ELENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNwRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTVDLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDckgsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9FLE9BQU8sVUFBVSxJQUFJLElBQUksQ0FBQztJQUM1QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNwRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTVDLGlGQUFpRjtJQUNqRixLQUFLLE1BQU0sR0FBRyxJQUFJO1FBQ2hCLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1FBQzFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUU7S0FDeEMsRUFBRSxDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ25HLDBDQUEwQztZQUMxQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTTtpQkFDaEIsS0FBSyxDQUFDLEtBQUssQ0FBQztpQkFDWixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDcEMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFpQixFQUFFLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsU0FBUyxDQUFDLDZDQUE2QztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxJQUFZO0lBQzlELE1BQU0sT0FBTyxHQUFHLE1BQU0sd0JBQXdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxHQUFXLEVBQUUsSUFBWTtJQUN0RSxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLGtCQUFrQixDQUFDLENBQUM7UUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsU0FBUyxHQUFHLGVBQWU7UUFDM0QsQ0FBQyxDQUFDLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTO1FBQy9ELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEdBQUcsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRS9KLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hJLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ2pELE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFNUIsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSxpRUFBaUU7SUFDakUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDL0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLHFCQUFxQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM5RSxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksbUNBQW1DLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztnQkFDcEcsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdEQUF3RDtRQUMxRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsUUFBUSxzQkFBc0IsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCO0lBQ3pGLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLCtDQUErQyxRQUFRLEVBQUUsRUFBRTtZQUM1RSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtZQUNwQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFsZSBwcm9jZXNzIGRldGVjdGlvbiBhbmQgcmVjb3ZlcnkgKCMxODUwKS5cbiAqXG4gKiBGaW5kcyBhbmQga2lsbHMgem9tYmllIERvbGxob3VzZU1DUCBwcm9jZXNzZXMgdGhhdCBzcXVhdCBvbiB0aGUgY29uc29sZVxuICogcG9ydCBhZnRlciB0aGVpciBzZXNzaW9uIGhhcyBlbmRlZC4gVXNlZCBieSBiaW5kQW5kTGlzdGVuIGluIHNlcnZlci50c1xuICogd2hlbiBFQUREUklOVVNFIG9jY3Vycy5cbiAqXG4gKiBFeHRyYWN0ZWQgdG8gYSBzdGFuZGFsb25lIG1vZHVsZSBzbyBpdCBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgaW1wb3J0aW5nXG4gKiB0aGUgZnVsbCBFeHByZXNzIHNlcnZlciBhbmQgaXRzIGRlcGVuZGVuY3kgY2hhaW4uXG4gKi9cblxuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbi8vIFVzZSBsYXp5IGltcG9ydCBmb3IgbG9nZ2VyIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgZW52LnRzL2NvbmZpZyBjaGFpblxuLy8gYXQgbW9kdWxlIGxvYWQgdGltZS4gVGhpcyBrZWVwcyB0aGUgbW9kdWxlIGluZGVwZW5kZW50bHkgdGVzdGFibGUuXG4vKiogVGltZW91dCBmb3IgbHNvZi9mdXNlci9wcyBzeXN0ZW0gY2FsbHMgKG1zKSAqL1xuY29uc3QgQ09NTUFORF9USU1FT1VUX01TID0gMTAwMDtcbi8qKiBQb2xsaW5nIGludGVydmFsIHdoZW4gd2FpdGluZyBmb3IgU0lHVEVSTSB0byB0YWtlIGVmZmVjdCAobXMpICovXG5jb25zdCBTSUdURVJNX1BPTExfTVMgPSAzMDA7XG4vKiogTnVtYmVyIG9mIHBvbGxzIGJlZm9yZSBlc2NhbGF0aW5nIHRvIFNJR0tJTEwgKi9cbmNvbnN0IEtJTExfUE9MTF9DT1VOVCA9IDEwO1xuLyoqIFdhaXQgYWZ0ZXIgU0lHS0lMTCBiZWZvcmUgcmV0dXJuaW5nIChtcykgKi9cbmNvbnN0IFNJR0tJTExfV0FJVF9NUyA9IDUwMDtcbi8qKiBXYWl0IGJldHdlZW4gbG9jayBmaWxlIHJlYWRzIGZvciBUT0NUT1UgbWl0aWdhdGlvbiAobXMpICovXG5jb25zdCBMT0NLX1JFQ0hFQ0tfREVMQVlfTVMgPSA1MDA7XG4vKiogTnVtYmVyIG9mIGxvY2stZmlsZSBjaGVja3MgYmVmb3JlIGRlY2lkaW5nIHRoZSBwb3J0IGhvbGRlciBpcyBub3QgYSBmcmVzaCBsZWFkZXIuICovXG5jb25zdCBMT0NLX1JFQ0hFQ0tfQVRURU1QVFMgPSAyO1xuLyoqIFBJRCB1c2VkIGJ5IHRoZSBPUyBpbml0L2xhdW5jaGQgcHJvY2VzczsgZGlyZWN0IGNoaWxkcmVuIGFyZSBlZmZlY3RpdmVseSBvcnBoYW5lZC4gKi9cbmNvbnN0IFJPT1RfUEFSRU5UX1BJRCA9IDE7XG4vKiogTnVtYmVyIG9mIGBwc2AgY29sdW1ucyByZXF1ZXN0ZWQgYnkgaW5zcGVjdFByb2Nlc3M6IHVzZXIsIHBpZCwgcHBpZCwgY29tbWFuZC4gKi9cbmNvbnN0IFBST0NFU1NfSU5TUEVDVElPTl9GSUVMRF9DT1VOVCA9IDQ7XG5cbmxldCBfbG9nZ2VyOiB0eXBlb2YgaW1wb3J0KCcuLi8uLi91dGlscy9sb2dnZXIuanMnKS5sb2dnZXIgfCBudWxsID0gbnVsbDtcbmFzeW5jIGZ1bmN0aW9uIGdldExvZ2dlcigpIHtcbiAgaWYgKCFfbG9nZ2VyKSB7XG4gICAgdHJ5IHsgX2xvZ2dlciA9IChhd2FpdCBpbXBvcnQoJy4uLy4uL3V0aWxzL2xvZ2dlci5qcycpKS5sb2dnZXI7IH1cbiAgICBjYXRjaCB7IC8qIGZhbGxiYWNrIGJlbG93ICovIH1cbiAgfVxuICByZXR1cm4gX2xvZ2dlcjtcbn1cbmNvbnN0IGxvZ2dlciA9IHtcbiAgd2FybjogYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IGwgPSBhd2FpdCBnZXRMb2dnZXIoKTtcbiAgICBpZiAobCkgbC53YXJuKGFyZ3NbMF0gYXMgc3RyaW5nLCBhcmdzWzFdKTtcbiAgICBlbHNlIGNvbnNvbGUuZXJyb3IoJ1tXQVJOXScsIC4uLmFyZ3MpO1xuICB9LFxuICBpbmZvOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpO1xuICAgIGlmIChsKSBsLmluZm8oYXJnc1swXSBhcyBzdHJpbmcsIGFyZ3NbMV0pO1xuICAgIGVsc2UgY29uc29sZS5lcnJvcignW0lORk9dJywgLi4uYXJncyk7XG4gIH0sXG4gIGRlYnVnOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpO1xuICAgIGlmIChsKSBsLmRlYnVnKGFyZ3NbMF0gYXMgc3RyaW5nLCBhcmdzWzFdKTtcbiAgfSxcbn07XG5cbmNvbnN0IE1DUF9IT1NUX1BBUkVOVF9QQVRURVJOUyA9IFtcbiAgL0NsYXVkZVxcLmFwcFxcL0NvbnRlbnRzXFwvSGVscGVyc1xcL2Rpc2NsYWltZXIvaSxcbiAgL0NvZGV4XFwuYXBwXFwvQ29udGVudHNcXC9SZXNvdXJjZXNcXC9jb2RleCBhcHAtc2VydmVyL2ksXG4gIC9DdXJzb3JcXC5hcHBcXC8vaSxcbiAgL1dpbmRzdXJmXFwuYXBwXFwvL2ksXG5dO1xuXG5pbnRlcmZhY2UgUHJvY2Vzc0luc3BlY3Rpb24ge1xuICB1c2VyOiBzdHJpbmc7XG4gIHBpZDogbnVtYmVyO1xuICBwYXJlbnRQaWQ6IG51bWJlcjtcbiAgY29tbWFuZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lIHtcbiAga2lsbGVkOiBib29sZWFuO1xuICByZWFzb246XG4gICAgfCAnaW5zcGVjdF9mYWlsZWQnXG4gICAgfCAnZGlmZmVyZW50X3VzZXInXG4gICAgfCAnbm90X2RvbGxob3VzZV9wcm9jZXNzJ1xuICAgIHwgJ2FjdGl2ZV9ob3N0X3BhcmVudCdcbiAgICB8ICd0ZXJtaW5hdGVkJ1xuICAgIHwgJ2FscmVhZHlfZGVhZCdcbiAgICB8ICdzdGlsbF9hbGl2ZSdcbiAgICB8ICdzaWduYWxfZmFpbGVkJztcbiAgcGlkOiBudW1iZXI7XG4gIHBhcmVudFBpZD86IG51bWJlcjtcbiAgY29tbWFuZD86IHN0cmluZztcbiAgcGFyZW50Q29tbWFuZD86IHN0cmluZztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvZ25pemVkTWNwSG9zdFBhcmVudChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb21tYW5kKS5ub3JtYWxpemVkQ29udGVudDtcbiAgcmV0dXJuIE1DUF9IT1NUX1BBUkVOVF9QQVRURVJOUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qobm9ybWFsaXplZENvbW1hbmQpKTtcbn1cblxuZnVuY3Rpb24gaXNEb2xsaG91c2VQcm9jZXNzQ29tbWFuZChjbWRMaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjbWRMaW5lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgY29uc3QgaXNEb2xsaG91c2VCaW4gPSAvKD86XnxcXC8pZG9sbGhvdXNlbWNwKD86XFxzfCQpLy50ZXN0KG5vcm1hbGl6ZWRDb21tYW5kKSB8fFxuICAgIG5vcm1hbGl6ZWRDb21tYW5kLmluY2x1ZGVzKCcuYmluL2RvbGxob3VzZW1jcCcpO1xuICBjb25zdCBpc01jcFNlcnZlckJpbiA9IG5vcm1hbGl6ZWRDb21tYW5kLmluY2x1ZGVzKCcuYmluL21jcC1zZXJ2ZXInKSB8fFxuICAgIC8oPzpkb2xsaG91c2VtY3B8bWNwLXNlcnZlcilbL1xcXFxdZGlzdFsvXFxcXF1pbmRleFxcLmpzLy50ZXN0KG5vcm1hbGl6ZWRDb21tYW5kKTtcbiAgcmV0dXJuIGlzRG9sbGhvdXNlQmluIHx8IGlzTWNwU2VydmVyQmluO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBpZFRva2VuKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQgfHwgY29kZVBvaW50IDwgNDggfHwgY29kZVBvaW50ID4gNTcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcnNlZCkgfHwgcGFyc2VkIDwgUk9PVF9QQVJFTlRfUElEKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlQ2hhcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJyAnIHx8IHZhbHVlID09PSAnXFx0JyB8fCB2YWx1ZSA9PT0gJ1xcbicgfHwgdmFsdWUgPT09ICdcXHInIHx8IHZhbHVlID09PSAnXFxmJyB8fCB2YWx1ZSA9PT0gJ1xcdic7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkS2lsbE91dGNvbWUoXG4gIGtpbGxlZDogYm9vbGVhbixcbiAgcmVhc29uOiBLaWxsU3RhbGVQcm9jZXNzT3V0Y29tZVsncmVhc29uJ10sXG4gIHByb2Nlc3NJbmZvOiBQcm9jZXNzSW5zcGVjdGlvbixcbiAgcGFyZW50Q29tbWFuZD86IHN0cmluZyxcbiAgZGV0YWlsPzogc3RyaW5nLFxuKTogS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUge1xuICByZXR1cm4ge1xuICAgIGtpbGxlZCxcbiAgICByZWFzb24sXG4gICAgcGlkOiBwcm9jZXNzSW5mby5waWQsXG4gICAgcGFyZW50UGlkOiBwcm9jZXNzSW5mby5wYXJlbnRQaWQsXG4gICAgY29tbWFuZDogcHJvY2Vzc0luZm8uY29tbWFuZCxcbiAgICBwYXJlbnRDb21tYW5kLFxuICAgIC4uLihkZXRhaWwgPyB7IGRldGFpbCB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRLaWxsR3VhcmRGYWlsdXJlKFxuICBwcm9jZXNzSW5mbzogUHJvY2Vzc0luc3BlY3Rpb24sXG4gIHBvcnQ6IG51bWJlcixcbik6IFByb21pc2U8S2lsbFN0YWxlUHJvY2Vzc091dGNvbWUgfCBudWxsPiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gKGF3YWl0IGltcG9ydCgnbm9kZTpvcycpKS51c2VySW5mbygpLnVzZXJuYW1lO1xuICBpZiAocHJvY2Vzc0luZm8udXNlciAhPT0gY3VycmVudFVzZXIpIHtcbiAgICBhd2FpdCBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gaGVsZCBieSBkaWZmZXJlbnQgdXNlciAocGlkICR7cHJvY2Vzc0luZm8ucGlkfSkg4oCUIG5vdCBraWxsaW5nYCk7XG4gICAgcmV0dXJuIGJ1aWxkS2lsbE91dGNvbWUoZmFsc2UsICdkaWZmZXJlbnRfdXNlcicsIHByb2Nlc3NJbmZvKTtcbiAgfVxuXG4gIGlmICghaXNEb2xsaG91c2VQcm9jZXNzQ29tbWFuZChwcm9jZXNzSW5mby5jb21tYW5kKSkge1xuICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IG5vbi1Eb2xsaG91c2VNQ1AgcHJvY2VzcyAocGlkICR7cHJvY2Vzc0luZm8ucGlkfSkg4oCUIG5vdCBraWxsaW5nYCwge1xuICAgICAgY21kTGluZTogcHJvY2Vzc0luZm8uY29tbWFuZCxcbiAgICB9KTtcbiAgICByZXR1cm4gYnVpbGRLaWxsT3V0Y29tZShmYWxzZSwgJ25vdF9kb2xsaG91c2VfcHJvY2VzcycsIHByb2Nlc3NJbmZvKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzSW5mby5wYXJlbnRQaWQgPD0gUk9PVF9QQVJFTlRfUElEIHx8ICFpc1BpZEFsaXZlKHByb2Nlc3NJbmZvLnBhcmVudFBpZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcmVudENvbW1hbmQgPSAoYXdhaXQgZ2V0UHJvY2Vzc0NvbW1hbmQocHJvY2Vzc0luZm8ucGFyZW50UGlkKSkgPz8gdW5kZWZpbmVkO1xuICBpZiAocGFyZW50Q29tbWFuZCAmJiBpc1JlY29nbml6ZWRNY3BIb3N0UGFyZW50KHBhcmVudENvbW1hbmQpKSB7XG4gICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGhlbGQgYnkgYWN0aXZlIGNsaWVudC1iYWNrZWQgRG9sbGhvdXNlTUNQIHByb2Nlc3MgKHBpZCAke3Byb2Nlc3NJbmZvLnBpZH0pIOKAlCBub3Qga2lsbGluZ2AsIHtcbiAgICAgIGNtZExpbmU6IHByb2Nlc3NJbmZvLmNvbW1hbmQsXG4gICAgICBwYXJlbnRQaWQ6IHByb2Nlc3NJbmZvLnBhcmVudFBpZCxcbiAgICAgIHBhcmVudENvbW1hbmQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1aWxkS2lsbE91dGNvbWUoZmFsc2UsICdhY3RpdmVfaG9zdF9wYXJlbnQnLCBwcm9jZXNzSW5mbywgcGFyZW50Q29tbWFuZCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlUHJvY2VzcyhcbiAgcHJvY2Vzc0luZm86IFByb2Nlc3NJbnNwZWN0aW9uLFxuICBwb3J0OiBudW1iZXIsXG4gIHBhcmVudENvbW1hbmQ/OiBzdHJpbmcsXG4pOiBQcm9taXNlPEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lPiB7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzSW5mby5waWQsICdTSUdURVJNJyk7XG4gIGxvZ2dlci53YXJuKGBbV2ViVUldIFNlbnQgU0lHVEVSTSB0byBzdGFsZSBwcm9jZXNzICR7cHJvY2Vzc0luZm8ucGlkfSBvbiBwb3J0ICR7cG9ydH1gLCB7XG4gICAgY21kTGluZTogcHJvY2Vzc0luZm8uY29tbWFuZCxcbiAgICBwYXJlbnRQaWQ6IHByb2Nlc3NJbmZvLnBhcmVudFBpZCxcbiAgICBwYXJlbnRDb21tYW5kLFxuICB9KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IEtJTExfUE9MTF9DT1VOVDsgaSsrKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIFNJR1RFUk1fUE9MTF9NUykpO1xuICAgIGlmICghaXNQaWRBbGl2ZShwcm9jZXNzSW5mby5waWQpKSB7XG4gICAgICByZXR1cm4gYnVpbGRLaWxsT3V0Y29tZSh0cnVlLCAndGVybWluYXRlZCcsIHByb2Nlc3NJbmZvLCBwYXJlbnRDb21tYW5kKTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmtpbGwocHJvY2Vzc0luZm8ucGlkLCAnU0lHS0lMTCcpO1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBTZW50IFNJR0tJTEwgdG8gc3RhbGUgcHJvY2VzcyAke3Byb2Nlc3NJbmZvLnBpZH0gb24gcG9ydCAke3BvcnR9YCk7XG4gIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBTSUdLSUxMX1dBSVRfTVMpKTtcbiAgcmV0dXJuIGlzUGlkQWxpdmUocHJvY2Vzc0luZm8ucGlkKVxuICAgID8gYnVpbGRLaWxsT3V0Y29tZShmYWxzZSwgJ3N0aWxsX2FsaXZlJywgcHJvY2Vzc0luZm8sIHBhcmVudENvbW1hbmQpXG4gICAgOiBidWlsZEtpbGxPdXRjb21lKHRydWUsICd0ZXJtaW5hdGVkJywgcHJvY2Vzc0luZm8sIHBhcmVudENvbW1hbmQpO1xufVxuXG5mdW5jdGlvbiBzcGxpdFByb2Nlc3NJbnNwZWN0aW9uRmllbGRzKGxpbmU6IHN0cmluZyk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShsaW5lKS5ub3JtYWxpemVkQ29udGVudC50cmltKCk7XG5cbiAgd2hpbGUgKGluZGV4IDwgbm9ybWFsaXplZExpbmUubGVuZ3RoICYmIGZpZWxkcy5sZW5ndGggPCBQUk9DRVNTX0lOU1BFQ1RJT05fRklFTERfQ09VTlQgLSAxKSB7XG4gICAgd2hpbGUgKGluZGV4IDwgbm9ybWFsaXplZExpbmUubGVuZ3RoICYmIGlzV2hpdGVzcGFjZUNoYXIobm9ybWFsaXplZExpbmVbaW5kZXhdKSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IG5vcm1hbGl6ZWRMaW5lLmxlbmd0aCkgYnJlYWs7XG5cbiAgICBjb25zdCBmaWVsZFN0YXJ0ID0gaW5kZXg7XG4gICAgd2hpbGUgKGluZGV4IDwgbm9ybWFsaXplZExpbmUubGVuZ3RoICYmICFpc1doaXRlc3BhY2VDaGFyKG5vcm1hbGl6ZWRMaW5lW2luZGV4XSkpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIGZpZWxkcy5wdXNoKG5vcm1hbGl6ZWRMaW5lLnNsaWNlKGZpZWxkU3RhcnQsIGluZGV4KSk7XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBub3JtYWxpemVkTGluZS5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlQ2hhcihub3JtYWxpemVkTGluZVtpbmRleF0pKSB7XG4gICAgaW5kZXgrKztcbiAgfVxuICBpZiAoaW5kZXggPCBub3JtYWxpemVkTGluZS5sZW5ndGgpIHtcbiAgICBmaWVsZHMucHVzaChub3JtYWxpemVkTGluZS5zbGljZShpbmRleCkpO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkcy5sZW5ndGggPT09IFBST0NFU1NfSU5TUEVDVElPTl9GSUVMRF9DT1VOVCA/IGZpZWxkcyA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTxQcm9jZXNzSW5zcGVjdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBleGVjRmlsZTogZXhlY0ZpbGVDYiB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmNoaWxkX3Byb2Nlc3MnKTtcbiAgY29uc3QgeyBwcm9taXNpZnkgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTp1dGlsJyk7XG4gIGNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGVDYik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0ZpbGVBc3luYyhcbiAgICAgICdwcycsXG4gICAgICBbJy1wJywgU3RyaW5nKHBpZCksICctbycsICd1c2VyPSxwaWQ9LHBwaWQ9LGNvbW1hbmQ9J10sXG4gICAgICB7IHRpbWVvdXQ6IENPTU1BTkRfVElNRU9VVF9NUyB9LFxuICAgICk7XG4gICAgY29uc3QgZmllbGRzID0gc3BsaXRQcm9jZXNzSW5zcGVjdGlvbkZpZWxkcyhzdGRvdXQpO1xuICAgIGlmICghZmllbGRzKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbdXNlciwgcGlkVG9rZW4sIHBhcmVudFBpZFRva2VuLCBjb21tYW5kXSA9IGZpZWxkcztcbiAgICBjb25zdCBwYXJzZWRQaWQgPSBwYXJzZVBpZFRva2VuKHBpZFRva2VuKTtcbiAgICBjb25zdCBwYXJzZWRQYXJlbnRQaWQgPSBwYXJzZVBpZFRva2VuKHBhcmVudFBpZFRva2VuKTtcbiAgICBpZiAocGFyc2VkUGlkID09PSBudWxsIHx8IHBhcnNlZFBhcmVudFBpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcjogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXNlcikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICBwaWQ6IHBhcnNlZFBpZCxcbiAgICAgIHBhcmVudFBpZDogcGFyc2VkUGFyZW50UGlkLFxuICAgICAgY29tbWFuZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29tbWFuZCkubm9ybWFsaXplZENvbnRlbnQsXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJvY2Vzc0NvbW1hbmQocGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgeyBleGVjRmlsZTogZXhlY0ZpbGVDYiB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmNoaWxkX3Byb2Nlc3MnKTtcbiAgY29uc3QgeyBwcm9taXNpZnkgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTp1dGlsJyk7XG4gIGNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGVDYik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0ZpbGVBc3luYygncHMnLCBbJy1wJywgU3RyaW5nKHBpZCksICctbycsICdjb21tYW5kPSddLCB7IHRpbWVvdXQ6IENPTU1BTkRfVElNRU9VVF9NUyB9KTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoc3Rkb3V0KS5ub3JtYWxpemVkQ29udGVudC50cmltKCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQaWRBbGl2ZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBQSUQgb2YgdGhlIHByb2Nlc3MgbGlzdGVuaW5nIG9uIGEgZ2l2ZW4gcG9ydC5cbiAqIFVzZXMgbHNvZiBvbiBtYWNPUy9MaW51eC4gUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZCBvciBvbiBlcnJvci5cbiAqXG4gKiBUaW1lb3V0OiAxcyDigJQgbHNvZiBvbiBsb2NhbGhvc3QgaXMgdHlwaWNhbGx5IDwxMDBtcy4gVGhlIDFzIGNlaWxpbmdcbiAqIGhhbmRsZXMgc2xvdyBORlMtbW91bnRlZCAvZGV2L2ZkIG9yIG92ZXJsb2FkZWQgQ0kgcnVubmVycyB3aXRob3V0XG4gKiBkZWxheWluZyBzdGFydHVwIG5vdGljZWFibHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kUGlkT25Qb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICBjb25zdCB7IGV4ZWNGaWxlOiBleGVjRmlsZUNiIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuICBjb25zdCB7IHByb21pc2lmeSB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOnV0aWwnKTtcbiAgY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZUNiKTtcblxuICAvLyBUcnkgbHNvZiBmaXJzdCAobWFjT1MgKyBtb3N0IExpbnV4KSwgZmFsbCBiYWNrIHRvIGZ1c2VyIChtaW5pbWFsIExpbnV4L0RvY2tlcilcbiAgZm9yIChjb25zdCBjbWQgb2YgW1xuICAgIHsgYmluOiAnbHNvZicsIGFyZ3M6IFsnLXRpJywgYDoke3BvcnR9YF0gfSxcbiAgICB7IGJpbjogJ2Z1c2VyJywgYXJnczogW2Ake3BvcnR9L3RjcGBdIH0sXG4gIF0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgZXhlY0ZpbGVBc3luYyhjbWQuYmluLCBjbWQuYXJncywgeyB0aW1lb3V0OiBDT01NQU5EX1RJTUVPVVRfTVMgfSk7XG4gICAgICAvLyBmdXNlciBvdXRwdXRzIHRvIHN0ZGVyciBvbiBzb21lIHN5c3RlbXNcbiAgICAgIGNvbnN0IG91dHB1dCA9IChzdGRvdXQgfHwgc3RkZXJyIHx8ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBwaWRzID0gb3V0cHV0XG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5tYXAoKHRva2VuKSA9PiBwYXJzZVBpZFRva2VuKHRva2VuKSlcbiAgICAgICAgLmZpbHRlcigocGlkKTogcGlkIGlzIG51bWJlciA9PiBwaWQgIT09IG51bGwpO1xuICAgICAgY29uc3Qgb3RoZXJQaWQgPSBwaWRzLmZpbmQocCA9PiBwICE9PSBwcm9jZXNzLnBpZCk7XG4gICAgICBpZiAob3RoZXJQaWQpIHJldHVybiBvdGhlclBpZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBjb21tYW5kIG5vdCBmb3VuZCBvciBubyByZXN1bHRzIOKAlCB0cnkgbmV4dFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLaWxsIGEgc3RhbGUgcHJvY2VzcyBob2xkaW5nIGEgcG9ydC4gU2VuZHMgU0lHVEVSTSwgd2FpdHMgYnJpZWZseSxcbiAqIHRoZW4gU0lHS0lMTCBpZiBzdGlsbCBhbGl2ZS4gT25seSBraWxscyBEb2xsaG91c2VNQ1AgcHJvY2Vzc2VzXG4gKiAodmVyaWZpZWQgYnkgY2hlY2tpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgdXNlciBvd25lcnNoaXApLlxuICpcbiAqIFRpbWVvdXQ6IDFzIGZvciBwcyB2ZXJpZmljYXRpb24uIEtpbGwgd2FpdDogMzAwbXMgw5cgMTAgcG9sbHMgPSAzc1xuICogYmVmb3JlIGVzY2FsYXRpbmcgdG8gU0lHS0lMTC4gVG90YWwgd29yc3QgY2FzZTogfjRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFN0YWxlUHJvY2VzcyhwaWQ6IG51bWJlciwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG91dGNvbWUgPSBhd2FpdCBraWxsU3RhbGVQcm9jZXNzRGV0YWlsZWQocGlkLCBwb3J0KTtcbiAgcmV0dXJuIG91dGNvbWUua2lsbGVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkKHBpZDogbnVtYmVyLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lPiB7XG4gIGNvbnN0IHByb2Nlc3NJbmZvID0gYXdhaXQgaW5zcGVjdFByb2Nlc3MocGlkKTtcbiAgaWYgKCFwcm9jZXNzSW5mbykge1xuICAgIGF3YWl0IGxvZ2dlci5kZWJ1ZyhgW1dlYlVJXSBDYW5ub3QgdmVyaWZ5IHByb2Nlc3MgJHtwaWR9IOKAlCBza2lwcGluZyBraWxsYCk7XG4gICAgcmV0dXJuIHsga2lsbGVkOiBmYWxzZSwgcmVhc29uOiAnaW5zcGVjdF9mYWlsZWQnLCBwaWQgfTtcbiAgfVxuXG4gIGNvbnN0IGd1YXJkRmFpbHVyZSA9IGF3YWl0IGdldEtpbGxHdWFyZEZhaWx1cmUocHJvY2Vzc0luZm8sIHBvcnQpO1xuICBpZiAoZ3VhcmRGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGd1YXJkRmFpbHVyZTtcbiAgfVxuICBjb25zdCBwYXJlbnRDb21tYW5kID0gcHJvY2Vzc0luZm8ucGFyZW50UGlkID4gUk9PVF9QQVJFTlRfUElEXG4gICAgPyAoYXdhaXQgZ2V0UHJvY2Vzc0NvbW1hbmQocHJvY2Vzc0luZm8ucGFyZW50UGlkKSkgPz8gdW5kZWZpbmVkXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgYXdhaXQgbG9nZ2VyLmRlYnVnKGBbV2ViVUldIFZlcmlmaWVkIHN0YWxlIHByb2Nlc3MgJHtwaWR9IGlzIERvbGxob3VzZU1DUGAsIHsgY21kTGluZTogcHJvY2Vzc0luZm8uY29tbWFuZCwgcGFyZW50UGlkOiBwcm9jZXNzSW5mby5wYXJlbnRQaWQsIHBhcmVudENvbW1hbmQgfSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGVybWluYXRlUHJvY2Vzcyhwcm9jZXNzSW5mbywgcG9ydCwgcGFyZW50Q29tbWFuZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghaXNQaWRBbGl2ZShwaWQpKSB7XG4gICAgICByZXR1cm4gYnVpbGRLaWxsT3V0Y29tZSh0cnVlLCAnYWxyZWFkeV9kZWFkJywgcHJvY2Vzc0luZm8sIHBhcmVudENvbW1hbmQpO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRLaWxsT3V0Y29tZShmYWxzZSwgJ3NpZ25hbF9mYWlsZWQnLCBwcm9jZXNzSW5mbywgcGFyZW50Q29tbWFuZCwgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVjdCBhbmQgcmVjb3ZlciBmcm9tIGEgc3RhbGUgcHJvY2VzcyBzcXVhdHRpbmcgb24gdGhlIHBvcnQuXG4gKiBDb21wYXJlcyB0aGUgcG9ydCBob2xkZXIncyBQSUQgYWdhaW5zdCB0aGUgbGVhZGVyIGxvY2sgZmlsZSB0byBkZXRlcm1pbmVcbiAqIGlmIGl0J3MgYSBzcXVhdHRlci4gUmV0dXJucyB0cnVlIGlmIHRoZSBzcXVhdHRlciB3YXMga2lsbGVkLlxuICpcbiAqIFRpbWVvdXRzOiBsc29mIDFzLCBwcyAxcywgU0lHVEVSTSB3YWl0IDNzIOKAlCBtYXggfjVzIHRvdGFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlclN0YWxlUG9ydChwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc3RhbGVQaWQgPSBhd2FpdCBmaW5kUGlkT25Qb3J0KHBvcnQpO1xuICBpZiAoIXN0YWxlUGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVE9DVE9VIG1pdGlnYXRpb246IGEgbmV3IHByb2Nlc3MgbWF5IGhhdmUganVzdCBib3VuZCB0aGUgcG9ydCBidXQgbm90IHlldFxuICAvLyB3cml0dGVuIGl0cyBsb2NrIGZpbGUuIFJlYWQgdGhlIGxvY2ssIHBhdXNlLCByZS1yZWFkLiBJZiB0aGUgc2Vjb25kIHJlYWRcbiAgLy8gbm93IG1hdGNoZXMgdGhlIHBvcnQgaG9sZGVyLCBpdCdzIGEgZnJlc2ggbGVhZGVyIOKAlCBkb24ndCBraWxsLlxuICBjb25zdCB7IHJlYWRMZWFkZXJMb2NrIH0gPSBhd2FpdCBpbXBvcnQoJy4vTGVhZGVyRWxlY3Rpb24uanMnKTtcbiAgZm9yIChsZXQgY2hlY2sgPSAwOyBjaGVjayA8IExPQ0tfUkVDSEVDS19BVFRFTVBUUzsgY2hlY2srKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgICAgIGlmIChsb2NrPy5waWQgPT09IHN0YWxlUGlkICYmIGxvY2s/LnBvcnQgPT09IHBvcnQgJiYgbG9jay5waWQgIT09IHByb2Nlc3MucGlkKSB7XG4gICAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IGxlZ2l0aW1hdGUgbGVhZGVyIChwaWQgJHtzdGFsZVBpZH0pIOKAlCBub3Qga2lsbGluZ2ApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYW4ndCByZWFkIGxvY2sgZmlsZSDigJQgY29udGludWUgdG8gbmV4dCBjaGVjayBvciBraWxsXG4gICAgfVxuICAgIGlmIChjaGVjayA8IExPQ0tfUkVDSEVDS19BVFRFTVBUUyAtIDEpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBMT0NLX1JFQ0hFQ0tfREVMQVlfTVMpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvdXRjb21lID0gYXdhaXQga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkKHN0YWxlUGlkLCBwb3J0KTtcbiAgaWYgKG91dGNvbWUua2lsbGVkKSB7XG4gICAgbG9nZ2VyLmluZm8oYFtXZWJVSV0gU3RhbGUgcHJvY2VzcyAke3N0YWxlUGlkfSByZW1vdmVkIGZyb20gcG9ydCAke3BvcnR9YCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIFNJR0tJTExfV0FJVF9NUykpOyAvLyBicmllZiBwYXVzZSBmb3IgcG9ydCByZWxlYXNlXG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgbG9nZ2VyLmRlYnVnKGBbV2ViVUldIFN0YWxlLXBvcnQgcmVjb3Zlcnkgc2tpcHBlZCBmb3IgcGlkICR7c3RhbGVQaWR9YCwge1xuICAgICAgcmVhc29uOiBvdXRjb21lLnJlYXNvbixcbiAgICAgIHBhcmVudFBpZDogb3V0Y29tZS5wYXJlbnRQaWQsXG4gICAgICBwYXJlbnRDb21tYW5kOiBvdXRjb21lLnBhcmVudENvbW1hbmQsXG4gICAgICBkZXRhaWw6IG91dGNvbWUuZGV0YWlsLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRjb21lLmtpbGxlZDtcbn1cbiJdfQ==
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFakYsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxrREFBa0Q7QUFDbEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixtREFBbUQ7QUFDbkQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLCtDQUErQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsOERBQThEO0FBQzlELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLHdGQUF3RjtBQUN4RixNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUNoQyx5RkFBeUY7QUFDekYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLG9GQUFvRjtBQUNwRixNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQztBQUV6QyxJQUFJLE9BQU8sR0FBeUQsSUFBSSxDQUFDO0FBQ3pFLEtBQUssVUFBVSxTQUFTO0lBQ3RCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQztZQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFDRCxNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRSxLQUFLLEVBQUUsR0FB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LENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWxlIHByb2Nlc3MgZGV0ZWN0aW9uIGFuZCByZWNvdmVyeSAoIzE4NTApLlxuICpcbiAqIEZpbmRzIGFuZCBraWxscyB6b21iaWUgRG9sbGhvdXNlTUNQIHByb2Nlc3NlcyB0aGF0IHNxdWF0IG9uIHRoZSBjb25zb2xlXG4gKiBwb3J0IGFmdGVyIHRoZWlyIHNlc3Npb24gaGFzIGVuZGVkLiBVc2VkIGJ5IGJpbmRBbmRMaXN0ZW4gaW4gc2VydmVyLnRzXG4gKiB3aGVuIEVBRERSSU5VU0Ugb2NjdXJzLlxuICpcbiAqIEV4dHJhY3RlZCB0byBhIHN0YW5kYWxvbmUgbW9kdWxlIHNvIGl0IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBpbXBvcnRpbmdcbiAqIHRoZSBmdWxsIEV4cHJlc3Mgc2VydmVyIGFuZCBpdHMgZGVwZW5kZW5jeSBjaGFpbi5cbiAqL1xuXG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuLy8gVXNlIGxhenkgaW1wb3J0IGZvciBsb2dnZXIgdG8gYXZvaWQgcHVsbGluZyBpbiB0aGUgZnVsbCBlbnYudHMvY29uZmlnIGNoYWluXG4vLyBhdCBtb2R1bGUgbG9hZCB0aW1lLiBUaGlzIGtlZXBzIHRoZSBtb2R1bGUgaW5kZXBlbmRlbnRseSB0ZXN0YWJsZS5cbi8qKiBUaW1lb3V0IGZvciBsc29mL2Z1c2VyL3BzIHN5c3RlbSBjYWxscyAobXMpICovXG5jb25zdCBDT01NQU5EX1RJTUVPVVRfTVMgPSAxMDAwO1xuLyoqIFBvbGxpbmcgaW50ZXJ2YWwgd2hlbiB3YWl0aW5nIGZvciBTSUdURVJNIHRvIHRha2UgZWZmZWN0IChtcykgKi9cbmNvbnN0IFNJR1RFUk1fUE9MTF9NUyA9IDMwMDtcbi8qKiBOdW1iZXIgb2YgcG9sbHMgYmVmb3JlIGVzY2FsYXRpbmcgdG8gU0lHS0lMTCAqL1xuY29uc3QgS0lMTF9QT0xMX0NPVU5UID0gMTA7XG4vKiogV2FpdCBhZnRlciBTSUdLSUxMIGJlZm9yZSByZXR1cm5pbmcgKG1zKSAqL1xuY29uc3QgU0lHS0lMTF9XQUlUX01TID0gNTAwO1xuLyoqIFdhaXQgYmV0d2VlbiBsb2NrIGZpbGUgcmVhZHMgZm9yIFRPQ1RPVSBtaXRpZ2F0aW9uIChtcykgKi9cbmNvbnN0IExPQ0tfUkVDSEVDS19ERUxBWV9NUyA9IDUwMDtcbi8qKiBOdW1iZXIgb2YgbG9jay1maWxlIGNoZWNrcyBiZWZvcmUgZGVjaWRpbmcgdGhlIHBvcnQgaG9sZGVyIGlzIG5vdCBhIGZyZXNoIGxlYWRlci4gKi9cbmNvbnN0IExPQ0tfUkVDSEVDS19BVFRFTVBUUyA9IDI7XG4vKiogUElEIHVzZWQgYnkgdGhlIE9TIGluaXQvbGF1bmNoZCBwcm9jZXNzOyBkaXJlY3QgY2hpbGRyZW4gYXJlIGVmZmVjdGl2ZWx5IG9ycGhhbmVkLiAqL1xuY29uc3QgUk9PVF9QQVJFTlRfUElEID0gMTtcbi8qKiBOdW1iZXIgb2YgYHBzYCBjb2x1bW5zIHJlcXVlc3RlZCBieSBpbnNwZWN0UHJvY2VzczogdXNlciwgcGlkLCBwcGlkLCBjb21tYW5kLiAqL1xuY29uc3QgUFJPQ0VTU19JTlNQRUNUSU9OX0ZJRUxEX0NPVU5UID0gNDtcblxubGV0IF9sb2dnZXI6IHR5cGVvZiBpbXBvcnQoJy4uLy4uL3V0aWxzL2xvZ2dlci5qcycpLmxvZ2dlciB8IG51bGwgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gZ2V0TG9nZ2VyKCkge1xuICBpZiAoIV9sb2dnZXIpIHtcbiAgICB0cnkgeyBfbG9nZ2VyID0gKGF3YWl0IGltcG9ydCgnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJykpLmxvZ2dlcjsgfVxuICAgIGNhdGNoIHsgLyogZmFsbGJhY2sgYmVsb3cgKi8gfVxuICB9XG4gIHJldHVybiBfbG9nZ2VyO1xufVxuY29uc3QgbG9nZ2VyID0ge1xuICB3YXJuOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpO1xuICAgIGlmIChsKSBsLndhcm4oYXJnc1swXSBhcyBzdHJpbmcsIGFyZ3NbMV0pO1xuICAgIGVsc2UgY29uc29sZS5lcnJvcignW1dBUk5dJywgLi4uYXJncyk7XG4gIH0sXG4gIGluZm86IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCBsID0gYXdhaXQgZ2V0TG9nZ2VyKCk7XG4gICAgaWYgKGwpIGwuaW5mbyhhcmdzWzBdIGFzIHN0cmluZywgYXJnc1sxXSk7XG4gICAgZWxzZSBjb25zb2xlLmVycm9yKCdbSU5GT10nLCAuLi5hcmdzKTtcbiAgfSxcbiAgZGVidWc6IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCBsID0gYXdhaXQgZ2V0TG9nZ2VyKCk7XG4gICAgaWYgKGwpIGwuZGVidWcoYXJnc1swXSBhcyBzdHJpbmcsIGFyZ3NbMV0pO1xuICB9LFxufTtcblxuY29uc3QgTUNQX0hPU1RfUEFSRU5UX1BBVFRFUk5TID0gW1xuICAvQ2xhdWRlXFwuYXBwXFwvQ29udGVudHNcXC9IZWxwZXJzXFwvZGlzY2xhaW1lci9pLFxuICAvQ29kZXhcXC5hcHBcXC9Db250ZW50c1xcL1Jlc291cmNlc1xcL2NvZGV4IGFwcC1zZXJ2ZXIvaSxcbiAgL0N1cnNvclxcLmFwcFxcLy9pLFxuICAvV2luZHN1cmZcXC5hcHBcXC8vaSxcbl07XG5cbmludGVyZmFjZSBQcm9jZXNzSW5zcGVjdGlvbiB7XG4gIHVzZXI6IHN0cmluZztcbiAgcGlkOiBudW1iZXI7XG4gIHBhcmVudFBpZDogbnVtYmVyO1xuICBjb21tYW5kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUge1xuICBraWxsZWQ6IGJvb2xlYW47XG4gIHJlYXNvbjpcbiAgICB8ICdpbnNwZWN0X2ZhaWxlZCdcbiAgICB8ICdkaWZmZXJlbnRfdXNlcidcbiAgICB8ICdub3RfZG9sbGhvdXNlX3Byb2Nlc3MnXG4gICAgfCAnYWN0aXZlX2hvc3RfcGFyZW50J1xuICAgIHwgJ3Rlcm1pbmF0ZWQnXG4gICAgfCAnYWxyZWFkeV9kZWFkJ1xuICAgIHwgJ3N0aWxsX2FsaXZlJ1xuICAgIHwgJ3NpZ25hbF9mYWlsZWQnO1xuICBwaWQ6IG51bWJlcjtcbiAgcGFyZW50UGlkPzogbnVtYmVyO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBwYXJlbnRDb21tYW5kPzogc3RyaW5nO1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2lsbFN0YWxlUHJvY2Vzc09wdGlvbnMge1xuICBhbGxvd0FjdGl2ZUhvc3RQYXJlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvZ25pemVkTWNwSG9zdFBhcmVudChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb21tYW5kKS5ub3JtYWxpemVkQ29udGVudDtcbiAgcmV0dXJuIE1DUF9IT1NUX1BBUkVOVF9QQVRURVJOUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qobm9ybWFsaXplZENvbW1hbmQpKTtcbn1cblxuZnVuY3Rpb24gaXNEb2xsaG91c2VQcm9jZXNzQ29tbWFuZChjbWRMaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjbWRMaW5lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgY29uc3QgaXNEb2xsaG91c2VCaW4gPSAvKD86XnxcXC8pZG9sbGhvdXNlbWNwKD86XFxzfCQpLy50ZXN0KG5vcm1hbGl6ZWRDb21tYW5kKSB8fFxuICAgIG5vcm1hbGl6ZWRDb21tYW5kLmluY2x1ZGVzKCcuYmluL2RvbGxob3VzZW1jcCcpO1xuICBjb25zdCBpc01jcFNlcnZlckJpbiA9IG5vcm1hbGl6ZWRDb21tYW5kLmluY2x1ZGVzKCcuYmluL21jcC1zZXJ2ZXInKSB8fFxuICAgIC8oPzpkb2xsaG91c2VtY3B8bWNwLXNlcnZlcilbL1xcXFxdZGlzdFsvXFxcXF1pbmRleFxcLmpzLy50ZXN0KG5vcm1hbGl6ZWRDb21tYW5kKTtcbiAgcmV0dXJuIGlzRG9sbGhvdXNlQmluIHx8IGlzTWNwU2VydmVyQmluO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBpZFRva2VuKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQgfHwgY29kZVBvaW50IDwgNDggfHwgY29kZVBvaW50ID4gNTcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcnNlZCkgfHwgcGFyc2VkIDwgUk9PVF9QQVJFTlRfUElEKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlQ2hhcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJyAnIHx8IHZhbHVlID09PSAnXFx0JyB8fCB2YWx1ZSA9PT0gJ1xcbicgfHwgdmFsdWUgPT09ICdcXHInIHx8IHZhbHVlID09PSAnXFxmJyB8fCB2YWx1ZSA9PT0gJ1xcdic7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkS2lsbE91dGNvbWUoXG4gIGtpbGxlZDogYm9vbGVhbixcbiAgcmVhc29uOiBLaWxsU3RhbGVQcm9jZXNzT3V0Y29tZVsncmVhc29uJ10sXG4gIHByb2Nlc3NJbmZvOiBQcm9jZXNzSW5zcGVjdGlvbixcbiAgcGFyZW50Q29tbWFuZD86IHN0cmluZyxcbiAgZGV0YWlsPzogc3RyaW5nLFxuKTogS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUge1xuICByZXR1cm4ge1xuICAgIGtpbGxlZCxcbiAgICByZWFzb24sXG4gICAgcGlkOiBwcm9jZXNzSW5mby5waWQsXG4gICAgcGFyZW50UGlkOiBwcm9jZXNzSW5mby5wYXJlbnRQaWQsXG4gICAgY29tbWFuZDogcHJvY2Vzc0luZm8uY29tbWFuZCxcbiAgICBwYXJlbnRDb21tYW5kLFxuICAgIC4uLihkZXRhaWwgPyB7IGRldGFpbCB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRLaWxsR3VhcmRGYWlsdXJlKFxuICBwcm9jZXNzSW5mbzogUHJvY2Vzc0luc3BlY3Rpb24sXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogS2lsbFN0YWxlUHJvY2Vzc09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8S2lsbFN0YWxlUHJvY2Vzc091dGNvbWUgfCBudWxsPiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gKGF3YWl0IGltcG9ydCgnbm9kZTpvcycpKS51c2VySW5mbygpLnVzZXJuYW1lO1xuICBpZiAocHJvY2Vzc0luZm8udXNlciAhPT0gY3VycmVudFVzZXIpIHtcbiAgICBhd2FpdCBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gaGVsZCBieSBkaWZmZXJlbnQgdXNlciAocGlkICR7cHJvY2Vzc0luZm8ucGlkfSkg4oCUIG5vdCBraWxsaW5nYCk7XG4gICAgcmV0dXJuIGJ1aWxkS2lsbE91dGNvbWUoZmFsc2UsICdkaWZmZXJlbnRfdXNlcicsIHByb2Nlc3NJbmZvKTtcbiAgfVxuXG4gIGlmICghaXNEb2xsaG91c2VQcm9jZXNzQ29tbWFuZChwcm9jZXNzSW5mby5jb21tYW5kKSkge1xuICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IG5vbi1Eb2xsaG91c2VNQ1AgcHJvY2VzcyAocGlkICR7cHJvY2Vzc0luZm8ucGlkfSkg4oCUIG5vdCBraWxsaW5nYCwge1xuICAgICAgY21kTGluZTogcHJvY2Vzc0luZm8uY29tbWFuZCxcbiAgICB9KTtcbiAgICByZXR1cm4gYnVpbGRLaWxsT3V0Y29tZShmYWxzZSwgJ25vdF9kb2xsaG91c2VfcHJvY2VzcycsIHByb2Nlc3NJbmZvKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzSW5mby5wYXJlbnRQaWQgPD0gUk9PVF9QQVJFTlRfUElEIHx8ICFpc1BpZEFsaXZlKHByb2Nlc3NJbmZvLnBhcmVudFBpZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcmVudENvbW1hbmQgPSAoYXdhaXQgZ2V0UHJvY2Vzc0NvbW1hbmQocHJvY2Vzc0luZm8ucGFyZW50UGlkKSkgPz8gdW5kZWZpbmVkO1xuICBpZiAoIW9wdGlvbnMuYWxsb3dBY3RpdmVIb3N0UGFyZW50ICYmIHBhcmVudENvbW1hbmQgJiYgaXNSZWNvZ25pemVkTWNwSG9zdFBhcmVudChwYXJlbnRDb21tYW5kKSkge1xuICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IGFjdGl2ZSBjbGllbnQtYmFja2VkIERvbGxob3VzZU1DUCBwcm9jZXNzIChwaWQgJHtwcm9jZXNzSW5mby5waWR9KSDigJQgbm90IGtpbGxpbmdgLCB7XG4gICAgICBjbWRMaW5lOiBwcm9jZXNzSW5mby5jb21tYW5kLFxuICAgICAgcGFyZW50UGlkOiBwcm9jZXNzSW5mby5wYXJlbnRQaWQsXG4gICAgICBwYXJlbnRDb21tYW5kLFxuICAgIH0pO1xuICAgIHJldHVybiBidWlsZEtpbGxPdXRjb21lKGZhbHNlLCAnYWN0aXZlX2hvc3RfcGFyZW50JywgcHJvY2Vzc0luZm8sIHBhcmVudENvbW1hbmQpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZVByb2Nlc3MoXG4gIHByb2Nlc3NJbmZvOiBQcm9jZXNzSW5zcGVjdGlvbixcbiAgcG9ydDogbnVtYmVyLFxuICBwYXJlbnRDb21tYW5kPzogc3RyaW5nLFxuKTogUHJvbWlzZTxLaWxsU3RhbGVQcm9jZXNzT3V0Y29tZT4ge1xuICBwcm9jZXNzLmtpbGwocHJvY2Vzc0luZm8ucGlkLCAnU0lHVEVSTScpO1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBTZW50IFNJR1RFUk0gdG8gc3RhbGUgcHJvY2VzcyAke3Byb2Nlc3NJbmZvLnBpZH0gb24gcG9ydCAke3BvcnR9YCwge1xuICAgIGNtZExpbmU6IHByb2Nlc3NJbmZvLmNvbW1hbmQsXG4gICAgcGFyZW50UGlkOiBwcm9jZXNzSW5mby5wYXJlbnRQaWQsXG4gICAgcGFyZW50Q29tbWFuZCxcbiAgfSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBLSUxMX1BPTExfQ09VTlQ7IGkrKykge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBTSUdURVJNX1BPTExfTVMpKTtcbiAgICBpZiAoIWlzUGlkQWxpdmUocHJvY2Vzc0luZm8ucGlkKSkge1xuICAgICAgcmV0dXJuIGJ1aWxkS2lsbE91dGNvbWUodHJ1ZSwgJ3Rlcm1pbmF0ZWQnLCBwcm9jZXNzSW5mbywgcGFyZW50Q29tbWFuZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5raWxsKHByb2Nlc3NJbmZvLnBpZCwgJ1NJR0tJTEwnKTtcbiAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gU2VudCBTSUdLSUxMIHRvIHN0YWxlIHByb2Nlc3MgJHtwcm9jZXNzSW5mby5waWR9IG9uIHBvcnQgJHtwb3J0fWApO1xuICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgU0lHS0lMTF9XQUlUX01TKSk7XG4gIHJldHVybiBpc1BpZEFsaXZlKHByb2Nlc3NJbmZvLnBpZClcbiAgICA/IGJ1aWxkS2lsbE91dGNvbWUoZmFsc2UsICdzdGlsbF9hbGl2ZScsIHByb2Nlc3NJbmZvLCBwYXJlbnRDb21tYW5kKVxuICAgIDogYnVpbGRLaWxsT3V0Y29tZSh0cnVlLCAndGVybWluYXRlZCcsIHByb2Nlc3NJbmZvLCBwYXJlbnRDb21tYW5kKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRQcm9jZXNzSW5zcGVjdGlvbkZpZWxkcyhsaW5lOiBzdHJpbmcpOiBzdHJpbmdbXSB8IG51bGwge1xuICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMaW5lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobGluZSkubm9ybWFsaXplZENvbnRlbnQudHJpbSgpO1xuXG4gIHdoaWxlIChpbmRleCA8IG5vcm1hbGl6ZWRMaW5lLmxlbmd0aCAmJiBmaWVsZHMubGVuZ3RoIDwgUFJPQ0VTU19JTlNQRUNUSU9OX0ZJRUxEX0NPVU5UIC0gMSkge1xuICAgIHdoaWxlIChpbmRleCA8IG5vcm1hbGl6ZWRMaW5lLmxlbmd0aCAmJiBpc1doaXRlc3BhY2VDaGFyKG5vcm1hbGl6ZWRMaW5lW2luZGV4XSkpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIGlmIChpbmRleCA+PSBub3JtYWxpemVkTGluZS5sZW5ndGgpIGJyZWFrO1xuXG4gICAgY29uc3QgZmllbGRTdGFydCA9IGluZGV4O1xuICAgIHdoaWxlIChpbmRleCA8IG5vcm1hbGl6ZWRMaW5lLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlQ2hhcihub3JtYWxpemVkTGluZVtpbmRleF0pKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgICBmaWVsZHMucHVzaChub3JtYWxpemVkTGluZS5zbGljZShmaWVsZFN0YXJ0LCBpbmRleCkpO1xuICB9XG5cbiAgd2hpbGUgKGluZGV4IDwgbm9ybWFsaXplZExpbmUubGVuZ3RoICYmIGlzV2hpdGVzcGFjZUNoYXIobm9ybWFsaXplZExpbmVbaW5kZXhdKSkge1xuICAgIGluZGV4Kys7XG4gIH1cbiAgaWYgKGluZGV4IDwgbm9ybWFsaXplZExpbmUubGVuZ3RoKSB7XG4gICAgZmllbGRzLnB1c2gobm9ybWFsaXplZExpbmUuc2xpY2UoaW5kZXgpKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMubGVuZ3RoID09PSBQUk9DRVNTX0lOU1BFQ1RJT05fRklFTERfQ09VTlQgPyBmaWVsZHMgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnNwZWN0UHJvY2VzcyhwaWQ6IG51bWJlcik6IFByb21pc2U8UHJvY2Vzc0luc3BlY3Rpb24gfCBudWxsPiB7XG4gIGNvbnN0IHsgZXhlY0ZpbGU6IGV4ZWNGaWxlQ2IgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gIGNvbnN0IHsgcHJvbWlzaWZ5IH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6dXRpbCcpO1xuICBjb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlQ2IpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoXG4gICAgICAncHMnLFxuICAgICAgWyctcCcsIFN0cmluZyhwaWQpLCAnLW8nLCAndXNlcj0scGlkPSxwcGlkPSxjb21tYW5kPSddLFxuICAgICAgeyB0aW1lb3V0OiBDT01NQU5EX1RJTUVPVVRfTVMgfSxcbiAgICApO1xuICAgIGNvbnN0IGZpZWxkcyA9IHNwbGl0UHJvY2Vzc0luc3BlY3Rpb25GaWVsZHMoc3Rkb3V0KTtcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgW3VzZXIsIHBpZFRva2VuLCBwYXJlbnRQaWRUb2tlbiwgY29tbWFuZF0gPSBmaWVsZHM7XG4gICAgY29uc3QgcGFyc2VkUGlkID0gcGFyc2VQaWRUb2tlbihwaWRUb2tlbik7XG4gICAgY29uc3QgcGFyc2VkUGFyZW50UGlkID0gcGFyc2VQaWRUb2tlbihwYXJlbnRQaWRUb2tlbik7XG4gICAgaWYgKHBhcnNlZFBpZCA9PT0gbnVsbCB8fCBwYXJzZWRQYXJlbnRQaWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXI6IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVzZXIpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgcGlkOiBwYXJzZWRQaWQsXG4gICAgICBwYXJlbnRQaWQ6IHBhcnNlZFBhcmVudFBpZCxcbiAgICAgIGNvbW1hbmQ6IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbW1hbmQpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2Nlc3NDb21tYW5kKHBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHsgZXhlY0ZpbGU6IGV4ZWNGaWxlQ2IgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gIGNvbnN0IHsgcHJvbWlzaWZ5IH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6dXRpbCcpO1xuICBjb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlQ2IpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoJ3BzJywgWyctcCcsIFN0cmluZyhwaWQpLCAnLW8nLCAnY29tbWFuZD0nXSwgeyB0aW1lb3V0OiBDT01NQU5EX1RJTUVPVVRfTVMgfSk7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHN0ZG91dCkubm9ybWFsaXplZENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkIHx8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGlkQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgUElEIG9mIHRoZSBwcm9jZXNzIGxpc3RlbmluZyBvbiBhIGdpdmVuIHBvcnQuXG4gKiBVc2VzIGxzb2Ygb24gbWFjT1MvTGludXguIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQgb3Igb24gZXJyb3IuXG4gKlxuICogVGltZW91dDogMXMg4oCUIGxzb2Ygb24gbG9jYWxob3N0IGlzIHR5cGljYWxseSA8MTAwbXMuIFRoZSAxcyBjZWlsaW5nXG4gKiBoYW5kbGVzIHNsb3cgTkZTLW1vdW50ZWQgL2Rldi9mZCBvciBvdmVybG9hZGVkIENJIHJ1bm5lcnMgd2l0aG91dFxuICogZGVsYXlpbmcgc3RhcnR1cCBub3RpY2VhYmx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZFBpZE9uUG9ydChwb3J0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgY29uc3QgeyBleGVjRmlsZTogZXhlY0ZpbGVDYiB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmNoaWxkX3Byb2Nlc3MnKTtcbiAgY29uc3QgeyBwcm9taXNpZnkgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTp1dGlsJyk7XG4gIGNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGVDYik7XG5cbiAgLy8gVHJ5IGxzb2YgZmlyc3QgKG1hY09TICsgbW9zdCBMaW51eCksIGZhbGwgYmFjayB0byBmdXNlciAobWluaW1hbCBMaW51eC9Eb2NrZXIpXG4gIGZvciAoY29uc3QgY21kIG9mIFtcbiAgICB7IGJpbjogJ2xzb2YnLCBhcmdzOiBbJy10aScsIGA6JHtwb3J0fWBdIH0sXG4gICAgeyBiaW46ICdmdXNlcicsIGFyZ3M6IFtgJHtwb3J0fS90Y3BgXSB9LFxuICBdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoY21kLmJpbiwgY21kLmFyZ3MsIHsgdGltZW91dDogQ09NTUFORF9USU1FT1VUX01TIH0pO1xuICAgICAgLy8gZnVzZXIgb3V0cHV0cyB0byBzdGRlcnIgb24gc29tZSBzeXN0ZW1zXG4gICAgICBjb25zdCBvdXRwdXQgPSAoc3Rkb3V0IHx8IHN0ZGVyciB8fCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgcGlkcyA9IG91dHB1dFxuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAubWFwKCh0b2tlbikgPT4gcGFyc2VQaWRUb2tlbih0b2tlbikpXG4gICAgICAgIC5maWx0ZXIoKHBpZCk6IHBpZCBpcyBudW1iZXIgPT4gcGlkICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IG90aGVyUGlkID0gcGlkcy5maW5kKHAgPT4gcCAhPT0gcHJvY2Vzcy5waWQpO1xuICAgICAgaWYgKG90aGVyUGlkKSByZXR1cm4gb3RoZXJQaWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTsgLy8gY29tbWFuZCBub3QgZm91bmQgb3Igbm8gcmVzdWx0cyDigJQgdHJ5IG5leHRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2lsbCBhIHN0YWxlIHByb2Nlc3MgaG9sZGluZyBhIHBvcnQuIFNlbmRzIFNJR1RFUk0sIHdhaXRzIGJyaWVmbHksXG4gKiB0aGVuIFNJR0tJTEwgaWYgc3RpbGwgYWxpdmUuIE9ubHkga2lsbHMgRG9sbGhvdXNlTUNQIHByb2Nlc3Nlc1xuICogKHZlcmlmaWVkIGJ5IGNoZWNraW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHVzZXIgb3duZXJzaGlwKS5cbiAqXG4gKiBUaW1lb3V0OiAxcyBmb3IgcHMgdmVyaWZpY2F0aW9uLiBLaWxsIHdhaXQ6IDMwMG1zIMOXIDEwIHBvbGxzID0gM3NcbiAqIGJlZm9yZSBlc2NhbGF0aW5nIHRvIFNJR0tJTEwuIFRvdGFsIHdvcnN0IGNhc2U6IH40cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBvdXRjb21lID0gYXdhaXQga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkKHBpZCwgcG9ydCk7XG4gIHJldHVybiBvdXRjb21lLmtpbGxlZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxTdGFsZVByb2Nlc3NEZXRhaWxlZChcbiAgcGlkOiBudW1iZXIsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogS2lsbFN0YWxlUHJvY2Vzc09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8S2lsbFN0YWxlUHJvY2Vzc091dGNvbWU+IHtcbiAgY29uc3QgcHJvY2Vzc0luZm8gPSBhd2FpdCBpbnNwZWN0UHJvY2VzcyhwaWQpO1xuICBpZiAoIXByb2Nlc3NJbmZvKSB7XG4gICAgYXdhaXQgbG9nZ2VyLmRlYnVnKGBbV2ViVUldIENhbm5vdCB2ZXJpZnkgcHJvY2VzcyAke3BpZH0g4oCUIHNraXBwaW5nIGtpbGxgKTtcbiAgICByZXR1cm4geyBraWxsZWQ6IGZhbHNlLCByZWFzb246ICdpbnNwZWN0X2ZhaWxlZCcsIHBpZCB9O1xuICB9XG5cbiAgY29uc3QgZ3VhcmRGYWlsdXJlID0gYXdhaXQgZ2V0S2lsbEd1YXJkRmFpbHVyZShwcm9jZXNzSW5mbywgcG9ydCwgb3B0aW9ucyk7XG4gIGlmIChndWFyZEZhaWx1cmUpIHtcbiAgICByZXR1cm4gZ3VhcmRGYWlsdXJlO1xuICB9XG4gIGNvbnN0IHBhcmVudENvbW1hbmQgPSBwcm9jZXNzSW5mby5wYXJlbnRQaWQgPiBST09UX1BBUkVOVF9QSURcbiAgICA/IChhd2FpdCBnZXRQcm9jZXNzQ29tbWFuZChwcm9jZXNzSW5mby5wYXJlbnRQaWQpKSA/PyB1bmRlZmluZWRcbiAgICA6IHVuZGVmaW5lZDtcblxuICBhd2FpdCBsb2dnZXIuZGVidWcoYFtXZWJVSV0gVmVyaWZpZWQgc3RhbGUgcHJvY2VzcyAke3BpZH0gaXMgRG9sbGhvdXNlTUNQYCwgeyBjbWRMaW5lOiBwcm9jZXNzSW5mby5jb21tYW5kLCBwYXJlbnRQaWQ6IHByb2Nlc3NJbmZvLnBhcmVudFBpZCwgcGFyZW50Q29tbWFuZCB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0ZXJtaW5hdGVQcm9jZXNzKHByb2Nlc3NJbmZvLCBwb3J0LCBwYXJlbnRDb21tYW5kKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFpc1BpZEFsaXZlKHBpZCkpIHtcbiAgICAgIHJldHVybiBidWlsZEtpbGxPdXRjb21lKHRydWUsICdhbHJlYWR5X2RlYWQnLCBwcm9jZXNzSW5mbywgcGFyZW50Q29tbWFuZCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZEtpbGxPdXRjb21lKGZhbHNlLCAnc2lnbmFsX2ZhaWxlZCcsIHByb2Nlc3NJbmZvLCBwYXJlbnRDb21tYW5kLCBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IGFuZCByZWNvdmVyIGZyb20gYSBzdGFsZSBwcm9jZXNzIHNxdWF0dGluZyBvbiB0aGUgcG9ydC5cbiAqIENvbXBhcmVzIHRoZSBwb3J0IGhvbGRlcidzIFBJRCBhZ2FpbnN0IHRoZSBsZWFkZXIgbG9jayBmaWxlIHRvIGRldGVybWluZVxuICogaWYgaXQncyBhIHNxdWF0dGVyLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNxdWF0dGVyIHdhcyBraWxsZWQuXG4gKlxuICogVGltZW91dHM6IGxzb2YgMXMsIHBzIDFzLCBTSUdURVJNIHdhaXQgM3Mg4oCUIG1heCB+NXMgdG90YWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyU3RhbGVQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzdGFsZVBpZCA9IGF3YWl0IGZpbmRQaWRPblBvcnQocG9ydCk7XG4gIGlmICghc3RhbGVQaWQpIHJldHVybiBmYWxzZTtcblxuICAvLyBUT0NUT1UgbWl0aWdhdGlvbjogYSBuZXcgcHJvY2VzcyBtYXkgaGF2ZSBqdXN0IGJvdW5kIHRoZSBwb3J0IGJ1dCBub3QgeWV0XG4gIC8vIHdyaXR0ZW4gaXRzIGxvY2sgZmlsZS4gUmVhZCB0aGUgbG9jaywgcGF1c2UsIHJlLXJlYWQuIElmIHRoZSBzZWNvbmQgcmVhZFxuICAvLyBub3cgbWF0Y2hlcyB0aGUgcG9ydCBob2xkZXIsIGl0J3MgYSBmcmVzaCBsZWFkZXIg4oCUIGRvbid0IGtpbGwuXG4gIGNvbnN0IHsgcmVhZExlYWRlckxvY2sgfSA9IGF3YWl0IGltcG9ydCgnLi9MZWFkZXJFbGVjdGlvbi5qcycpO1xuICBmb3IgKGxldCBjaGVjayA9IDA7IGNoZWNrIDwgTE9DS19SRUNIRUNLX0FUVEVNUFRTOyBjaGVjaysrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuICAgICAgaWYgKGxvY2s/LnBpZCA9PT0gc3RhbGVQaWQgJiYgbG9jaz8ucG9ydCA9PT0gcG9ydCAmJiBsb2NrLnBpZCAhPT0gcHJvY2Vzcy5waWQpIHtcbiAgICAgICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGhlbGQgYnkgbGVnaXRpbWF0ZSBsZWFkZXIgKHBpZCAke3N0YWxlUGlkfSkg4oCUIG5vdCBraWxsaW5nYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhbid0IHJlYWQgbG9jayBmaWxlIOKAlCBjb250aW51ZSB0byBuZXh0IGNoZWNrIG9yIGtpbGxcbiAgICB9XG4gICAgaWYgKGNoZWNrIDwgTE9DS19SRUNIRUNLX0FUVEVNUFRTIC0gMSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUkVDSEVDS19ERUxBWV9NUykpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG91dGNvbWUgPSBhd2FpdCBraWxsU3RhbGVQcm9jZXNzRGV0YWlsZWQoc3RhbGVQaWQsIHBvcnQpO1xuICBpZiAob3V0Y29tZS5raWxsZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBTdGFsZSBwcm9jZXNzICR7c3RhbGVQaWR9IHJlbW92ZWQgZnJvbSBwb3J0ICR7cG9ydH1gKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgU0lHS0lMTF9XQUlUX01TKSk7IC8vIGJyaWVmIHBhdXNlIGZvciBwb3J0IHJlbGVhc2VcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBsb2dnZXIuZGVidWcoYFtXZWJVSV0gU3RhbGUtcG9ydCByZWNvdmVyeSBza2lwcGVkIGZvciBwaWQgJHtzdGFsZVBpZH1gLCB7XG4gICAgICByZWFzb246IG91dGNvbWUucmVhc29uLFxuICAgICAgcGFyZW50UGlkOiBvdXRjb21lLnBhcmVudFBpZCxcbiAgICAgIHBhcmVudENvbW1hbmQ6IG91dGNvbWUucGFyZW50Q29tbWFuZCxcbiAgICAgIGRldGFpbDogb3V0Y29tZS5kZXRhaWwsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dGNvbWUua2lsbGVkO1xufVxuIl19
@@ -17,7 +17,7 @@ import type { MetricSnapshot } from '../../metrics/types.js';
17
17
  import type { MemoryLogSink } from '../../logging/sinks/MemoryLogSink.js';
18
18
  import type { MemoryMetricsSink } from '../../metrics/sinks/MemoryMetricsSink.js';
19
19
  import { logger } from '../../utils/logger.js';
20
- import { detectLegacyLeader, readLeaderLock, deleteLeaderLock, type ElectionResult, type ConsoleLeaderInfo } from './LeaderElection.js';
20
+ import { detectLegacyLeader, readLeaderLock, deleteLeaderLock, type ElectionResult, type ConsoleLeaderInfo, type LeaderPreferenceDecision } from './LeaderElection.js';
21
21
  import { findPidOnPort } from './StaleProcessRecovery.js';
22
22
  /**
23
23
  * Options for starting the unified console.
@@ -89,6 +89,11 @@ export interface BindFailureRecoveryResult extends PortLeaderDiscovery {
89
89
  lockCleanupAttempted: boolean;
90
90
  lockCleanupPerformed: boolean;
91
91
  }
92
+ export interface PortOwnerReplacementDecision {
93
+ shouldEvict: boolean;
94
+ ownerPid: number | null;
95
+ preference: LeaderPreferenceDecision | null;
96
+ }
92
97
  interface DiscoveryDependencies {
93
98
  fetchImpl?: typeof fetch;
94
99
  findPidOnPortImpl?: typeof findPidOnPort;
@@ -99,6 +104,7 @@ interface BindFailureRecoveryDependencies extends DiscoveryDependencies {
99
104
  deleteLeaderLockImpl?: typeof deleteLeaderLock;
100
105
  }
101
106
  export declare function recoverLeaderBindFailure(provisionalLeader: ConsoleLeaderInfo, port: number, authToken: string | null, deps?: BindFailureRecoveryDependencies): Promise<BindFailureRecoveryResult>;
107
+ export declare function evaluatePortOwnerReplacement(candidateLeader: ConsoleLeaderInfo, fallback: PortLeaderDiscovery): PortOwnerReplacementDecision;
102
108
  /**
103
109
  * Start the unified web console.
104
110
  *
@@ -1 +1 @@
1
- {"version":3,"file":"UnifiedConsole.d.ts","sourceRoot":"","sources":["../../../src/web/console/UnifiedConsole.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UnifiedConsole.d.ts","sourceRoot":"","sources":["../../../src/web/console/UnifiedConsole.ts"],"names":[],"mappings":"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"}
@@ -14,12 +14,12 @@
14
14
  */
15
15
  import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
16
16
  import { logger } from '../../utils/logger.js';
17
- import { electLeader, isLeaderWebConsoleReachable, forceClaimLeadership, startHeartbeat, registerLeaderCleanup, detectLegacyLeader, readLeaderLock, deleteLeaderLock, LOCK_VERSION, CONSOLE_PROTOCOL_VERSION, LEGACY_SERVER_VERSION, } from './LeaderElection.js';
17
+ import { electLeader, isLeaderWebConsoleReachable, forceClaimLeadership, startHeartbeat, registerLeaderCleanup, detectLegacyLeader, readLeaderLock, deleteLeaderLock, claimLeadership, createLeaderInfo, LOCK_VERSION, CONSOLE_PROTOCOL_VERSION, LEGACY_SERVER_VERSION, evaluateLeaderPreference, } from './LeaderElection.js';
18
18
  import { createIngestRoutes } from './IngestRoutes.js';
19
19
  import { LeaderForwardingLogSink, SessionHeartbeat, } from './LeaderForwardingSink.js';
20
20
  import { PromotionManager } from './PromotionManager.js';
21
21
  import { ConsoleTokenStore } from './consoleToken.js';
22
- import { findPidOnPort } from './StaleProcessRecovery.js';
22
+ import { findPidOnPort, killStaleProcessDetailed, } from './StaleProcessRecovery.js';
23
23
  import { env } from '../../config/env.js';
24
24
  /**
25
25
  * Default console port from the env var. Used as fallback when no port
@@ -206,6 +206,122 @@ export async function recoverLeaderBindFailure(provisionalLeader, port, authToke
206
206
  lockCleanupPerformed,
207
207
  };
208
208
  }
209
+ export function evaluatePortOwnerReplacement(candidateLeader, fallback) {
210
+ if (!fallback.leaderInfo || fallback.ownerPid === null || fallback.ownerPid === candidateLeader.pid) {
211
+ return {
212
+ shouldEvict: false,
213
+ ownerPid: fallback.ownerPid,
214
+ preference: null,
215
+ };
216
+ }
217
+ const preference = evaluateLeaderPreference(candidateLeader, fallback.leaderInfo);
218
+ return {
219
+ shouldEvict: preference.shouldReplace,
220
+ ownerPid: fallback.ownerPid,
221
+ preference,
222
+ };
223
+ }
224
+ function buildBindFailureLogContext(consolePort, provisionalLeader, bindResult, fallback, replacement, forcedKill) {
225
+ return {
226
+ port: consolePort,
227
+ bindError: bindResult?.error,
228
+ bindDetail: bindResult?.detail,
229
+ provisionalLeaderPid: provisionalLeader.pid,
230
+ provisionalLeaderSessionId: provisionalLeader.sessionId,
231
+ provisionalLeaderVersion: provisionalLeader.serverVersion ?? LEGACY_SERVER_VERSION,
232
+ provisionalLeaderProtocolVersion: provisionalLeader.consoleProtocolVersion ?? CONSOLE_PROTOCOL_VERSION,
233
+ fallbackOwnerPid: fallback.ownerPid,
234
+ fallbackSource: fallback.source,
235
+ fallbackLeaderPid: fallback.leaderInfo?.pid,
236
+ fallbackLeaderSessionId: fallback.leaderInfo?.sessionId,
237
+ fallbackLeaderVersion: fallback.leaderInfo?.serverVersion ?? LEGACY_SERVER_VERSION,
238
+ fallbackLeaderProtocolVersion: fallback.leaderInfo?.consoleProtocolVersion ?? CONSOLE_PROTOCOL_VERSION,
239
+ replacementShouldEvict: replacement?.shouldEvict ?? false,
240
+ replacementReason: replacement?.preference?.reason,
241
+ forcedKillReason: forcedKill?.reason,
242
+ forcedKillPid: forcedKill?.pid,
243
+ forcedKillDetail: forcedKill?.detail,
244
+ };
245
+ }
246
+ async function attemptForceTakeover(options, currentElection, consolePort, primaryToken, serverOpts, startWebServerImpl) {
247
+ const initialFallback = await recoverLeaderBindFailure(currentElection.leaderInfo, consolePort, primaryToken);
248
+ const initialReplacement = evaluatePortOwnerReplacement(currentElection.leaderInfo, initialFallback);
249
+ if (!initialReplacement.shouldEvict || initialReplacement.ownerPid === null) {
250
+ return {
251
+ webResult: { bindResult: { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` } },
252
+ election: currentElection,
253
+ fallback: initialFallback,
254
+ replacement: initialReplacement,
255
+ forcedKill: null,
256
+ takeoverAttempted: false,
257
+ reboundLockClaimed: false,
258
+ };
259
+ }
260
+ const latestFallback = await discoverLeaderServingPort(consolePort, primaryToken);
261
+ const latestReplacement = evaluatePortOwnerReplacement(currentElection.leaderInfo, latestFallback);
262
+ if (!latestReplacement.shouldEvict || latestReplacement.ownerPid === null) {
263
+ logger.warn('[UnifiedConsole] Forced takeover target changed before eviction; skipping forced kill', {
264
+ ...buildBindFailureLogContext(consolePort, currentElection.leaderInfo, { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` }, latestFallback, latestReplacement),
265
+ previousOwnerPid: initialReplacement.ownerPid,
266
+ });
267
+ return {
268
+ webResult: { bindResult: { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` } },
269
+ election: currentElection,
270
+ fallback: latestFallback,
271
+ replacement: latestReplacement,
272
+ forcedKill: null,
273
+ takeoverAttempted: false,
274
+ reboundLockClaimed: false,
275
+ };
276
+ }
277
+ logger.warn('[UnifiedConsole] Attempting forced takeover from older or incompatible active leader', {
278
+ ...buildBindFailureLogContext(consolePort, currentElection.leaderInfo, { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` }, latestFallback, latestReplacement),
279
+ });
280
+ const forcedKill = await killStaleProcessDetailed(latestReplacement.ownerPid, consolePort, {
281
+ allowActiveHostParent: true,
282
+ });
283
+ if (!forcedKill.killed) {
284
+ logger.warn('[UnifiedConsole] Forced takeover skipped or failed after identifying replaceable leader', {
285
+ ...buildBindFailureLogContext(consolePort, currentElection.leaderInfo, { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` }, latestFallback, latestReplacement, forcedKill),
286
+ });
287
+ return {
288
+ webResult: { bindResult: { success: false, error: 'EADDRINUSE', detail: `Port ${consolePort} already in use` } },
289
+ election: currentElection,
290
+ fallback: latestFallback,
291
+ replacement: latestReplacement,
292
+ forcedKill,
293
+ takeoverAttempted: true,
294
+ reboundLockClaimed: false,
295
+ };
296
+ }
297
+ const reboundWebResult = await startWebServerImpl(serverOpts);
298
+ let reboundElection = currentElection;
299
+ let reboundLockClaimed = false;
300
+ if (!reboundWebResult.bindResult || reboundWebResult.bindResult.success) {
301
+ const reboundLeaderInfo = createLeaderInfo(options.sessionId, consolePort);
302
+ reboundLockClaimed = await claimLeadership(reboundLeaderInfo);
303
+ if (!reboundLockClaimed) {
304
+ logger.warn('[UnifiedConsole] Rebound leader bound port but could not immediately re-claim lock', {
305
+ ...buildBindFailureLogContext(consolePort, reboundLeaderInfo, reboundWebResult.bindResult, latestFallback, latestReplacement, forcedKill),
306
+ });
307
+ }
308
+ reboundElection = { role: 'leader', leaderInfo: reboundLeaderInfo };
309
+ }
310
+ else {
311
+ logger.warn('[UnifiedConsole] Forced takeover killed old leader but bind retry still failed', {
312
+ ...buildBindFailureLogContext(consolePort, currentElection.leaderInfo, reboundWebResult.bindResult, latestFallback, latestReplacement, forcedKill),
313
+ });
314
+ }
315
+ return {
316
+ webResult: reboundWebResult,
317
+ election: reboundElection,
318
+ fallback: latestFallback,
319
+ replacement: latestReplacement,
320
+ forcedKill,
321
+ takeoverAttempted: true,
322
+ reboundLockClaimed,
323
+ };
324
+ }
209
325
  /**
210
326
  * Start the unified web console.
211
327
  *
@@ -283,31 +399,29 @@ async function startAsLeader(options, election, consolePort = DEFAULT_CONSOLE_PO
283
399
  };
284
400
  // bindAndListen now handles EADDRINUSE by finding and killing the stale
285
401
  // process on the port, then retrying. No external retry loop needed.
286
- const webResult = await startWebServer(serverOpts);
402
+ let webResult = await startWebServer(serverOpts);
287
403
  if (webResult.bindResult && !webResult.bindResult.success) {
288
- const fallback = await recoverLeaderBindFailure(election.leaderInfo, consolePort, primaryToken.token);
289
- if (fallback.leaderInfo) {
290
- logger.warn('[UnifiedConsole] Leader role aborted: bind failed, falling back to follower', {
291
- port: consolePort,
292
- bindError: webResult.bindResult.error,
293
- bindDetail: webResult.bindResult.detail,
294
- provisionalLeaderPid: election.leaderInfo.pid,
295
- provisionalLeaderSessionId: election.leaderInfo.sessionId,
296
- ownerPid: fallback.ownerPid,
297
- source: fallback.source,
298
- lockCleanupAttempted: fallback.lockCleanupAttempted,
299
- lockCleanupPerformed: fallback.lockCleanupPerformed,
404
+ const forceTakeover = await attemptForceTakeover(options, election, consolePort, primaryToken.token, serverOpts, startWebServer);
405
+ webResult = forceTakeover.webResult;
406
+ election = forceTakeover.election;
407
+ if (webResult.bindResult && !webResult.bindResult.success) {
408
+ if (forceTakeover.fallback.leaderInfo) {
409
+ logger.warn('[UnifiedConsole] Leader role aborted: bind failed, falling back to follower', {
410
+ ...buildBindFailureLogContext(consolePort, election.leaderInfo, webResult.bindResult, forceTakeover.fallback, forceTakeover.replacement, forceTakeover.forcedKill),
411
+ takeoverAttempted: forceTakeover.takeoverAttempted,
412
+ reboundLockClaimed: forceTakeover.reboundLockClaimed,
413
+ lockCleanupAttempted: forceTakeover.fallback.source !== 'none',
414
+ });
415
+ const followerElection = { role: 'follower', leaderInfo: forceTakeover.fallback.leaderInfo };
416
+ return startAsFollower(options, followerElection, consolePort, primaryToken.token);
417
+ }
418
+ logger.error('[UnifiedConsole] Leader failed to bind and no active leader could be identified', {
419
+ ...buildBindFailureLogContext(consolePort, election.leaderInfo, webResult.bindResult, forceTakeover.fallback, forceTakeover.replacement, forceTakeover.forcedKill),
420
+ takeoverAttempted: forceTakeover.takeoverAttempted,
421
+ reboundLockClaimed: forceTakeover.reboundLockClaimed,
300
422
  });
301
- const followerElection = { role: 'follower', leaderInfo: fallback.leaderInfo };
302
- return startAsFollower(options, followerElection, consolePort, primaryToken.token);
423
+ throw new Error(`Leader failed to bind port ${consolePort} and no active leader was discoverable`);
303
424
  }
304
- logger.error('[UnifiedConsole] Leader failed to bind and no active leader could be identified', {
305
- port: consolePort,
306
- provisionalLeaderPid: election.leaderInfo.pid,
307
- bindError: webResult.bindResult.error,
308
- bindDetail: webResult.bindResult.detail,
309
- });
310
- throw new Error(`Leader failed to bind port ${consolePort} and no active leader was discoverable`);
311
425
  }
312
426
  // Register the leader only after the HTTP listener is actually serving the port.
313
427
  ingestResult.registerLeaderSession(options.sessionId, process.pid);
@@ -394,4 +508,4 @@ async function startAsFollower(options, election, consolePort = DEFAULT_CONSOLE_
394
508
  },
395
509
  };
396
510
  }
397
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUd0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztBQUM1RCxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLG1DQUFtQyxHQUFHLGFBQWEsQ0FBQztBQUUxRCxTQUFTLGdCQUFnQjtJQUN2QixPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQW9DRDs7Ozs7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QztJQUVILE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixRQUFRO1FBQ1IsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmlmaWVkIHdlYiBjb25zb2xlIG9yY2hlc3RyYXRvci5cbiAqXG4gKiBUaWVzIHRvZ2V0aGVyIGxlYWRlciBlbGVjdGlvbiwgY29uc29sZSBzdGFydHVwLCBmb2xsb3dlciB3aXJpbmcsXG4gKiBhbmQgc2Vzc2lvbiBsaWZlY3ljbGUgbWFuYWdlbWVudC4gVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludFxuICogY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGRlZmVycmVkIHNldHVwLlxuICpcbiAqIEZsb3c6XG4gKiAxLiBSdW4gbGVhZGVyIGVsZWN0aW9uIChyZWFkIGxvY2sgZmlsZSwgY2xhaW0gb3IgZm9sbG93KVxuICogMi4gSWYgbGVhZGVyOiBzdGFydCB3ZWIgc2VydmVyIG9uIGZpeGVkIHBvcnQsIG1vdW50IGluZ2VzdCByb3V0ZXMsIHN0YXJ0IGhlYXJ0YmVhdFxuICogMy4gSWYgZm9sbG93ZXI6IHJlZ2lzdGVyIGZvcndhcmRpbmcgc2lua3Mgd2l0aCBMb2dNYW5hZ2VyLCBzdGFydCBzZXNzaW9uIGhlYXJ0YmVhdFxuICpcbiAqIEBzaW5jZSB2Mi4xLjAg4oCUIElzc3VlICMxNzAwXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBVbmlmaWVkTG9nRW50cnkgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0cmljU25hcHNob3QgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBlbGVjdExlYWRlcixcbiAgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlLFxuICBmb3JjZUNsYWltTGVhZGVyc2hpcCxcbiAgc3RhcnRIZWFydGJlYXQsXG4gIHJlZ2lzdGVyTGVhZGVyQ2xlYW51cCxcbiAgZGV0ZWN0TGVnYWN5TGVhZGVyLFxuICByZWFkTGVhZGVyTG9jayxcbiAgZGVsZXRlTGVhZGVyTG9jayxcbiAgTE9DS19WRVJTSU9OLFxuICBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgdHlwZSBFbGVjdGlvblJlc3VsdCxcbiAgdHlwZSBDb25zb2xlTGVhZGVySW5mbyxcbn0gZnJvbSAnLi9MZWFkZXJFbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSBmcm9tICcuL0luZ2VzdFJvdXRlcy5qcyc7XG5pbXBvcnQge1xuICBMZWFkZXJGb3J3YXJkaW5nTG9nU2luayxcbiAgU2Vzc2lvbkhlYXJ0YmVhdCxcbn0gZnJvbSAnLi9MZWFkZXJGb3J3YXJkaW5nU2luay5qcyc7XG5pbXBvcnQgeyBQcm9tb3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi9Qcm9tb3Rpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbnNvbGVUb2tlblN0b3JlIH0gZnJvbSAnLi9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHsgZmluZFBpZE9uUG9ydCB9IGZyb20gJy4vU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBjb25zb2xlIHBvcnQgZnJvbSB0aGUgZW52IHZhci4gVXNlZCBhcyBmYWxsYmFjayB3aGVuIG5vIHBvcnRcbiAqIGlzIHByb3ZpZGVkIHZpYSBjb25maWcgZmlsZSBvciBvcHRpb25zLiBUaGUgcmVzb2x1dGlvbiBoaWVyYXJjaHkgaXM6XG4gKiAgIDEuIG9wdGlvbnMucG9ydCAoZnJvbSBjb25maWcgZmlsZSwgcmVzb2x2ZWQgYnkgdGhlIERJIGNvbnRhaW5lcilcbiAqICAgMi4gRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQgZW52IHZhclxuICogICAzLiA0MTcxNSAoaGFyZGNvZGVkIGRlZmF1bHQgaW4gZW52LnRzKVxuICovXG5jb25zdCBERUZBVUxUX0NPTlNPTEVfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IExFR0FDWV9DT05TT0xFX0ZBTExCQUNLX1BPUlQgPSAzOTM5O1xuY29uc3QgU1lOVEhFVElDX1BPUlRfT1dORVJfU0VTU0lPTl9QUkVGSVggPSAncG9ydC1vd25lci0nO1xuXG5mdW5jdGlvbiBjdXJyZW50VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgdGhlIHVuaWZpZWQgY29uc29sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkQ29uc29sZU9wdGlvbnMge1xuICAvKiogVGhpcyBwcm9jZXNzJ3MgdW5pcXVlIHNlc3Npb24gSUQgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBQb3J0Zm9saW8gYmFzZSBkaXJlY3RvcnkgKGZvciBzdGFydFdlYlNlcnZlcikgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBMb2cgbWVtb3J5IHNpbmsgKGZvciBjb25zb2xlIGhpc3RvcnkpICovXG4gIG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIC8qKiBNZXRyaWNzIG1lbW9yeSBzaW5rICovXG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIC8qKiBNQ1AtQVFMIGhhbmRsZXIgZm9yIHBlcm1pc3Npb24gcm91dGVzICh0eXBlZCBhcyBhbnkgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0cykgKi9cbiAgbWNwQXFsSGFuZGxlcj86IGFueTtcbiAgLyoqIENhbGxiYWNrIHRvIHJlZ2lzdGVyIGEgbG9nIHNpbmsgd2l0aCB0aGUgTG9nTWFuYWdlciAqL1xuICByZWdpc3RlckxvZ1Npbms6IChzaW5rOiB7IHdyaXRlKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpOiB2b2lkOyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+OyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IH0pID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB0byB3aXJlIFNTRSBicm9hZGNhc3RzIGFmdGVyIHdlYiBzZXJ2ZXIgc3RhcnRzICovXG4gIHdpcmVTU0VCcm9hZGNhc3RzOiAod2ViUmVzdWx0OiB7IGxvZ0Jyb2FkY2FzdD86IChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkOyBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQgfSwgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaykgPT4gdm9pZDtcbiAgLyoqIENvbnNvbGUgcG9ydCBvdmVycmlkZSBmcm9tIGNvbmZpZyBmaWxlLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyB0aGUgdW5pZmllZCBjb25zb2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWZpZWRDb25zb2xlUmVzdWx0IHtcbiAgcm9sZTogJ2xlYWRlcicgfCAnZm9sbG93ZXInO1xuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQ7XG4gIC8qKiBQb3J0IHRoZSBjb25zb2xlIGlzIHJ1bm5pbmcgb24gKGxlYWRlciBvbmx5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogQ2xlYW51cCBmdW5jdGlvbiB0byBjYWxsIG9uIHNodXRkb3duICovXG4gIGNsZWFudXA6ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGEgcnVubmluZyBsZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgYW5kXG4gKiBsb2cgYSBXQVJOLWxldmVsIG1lc3NhZ2UgaWYgb25lIGlzIGZvdW5kICgjMTc5NCkuXG4gKlxuICogRXh0cmFjdGVkIGZyb20gYHN0YXJ0VW5pZmllZENvbnNvbGVgIHNvIHRoZSB3aXJpbmcgY2FuIGJlIGludGVncmF0aW9uLVxuICogdGVzdGVkIGluIGlzb2xhdGlvbiB3aXRob3V0IHNwaW5uaW5nIHVwIGEgZnVsbCB3ZWIgc2VydmVyIGFuZCBsZWFkZXJcbiAqIGVsZWN0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgZmlyZS1hbmQtZm9yZ2V0OiBkZXRlY3Rpb24gZmFpbHVyZXNcbiAqIGFyZSBsb2dnZWQgYXQgREVCVUcgYW5kIG5ldmVyIHByb3BhZ2F0ZSwgYmVjYXVzZSBhIGZhaWx1cmUgaGVyZSBtdXN0XG4gKiBub3QgYmxvY2sgbGVhZGVyIGVsZWN0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRQb3J0IC0gVGhlIHBvcnQgdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZSBpbnRlbmRzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICBiaW5kIHRvLiBVc2VkIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gaGVscCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdGVsbCB0aGUgdHdvIGNvbnNvbGVzIGFwYXJ0LlxuICogQHBhcmFtIGRldGVjdCAgICAgIC0gT3B0aW9uYWwgaW5qZWN0aW9uIHBvaW50IGZvciB0aGUgZGV0ZWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gYGRldGVjdExlZ2FjeUxlYWRlcmAuIFRlc3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICBwYXNzIGEgc3R1Yi5cbiAqIEBwYXJhbSBsb2cgICAgICAgICAtIE9wdGlvbmFsIGluamVjdGlvbiBwb2ludCBmb3IgdGhlIGxvZ2dlci4gRGVmYXVsdHNcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2R1bGUgbG9nZ2VyLiBUZXN0cyBwYXNzIGEgc3B5LlxuICogQHJldHVybnMgVGhlIGxlZ2FjeSBsZWFkZXIgaW5mbyBmcm9tIGBkZXRlY3QoKWAsIG9yIG51bGwgaWYgZGV0ZWN0aW9uXG4gKiAgICAgICAgICB0aHJldy4gRXhwb3NlZCBzbyB0ZXN0cyBjYW4gYXNzZXJ0IHRoZSBmdWxsIHJlc3VsdCBzaGFwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhcm5JZkxlZ2FjeUNvbnNvbGVQcmVzZW50KFxuICBjdXJyZW50UG9ydDogbnVtYmVyLFxuICBkZXRlY3Q6IHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXIgPSBkZXRlY3RMZWdhY3lMZWFkZXIsXG4gIGxvZzogdHlwZW9mIGxvZ2dlciA9IGxvZ2dlcixcbik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXI+PiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZWdhY3kgPSBhd2FpdCBkZXRlY3QoKTtcbiAgICBpZiAobGVnYWN5LmxlZ2FjeVJ1bm5pbmcpIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgW1VuaWZpZWRDb25zb2xlXSBMZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgZGV0ZWN0ZWQgYCArXG4gICAgICAgIGAocGlkPSR7bGVnYWN5LnBpZH0sIHBvcnQ9JHtsZWdhY3kucG9ydH0pLiBCb3RoIGNvbnNvbGVzIHdpbGwgcnVuIGAgK1xuICAgICAgICBgaW5kZXBlbmRlbnRseSBvbiBkaWZmZXJlbnQgcG9ydHMgd2l0aCBkaWZmZXJlbnQgc2VjdXJpdHkgcG9zdHVyZS4gYCArXG4gICAgICAgIGBUaGUgYXV0aGVudGljYXRlZCBjb25zb2xlICh0aGlzIHByb2Nlc3MpIHVzZXMgcG9ydCAke2N1cnJlbnRQb3J0fTsgYCArXG4gICAgICAgIGB0aGUgbGVnYWN5IGNvbnNvbGUgdXNlcyBwb3J0ICR7bGVnYWN5LnBvcnQgPz8gTEVHQUNZX0NPTlNPTEVfRkFMTEJBQ0tfUE9SVH0uIGAgK1xuICAgICAgICBgRm9yIGNvbnNpc3RlbnQgc2VjdXJpdHksIHVwZGF0ZSB0aGUgbGVnYWN5IGluc3RhbGxhdGlvbiB0byBhIGAgK1xuICAgICAgICBgdmVyc2lvbiB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsZWdhY3k7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIEJlc3QtZWZmb3J0IOKAlCBuZXZlciBibG9jayBlbGVjdGlvbiBvbiBhIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgbG9nLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIExlZ2FjeSBsZWFkZXIgZGV0ZWN0aW9uIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNlc3Npb25BcGlSZWNvcmQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgcGlkOiBudW1iZXI7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgbGFzdEhlYXJ0YmVhdD86IHN0cmluZztcbiAgc3RhdHVzPzogc3RyaW5nO1xuICBpc0xlYWRlcj86IGJvb2xlYW47XG4gIGtpbmQ/OiBzdHJpbmc7XG4gIHNlcnZlclZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbnNvbGVQcm90b2NvbFZlcnNpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydExlYWRlckRpc2NvdmVyeSB7XG4gIGxlYWRlckluZm86IENvbnNvbGVMZWFkZXJJbmZvIHwgbnVsbDtcbiAgb3duZXJQaWQ6IG51bWJlciB8IG51bGw7XG4gIHNvdXJjZTogJ2FwaScgfCAnbG9jaycgfCAnc3ludGhldGljJyB8ICdub25lJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaW5kRmFpbHVyZVJlY292ZXJ5UmVzdWx0IGV4dGVuZHMgUG9ydExlYWRlckRpc2NvdmVyeSB7XG4gIGxvY2tDbGVhbnVwQXR0ZW1wdGVkOiBib29sZWFuO1xuICBsb2NrQ2xlYW51cFBlcmZvcm1lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIERpc2NvdmVyeURlcGVuZGVuY2llcyB7XG4gIGZldGNoSW1wbD86IHR5cGVvZiBmZXRjaDtcbiAgZmluZFBpZE9uUG9ydEltcGw/OiB0eXBlb2YgZmluZFBpZE9uUG9ydDtcbiAgcmVhZExlYWRlckxvY2tJbXBsPzogdHlwZW9mIHJlYWRMZWFkZXJMb2NrO1xufVxuXG5mdW5jdGlvbiBidWlsZERpc2NvdmVyeUhlYWRlcnMoYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBhdXRoVG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGVhZGVySW5mb0Zyb21TZXNzaW9uKHBvcnQ6IG51bWJlciwgb3duZXJQaWQ6IG51bWJlciwgbGVhZGVyU2Vzc2lvbjogU2Vzc2lvbkFwaVJlY29yZCk6IENvbnNvbGVMZWFkZXJJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgcGlkOiBvd25lclBpZCxcbiAgICBwb3J0LFxuICAgIHNlc3Npb25JZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobGVhZGVyU2Vzc2lvbi5zZXNzaW9uSWQpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgIHN0YXJ0ZWRBdDogbGVhZGVyU2Vzc2lvbi5zdGFydGVkQXQgPz8gY3VycmVudFRpbWVzdGFtcCgpLFxuICAgIGhlYXJ0YmVhdDogbGVhZGVyU2Vzc2lvbi5sYXN0SGVhcnRiZWF0ID8/IGN1cnJlbnRUaW1lc3RhbXAoKSxcbiAgICBzZXJ2ZXJWZXJzaW9uOiBsZWFkZXJTZXNzaW9uLnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IGxlYWRlclNlc3Npb24uY29uc29sZVByb3RvY29sVmVyc2lvbiA/PyBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3ludGhldGljTGVhZGVySW5mbyhwb3J0OiBudW1iZXIsIG93bmVyUGlkOiBudW1iZXIpOiBDb25zb2xlTGVhZGVySW5mbyB7XG4gIGNvbnN0IG5vdyA9IGN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgcGlkOiBvd25lclBpZCxcbiAgICBwb3J0LFxuICAgIHNlc3Npb25JZDogYCR7U1lOVEhFVElDX1BPUlRfT1dORVJfU0VTU0lPTl9QUkVGSVh9JHtvd25lclBpZH1gLFxuICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgIGhlYXJ0YmVhdDogbm93LFxuICAgIHNlcnZlclZlcnNpb246IExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyTGVhZGVyVmlhU2Vzc2lvbnNBcGkoXG4gIHBvcnQ6IG51bWJlcixcbiAgb3duZXJQaWQ6IG51bWJlcixcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLFxuICBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCxcbik6IFByb21pc2U8Q29uc29sZUxlYWRlckluZm8gfCBudWxsPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hJbXBsKGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0vYXBpL3Nlc3Npb25zYCwge1xuICAgIGhlYWRlcnM6IGJ1aWxkRGlzY292ZXJ5SGVhZGVycyhhdXRoVG9rZW4pLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHNlc3Npb25zPzogU2Vzc2lvbkFwaVJlY29yZFtdIH07XG4gIGNvbnN0IHNlc3Npb25zID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLnNlc3Npb25zKSA/IHBheWxvYWQuc2Vzc2lvbnMgOiBbXTtcbiAgY29uc3QgbGVhZGVyU2Vzc2lvbiA9IHNlc3Npb25zLmZpbmQoKHNlc3Npb24pID0+XG4gICAgc2Vzc2lvbi5waWQgPT09IG93bmVyUGlkICYmXG4gICAgc2Vzc2lvbi5pc0xlYWRlciA9PT0gdHJ1ZSAmJlxuICAgIHNlc3Npb24ua2luZCA9PT0gJ21jcCcgJiZcbiAgICBzZXNzaW9uLnN0YXR1cyAhPT0gJ3N0b3BwZWQnXG4gICk7XG4gIHJldHVybiBsZWFkZXJTZXNzaW9uID8gYnVpbGRMZWFkZXJJbmZvRnJvbVNlc3Npb24ocG9ydCwgb3duZXJQaWQsIGxlYWRlclNlc3Npb24pIDogbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQoXG4gIHBvcnQ6IG51bWJlcixcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLFxuICBkZXBzOiBEaXNjb3ZlcnlEZXBlbmRlbmNpZXMgPSB7fSxcbik6IFByb21pc2U8UG9ydExlYWRlckRpc2NvdmVyeT4ge1xuICBjb25zdCBmZXRjaEltcGwgPSBkZXBzLmZldGNoSW1wbCA/PyBmZXRjaDtcbiAgY29uc3QgZmluZFBpZE9uUG9ydEltcGwgPSBkZXBzLmZpbmRQaWRPblBvcnRJbXBsID8/IGZpbmRQaWRPblBvcnQ7XG4gIGNvbnN0IHJlYWRMZWFkZXJMb2NrSW1wbCA9IGRlcHMucmVhZExlYWRlckxvY2tJbXBsID8/IHJlYWRMZWFkZXJMb2NrO1xuICBjb25zdCBvd25lclBpZCA9IGF3YWl0IGZpbmRQaWRPblBvcnRJbXBsKHBvcnQpO1xuXG4gIGlmIChvd25lclBpZCAhPT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsZWFkZXJJbmZvID0gYXdhaXQgZGlzY292ZXJMZWFkZXJWaWFTZXNzaW9uc0FwaShwb3J0LCBvd25lclBpZCwgYXV0aFRva2VuLCBmZXRjaEltcGwpO1xuICAgICAgaWYgKGxlYWRlckluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgb3duZXJQaWQsIHNvdXJjZTogJ2FwaScsIGxlYWRlckluZm8gfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBGYWlsZWQgdG8gcXVlcnkgYWN0aXZlIGxlYWRlciBzZXNzaW9ucycsIHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgb3duZXJQaWQsXG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2tJbXBsKCk7XG4gIGlmIChsb2NrPy5wb3J0ID09PSBwb3J0ICYmIChvd25lclBpZCA9PT0gbnVsbCB8fCBsb2NrLnBpZCA9PT0gb3duZXJQaWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG93bmVyUGlkOiBvd25lclBpZCA/PyBsb2NrLnBpZCxcbiAgICAgIHNvdXJjZTogJ2xvY2snLFxuICAgICAgbGVhZGVySW5mbzoge1xuICAgICAgICAuLi5sb2NrLFxuICAgICAgICBzZXNzaW9uSWQ6IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGxvY2suc2Vzc2lvbklkKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvd25lclBpZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBvd25lclBpZCxcbiAgICAgIHNvdXJjZTogJ3N5bnRoZXRpYycsXG4gICAgICBsZWFkZXJJbmZvOiBidWlsZFN5bnRoZXRpY0xlYWRlckluZm8ocG9ydCwgb3duZXJQaWQpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBsZWFkZXJJbmZvOiBudWxsLCBvd25lclBpZDogbnVsbCwgc291cmNlOiAnbm9uZScgfTtcbn1cblxuaW50ZXJmYWNlIEJpbmRGYWlsdXJlUmVjb3ZlcnlEZXBlbmRlbmNpZXMgZXh0ZW5kcyBEaXNjb3ZlcnlEZXBlbmRlbmNpZXMge1xuICBkZWxldGVMZWFkZXJMb2NrSW1wbD86IHR5cGVvZiBkZWxldGVMZWFkZXJMb2NrO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckxlYWRlckJpbmRGYWlsdXJlKFxuICBwcm92aXNpb25hbExlYWRlcjogQ29uc29sZUxlYWRlckluZm8sXG4gIHBvcnQ6IG51bWJlcixcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLFxuICBkZXBzOiBCaW5kRmFpbHVyZVJlY292ZXJ5RGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPEJpbmRGYWlsdXJlUmVjb3ZlcnlSZXN1bHQ+IHtcbiAgY29uc3QgcmVhZExlYWRlckxvY2tJbXBsID0gZGVwcy5yZWFkTGVhZGVyTG9ja0ltcGwgPz8gcmVhZExlYWRlckxvY2s7XG4gIGNvbnN0IGRlbGV0ZUxlYWRlckxvY2tJbXBsID0gZGVwcy5kZWxldGVMZWFkZXJMb2NrSW1wbCA/PyBkZWxldGVMZWFkZXJMb2NrO1xuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgYmluZCByZWNvdmVyeSBpbml0aWF0ZWQnLCB7XG4gICAgcHJvdmlzaW9uYWxTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICBwcm92aXNpb25hbFBpZDogcHJvdmlzaW9uYWxMZWFkZXIucGlkLFxuICAgIHBvcnQsXG4gIH0pO1xuXG4gIGxldCBmYWxsYmFjayA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQocG9ydCwgYXV0aFRva2VuLCBkZXBzKTtcbiAgbGV0IGxvY2tDbGVhbnVwQXR0ZW1wdGVkID0gZmFsc2U7XG4gIGxldCBsb2NrQ2xlYW51cFBlcmZvcm1lZCA9IGZhbHNlO1xuICBjb25zdCBjdXJyZW50TG9jayA9IGF3YWl0IHJlYWRMZWFkZXJMb2NrSW1wbCgpO1xuICBjb25zdCBwcm92aXNpb25hbExvY2tNYXRjaGVzID0gKFxuICAgIGN1cnJlbnRMb2NrPy5waWQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCAmJlxuICAgIGN1cnJlbnRMb2NrLnBvcnQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnBvcnQgJiZcbiAgICBjdXJyZW50TG9jay5zZXNzaW9uSWQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZFxuICApO1xuICBjb25zdCBmYWxsYmFja1BvaW50c1RvUHJvdmlzaW9uYWxMZWFkZXIgPSAoXG4gICAgZmFsbGJhY2subGVhZGVySW5mbz8ucGlkID09PSBwcm92aXNpb25hbExlYWRlci5waWQgJiZcbiAgICBmYWxsYmFjay5sZWFkZXJJbmZvLnBvcnQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnBvcnQgJiZcbiAgICBmYWxsYmFjay5sZWFkZXJJbmZvLnNlc3Npb25JZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkXG4gICk7XG5cbiAgaWYgKHByb3Zpc2lvbmFsTG9ja01hdGNoZXMpIHtcbiAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZCA9IHRydWU7XG4gICAgYXdhaXQgZGVsZXRlTGVhZGVyTG9ja0ltcGwoKTtcbiAgICBsb2NrQ2xlYW51cFBlcmZvcm1lZCA9IHRydWU7XG4gICAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gUmVtb3ZlZCBwcm92aXNpb25hbCBsZWFkZXIgbG9jayBhZnRlciBiaW5kIGZhaWx1cmUnLCB7XG4gICAgICBwcm92aXNpb25hbFNlc3Npb25JZDogcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkLFxuICAgICAgcHJvdmlzaW9uYWxQaWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gICAgaWYgKGZhbGxiYWNrUG9pbnRzVG9Qcm92aXNpb25hbExlYWRlcikge1xuICAgICAgZmFsbGJhY2sgPSBhd2FpdCBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0KHBvcnQsIGF1dGhUb2tlbiwgZGVwcyk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gTGVhZGVyIGJpbmQgcmVjb3ZlcnkgY29tcGxldGVkJywge1xuICAgIHByb3Zpc2lvbmFsU2Vzc2lvbklkOiBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWQsXG4gICAgcHJvdmlzaW9uYWxQaWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCxcbiAgICBwb3J0LFxuICAgIGRpc2NvdmVyeVNvdXJjZTogZmFsbGJhY2suc291cmNlLFxuICAgIG93bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZCxcbiAgICBsb2NrQ2xlYW51cFBlcmZvcm1lZCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5mYWxsYmFjayxcbiAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZCxcbiAgICBsb2NrQ2xlYW51cFBlcmZvcm1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgdW5pZmllZCB3ZWIgY29uc29sZS5cbiAqXG4gKiBSdW5zIGxlYWRlciBlbGVjdGlvbiwgdGhlbiBlaXRoZXIgc3RhcnRzIHRoZSBmdWxsIGNvbnNvbGUgKGxlYWRlcilcbiAqIG9yIHNldHMgdXAgZXZlbnQgZm9yd2FyZGluZyAoZm9sbG93ZXIpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRVbmlmaWVkQ29uc29sZShvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMpOiBQcm9taXNlPFVuaWZpZWRDb25zb2xlUmVzdWx0PiB7XG4gIC8vIFJlc29sdmUgcG9ydDogb3B0aW9ucyAoY29uZmlnIGZpbGUpIOKGkiBlbnYgdmFyIOKGkiBkZWZhdWx0XG4gIGNvbnN0IGNvbnNvbGVQb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfQ09OU09MRV9QT1JUO1xuICBsb2dnZXIuZGVidWcoYFtVbmlmaWVkQ29uc29sZV0gUG9ydCByZXNvbHZlZDogJHtjb25zb2xlUG9ydH1gICtcbiAgICAob3B0aW9ucy5wb3J0ID8gJyAoZnJvbSBjb25maWcgZmlsZSknIDogYCAoZnJvbSBlbnYvZGVmYXVsdClgKSk7XG5cbiAgLy8gTGVnYWN5LWxlYWRlciBkZXRlY3Rpb24gKCMxNzk0KSDigJQgd2FybiB0aGUgdXNlciBpZiBhIHByZS1hdXRoXG4gIC8vIERvbGxob3VzZU1DUCBjb25zb2xlIGlzIHJ1bm5pbmcgYWxvbmdzaWRlIHRoaXMgYXV0aGVudGljYXRlZCBvbmUuXG4gIC8vIFRoZXkgd2lsbCBjb2V4aXN0IGZpbmUgYmVjYXVzZSBvZiBwb3J0ICsgbG9jayArIHRva2VuIGZpbGUgaXNvbGF0aW9uLFxuICAvLyBidXQgdGhlIHVzZXIgc2hvdWxkIGtub3cgYm90aCBleGlzdCBzbyB0aGUgZGlmZmVyaW5nIHNlY3VyaXR5IHBvc3R1cmVcbiAgLy8gYmV0d2VlbiB0aGVtIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnVnLlxuICBhd2FpdCB3YXJuSWZMZWdhY3lDb25zb2xlUHJlc2VudChjb25zb2xlUG9ydCk7XG5cbiAgbGV0IGVsZWN0aW9uID0gYXdhaXQgZWxlY3RMZWFkZXIob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcblxuICAvLyBJZiB3ZSBsb3N0IHRoZSBlbGVjdGlvbiwgY2hlY2sgaWYgdGhlIGxlYWRlciBpcyBhY3R1YWxseSBydW5uaW5nIGEgd2ViIGNvbnNvbGUuXG4gIC8vIEFuIE1DUCBzdGRpbyBwcm9jZXNzIG1heSBob2xkIGxlYWRlcnNoaXAgYnV0IG5vdCBzZXJ2ZSB3ZWIgcm91dGVzLlxuICAvLyBJbiB0aGF0IGNhc2UsIGZvcmNlIGEgdGFrZW92ZXIgc28gdGhlIHdlYiBjb25zb2xlIHdvcmtzIHByb3Blcmx5LlxuICBpZiAoZWxlY3Rpb24ucm9sZSA9PT0gJ2ZvbGxvd2VyJykge1xuICAgIGNvbnN0IHJlYWNoYWJsZSA9IGF3YWl0IGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZShlbGVjdGlvbi5sZWFkZXJJbmZvKTtcbiAgICBpZiAoIXJlYWNoYWJsZSkge1xuICAgICAgZWxlY3Rpb24gPSBhd2FpdCBmb3JjZUNsYWltTGVhZGVyc2hpcChvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbGVjdGlvbi5yb2xlID09PSAnbGVhZGVyJykge1xuICAgIHJldHVybiBzdGFydEFzTGVhZGVyKG9wdGlvbnMsIGVsZWN0aW9uLCBjb25zb2xlUG9ydCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBlbGVjdGlvbiwgY29uc29sZVBvcnQpO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYXMgdGhlIGNvbnNvbGUgbGVhZGVyLlxuICogQmluZHMgdGhlIHJlc29sdmVkIGNvbnNvbGUgcG9ydCAoY29uZmlnIGZpbGUg4oaSIGVudiB2YXIg4oaSIGRlZmF1bHQpLFxuICogbW91bnRzIGFsbCByb3V0ZXMgaW5jbHVkaW5nIGluZ2VzdGlvbiwgc3RhcnRzIGhlYXJ0YmVhdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRBc0xlYWRlcihcbiAgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIgPSBERUZBVUxUX0NPTlNPTEVfUE9SVCxcbik6IFByb21pc2U8VW5pZmllZENvbnNvbGVSZXN1bHQ+IHtcbiAgY29uc3QgeyBzdGFydFdlYlNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2ZXIuanMnKTtcbiAgY29uc3QgeyBwaWNrUmFuZG9tVG9rZW5OYW1lIH0gPSBhd2FpdCBpbXBvcnQoJy4vU2Vzc2lvbk5hbWVzLmpzJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgY29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBDcmVhdGVzIHRoZSB0b2tlbiBmaWxlIG9uXG4gIC8vIGZpcnN0IHJ1biwgcmVhZHMgdGhlIGV4aXN0aW5nIHRva2VucyBvbiBzdWJzZXF1ZW50IHJ1bnMuIFRoZSB0b2tlbiBpc1xuICAvLyBwZXJzaXN0ZW50IGFjcm9zcyByZXN0YXJ0cyDigJQgb25seSByb3RhdGVkIG9uIGV4cGxpY2l0IHJlcXVlc3QgKFBoYXNlIDIpLlxuICAvLyBGZWF0dXJlIGZsYWcgRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgY29udHJvbHMgZW5mb3JjZW1lbnQ7IHRoZSBmaWxlXG4gIC8vIGlzIGdlbmVyYXRlZCByZWdhcmRsZXNzIHNvIGNvbnN1bWVycyBjYW4gYXR0YWNoIHRva2VucyBwcmVlbXB0aXZlbHkuXG4gIGNvbnN0IHRva2VuU3RvcmUgPSBuZXcgQ29uc29sZVRva2VuU3RvcmUoZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUpO1xuICBjb25zdCBwcmltYXJ5VG9rZW4gPSBhd2FpdCB0b2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7XG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIENvbnNvbGUgdG9rZW4gc3RvcmUgaW5pdGlhbGl6ZWQnLCB7XG4gICAgdG9rZW5JZDogcHJpbWFyeVRva2VuLmlkLFxuICAgIHRva2VuTmFtZTogcHJpbWFyeVRva2VuLm5hbWUsXG4gICAgZmlsZTogdG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpLFxuICAgIGF1dGhFbmZvcmNlZDogZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVELFxuICB9KTtcblxuICAvLyBQcmUtY3JlYXRlIGEgcGxhY2Vob2xkZXIgYnJvYWRjYXN0IHRoYXQgd2UnbGwgd2lyZSB1cCBhZnRlciB0aGUgc2VydmVyIHN0YXJ0c1xuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgbGV0IGxpdmVNZXRyaWNzT25TbmFwc2hvdDogKChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8vIENyZWF0ZSBpbmdlc3Rpb24gcm91dGVzIHdpdGggYSBkZWZlcnJlZCBicm9hZGNhc3QgKHdpcmVkIGFmdGVyIHNlcnZlciBzdGFydHMpXG4gIGNvbnN0IGluZ2VzdFJlc3VsdCA9IGNyZWF0ZUluZ2VzdFJvdXRlcyh7XG4gICAgbG9nQnJvYWRjYXN0OiAoZW50cnkpID0+IGxpdmVCcm9hZGNhc3Q/LihlbnRyeSksXG4gICAgbWV0cmljc09uU25hcHNob3Q6IChzbmFwc2hvdCkgPT4gbGl2ZU1ldHJpY3NPblNuYXBzaG90Py4oc25hcHNob3QpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG9wdGlvbnMubWV0cmljc1Npbms/Lm9uU25hcHNob3Qoc25hcHNob3QpLFxuICB9KTtcblxuICAvLyBTdGFydCB0aGUgd2ViIHNlcnZlciB3aXRoIGluZ2VzdCByb3V0ZXMgbW91bnRlZCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjay5cbiAgLy8gSWYgdGhlIHBvcnQgaXMgb2NjdXBpZWQgYnkgYSBzdGFsZSBwcm9jZXNzLCByZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcG9ydGZvbGlvRGlyOiBvcHRpb25zLnBvcnRmb2xpb0RpcixcbiAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgYWRkaXRpb25hbFJvdXRlcnM6IFtpbmdlc3RSZXN1bHQucm91dGVyXSxcbiAgICB0b2tlblN0b3JlLFxuICAgIC4uLihvcHRpb25zLm1jcEFxbEhhbmRsZXIgPyB7IG1jcEFxbEhhbmRsZXI6IG9wdGlvbnMubWNwQXFsSGFuZGxlciB9IDoge30pLFxuICB9O1xuICAvLyBiaW5kQW5kTGlzdGVuIG5vdyBoYW5kbGVzIEVBRERSSU5VU0UgYnkgZmluZGluZyBhbmQga2lsbGluZyB0aGUgc3RhbGVcbiAgLy8gcHJvY2VzcyBvbiB0aGUgcG9ydCwgdGhlbiByZXRyeWluZy4gTm8gZXh0ZXJuYWwgcmV0cnkgbG9vcCBuZWVkZWQuXG4gIGNvbnN0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHNlcnZlck9wdHMpO1xuXG4gIGlmICh3ZWJSZXN1bHQuYmluZFJlc3VsdCAmJiAhd2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZhbGxiYWNrID0gYXdhaXQgcmVjb3ZlckxlYWRlckJpbmRGYWlsdXJlKGVsZWN0aW9uLmxlYWRlckluZm8sIGNvbnNvbGVQb3J0LCBwcmltYXJ5VG9rZW4udG9rZW4pO1xuICAgIGlmIChmYWxsYmFjay5sZWFkZXJJbmZvKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgcm9sZSBhYm9ydGVkOiBiaW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZvbGxvd2VyJywge1xuICAgICAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICAgICAgYmluZEVycm9yOiB3ZWJSZXN1bHQuYmluZFJlc3VsdC5lcnJvcixcbiAgICAgICAgYmluZERldGFpbDogd2ViUmVzdWx0LmJpbmRSZXN1bHQuZGV0YWlsLFxuICAgICAgICBwcm92aXNpb25hbExlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgICAgIHByb3Zpc2lvbmFsTGVhZGVyU2Vzc2lvbklkOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnNlc3Npb25JZCxcbiAgICAgICAgb3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgICAgICBzb3VyY2U6IGZhbGxiYWNrLnNvdXJjZSxcbiAgICAgICAgbG9ja0NsZWFudXBBdHRlbXB0ZWQ6IGZhbGxiYWNrLmxvY2tDbGVhbnVwQXR0ZW1wdGVkLFxuICAgICAgICBsb2NrQ2xlYW51cFBlcmZvcm1lZDogZmFsbGJhY2subG9ja0NsZWFudXBQZXJmb3JtZWQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvbGxvd2VyRWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0ID0geyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiBmYWxsYmFjay5sZWFkZXJJbmZvIH07XG4gICAgICByZXR1cm4gc3RhcnRBc0ZvbGxvd2VyKG9wdGlvbnMsIGZvbGxvd2VyRWxlY3Rpb24sIGNvbnNvbGVQb3J0LCBwcmltYXJ5VG9rZW4udG9rZW4pO1xuICAgIH1cblxuICAgIGxvZ2dlci5lcnJvcignW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgZmFpbGVkIHRvIGJpbmQgYW5kIG5vIGFjdGl2ZSBsZWFkZXIgY291bGQgYmUgaWRlbnRpZmllZCcsIHtcbiAgICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgICAgcHJvdmlzaW9uYWxMZWFkZXJQaWQ6IGVsZWN0aW9uLmxlYWRlckluZm8ucGlkLFxuICAgICAgYmluZEVycm9yOiB3ZWJSZXN1bHQuYmluZFJlc3VsdC5lcnJvcixcbiAgICAgIGJpbmREZXRhaWw6IHdlYlJlc3VsdC5iaW5kUmVzdWx0LmRldGFpbCxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExlYWRlciBmYWlsZWQgdG8gYmluZCBwb3J0ICR7Y29uc29sZVBvcnR9IGFuZCBubyBhY3RpdmUgbGVhZGVyIHdhcyBkaXNjb3ZlcmFibGVgKTtcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBsZWFkZXIgb25seSBhZnRlciB0aGUgSFRUUCBsaXN0ZW5lciBpcyBhY3R1YWxseSBzZXJ2aW5nIHRoZSBwb3J0LlxuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJMZWFkZXJTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBwcm9jZXNzLnBpZCk7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiBzbyB0aGUgc2Vzc2lvbiBpbmRpY2F0b3IgaXMgbmV2ZXIgZW1wdHkgKCMxODA1KVxuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gIC8vIFdpcmUgU1NFIGJyb2FkY2FzdHMgZm9yIHRoaXMgbGVhZGVyJ3Mgb3duIGV2ZW50c1xuICBvcHRpb25zLndpcmVTU0VCcm9hZGNhc3RzKHdlYlJlc3VsdCwgb3B0aW9ucy5tZXRyaWNzU2luayk7XG5cbiAgLy8gTm93IHdpcmUgdGhlIGxpdmUgYnJvYWRjYXN0IGZ1bmN0aW9ucyBpbnRvIHRoZSBpbmdlc3Qgcm91dGVzXG4gIGlmICh3ZWJSZXN1bHQubG9nQnJvYWRjYXN0KSB7XG4gICAgY29uc3Qgb3JpZ2luYWxCcm9hZGNhc3QgPSB3ZWJSZXN1bHQubG9nQnJvYWRjYXN0O1xuICAgIC8vIFN0YW1wIGxlYWRlcidzIG93biBlbnRyaWVzIHdpdGggc2Vzc2lvbiBJRFxuICAgIGxpdmVCcm9hZGNhc3QgPSAoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSkgPT4ge1xuICAgICAgY29uc3Qgc3RhbXBlZDogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgZGF0YTogeyAuLi5lbnRyeS5kYXRhLCBfc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCB9LFxuICAgICAgfTtcbiAgICAgIG9yaWdpbmFsQnJvYWRjYXN0KHN0YW1wZWQpO1xuICAgIH07XG4gIH1cbiAgbGl2ZU1ldHJpY3NPblNuYXBzaG90ID0gd2ViUmVzdWx0Lm1ldHJpY3NPblNuYXBzaG90O1xuXG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIEluZ2VzdGlvbiByb3V0ZXMgbW91bnRlZCcpO1xuXG4gIC8vIFN0YXJ0IGhlYXJ0YmVhdCBhbmQgcmVnaXN0ZXIgY2xlYW51cFxuICBjb25zdCBzdG9wSGVhcnRiZWF0ID0gc3RhcnRIZWFydGJlYXQoZWxlY3Rpb24ubGVhZGVySW5mbyk7XG4gIHJlZ2lzdGVyTGVhZGVyQ2xlYW51cCgpO1xuXG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBzdGFydGVkJywge1xuICAgIHNlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQsIHBvcnQ6IGNvbnNvbGVQb3J0LCBwaWQ6IHByb2Nlc3MucGlkLFxuICAgIHJvbGU6ICdsZWFkZXInLCBpbmdlc3RSb3V0ZXM6IFsnL2FwaS9pbmdlc3QvbG9ncycsICcvYXBpL2luZ2VzdC9tZXRyaWNzJywgJy9hcGkvaW5nZXN0L3Nlc3Npb24nLCAnL2FwaS9zZXNzaW9ucyddLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHJvbGU6ICdsZWFkZXInLFxuICAgIGVsZWN0aW9uLFxuICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHtcbiAgICAgIHN0b3BIZWFydGJlYXQoKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGFzIGEgZm9sbG93ZXIuXG4gKiBSZWdpc3RlcnMgZm9yd2FyZGluZyBzaW5rcyB3aXRoIHRoZSBMb2dNYW5hZ2VyLCBzdGFydHMgc2Vzc2lvbiBoZWFydGJlYXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0QXNGb2xsb3dlcihcbiAgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIgPSBERUZBVUxUX0NPTlNPTEVfUE9SVCxcbiAgaW5pdGlhbEF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4pOiBQcm9taXNlPFVuaWZpZWRDb25zb2xlUmVzdWx0PiB7XG4gIGNvbnN0IGxlYWRlclVybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7ZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0fWA7XG5cbiAgLy8gUmVhZCB0aGUgY29uc29sZSBhdXRoIHRva2VuICgjMTc4MCkgd3JpdHRlbiBieSB0aGUgbGVhZGVyLiBNYXkgYmUgbnVsbFxuICAvLyBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IHlldCDigJQgdGhlIHNpbmtzIGhhbmRsZSB0aGF0IGdyYWNlZnVsbHkgYW5kXG4gIC8vIHNpbXBseSBvbWl0IHRoZSBCZWFyZXIgaGVhZGVyLCB3aGljaCBpcyBmaW5lIHdoZW4gYXV0aCBpcyBub3QgZW5mb3JjZWQuXG4gIGxldCBhdXRoVG9rZW4gPSBpbml0aWFsQXV0aFRva2VuO1xuICBpZiAoYXV0aFRva2VuID09PSBudWxsKSB7XG4gICAgY29uc3QgeyBnZXRQcmltYXJ5VG9rZW5Gcm9tRmlsZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgIGF1dGhUb2tlbiA9IGF3YWl0IGdldFByaW1hcnlUb2tlbkZyb21GaWxlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgfVxuICBpZiAoYXV0aFRva2VuKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIEZvbGxvd2VyIGxvYWRlZCBjb25zb2xlIGF1dGggdG9rZW4nKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tVbmlmaWVkQ29uc29sZV0gTm8gY29uc29sZSBhdXRoIHRva2VuIGZpbGUgZm91bmQ7IGZvbGxvd2VyIHdpbGwgUE9TVCB3aXRob3V0IEJlYXJlciBoZWFkZXInKTtcbiAgfVxuXG4gIC8vIFBlci1pbnN0YW5jZSBwcm9tb3Rpb24gbWFuYWdlciDigJQgdHJhY2tzIGl0cyBvd24gYXR0ZW1wdCBjb3VudGVyIHNvXG4gIC8vIG11bHRpcGxlIGZvbGxvd2VycyBkb24ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyJ3MgcHJvbW90aW9uIGJ1ZGdldHMuXG4gIGNvbnN0IHByb21vdGlvbk1nciA9IG5ldyBQcm9tb3Rpb25NYW5hZ2VyKG9wdGlvbnMsIGNvbnNvbGVQb3J0LCBzdGFydEFzTGVhZGVyLCBzdGFydEFzRm9sbG93ZXIpO1xuXG4gIC8vIERlY2xhcmUgc2Vzc2lvbkhlYXJ0YmVhdCBiZWZvcmUgdGhlIHNpbmsgc28gdGhlIGNsb3N1cmUgY2FuIGNhcHR1cmUgaXQuXG4gIC8vIEJvdGggYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgY291bGQgcG9zc2libHkgZmlyZSAobmVlZHMgNSsgZmFpbGVkIGZsdXNoZXMpLlxuICBsZXQgc2Vzc2lvbkhlYXJ0YmVhdDogU2Vzc2lvbkhlYXJ0YmVhdDtcblxuICAvLyBSZWdpc3RlciBhIGZvcndhcmRpbmcgbG9nIHNpbmsgd2l0aCBsZWFkZXItZGVhdGggY2FsbGJhY2sgKCMxODUwKS5cbiAgY29uc3QgZm9yd2FyZGluZ1NpbmsgPSBuZXcgTGVhZGVyRm9yd2FyZGluZ0xvZ1NpbmsobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgYXV0aFRva2VuLCAoKSA9PiB7XG4gICAgcHJvbW90aW9uTWdyLnByb21vdGUoZm9yd2FyZGluZ1NpbmssIHNlc3Npb25IZWFydGJlYXQpXG4gICAgICAuY2F0Y2goZXJyID0+IGxvZ2dlci5lcnJvcignW1VuaWZpZWRDb25zb2xlXSBQcm9tb3Rpb24gY3Jhc2hlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pKTtcbiAgfSk7XG4gIG9wdGlvbnMucmVnaXN0ZXJMb2dTaW5rKGZvcndhcmRpbmdTaW5rKTtcblxuICAvLyBTdGFydCBzZXNzaW9uIGhlYXJ0YmVhdCB0byB0aGUgbGVhZGVyXG4gIHNlc3Npb25IZWFydGJlYXQgPSBuZXcgU2Vzc2lvbkhlYXJ0YmVhdChsZWFkZXJVcmwsIG9wdGlvbnMuc2Vzc2lvbklkLCBwcm9jZXNzLnBpZCwgYXV0aFRva2VuKTtcbiAgYXdhaXQgc2Vzc2lvbkhlYXJ0YmVhdC5zdGFydCgpO1xuXG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIEZvbGxvd2VyIHN0YXJ0ZWQnLCB7XG4gICAgc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCwgcGlkOiBwcm9jZXNzLnBpZCwgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBsZWFkZXJTZXNzaW9uOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnNlc3Npb25JZCwgbGVhZGVyUGlkOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnBpZCxcbiAgICBsZWFkZXJQb3J0OiBlbGVjdGlvbi5sZWFkZXJJbmZvLnBvcnQsIGxlYWRlclVybCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnZm9sbG93ZXInLFxuICAgIGVsZWN0aW9uLFxuICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RvcCgpO1xuICAgICAgYXdhaXQgZm9yd2FyZGluZ1NpbmsuY2xvc2UoKTtcbiAgICB9LFxuICB9O1xufVxuIl19
511
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU9ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUl6QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsMEJBQTBCLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxtQ0FBbUMsR0FBRyxhQUFhLENBQUM7QUFFMUQsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFvQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsV0FBbUIsRUFDbkIsU0FBb0Msa0JBQWtCLEVBQ3RELE1BQXFCLE1BQU07SUFFM0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixHQUFHLENBQUMsSUFBSSxDQUNOLDZFQUE2RTtnQkFDN0UsUUFBUSxNQUFNLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLDRCQUE0QjtnQkFDbkUsb0VBQW9FO2dCQUNwRSxzREFBc0QsV0FBVyxJQUFJO2dCQUNyRSxnQ0FBZ0MsTUFBTSxDQUFDLElBQUksSUFBSSw0QkFBNEIsSUFBSTtnQkFDL0UsK0RBQStEO2dCQUMvRCx5Q0FBeUMsQ0FDMUMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLDREQUE0RDtRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxFQUFFO1lBQzNELEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ3hELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUErQ0QsU0FBUyxxQkFBcUIsQ0FBQyxTQUF3QjtJQUNyRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsVUFBVSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbkUsQ0FBQztBQUVELFNBQVMsMEJBQTBCLENBQUMsSUFBWSxFQUFFLFFBQWdCLEVBQUUsYUFBK0I7SUFDakcsT0FBTztRQUNMLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLEdBQUcsRUFBRSxRQUFRO1FBQ2IsSUFBSTtRQUNKLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQjtRQUNoRixTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsRUFBRTtRQUN4RCxTQUFTLEVBQUUsYUFBYSxDQUFDLGFBQWEsSUFBSSxnQkFBZ0IsRUFBRTtRQUM1RCxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQWEsSUFBSSxxQkFBcUI7UUFDbkUsc0JBQXNCLEVBQUUsYUFBYSxDQUFDLHNCQUFzQixJQUFJLHdCQUF3QjtLQUN6RixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzlELE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsT0FBTztRQUNMLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLEdBQUcsRUFBRSxRQUFRO1FBQ2IsSUFBSTtRQUNKLFNBQVMsRUFBRSxHQUFHLG1DQUFtQyxHQUFHLFFBQVEsRUFBRTtRQUM5RCxTQUFTLEVBQUUsR0FBRztRQUNkLFNBQVMsRUFBRSxHQUFHO1FBQ2QsYUFBYSxFQUFFLHFCQUFxQjtRQUNwQyxzQkFBc0IsRUFBRSx3QkFBd0I7S0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsNEJBQTRCLENBQ3pDLElBQVksRUFDWixRQUFnQixFQUNoQixTQUF3QixFQUN4QixTQUF1QjtJQUV2QixNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxlQUFlLEVBQUU7UUFDeEUsT0FBTyxFQUFFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztLQUMxQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBdUMsQ0FBQztJQUMzRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUM5QyxPQUFPLENBQUMsR0FBRyxLQUFLLFFBQVE7UUFDeEIsT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJO1FBQ3pCLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSztRQUN0QixPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FDN0IsQ0FBQztJQUNGLE9BQU8sYUFBYSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUYsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUseUJBQXlCLENBQzdDLElBQVksRUFDWixTQUF3QixFQUN4QixPQUE4QixFQUFFO0lBRWhDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBQzFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGFBQWEsQ0FBQztJQUNsRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxjQUFjLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUvQyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLDRCQUE0QixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVGLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMseURBQXlELEVBQUU7Z0JBQ3RFLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUN4RCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztJQUN4QyxJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTztZQUNMLFFBQVEsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDOUIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxJQUFJO2dCQUNQLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQjthQUN4RTtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdEIsT0FBTztZQUNMLFFBQVE7WUFDUixNQUFNLEVBQUUsV0FBVztZQUNuQixVQUFVLEVBQUUsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztTQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlELENBQUM7QUFNRCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxpQkFBb0MsRUFDcEMsSUFBWSxFQUNaLFNBQXdCLEVBQ3hCLE9BQXdDLEVBQUU7SUFFMUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksY0FBYyxDQUFDO0lBQ3JFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixJQUFJLGdCQUFnQixDQUFDO0lBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELEVBQUU7UUFDN0Qsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsU0FBUztRQUNqRCxjQUFjLEVBQUUsaUJBQWlCLENBQUMsR0FBRztRQUNyQyxJQUFJO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsSUFBSSxRQUFRLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RFLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztJQUMvQyxNQUFNLHNCQUFzQixHQUFHLENBQzdCLFdBQVcsRUFBRSxHQUFHLEtBQUssaUJBQWlCLENBQUMsR0FBRztRQUMxQyxXQUFXLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLElBQUk7UUFDM0MsV0FBVyxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxTQUFTLENBQ3RELENBQUM7SUFDRixNQUFNLGlDQUFpQyxHQUFHLENBQ3hDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLGlCQUFpQixDQUFDLEdBQUc7UUFDbEQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsSUFBSTtRQUNuRCxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxTQUFTLENBQzlELENBQUM7SUFFRixJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0Isb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE1BQU0sb0JBQW9CLEVBQUUsQ0FBQztRQUM3QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsRUFBRTtZQUNqRixvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTO1lBQ2pELGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHO1lBQ3JDLElBQUk7U0FDTCxDQUFDLENBQUM7UUFDSCxJQUFJLGlDQUFpQyxFQUFFLENBQUM7WUFDdEMsUUFBUSxHQUFHLE1BQU0seUJBQXlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELEVBQUU7UUFDN0Qsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsU0FBUztRQUNqRCxjQUFjLEVBQUUsaUJBQWlCLENBQUMsR0FBRztRQUNyQyxJQUFJO1FBQ0osZUFBZSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixvQkFBb0I7UUFDcEIsb0JBQW9CO0tBQ3JCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxvQkFBb0I7UUFDcEIsb0JBQW9CO0tBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxlQUFrQyxFQUNsQyxRQUE2QjtJQUU3QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwRyxPQUFPO1lBQ0wsV0FBVyxFQUFFLEtBQUs7WUFDbEIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1lBQzNCLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRixPQUFPO1FBQ0wsV0FBVyxFQUFFLFVBQVUsQ0FBQyxhQUFhO1FBQ3JDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixVQUFVO0tBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUNqQyxXQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsVUFBeUMsRUFDekMsUUFBNkIsRUFDN0IsV0FBMEMsRUFDMUMsVUFBMkM7SUFFM0MsT0FBTztRQUNMLElBQUksRUFBRSxXQUFXO1FBQ2pCLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSztRQUM1QixVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU07UUFDOUIsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsR0FBRztRQUMzQywwQkFBMEIsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTO1FBQ3ZELHdCQUF3QixFQUFFLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxxQkFBcUI7UUFDbEYsZ0NBQWdDLEVBQUUsaUJBQWlCLENBQUMsc0JBQXNCLElBQUksd0JBQXdCO1FBQ3RHLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxRQUFRO1FBQ25DLGNBQWMsRUFBRSxRQUFRLENBQUMsTUFBTTtRQUMvQixpQkFBaUIsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUc7UUFDM0MsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTO1FBQ3ZELHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsYUFBYSxJQUFJLHFCQUFxQjtRQUNsRiw2QkFBNkIsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLHNCQUFzQixJQUFJLHdCQUF3QjtRQUN0RyxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxJQUFJLEtBQUs7UUFDekQsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNO1FBQ2xELGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNO1FBQ3BDLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRztRQUM5QixnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTTtLQUNyQyxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxvQkFBb0IsQ0FDakMsT0FBOEIsRUFDOUIsZUFBK0IsRUFDL0IsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsVUFBNEIsRUFDNUIsa0JBQTJFO0lBRTNFLE1BQU0sZUFBZSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUcsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXJHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLElBQUksa0JBQWtCLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVFLE9BQU87WUFDTCxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsV0FBVyxpQkFBaUIsRUFBRSxFQUFFO1lBQ2hILFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFdBQVcsRUFBRSxrQkFBa0I7WUFDL0IsVUFBVSxFQUFFLElBQUk7WUFDaEIsaUJBQWlCLEVBQUUsS0FBSztZQUN4QixrQkFBa0IsRUFBRSxLQUFLO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEYsTUFBTSxpQkFBaUIsR0FBRyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ25HLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLElBQUksaUJBQWlCLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUZBQXVGLEVBQUU7WUFDbkcsR0FBRywwQkFBMEIsQ0FDM0IsV0FBVyxFQUNYLGVBQWUsQ0FBQyxVQUFVLEVBQzFCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLFdBQVcsaUJBQWlCLEVBQUUsRUFDckYsY0FBYyxFQUNkLGlCQUFpQixDQUNsQjtZQUNELGdCQUFnQixFQUFFLGtCQUFrQixDQUFDLFFBQVE7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxXQUFXLGlCQUFpQixFQUFFLEVBQUU7WUFDaEgsUUFBUSxFQUFFLGVBQWU7WUFDekIsUUFBUSxFQUFFLGNBQWM7WUFDeEIsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixVQUFVLEVBQUUsSUFBSTtZQUNoQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLGtCQUFrQixFQUFFLEtBQUs7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLHNGQUFzRixFQUFFO1FBQ2xHLEdBQUcsMEJBQTBCLENBQzNCLFdBQVcsRUFDWCxlQUFlLENBQUMsVUFBVSxFQUMxQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxXQUFXLGlCQUFpQixFQUFFLEVBQ3JGLGNBQWMsRUFDZCxpQkFBaUIsQ0FDbEI7S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7UUFDekYscUJBQXFCLEVBQUUsSUFBSTtLQUM1QixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMseUZBQXlGLEVBQUU7WUFDckcsR0FBRywwQkFBMEIsQ0FDM0IsV0FBVyxFQUNYLGVBQWUsQ0FBQyxVQUFVLEVBQzFCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLFdBQVcsaUJBQWlCLEVBQUUsRUFDckYsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixVQUFVLENBQ1g7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLFdBQVcsaUJBQWlCLEVBQUUsRUFBRTtZQUNoSCxRQUFRLEVBQUUsZUFBZTtZQUN6QixRQUFRLEVBQUUsY0FBYztZQUN4QixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLFVBQVU7WUFDVixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGtCQUFrQixFQUFFLEtBQUs7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUQsSUFBSSxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQ3RDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRS9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hFLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzRSxrQkFBa0IsR0FBRyxNQUFNLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0ZBQW9GLEVBQUU7Z0JBQ2hHLEdBQUcsMEJBQTBCLENBQzNCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLENBQUMsVUFBVSxFQUMzQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxlQUFlLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQ3RFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsRUFBRTtZQUM1RixHQUFHLDBCQUEwQixDQUMzQixXQUFXLEVBQ1gsZUFBZSxDQUFDLFVBQVUsRUFDMUIsZ0JBQWdCLENBQUMsVUFBVSxFQUMzQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLGdCQUFnQjtRQUMzQixRQUFRLEVBQUUsZUFBZTtRQUN6QixRQUFRLEVBQUUsY0FBYztRQUN4QixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLFVBQVU7UUFDVixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLGtCQUFrQjtLQUNuQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxPQUE4QjtJQUN0RSwwREFBMEQ7SUFDMUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxvQkFBb0IsQ0FBQztJQUN6RCxNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxXQUFXLEVBQUU7UUFDM0QsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBRWxFLGdFQUFnRTtJQUNoRSxvRUFBb0U7SUFDcEUsd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUN4RSx3Q0FBd0M7SUFDeEMsTUFBTSwwQkFBMEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU5QyxJQUFJLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWpFLGtGQUFrRjtJQUNsRixxRUFBcUU7SUFDckUsb0VBQW9FO0lBQ3BFLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxNQUFNLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixRQUFRLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sYUFBYSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLGVBQWUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxhQUFhLENBQzFCLE9BQThCLEVBQzlCLFFBQXdCLEVBQ3hCLGNBQXNCLG9CQUFvQjtJQUUxQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDeEQsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVsRSx3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDM0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxVQUFVLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELEVBQUU7UUFDOUQsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQ3hCLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSTtRQUM1QixJQUFJLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLDBCQUEwQjtLQUM3QyxDQUFDLENBQUM7SUFFSCxnRkFBZ0Y7SUFDaEYsSUFBSSxhQUE2RCxDQUFDO0lBQ2xFLElBQUkscUJBQXVFLENBQUM7SUFFNUUsZ0ZBQWdGO0lBQ2hGLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNsRSxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO0tBQzlFLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsTUFBTSxVQUFVLEdBQUc7UUFDakIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsSUFBSSxFQUFFLFdBQVc7UUFDakIsaUJBQWlCLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ3hDLFVBQVU7UUFDVixHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDM0UsQ0FBQztJQUNGLHdFQUF3RTtJQUN4RSxxRUFBcUU7SUFDckUsSUFBSSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakQsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxNQUFNLG9CQUFvQixDQUM5QyxPQUFPLEVBQ1AsUUFBUSxFQUNSLFdBQVcsRUFDWCxZQUFZLENBQUMsS0FBSyxFQUNsQixVQUFVLEVBQ1YsY0FBYyxDQUNmLENBQUM7UUFDRixTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUNwQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUVsQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyw2RUFBNkUsRUFBRTtvQkFDekYsR0FBRywwQkFBMEIsQ0FDM0IsV0FBVyxFQUNYLFFBQVEsQ0FBQyxVQUFVLEVBQ25CLFNBQVMsQ0FBQyxVQUFVLEVBQ3BCLGFBQWEsQ0FBQyxRQUFRLEVBQ3RCLGFBQWEsQ0FBQyxXQUFXLEVBQ3pCLGFBQWEsQ0FBQyxVQUFVLENBQ3pCO29CQUNELGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxpQkFBaUI7b0JBQ2xELGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxrQkFBa0I7b0JBQ3BELG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLE1BQU07aUJBQy9ELENBQUMsQ0FBQztnQkFDSCxNQUFNLGdCQUFnQixHQUFtQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzdHLE9BQU8sZUFBZSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGlGQUFpRixFQUFFO2dCQUM5RixHQUFHLDBCQUEwQixDQUMzQixXQUFXLEVBQ1gsUUFBUSxDQUFDLFVBQVUsRUFDbkIsU0FBUyxDQUFDLFVBQVUsRUFDcEIsYUFBYSxDQUFDLFFBQVEsRUFDdEIsYUFBYSxDQUFDLFdBQVcsRUFDekIsYUFBYSxDQUFDLFVBQVUsQ0FDekI7Z0JBQ0QsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEQsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLGtCQUFrQjthQUNyRCxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixXQUFXLHdDQUF3QyxDQUFDLENBQUM7UUFDckcsQ0FBQztJQUNILENBQUM7SUFFRCxpRkFBaUY7SUFDakYsWUFBWSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRW5FLGtGQUFrRjtJQUNsRixZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUV0QyxtREFBbUQ7SUFDbkQsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFMUQsK0RBQStEO0lBQy9ELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztRQUNqRCw2Q0FBNkM7UUFDN0MsYUFBYSxHQUFHLENBQUMsS0FBc0IsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sT0FBTyxHQUFvQjtnQkFDL0IsR0FBRyxLQUFLO2dCQUNSLElBQUksRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTthQUN2RCxDQUFDO1lBQ0YsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztJQUVwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFFekQsdUNBQXVDO0lBQ3ZDLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQscUJBQXFCLEVBQUUsQ0FBQztJQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1FBQzdDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2pFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxDQUFDO0tBQ2xILENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLFFBQVE7UUFDUixJQUFJLEVBQUUsV0FBVztRQUNqQixPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEIsYUFBYSxFQUFFLENBQUM7UUFDbEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsT0FBOEIsRUFDOUIsUUFBd0IsRUFDeEIsY0FBc0Isb0JBQW9CLEVBQzFDLG1CQUFrQyxJQUFJO0lBRXRDLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRWpFLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLElBQUksU0FBUyxHQUFHLGdCQUFnQixDQUFDO0lBQ2pDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEUsU0FBUyxHQUFHLE1BQU0sdUJBQXVCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsS0FBSyxDQUFDLDZGQUE2RixDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSwwRUFBMEU7SUFDMUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVoRywwRUFBMEU7SUFDMUUsMEZBQTBGO0lBQzFGLElBQUksZ0JBQWtDLENBQUM7SUFFdkMscUVBQXFFO0lBQ3JFLE1BQU0sY0FBYyxHQUFHLElBQUksdUJBQXVCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUMvRixZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQzthQUNuRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFeEMsd0NBQXdDO0lBQ3hDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RixNQUFNLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBRS9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUU7UUFDL0MsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVU7UUFDaEUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUc7UUFDaEYsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVM7S0FDaEQsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVO1FBQ2hCLFFBQVE7UUFDUixPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaWZpZWQgd2ViIGNvbnNvbGUgb3JjaGVzdHJhdG9yLlxuICpcbiAqIFRpZXMgdG9nZXRoZXIgbGVhZGVyIGVsZWN0aW9uLCBjb25zb2xlIHN0YXJ0dXAsIGZvbGxvd2VyIHdpcmluZyxcbiAqIGFuZCBzZXNzaW9uIGxpZmVjeWNsZSBtYW5hZ2VtZW50LiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gKiBjYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgZGVmZXJyZWQgc2V0dXAuXG4gKlxuICogRmxvdzpcbiAqIDEuIFJ1biBsZWFkZXIgZWxlY3Rpb24gKHJlYWQgbG9jayBmaWxlLCBjbGFpbSBvciBmb2xsb3cpXG4gKiAyLiBJZiBsZWFkZXI6IHN0YXJ0IHdlYiBzZXJ2ZXIgb24gZml4ZWQgcG9ydCwgbW91bnQgaW5nZXN0IHJvdXRlcywgc3RhcnQgaGVhcnRiZWF0XG4gKiAzLiBJZiBmb2xsb3dlcjogcmVnaXN0ZXIgZm9yd2FyZGluZyBzaW5rcyB3aXRoIExvZ01hbmFnZXIsIHN0YXJ0IHNlc3Npb24gaGVhcnRiZWF0XG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRMb2dFbnRyeSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNTbmFwc2hvdCB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgV2ViU2VydmVyT3B0aW9ucywgV2ViU2VydmVyUmVzdWx0IH0gZnJvbSAnLi4vc2VydmVyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGVsZWN0TGVhZGVyLFxuICBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGUsXG4gIGZvcmNlQ2xhaW1MZWFkZXJzaGlwLFxuICBzdGFydEhlYXJ0YmVhdCxcbiAgcmVnaXN0ZXJMZWFkZXJDbGVhbnVwLFxuICBkZXRlY3RMZWdhY3lMZWFkZXIsXG4gIHJlYWRMZWFkZXJMb2NrLFxuICBkZWxldGVMZWFkZXJMb2NrLFxuICBjbGFpbUxlYWRlcnNoaXAsXG4gIGNyZWF0ZUxlYWRlckluZm8sXG4gIExPQ0tfVkVSU0lPTixcbiAgQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gIGV2YWx1YXRlTGVhZGVyUHJlZmVyZW5jZSxcbiAgdHlwZSBFbGVjdGlvblJlc3VsdCxcbiAgdHlwZSBDb25zb2xlTGVhZGVySW5mbyxcbiAgdHlwZSBMZWFkZXJQcmVmZXJlbmNlRGVjaXNpb24sXG59IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gZnJvbSAnLi9Jbmdlc3RSb3V0ZXMuanMnO1xuaW1wb3J0IHtcbiAgTGVhZGVyRm9yd2FyZGluZ0xvZ1NpbmssXG4gIFNlc3Npb25IZWFydGJlYXQsXG59IGZyb20gJy4vTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMnO1xuaW1wb3J0IHsgUHJvbW90aW9uTWFuYWdlciB9IGZyb20gJy4vUHJvbW90aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7XG4gIGZpbmRQaWRPblBvcnQsXG4gIGtpbGxTdGFsZVByb2Nlc3NEZXRhaWxlZCxcbiAgdHlwZSBLaWxsU3RhbGVQcm9jZXNzT3V0Y29tZSxcbn0gZnJvbSAnLi9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcblxuLyoqXG4gKiBEZWZhdWx0IGNvbnNvbGUgcG9ydCBmcm9tIHRoZSBlbnYgdmFyLiBVc2VkIGFzIGZhbGxiYWNrIHdoZW4gbm8gcG9ydFxuICogaXMgcHJvdmlkZWQgdmlhIGNvbmZpZyBmaWxlIG9yIG9wdGlvbnMuIFRoZSByZXNvbHV0aW9uIGhpZXJhcmNoeSBpczpcbiAqICAgMS4gb3B0aW9ucy5wb3J0IChmcm9tIGNvbmZpZyBmaWxlLCByZXNvbHZlZCBieSB0aGUgREkgY29udGFpbmVyKVxuICogICAyLiBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCBlbnYgdmFyXG4gKiAgIDMuIDQxNzE1IChoYXJkY29kZWQgZGVmYXVsdCBpbiBlbnYudHMpXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OU09MRV9QT1JUID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUO1xuY29uc3QgTEVHQUNZX0NPTlNPTEVfRkFMTEJBQ0tfUE9SVCA9IDM5Mzk7XG5jb25zdCBTWU5USEVUSUNfUE9SVF9PV05FUl9TRVNTSU9OX1BSRUZJWCA9ICdwb3J0LW93bmVyLSc7XG5cbmZ1bmN0aW9uIGN1cnJlbnRUaW1lc3RhbXAoKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgdW5pZmllZCBjb25zb2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWZpZWRDb25zb2xlT3B0aW9ucyB7XG4gIC8qKiBUaGlzIHByb2Nlc3MncyB1bmlxdWUgc2Vzc2lvbiBJRCAqL1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgLyoqIFBvcnRmb2xpbyBiYXNlIGRpcmVjdG9yeSAoZm9yIHN0YXJ0V2ViU2VydmVyKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIExvZyBtZW1vcnkgc2luayAoZm9yIGNvbnNvbGUgaGlzdG9yeSkgKi9cbiAgbWVtb3J5U2luazogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1ldHJpY3MgbWVtb3J5IHNpbmsgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIE1DUC1BUUwgaGFuZGxlciBmb3IgcGVybWlzc2lvbiByb3V0ZXMgKHR5cGVkIGFzIGFueSB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzKSAqL1xuICBtY3BBcWxIYW5kbGVyPzogYW55O1xuICAvKiogQ2FsbGJhY2sgdG8gcmVnaXN0ZXIgYSBsb2cgc2luayB3aXRoIHRoZSBMb2dNYW5hZ2VyICovXG4gIHJlZ2lzdGVyTG9nU2luazogKHNpbms6IHsgd3JpdGUoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSk6IHZvaWQ7IGZsdXNoKCk6IFByb21pc2U8dm9pZD47IGNsb3NlKCk6IFByb21pc2U8dm9pZD4gfSkgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHRvIHdpcmUgU1NFIGJyb2FkY2FzdHMgYWZ0ZXIgd2ViIHNlcnZlciBzdGFydHMgKi9cbiAgd2lyZVNTRUJyb2FkY2FzdHM6ICh3ZWJSZXN1bHQ6IHsgbG9nQnJvYWRjYXN0PzogKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQ7IG1ldHJpY3NPblNuYXBzaG90PzogKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZCB9LCBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rKSA9PiB2b2lkO1xuICAvKiogQ29uc29sZSBwb3J0IG92ZXJyaWRlIGZyb20gY29uZmlnIGZpbGUuIEZhbGxzIGJhY2sgdG8gZW52IHZhciBpZiBub3QgcHJvdmlkZWQuICovXG4gIHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIHRoZSB1bmlmaWVkIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pZmllZENvbnNvbGVSZXN1bHQge1xuICByb2xlOiAnbGVhZGVyJyB8ICdmb2xsb3dlcic7XG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdDtcbiAgLyoqIFBvcnQgdGhlIGNvbnNvbGUgaXMgcnVubmluZyBvbiAobGVhZGVyIG9ubHkpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBDbGVhbnVwIGZ1bmN0aW9uIHRvIGNhbGwgb24gc2h1dGRvd24gKi9cbiAgY2xlYW51cDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgYSBydW5uaW5nIGxlZ2FjeSAocHJlLWF1dGhlbnRpY2F0aW9uKSBEb2xsaG91c2VNQ1AgY29uc29sZSBhbmRcbiAqIGxvZyBhIFdBUk4tbGV2ZWwgbWVzc2FnZSBpZiBvbmUgaXMgZm91bmQgKCMxNzk0KS5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSBgc3RhcnRVbmlmaWVkQ29uc29sZWAgc28gdGhlIHdpcmluZyBjYW4gYmUgaW50ZWdyYXRpb24tXG4gKiB0ZXN0ZWQgaW4gaXNvbGF0aW9uIHdpdGhvdXQgc3Bpbm5pbmcgdXAgYSBmdWxsIHdlYiBzZXJ2ZXIgYW5kIGxlYWRlclxuICogZWxlY3Rpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmaXJlLWFuZC1mb3JnZXQ6IGRldGVjdGlvbiBmYWlsdXJlc1xuICogYXJlIGxvZ2dlZCBhdCBERUJVRyBhbmQgbmV2ZXIgcHJvcGFnYXRlLCBiZWNhdXNlIGEgZmFpbHVyZSBoZXJlIG11c3RcbiAqIG5vdCBibG9jayBsZWFkZXIgZWxlY3Rpb24gb2YgdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudFBvcnQgLSBUaGUgcG9ydCB0aGUgYXV0aGVudGljYXRlZCBjb25zb2xlIGludGVuZHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgIGJpbmQgdG8uIFVzZWQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSB0byBoZWxwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgdXNlciB0ZWxsIHRoZSB0d28gY29uc29sZXMgYXBhcnQuXG4gKiBAcGFyYW0gZGV0ZWN0ICAgICAgLSBPcHRpb25hbCBpbmplY3Rpb24gcG9pbnQgZm9yIHRoZSBkZXRlY3Rpb25cbiAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiBEZWZhdWx0cyB0byBgZGV0ZWN0TGVnYWN5TGVhZGVyYC4gVGVzdHNcbiAqICAgICAgICAgICAgICAgICAgICAgIHBhc3MgYSBzdHViLlxuICogQHBhcmFtIGxvZyAgICAgICAgIC0gT3B0aW9uYWwgaW5qZWN0aW9uIHBvaW50IGZvciB0aGUgbG9nZ2VyLiBEZWZhdWx0c1xuICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG1vZHVsZSBsb2dnZXIuIFRlc3RzIHBhc3MgYSBzcHkuXG4gKiBAcmV0dXJucyBUaGUgbGVnYWN5IGxlYWRlciBpbmZvIGZyb20gYGRldGVjdCgpYCwgb3IgbnVsbCBpZiBkZXRlY3Rpb25cbiAqICAgICAgICAgIHRocmV3LiBFeHBvc2VkIHNvIHRlc3RzIGNhbiBhc3NlcnQgdGhlIGZ1bGwgcmVzdWx0IHNoYXBlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FybklmTGVnYWN5Q29uc29sZVByZXNlbnQoXG4gIGN1cnJlbnRQb3J0OiBudW1iZXIsXG4gIGRldGVjdDogdHlwZW9mIGRldGVjdExlZ2FjeUxlYWRlciA9IGRldGVjdExlZ2FjeUxlYWRlcixcbiAgbG9nOiB0eXBlb2YgbG9nZ2VyID0gbG9nZ2VyLFxuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGRldGVjdExlZ2FjeUxlYWRlcj4+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGxlZ2FjeSA9IGF3YWl0IGRldGVjdCgpO1xuICAgIGlmIChsZWdhY3kubGVnYWN5UnVubmluZykge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBbVW5pZmllZENvbnNvbGVdIExlZ2FjeSAocHJlLWF1dGhlbnRpY2F0aW9uKSBEb2xsaG91c2VNQ1AgY29uc29sZSBkZXRlY3RlZCBgICtcbiAgICAgICAgYChwaWQ9JHtsZWdhY3kucGlkfSwgcG9ydD0ke2xlZ2FjeS5wb3J0fSkuIEJvdGggY29uc29sZXMgd2lsbCBydW4gYCArXG4gICAgICAgIGBpbmRlcGVuZGVudGx5IG9uIGRpZmZlcmVudCBwb3J0cyB3aXRoIGRpZmZlcmVudCBzZWN1cml0eSBwb3N0dXJlLiBgICtcbiAgICAgICAgYFRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUgKHRoaXMgcHJvY2VzcykgdXNlcyBwb3J0ICR7Y3VycmVudFBvcnR9OyBgICtcbiAgICAgICAgYHRoZSBsZWdhY3kgY29uc29sZSB1c2VzIHBvcnQgJHtsZWdhY3kucG9ydCA/PyBMRUdBQ1lfQ09OU09MRV9GQUxMQkFDS19QT1JUfS4gYCArXG4gICAgICAgIGBGb3IgY29uc2lzdGVudCBzZWN1cml0eSwgdXBkYXRlIHRoZSBsZWdhY3kgaW5zdGFsbGF0aW9uIHRvIGEgYCArXG4gICAgICAgIGB2ZXJzaW9uIHdpdGggdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2FjeTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQmVzdC1lZmZvcnQg4oCUIG5ldmVyIGJsb2NrIGVsZWN0aW9uIG9uIGEgZGV0ZWN0aW9uIGZhaWx1cmVcbiAgICBsb2cuZGVidWcoJ1tVbmlmaWVkQ29uc29sZV0gTGVnYWN5IGxlYWRlciBkZXRlY3Rpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2Vzc2lvbkFwaVJlY29yZCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBwaWQ6IG51bWJlcjtcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBsYXN0SGVhcnRiZWF0Pzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIGlzTGVhZGVyPzogYm9vbGVhbjtcbiAga2luZD86IHN0cmluZztcbiAgc2VydmVyVmVyc2lvbj86IHN0cmluZztcbiAgY29uc29sZVByb3RvY29sVmVyc2lvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0TGVhZGVyRGlzY292ZXJ5IHtcbiAgbGVhZGVySW5mbzogQ29uc29sZUxlYWRlckluZm8gfCBudWxsO1xuICBvd25lclBpZDogbnVtYmVyIHwgbnVsbDtcbiAgc291cmNlOiAnYXBpJyB8ICdsb2NrJyB8ICdzeW50aGV0aWMnIHwgJ25vbmUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRGYWlsdXJlUmVjb3ZlcnlSZXN1bHQgZXh0ZW5kcyBQb3J0TGVhZGVyRGlzY292ZXJ5IHtcbiAgbG9ja0NsZWFudXBBdHRlbXB0ZWQ6IGJvb2xlYW47XG4gIGxvY2tDbGVhbnVwUGVyZm9ybWVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRPd25lclJlcGxhY2VtZW50RGVjaXNpb24ge1xuICBzaG91bGRFdmljdDogYm9vbGVhbjtcbiAgb3duZXJQaWQ6IG51bWJlciB8IG51bGw7XG4gIHByZWZlcmVuY2U6IExlYWRlclByZWZlcmVuY2VEZWNpc2lvbiB8IG51bGw7XG59XG5cbmludGVyZmFjZSBGb3JjZVRha2VvdmVyQXR0ZW1wdFJlc3VsdCB7XG4gIHdlYlJlc3VsdDogV2ViU2VydmVyUmVzdWx0O1xuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQ7XG4gIGZhbGxiYWNrOiBQb3J0TGVhZGVyRGlzY292ZXJ5O1xuICByZXBsYWNlbWVudDogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbjtcbiAgZm9yY2VkS2lsbDogS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUgfCBudWxsO1xuICB0YWtlb3ZlckF0dGVtcHRlZDogYm9vbGVhbjtcbiAgcmVib3VuZExvY2tDbGFpbWVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGlzY292ZXJ5RGVwZW5kZW5jaWVzIHtcbiAgZmV0Y2hJbXBsPzogdHlwZW9mIGZldGNoO1xuICBmaW5kUGlkT25Qb3J0SW1wbD86IHR5cGVvZiBmaW5kUGlkT25Qb3J0O1xuICByZWFkTGVhZGVyTG9ja0ltcGw/OiB0eXBlb2YgcmVhZExlYWRlckxvY2s7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGlzY292ZXJ5SGVhZGVycyhhdXRoVG9rZW46IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIGF1dGhUb2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGhUb2tlbn1gIH0gOiB7fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMZWFkZXJJbmZvRnJvbVNlc3Npb24ocG9ydDogbnVtYmVyLCBvd25lclBpZDogbnVtYmVyLCBsZWFkZXJTZXNzaW9uOiBTZXNzaW9uQXBpUmVjb3JkKTogQ29uc29sZUxlYWRlckluZm8ge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb246IExPQ0tfVkVSU0lPTixcbiAgICBwaWQ6IG93bmVyUGlkLFxuICAgIHBvcnQsXG4gICAgc2Vzc2lvbklkOiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShsZWFkZXJTZXNzaW9uLnNlc3Npb25JZCkubm9ybWFsaXplZENvbnRlbnQsXG4gICAgc3RhcnRlZEF0OiBsZWFkZXJTZXNzaW9uLnN0YXJ0ZWRBdCA/PyBjdXJyZW50VGltZXN0YW1wKCksXG4gICAgaGVhcnRiZWF0OiBsZWFkZXJTZXNzaW9uLmxhc3RIZWFydGJlYXQgPz8gY3VycmVudFRpbWVzdGFtcCgpLFxuICAgIHNlcnZlclZlcnNpb246IGxlYWRlclNlc3Npb24uc2VydmVyVmVyc2lvbiA/PyBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gICAgY29uc29sZVByb3RvY29sVmVyc2lvbjogbGVhZGVyU2Vzc2lvbi5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTeW50aGV0aWNMZWFkZXJJbmZvKHBvcnQ6IG51bWJlciwgb3duZXJQaWQ6IG51bWJlcik6IENvbnNvbGVMZWFkZXJJbmZvIHtcbiAgY29uc3Qgbm93ID0gY3VycmVudFRpbWVzdGFtcCgpO1xuICByZXR1cm4ge1xuICAgIHZlcnNpb246IExPQ0tfVkVSU0lPTixcbiAgICBwaWQ6IG93bmVyUGlkLFxuICAgIHBvcnQsXG4gICAgc2Vzc2lvbklkOiBgJHtTWU5USEVUSUNfUE9SVF9PV05FUl9TRVNTSU9OX1BSRUZJWH0ke293bmVyUGlkfWAsXG4gICAgc3RhcnRlZEF0OiBub3csXG4gICAgaGVhcnRiZWF0OiBub3csXG4gICAgc2VydmVyVmVyc2lvbjogTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJMZWFkZXJWaWFTZXNzaW9uc0FwaShcbiAgcG9ydDogbnVtYmVyLFxuICBvd25lclBpZDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGZldGNoSW1wbDogdHlwZW9mIGZldGNoLFxuKTogUHJvbWlzZTxDb25zb2xlTGVhZGVySW5mbyB8IG51bGw+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEltcGwoYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fS9hcGkvc2Vzc2lvbnNgLCB7XG4gICAgaGVhZGVyczogYnVpbGREaXNjb3ZlcnlIZWFkZXJzKGF1dGhUb2tlbiksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgc2Vzc2lvbnM/OiBTZXNzaW9uQXBpUmVjb3JkW10gfTtcbiAgY29uc3Qgc2Vzc2lvbnMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuc2Vzc2lvbnMpID8gcGF5bG9hZC5zZXNzaW9ucyA6IFtdO1xuICBjb25zdCBsZWFkZXJTZXNzaW9uID0gc2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT5cbiAgICBzZXNzaW9uLnBpZCA9PT0gb3duZXJQaWQgJiZcbiAgICBzZXNzaW9uLmlzTGVhZGVyID09PSB0cnVlICYmXG4gICAgc2Vzc2lvbi5raW5kID09PSAnbWNwJyAmJlxuICAgIHNlc3Npb24uc3RhdHVzICE9PSAnc3RvcHBlZCdcbiAgKTtcbiAgcmV0dXJuIGxlYWRlclNlc3Npb24gPyBidWlsZExlYWRlckluZm9Gcm9tU2Vzc2lvbihwb3J0LCBvd25lclBpZCwgbGVhZGVyU2Vzc2lvbikgOiBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydChcbiAgcG9ydDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGRlcHM6IERpc2NvdmVyeURlcGVuZGVuY2llcyA9IHt9LFxuKTogUHJvbWlzZTxQb3J0TGVhZGVyRGlzY292ZXJ5PiB7XG4gIGNvbnN0IGZldGNoSW1wbCA9IGRlcHMuZmV0Y2hJbXBsID8/IGZldGNoO1xuICBjb25zdCBmaW5kUGlkT25Qb3J0SW1wbCA9IGRlcHMuZmluZFBpZE9uUG9ydEltcGwgPz8gZmluZFBpZE9uUG9ydDtcbiAgY29uc3QgcmVhZExlYWRlckxvY2tJbXBsID0gZGVwcy5yZWFkTGVhZGVyTG9ja0ltcGwgPz8gcmVhZExlYWRlckxvY2s7XG4gIGNvbnN0IG93bmVyUGlkID0gYXdhaXQgZmluZFBpZE9uUG9ydEltcGwocG9ydCk7XG5cbiAgaWYgKG93bmVyUGlkICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxlYWRlckluZm8gPSBhd2FpdCBkaXNjb3ZlckxlYWRlclZpYVNlc3Npb25zQXBpKHBvcnQsIG93bmVyUGlkLCBhdXRoVG9rZW4sIGZldGNoSW1wbCk7XG4gICAgICBpZiAobGVhZGVySW5mbykge1xuICAgICAgICByZXR1cm4geyBvd25lclBpZCwgc291cmNlOiAnYXBpJywgbGVhZGVySW5mbyB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIEZhaWxlZCB0byBxdWVyeSBhY3RpdmUgbGVhZGVyIHNlc3Npb25zJywge1xuICAgICAgICBwb3J0LFxuICAgICAgICBvd25lclBpZCxcbiAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvY2sgPSBhd2FpdCByZWFkTGVhZGVyTG9ja0ltcGwoKTtcbiAgaWYgKGxvY2s/LnBvcnQgPT09IHBvcnQgJiYgKG93bmVyUGlkID09PSBudWxsIHx8IGxvY2sucGlkID09PSBvd25lclBpZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJQaWQ6IG93bmVyUGlkID8/IGxvY2sucGlkLFxuICAgICAgc291cmNlOiAnbG9jaycsXG4gICAgICBsZWFkZXJJbmZvOiB7XG4gICAgICAgIC4uLmxvY2ssXG4gICAgICAgIHNlc3Npb25JZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobG9jay5zZXNzaW9uSWQpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG93bmVyUGlkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG93bmVyUGlkLFxuICAgICAgc291cmNlOiAnc3ludGhldGljJyxcbiAgICAgIGxlYWRlckluZm86IGJ1aWxkU3ludGhldGljTGVhZGVySW5mbyhwb3J0LCBvd25lclBpZCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGxlYWRlckluZm86IG51bGwsIG93bmVyUGlkOiBudWxsLCBzb3VyY2U6ICdub25lJyB9O1xufVxuXG5pbnRlcmZhY2UgQmluZEZhaWx1cmVSZWNvdmVyeURlcGVuZGVuY2llcyBleHRlbmRzIERpc2NvdmVyeURlcGVuZGVuY2llcyB7XG4gIGRlbGV0ZUxlYWRlckxvY2tJbXBsPzogdHlwZW9mIGRlbGV0ZUxlYWRlckxvY2s7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyTGVhZGVyQmluZEZhaWx1cmUoXG4gIHByb3Zpc2lvbmFsTGVhZGVyOiBDb25zb2xlTGVhZGVySW5mbyxcbiAgcG9ydDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGRlcHM6IEJpbmRGYWlsdXJlUmVjb3ZlcnlEZXBlbmRlbmNpZXMgPSB7fSxcbik6IFByb21pc2U8QmluZEZhaWx1cmVSZWNvdmVyeVJlc3VsdD4ge1xuICBjb25zdCByZWFkTGVhZGVyTG9ja0ltcGwgPSBkZXBzLnJlYWRMZWFkZXJMb2NrSW1wbCA/PyByZWFkTGVhZGVyTG9jaztcbiAgY29uc3QgZGVsZXRlTGVhZGVyTG9ja0ltcGwgPSBkZXBzLmRlbGV0ZUxlYWRlckxvY2tJbXBsID8/IGRlbGV0ZUxlYWRlckxvY2s7XG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBiaW5kIHJlY292ZXJ5IGluaXRpYXRlZCcsIHtcbiAgICBwcm92aXNpb25hbFNlc3Npb25JZDogcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkLFxuICAgIHByb3Zpc2lvbmFsUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgcG9ydCxcbiAgfSk7XG5cbiAgbGV0IGZhbGxiYWNrID0gYXdhaXQgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydChwb3J0LCBhdXRoVG9rZW4sIGRlcHMpO1xuICBsZXQgbG9ja0NsZWFudXBBdHRlbXB0ZWQgPSBmYWxzZTtcbiAgbGV0IGxvY2tDbGVhbnVwUGVyZm9ybWVkID0gZmFsc2U7XG4gIGNvbnN0IGN1cnJlbnRMb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2tJbXBsKCk7XG4gIGNvbnN0IHByb3Zpc2lvbmFsTG9ja01hdGNoZXMgPSAoXG4gICAgY3VycmVudExvY2s/LnBpZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucGlkICYmXG4gICAgY3VycmVudExvY2sucG9ydCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucG9ydCAmJlxuICAgIGN1cnJlbnRMb2NrLnNlc3Npb25JZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkXG4gICk7XG4gIGNvbnN0IGZhbGxiYWNrUG9pbnRzVG9Qcm92aXNpb25hbExlYWRlciA9IChcbiAgICBmYWxsYmFjay5sZWFkZXJJbmZvPy5waWQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCAmJlxuICAgIGZhbGxiYWNrLmxlYWRlckluZm8ucG9ydCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucG9ydCAmJlxuICAgIGZhbGxiYWNrLmxlYWRlckluZm8uc2Vzc2lvbklkID09PSBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWRcbiAgKTtcblxuICBpZiAocHJvdmlzaW9uYWxMb2NrTWF0Y2hlcykge1xuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCBkZWxldGVMZWFkZXJMb2NrSW1wbCgpO1xuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkID0gdHJ1ZTtcbiAgICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBSZW1vdmVkIHByb3Zpc2lvbmFsIGxlYWRlciBsb2NrIGFmdGVyIGJpbmQgZmFpbHVyZScsIHtcbiAgICAgIHByb3Zpc2lvbmFsU2Vzc2lvbklkOiBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWQsXG4gICAgICBwcm92aXNpb25hbFBpZDogcHJvdmlzaW9uYWxMZWFkZXIucGlkLFxuICAgICAgcG9ydCxcbiAgICB9KTtcbiAgICBpZiAoZmFsbGJhY2tQb2ludHNUb1Byb3Zpc2lvbmFsTGVhZGVyKSB7XG4gICAgICBmYWxsYmFjayA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQocG9ydCwgYXV0aFRva2VuLCBkZXBzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgYmluZCByZWNvdmVyeSBjb21wbGV0ZWQnLCB7XG4gICAgcHJvdmlzaW9uYWxTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICBwcm92aXNpb25hbFBpZDogcHJvdmlzaW9uYWxMZWFkZXIucGlkLFxuICAgIHBvcnQsXG4gICAgZGlzY292ZXJ5U291cmNlOiBmYWxsYmFjay5zb3VyY2UsXG4gICAgb3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkLFxuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLmZhbGxiYWNrLFxuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkLFxuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVQb3J0T3duZXJSZXBsYWNlbWVudChcbiAgY2FuZGlkYXRlTGVhZGVyOiBDb25zb2xlTGVhZGVySW5mbyxcbiAgZmFsbGJhY2s6IFBvcnRMZWFkZXJEaXNjb3ZlcnksXG4pOiBQb3J0T3duZXJSZXBsYWNlbWVudERlY2lzaW9uIHtcbiAgaWYgKCFmYWxsYmFjay5sZWFkZXJJbmZvIHx8IGZhbGxiYWNrLm93bmVyUGlkID09PSBudWxsIHx8IGZhbGxiYWNrLm93bmVyUGlkID09PSBjYW5kaWRhdGVMZWFkZXIucGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZEV2aWN0OiBmYWxzZSxcbiAgICAgIG93bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICAgIHByZWZlcmVuY2U6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHByZWZlcmVuY2UgPSBldmFsdWF0ZUxlYWRlclByZWZlcmVuY2UoY2FuZGlkYXRlTGVhZGVyLCBmYWxsYmFjay5sZWFkZXJJbmZvKTtcbiAgcmV0dXJuIHtcbiAgICBzaG91bGRFdmljdDogcHJlZmVyZW5jZS5zaG91bGRSZXBsYWNlLFxuICAgIG93bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICBwcmVmZXJlbmNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgcHJvdmlzaW9uYWxMZWFkZXI6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBiaW5kUmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHRbJ2JpbmRSZXN1bHQnXSxcbiAgZmFsbGJhY2s6IFBvcnRMZWFkZXJEaXNjb3ZlcnksXG4gIHJlcGxhY2VtZW50PzogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbixcbiAgZm9yY2VkS2lsbD86IEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lIHwgbnVsbCxcbikge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgIGJpbmRFcnJvcjogYmluZFJlc3VsdD8uZXJyb3IsXG4gICAgYmluZERldGFpbDogYmluZFJlc3VsdD8uZGV0YWlsLFxuICAgIHByb3Zpc2lvbmFsTGVhZGVyUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgcHJvdmlzaW9uYWxMZWFkZXJTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICBwcm92aXNpb25hbExlYWRlclZlcnNpb246IHByb3Zpc2lvbmFsTGVhZGVyLnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIHByb3Zpc2lvbmFsTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBwcm92aXNpb25hbExlYWRlci5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICBmYWxsYmFja093bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICBmYWxsYmFja1NvdXJjZTogZmFsbGJhY2suc291cmNlLFxuICAgIGZhbGxiYWNrTGVhZGVyUGlkOiBmYWxsYmFjay5sZWFkZXJJbmZvPy5waWQsXG4gICAgZmFsbGJhY2tMZWFkZXJTZXNzaW9uSWQ6IGZhbGxiYWNrLmxlYWRlckluZm8/LnNlc3Npb25JZCxcbiAgICBmYWxsYmFja0xlYWRlclZlcnNpb246IGZhbGxiYWNrLmxlYWRlckluZm8/LnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGZhbGxiYWNrTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBmYWxsYmFjay5sZWFkZXJJbmZvPy5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICByZXBsYWNlbWVudFNob3VsZEV2aWN0OiByZXBsYWNlbWVudD8uc2hvdWxkRXZpY3QgPz8gZmFsc2UsXG4gICAgcmVwbGFjZW1lbnRSZWFzb246IHJlcGxhY2VtZW50Py5wcmVmZXJlbmNlPy5yZWFzb24sXG4gICAgZm9yY2VkS2lsbFJlYXNvbjogZm9yY2VkS2lsbD8ucmVhc29uLFxuICAgIGZvcmNlZEtpbGxQaWQ6IGZvcmNlZEtpbGw/LnBpZCxcbiAgICBmb3JjZWRLaWxsRGV0YWlsOiBmb3JjZWRLaWxsPy5kZXRhaWwsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGF0dGVtcHRGb3JjZVRha2VvdmVyKFxuICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gIGN1cnJlbnRFbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gIHByaW1hcnlUb2tlbjogc3RyaW5nLFxuICBzZXJ2ZXJPcHRzOiBXZWJTZXJ2ZXJPcHRpb25zLFxuICBzdGFydFdlYlNlcnZlckltcGw6IChvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zKSA9PiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4sXG4pOiBQcm9taXNlPEZvcmNlVGFrZW92ZXJBdHRlbXB0UmVzdWx0PiB7XG4gIGNvbnN0IGluaXRpYWxGYWxsYmFjayA9IGF3YWl0IHJlY292ZXJMZWFkZXJCaW5kRmFpbHVyZShjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbywgY29uc29sZVBvcnQsIHByaW1hcnlUb2tlbik7XG4gIGNvbnN0IGluaXRpYWxSZXBsYWNlbWVudCA9IGV2YWx1YXRlUG9ydE93bmVyUmVwbGFjZW1lbnQoY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sIGluaXRpYWxGYWxsYmFjayk7XG5cbiAgaWYgKCFpbml0aWFsUmVwbGFjZW1lbnQuc2hvdWxkRXZpY3QgfHwgaW5pdGlhbFJlcGxhY2VtZW50Lm93bmVyUGlkID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdlYlJlc3VsdDogeyBiaW5kUmVzdWx0OiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9IH0sXG4gICAgICBlbGVjdGlvbjogY3VycmVudEVsZWN0aW9uLFxuICAgICAgZmFsbGJhY2s6IGluaXRpYWxGYWxsYmFjayxcbiAgICAgIHJlcGxhY2VtZW50OiBpbml0aWFsUmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsOiBudWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IGZhbHNlLFxuICAgICAgcmVib3VuZExvY2tDbGFpbWVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF0ZXN0RmFsbGJhY2sgPSBhd2FpdCBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0KGNvbnNvbGVQb3J0LCBwcmltYXJ5VG9rZW4pO1xuICBjb25zdCBsYXRlc3RSZXBsYWNlbWVudCA9IGV2YWx1YXRlUG9ydE93bmVyUmVwbGFjZW1lbnQoY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sIGxhdGVzdEZhbGxiYWNrKTtcbiAgaWYgKCFsYXRlc3RSZXBsYWNlbWVudC5zaG91bGRFdmljdCB8fCBsYXRlc3RSZXBsYWNlbWVudC5vd25lclBpZCA9PT0gbnVsbCkge1xuICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIEZvcmNlZCB0YWtlb3ZlciB0YXJnZXQgY2hhbmdlZCBiZWZvcmUgZXZpY3Rpb247IHNraXBwaW5nIGZvcmNlZCBraWxsJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSxcbiAgICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgKSxcbiAgICAgIHByZXZpb3VzT3duZXJQaWQ6IGluaXRpYWxSZXBsYWNlbWVudC5vd25lclBpZCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2ViUmVzdWx0OiB7IGJpbmRSZXN1bHQ6IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0gfSxcbiAgICAgIGVsZWN0aW9uOiBjdXJyZW50RWxlY3Rpb24sXG4gICAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgICByZXBsYWNlbWVudDogbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsOiBudWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IGZhbHNlLFxuICAgICAgcmVib3VuZExvY2tDbGFpbWVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgbG9nZ2VyLndhcm4oJ1tVbmlmaWVkQ29uc29sZV0gQXR0ZW1wdGluZyBmb3JjZWQgdGFrZW92ZXIgZnJvbSBvbGRlciBvciBpbmNvbXBhdGlibGUgYWN0aXZlIGxlYWRlcicsIHtcbiAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sXG4gICAgICB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9LFxuICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICBsYXRlc3RSZXBsYWNlbWVudCxcbiAgICApLFxuICB9KTtcblxuICBjb25zdCBmb3JjZWRLaWxsID0gYXdhaXQga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkKGxhdGVzdFJlcGxhY2VtZW50Lm93bmVyUGlkLCBjb25zb2xlUG9ydCwge1xuICAgIGFsbG93QWN0aXZlSG9zdFBhcmVudDogdHJ1ZSxcbiAgfSk7XG4gIGlmICghZm9yY2VkS2lsbC5raWxsZWQpIHtcbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBGb3JjZWQgdGFrZW92ZXIgc2tpcHBlZCBvciBmYWlsZWQgYWZ0ZXIgaWRlbnRpZnlpbmcgcmVwbGFjZWFibGUgbGVhZGVyJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSxcbiAgICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgICBmb3JjZWRLaWxsLFxuICAgICAgKSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2ViUmVzdWx0OiB7IGJpbmRSZXN1bHQ6IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0gfSxcbiAgICAgIGVsZWN0aW9uOiBjdXJyZW50RWxlY3Rpb24sXG4gICAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgICByZXBsYWNlbWVudDogbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IHRydWUsXG4gICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZWJvdW5kV2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXJJbXBsKHNlcnZlck9wdHMpO1xuICBsZXQgcmVib3VuZEVsZWN0aW9uID0gY3VycmVudEVsZWN0aW9uO1xuICBsZXQgcmVib3VuZExvY2tDbGFpbWVkID0gZmFsc2U7XG5cbiAgaWYgKCFyZWJvdW5kV2ViUmVzdWx0LmJpbmRSZXN1bHQgfHwgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBjb25zdCByZWJvdW5kTGVhZGVySW5mbyA9IGNyZWF0ZUxlYWRlckluZm8ob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcbiAgICByZWJvdW5kTG9ja0NsYWltZWQgPSBhd2FpdCBjbGFpbUxlYWRlcnNoaXAocmVib3VuZExlYWRlckluZm8pO1xuICAgIGlmICghcmVib3VuZExvY2tDbGFpbWVkKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBSZWJvdW5kIGxlYWRlciBib3VuZCBwb3J0IGJ1dCBjb3VsZCBub3QgaW1tZWRpYXRlbHkgcmUtY2xhaW0gbG9jaycsIHtcbiAgICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgICAgcmVib3VuZExlYWRlckluZm8sXG4gICAgICAgICAgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGxhdGVzdEZhbGxiYWNrLFxuICAgICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgICAgIGZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVib3VuZEVsZWN0aW9uID0geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogcmVib3VuZExlYWRlckluZm8gfTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBGb3JjZWQgdGFrZW92ZXIga2lsbGVkIG9sZCBsZWFkZXIgYnV0IGJpbmQgcmV0cnkgc3RpbGwgZmFpbGVkJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgICAgbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICAgIGZvcmNlZEtpbGwsXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3ZWJSZXN1bHQ6IHJlYm91bmRXZWJSZXN1bHQsXG4gICAgZWxlY3Rpb246IHJlYm91bmRFbGVjdGlvbixcbiAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgcmVwbGFjZW1lbnQ6IGxhdGVzdFJlcGxhY2VtZW50LFxuICAgIGZvcmNlZEtpbGwsXG4gICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IHRydWUsXG4gICAgcmVib3VuZExvY2tDbGFpbWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSB1bmlmaWVkIHdlYiBjb25zb2xlLlxuICpcbiAqIFJ1bnMgbGVhZGVyIGVsZWN0aW9uLCB0aGVuIGVpdGhlciBzdGFydHMgdGhlIGZ1bGwgY29uc29sZSAobGVhZGVyKVxuICogb3Igc2V0cyB1cCBldmVudCBmb3J3YXJkaW5nIChmb2xsb3dlcikuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFVuaWZpZWRDb25zb2xlKG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZENvbnNvbGVSZXN1bHQ+IHtcbiAgLy8gUmVzb2x2ZSBwb3J0OiBvcHRpb25zIChjb25maWcgZmlsZSkg4oaSIGVudiB2YXIg4oaSIGRlZmF1bHRcbiAgY29uc3QgY29uc29sZVBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9DT05TT0xFX1BPUlQ7XG4gIGxvZ2dlci5kZWJ1ZyhgW1VuaWZpZWRDb25zb2xlXSBQb3J0IHJlc29sdmVkOiAke2NvbnNvbGVQb3J0fWAgK1xuICAgIChvcHRpb25zLnBvcnQgPyAnIChmcm9tIGNvbmZpZyBmaWxlKScgOiBgIChmcm9tIGVudi9kZWZhdWx0KWApKTtcblxuICAvLyBMZWdhY3ktbGVhZGVyIGRldGVjdGlvbiAoIzE3OTQpIOKAlCB3YXJuIHRoZSB1c2VyIGlmIGEgcHJlLWF1dGhcbiAgLy8gRG9sbGhvdXNlTUNQIGNvbnNvbGUgaXMgcnVubmluZyBhbG9uZ3NpZGUgdGhpcyBhdXRoZW50aWNhdGVkIG9uZS5cbiAgLy8gVGhleSB3aWxsIGNvZXhpc3QgZmluZSBiZWNhdXNlIG9mIHBvcnQgKyBsb2NrICsgdG9rZW4gZmlsZSBpc29sYXRpb24sXG4gIC8vIGJ1dCB0aGUgdXNlciBzaG91bGQga25vdyBib3RoIGV4aXN0IHNvIHRoZSBkaWZmZXJpbmcgc2VjdXJpdHkgcG9zdHVyZVxuICAvLyBiZXR3ZWVuIHRoZW0gZG9lc24ndCBsb29rIGxpa2UgYSBidWcuXG4gIGF3YWl0IHdhcm5JZkxlZ2FjeUNvbnNvbGVQcmVzZW50KGNvbnNvbGVQb3J0KTtcblxuICBsZXQgZWxlY3Rpb24gPSBhd2FpdCBlbGVjdExlYWRlcihvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQpO1xuXG4gIC8vIElmIHdlIGxvc3QgdGhlIGVsZWN0aW9uLCBjaGVjayBpZiB0aGUgbGVhZGVyIGlzIGFjdHVhbGx5IHJ1bm5pbmcgYSB3ZWIgY29uc29sZS5cbiAgLy8gQW4gTUNQIHN0ZGlvIHByb2Nlc3MgbWF5IGhvbGQgbGVhZGVyc2hpcCBidXQgbm90IHNlcnZlIHdlYiByb3V0ZXMuXG4gIC8vIEluIHRoYXQgY2FzZSwgZm9yY2UgYSB0YWtlb3ZlciBzbyB0aGUgd2ViIGNvbnNvbGUgd29ya3MgcHJvcGVybHkuXG4gIGlmIChlbGVjdGlvbi5yb2xlID09PSAnZm9sbG93ZXInKSB7XG4gICAgY29uc3QgcmVhY2hhYmxlID0gYXdhaXQgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlKGVsZWN0aW9uLmxlYWRlckluZm8pO1xuICAgIGlmICghcmVhY2hhYmxlKSB7XG4gICAgICBlbGVjdGlvbiA9IGF3YWl0IGZvcmNlQ2xhaW1MZWFkZXJzaGlwKG9wdGlvbnMuc2Vzc2lvbklkLCBjb25zb2xlUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVsZWN0aW9uLnJvbGUgPT09ICdsZWFkZXInKSB7XG4gICAgcmV0dXJuIHN0YXJ0QXNMZWFkZXIob3B0aW9ucywgZWxlY3Rpb24sIGNvbnNvbGVQb3J0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhcnRBc0ZvbGxvd2VyKG9wdGlvbnMsIGVsZWN0aW9uLCBjb25zb2xlUG9ydCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhcyB0aGUgY29uc29sZSBsZWFkZXIuXG4gKiBCaW5kcyB0aGUgcmVzb2x2ZWQgY29uc29sZSBwb3J0IChjb25maWcgZmlsZSDihpIgZW52IHZhciDihpIgZGVmYXVsdCksXG4gKiBtb3VudHMgYWxsIHJvdXRlcyBpbmNsdWRpbmcgaW5nZXN0aW9uLCBzdGFydHMgaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzTGVhZGVyKFxuICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgY29uc29sZVBvcnQ6IG51bWJlciA9IERFRkFVTFRfQ09OU09MRV9QT1JULFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCB7IHN0YXJ0V2ViU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZlci5qcycpO1xuICBjb25zdCB7IHBpY2tSYW5kb21Ub2tlbk5hbWUgfSA9IGF3YWl0IGltcG9ydCgnLi9TZXNzaW9uTmFtZXMuanMnKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBjb25zb2xlIHRva2VuIHN0b3JlICgjMTc4MCkuIENyZWF0ZXMgdGhlIHRva2VuIGZpbGUgb25cbiAgLy8gZmlyc3QgcnVuLCByZWFkcyB0aGUgZXhpc3RpbmcgdG9rZW5zIG9uIHN1YnNlcXVlbnQgcnVucy4gVGhlIHRva2VuIGlzXG4gIC8vIHBlcnNpc3RlbnQgYWNyb3NzIHJlc3RhcnRzIOKAlCBvbmx5IHJvdGF0ZWQgb24gZXhwbGljaXQgcmVxdWVzdCAoUGhhc2UgMikuXG4gIC8vIEZlYXR1cmUgZmxhZyBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBjb250cm9scyBlbmZvcmNlbWVudDsgdGhlIGZpbGVcbiAgLy8gaXMgZ2VuZXJhdGVkIHJlZ2FyZGxlc3Mgc28gY29uc3VtZXJzIGNhbiBhdHRhY2ggdG9rZW5zIHByZWVtcHRpdmVseS5cbiAgY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBDb25zb2xlVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gIGNvbnN0IHByaW1hcnlUb2tlbiA9IGF3YWl0IHRva2VuU3RvcmUuZW5zdXJlSW5pdGlhbGl6ZWQocGlja1JhbmRvbVRva2VuTmFtZSgpKTtcbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gQ29uc29sZSB0b2tlbiBzdG9yZSBpbml0aWFsaXplZCcsIHtcbiAgICB0b2tlbklkOiBwcmltYXJ5VG9rZW4uaWQsXG4gICAgdG9rZW5OYW1lOiBwcmltYXJ5VG9rZW4ubmFtZSxcbiAgICBmaWxlOiB0b2tlblN0b3JlLmdldEZpbGVQYXRoKCksXG4gICAgYXV0aEVuZm9yY2VkOiBlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQsXG4gIH0pO1xuXG4gIC8vIFByZS1jcmVhdGUgYSBwbGFjZWhvbGRlciBicm9hZGNhc3QgdGhhdCB3ZSdsbCB3aXJlIHVwIGFmdGVyIHRoZSBzZXJ2ZXIgc3RhcnRzXG4gIGxldCBsaXZlQnJvYWRjYXN0OiAoKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBsZXQgbGl2ZU1ldHJpY3NPblNuYXBzaG90OiAoKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8gQ3JlYXRlIGluZ2VzdGlvbiByb3V0ZXMgd2l0aCBhIGRlZmVycmVkIGJyb2FkY2FzdCAod2lyZWQgYWZ0ZXIgc2VydmVyIHN0YXJ0cylcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgICBtZXRyaWNzT25TbmFwc2hvdDogKHNuYXBzaG90KSA9PiBsaXZlTWV0cmljc09uU25hcHNob3Q/LihzbmFwc2hvdCksXG4gICAgc3RvcmVNZXRyaWNzU25hcHNob3Q6IChzbmFwc2hvdCkgPT4gb3B0aW9ucy5tZXRyaWNzU2luaz8ub25TbmFwc2hvdChzbmFwc2hvdCksXG4gIH0pO1xuXG4gIC8vIFN0YXJ0IHRoZSB3ZWIgc2VydmVyIHdpdGggaW5nZXN0IHJvdXRlcyBtb3VudGVkIGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrLlxuICAvLyBJZiB0aGUgcG9ydCBpcyBvY2N1cGllZCBieSBhIHN0YWxlIHByb2Nlc3MsIHJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICAgIHRva2VuU3RvcmUsXG4gICAgLi4uKG9wdGlvbnMubWNwQXFsSGFuZGxlciA/IHsgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyIH0gOiB7fSksXG4gIH07XG4gIC8vIGJpbmRBbmRMaXN0ZW4gbm93IGhhbmRsZXMgRUFERFJJTlVTRSBieSBmaW5kaW5nIGFuZCBraWxsaW5nIHRoZSBzdGFsZVxuICAvLyBwcm9jZXNzIG9uIHRoZSBwb3J0LCB0aGVuIHJldHJ5aW5nLiBObyBleHRlcm5hbCByZXRyeSBsb29wIG5lZWRlZC5cbiAgbGV0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHNlcnZlck9wdHMpO1xuXG4gIGlmICh3ZWJSZXN1bHQuYmluZFJlc3VsdCAmJiAhd2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcmNlVGFrZW92ZXIgPSBhd2FpdCBhdHRlbXB0Rm9yY2VUYWtlb3ZlcihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBlbGVjdGlvbixcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgcHJpbWFyeVRva2VuLnRva2VuLFxuICAgICAgc2VydmVyT3B0cyxcbiAgICAgIHN0YXJ0V2ViU2VydmVyLFxuICAgICk7XG4gICAgd2ViUmVzdWx0ID0gZm9yY2VUYWtlb3Zlci53ZWJSZXN1bHQ7XG4gICAgZWxlY3Rpb24gPSBmb3JjZVRha2VvdmVyLmVsZWN0aW9uO1xuXG4gICAgaWYgKHdlYlJlc3VsdC5iaW5kUmVzdWx0ICYmICF3ZWJSZXN1bHQuYmluZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBpZiAoZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5sZWFkZXJJbmZvKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgcm9sZSBhYm9ydGVkOiBiaW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZvbGxvd2VyJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZDogZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5zb3VyY2UgIT09ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9sbG93ZXJFbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQgPSB7IHJvbGU6ICdmb2xsb3dlcicsIGxlYWRlckluZm86IGZvcmNlVGFrZW92ZXIuZmFsbGJhY2subGVhZGVySW5mbyB9O1xuICAgICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBmb2xsb3dlckVsZWN0aW9uLCBjb25zb2xlUG9ydCwgcHJpbWFyeVRva2VuLnRva2VuKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBmYWlsZWQgdG8gYmluZCBhbmQgbm8gYWN0aXZlIGxlYWRlciBjb3VsZCBiZSBpZGVudGlmaWVkJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlYWRlciBmYWlsZWQgdG8gYmluZCBwb3J0ICR7Y29uc29sZVBvcnR9IGFuZCBubyBhY3RpdmUgbGVhZGVyIHdhcyBkaXNjb3ZlcmFibGVgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgbGVhZGVyIG9ubHkgYWZ0ZXIgdGhlIEhUVFAgbGlzdGVuZXIgaXMgYWN0dWFsbHkgc2VydmluZyB0aGUgcG9ydC5cbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyTGVhZGVyU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQpO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSB3ZWIgY29uc29sZSBpdHNlbGYgc28gdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSlcbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTtcblxuICAvLyBXaXJlIFNTRSBicm9hZGNhc3RzIGZvciB0aGlzIGxlYWRlcidzIG93biBldmVudHNcbiAgb3B0aW9ucy53aXJlU1NFQnJvYWRjYXN0cyh3ZWJSZXN1bHQsIG9wdGlvbnMubWV0cmljc1NpbmspO1xuXG4gIC8vIE5vdyB3aXJlIHRoZSBsaXZlIGJyb2FkY2FzdCBmdW5jdGlvbnMgaW50byB0aGUgaW5nZXN0IHJvdXRlc1xuICBpZiAod2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdCkge1xuICAgIGNvbnN0IG9yaWdpbmFsQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbiAgICAvLyBTdGFtcCBsZWFkZXIncyBvd24gZW50cmllcyB3aXRoIHNlc3Npb24gSURcbiAgICBsaXZlQnJvYWRjYXN0ID0gKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBvcmlnaW5hbEJyb2FkY2FzdChzdGFtcGVkKTtcbiAgICB9O1xuICB9XG4gIGxpdmVNZXRyaWNzT25TbmFwc2hvdCA9IHdlYlJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdDtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBJbmdlc3Rpb24gcm91dGVzIG1vdW50ZWQnKTtcblxuICAvLyBTdGFydCBoZWFydGJlYXQgYW5kIHJlZ2lzdGVyIGNsZWFudXBcbiAgY29uc3Qgc3RvcEhlYXJ0YmVhdCA9IHN0YXJ0SGVhcnRiZWF0KGVsZWN0aW9uLmxlYWRlckluZm8pO1xuICByZWdpc3RlckxlYWRlckNsZWFudXAoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgc3RhcnRlZCcsIHtcbiAgICBzZXNzaW9uSWQ6IG9wdGlvbnMuc2Vzc2lvbklkLCBwb3J0OiBjb25zb2xlUG9ydCwgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICByb2xlOiAnbGVhZGVyJywgaW5nZXN0Um91dGVzOiBbJy9hcGkvaW5nZXN0L2xvZ3MnLCAnL2FwaS9pbmdlc3QvbWV0cmljcycsICcvYXBpL2luZ2VzdC9zZXNzaW9uJywgJy9hcGkvc2Vzc2lvbnMnXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnbGVhZGVyJyxcbiAgICBlbGVjdGlvbixcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBzdG9wSGVhcnRiZWF0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhcyBhIGZvbGxvd2VyLlxuICogUmVnaXN0ZXJzIGZvcndhcmRpbmcgc2lua3Mgd2l0aCB0aGUgTG9nTWFuYWdlciwgc3RhcnRzIHNlc3Npb24gaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzRm9sbG93ZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBjb25zb2xlUG9ydDogbnVtYmVyID0gREVGQVVMVF9DT05TT0xFX1BPUlQsXG4gIGluaXRpYWxBdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCBsZWFkZXJVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke2VsZWN0aW9uLmxlYWRlckluZm8ucG9ydH1gO1xuXG4gIC8vIFJlYWQgdGhlIGNvbnNvbGUgYXV0aCB0b2tlbiAoIzE3ODApIHdyaXR0ZW4gYnkgdGhlIGxlYWRlci4gTWF5IGJlIG51bGxcbiAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCB5ZXQg4oCUIHRoZSBzaW5rcyBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5IGFuZFxuICAvLyBzaW1wbHkgb21pdCB0aGUgQmVhcmVyIGhlYWRlciwgd2hpY2ggaXMgZmluZSB3aGVuIGF1dGggaXMgbm90IGVuZm9yY2VkLlxuICBsZXQgYXV0aFRva2VuID0gaW5pdGlhbEF1dGhUb2tlbjtcbiAgaWYgKGF1dGhUb2tlbiA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHsgZ2V0UHJpbWFyeVRva2VuRnJvbUZpbGUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBhdXRoVG9rZW4gPSBhd2FpdCBnZXRQcmltYXJ5VG9rZW5Gcm9tRmlsZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gIH1cbiAgaWYgKGF1dGhUb2tlbikge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBsb2FkZWQgY29uc29sZSBhdXRoIHRva2VuJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIE5vIGNvbnNvbGUgYXV0aCB0b2tlbiBmaWxlIGZvdW5kOyBmb2xsb3dlciB3aWxsIFBPU1Qgd2l0aG91dCBCZWFyZXIgaGVhZGVyJyk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgcHJvbW90aW9uIG1hbmFnZXIg4oCUIHRyYWNrcyBpdHMgb3duIGF0dGVtcHQgY291bnRlciBzb1xuICAvLyBtdWx0aXBsZSBmb2xsb3dlcnMgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICBjb25zdCBwcm9tb3Rpb25NZ3IgPSBuZXcgUHJvbW90aW9uTWFuYWdlcihvcHRpb25zLCBjb25zb2xlUG9ydCwgc3RhcnRBc0xlYWRlciwgc3RhcnRBc0ZvbGxvd2VyKTtcblxuICAvLyBEZWNsYXJlIHNlc3Npb25IZWFydGJlYXQgYmVmb3JlIHRoZSBzaW5rIHNvIHRoZSBjbG9zdXJlIGNhbiBjYXB0dXJlIGl0LlxuICAvLyBCb3RoIGFyZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGNvdWxkIHBvc3NpYmx5IGZpcmUgKG5lZWRzIDUrIGZhaWxlZCBmbHVzaGVzKS5cbiAgbGV0IHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQ7XG5cbiAgLy8gUmVnaXN0ZXIgYSBmb3J3YXJkaW5nIGxvZyBzaW5rIHdpdGggbGVhZGVyLWRlYXRoIGNhbGxiYWNrICgjMTg1MCkuXG4gIGNvbnN0IGZvcndhcmRpbmdTaW5rID0gbmV3IExlYWRlckZvcndhcmRpbmdMb2dTaW5rKGxlYWRlclVybCwgb3B0aW9ucy5zZXNzaW9uSWQsIGF1dGhUb2tlbiwgKCkgPT4ge1xuICAgIHByb21vdGlvbk1nci5wcm9tb3RlKGZvcndhcmRpbmdTaW5rLCBzZXNzaW9uSGVhcnRiZWF0KVxuICAgICAgLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ1tVbmlmaWVkQ29uc29sZV0gUHJvbW90aW9uIGNyYXNoZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSk7XG4gIH0pO1xuICBvcHRpb25zLnJlZ2lzdGVyTG9nU2luayhmb3J3YXJkaW5nU2luayk7XG5cbiAgLy8gU3RhcnQgc2Vzc2lvbiBoZWFydGJlYXQgdG8gdGhlIGxlYWRlclxuICBzZXNzaW9uSGVhcnRiZWF0ID0gbmV3IFNlc3Npb25IZWFydGJlYXQobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQsIGF1dGhUb2tlbik7XG4gIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RhcnQoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBzdGFydGVkJywge1xuICAgIHNlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHJvbGU6ICdmb2xsb3dlcicsXG4gICAgbGVhZGVyU2Vzc2lvbjogZWxlY3Rpb24ubGVhZGVySW5mby5zZXNzaW9uSWQsIGxlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgbGVhZGVyUG9ydDogZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0LCBsZWFkZXJVcmwsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBlbGVjdGlvbixcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXNzaW9uSGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIGF3YWl0IGZvcndhcmRpbmdTaW5rLmNsb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
package/oauth-helper.mjs CHANGED
@@ -110,7 +110,7 @@ async function pollGitHub(deviceCode, clientId) {
110
110
  const data = await response.json();
111
111
  return data;
112
112
  } catch (error) {
113
- await log(`Network error polling GitHub: ${error.message}`);
113
+ await log('Network error polling GitHub');
114
114
  throw error;
115
115
  }
116
116
  }
@@ -130,8 +130,8 @@ async function storeToken(token) {
130
130
  await TokenManager.storeGitHubToken(token);
131
131
  await log('Token stored successfully using TokenManager');
132
132
  return true;
133
- } catch (error) {
134
- await log(`Failed to store token using TokenManager: ${error.message}`);
133
+ } catch {
134
+ await log('Failed to store token using TokenManager');
135
135
 
136
136
  // Fallback: Write to a temporary file for the MCP server to pick up
137
137
  try {
@@ -154,10 +154,10 @@ async function storeToken(token) {
154
154
  // Verify file permissions
155
155
  await fs.chmod(tempTokenFile, 0o600);
156
156
 
157
- await log(`Token written to fallback file with secure permissions`);
157
+ await log('Token written to fallback file with secure permissions');
158
158
  return true;
159
159
  } catch (fallbackError) {
160
- await log(`Fallback storage also failed: ${fallbackError.message}`);
160
+ await log('Fallback storage also failed');
161
161
  throw fallbackError;
162
162
  }
163
163
  }
@@ -192,14 +192,14 @@ async function writePidFile() {
192
192
  await fs.mkdir(pidDir, { recursive: true, mode: 0o700 });
193
193
  await fs.writeFile(pidFile, process.pid.toString(), { mode: 0o600 });
194
194
  await log(`PID file written: ${pidFile}`);
195
- } catch (error) {
196
- await log(`Failed to write PID file: ${error.message}`);
195
+ } catch {
196
+ await log('Failed to write PID file');
197
197
  }
198
198
  }
199
199
 
200
200
  async function main() {
201
201
  await log(`[START] OAuth helper started - PID: ${process.pid}`);
202
- await log(`[CONFIG] Device code: ${deviceCode.substring(0, 2)}****`); // More aggressive truncation
202
+ await log('[CONFIG] Device code received');
203
203
  await log(`[CONFIG] Poll interval: ${pollInterval}s, Expires in: ${expiresIn}s`);
204
204
  await log(`[CONFIG] Node version: ${process.version}`);
205
205
  await log(`[CONFIG] Platform: ${process.platform}`);
@@ -278,9 +278,9 @@ async function main() {
278
278
  process.exit(1);
279
279
 
280
280
  default:
281
- await log(`OAUTH_HELPER_276: Unknown error from GitHub: ${response.error}`);
282
- await log(`[ERROR] Error description: ${response.error_description}`);
283
- console.error(`OAUTH_UNKNOWN_RESPONSE: Unknown error '${response.error}' at line 276`);
281
+ await log('OAUTH_HELPER_276: Unknown error from GitHub during device flow polling');
282
+ await log('[ERROR] GitHub returned an unrecognized OAuth polling response');
283
+ console.error('OAUTH_UNKNOWN_RESPONSE: Unknown GitHub OAuth response at line 276');
284
284
  }
285
285
  } else if (response.access_token) {
286
286
  // Success! We got the token
@@ -309,7 +309,7 @@ async function main() {
309
309
  consecutiveErrors = 0;
310
310
  }
311
311
  } catch (error) {
312
- await log(`[ERROR] Polling error: ${error.message}`);
312
+ await log('[ERROR] Polling error');
313
313
 
314
314
  // Classify error types
315
315
  const isNetworkError = error.message && (
@@ -333,8 +333,8 @@ async function main() {
333
333
  }
334
334
  } else {
335
335
  // Non-network error, likely fatal
336
- await log(`OAUTH_HELPER_330: Non-recoverable error: ${error.message}`);
337
- console.error(`OAUTH_FATAL_ERROR: Non-recoverable error at line 330 - ${error.message}`);
336
+ await log('OAUTH_HELPER_330: Non-recoverable error');
337
+ console.error('OAUTH_FATAL_ERROR: Non-recoverable error at line 330');
338
338
  clearInterval(heartbeatInterval);
339
339
  await cleanupPidFile();
340
340
  process.exit(1);
@@ -355,9 +355,9 @@ async function main() {
355
355
  }
356
356
 
357
357
  // Run the main function
358
- main().catch(async (error) => {
359
- await log(`Fatal error: ${error.message}`);
360
- console.error('Fatal error in OAuth helper:', error);
358
+ main().catch(async () => {
359
+ await log('Fatal error');
360
+ console.error('Fatal error in OAuth helper');
361
361
  await cleanupPidFile();
362
362
  process.exit(1);
363
- });
363
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.20",
3
+ "version": "2.0.22",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.20",
6
+ "version": "2.0.22",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.20",
32
+ "version": "2.0.22",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }