@dbx-tools/postgres 0.9.4 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
6
- export const PACKAGE_VERSION = "0.9.4";
6
+ export const PACKAGE_VERSION = "0.9.6";
7
7
  export * as advisoryLock from "./src/advisory-lock.ts";
8
8
  export * as persistence from "./src/persistence.ts";
9
9
  export * as topicBus from "./src/topic-bus.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
2
- export declare const PACKAGE_VERSION = "0.9.4";
2
+ export declare const PACKAGE_VERSION = "0.9.6";
3
3
  export * as advisoryLock from "./src/advisory-lock.ts";
4
4
  export * as persistence from "./src/persistence.ts";
5
5
  export * as topicBus from "./src/topic-bus.ts";
package/lib/index.js CHANGED
@@ -2,11 +2,11 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
5
- export const PACKAGE_VERSION = "0.9.4";
5
+ export const PACKAGE_VERSION = "0.9.6";
6
6
  export * as advisoryLock from "./src/advisory-lock.js";
7
7
  export * as persistence from "./src/persistence.js";
8
8
  export * as topicBus from "./src/topic-bus.js";
9
9
  export { POINTER_VERSION } from "./src/persistence.js";
10
10
  export { PostgresTopicBus } from "./src/topic-bus.js";
11
11
  export * from "./exports.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40XCI7XG5leHBvcnQgKiBhcyBhZHZpc29yeUxvY2sgZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS42XCI7XG5leHBvcnQgKiBhcyBhZHZpc29yeUxvY2sgZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { createHash } from "node:crypto";
10
+ import { advisoryLockId as nativeAdvisoryLockId } from "@dbx-tools/core-rs";
11
11
  import { object } from "@dbx-tools/shared-core";
12
12
  const SIGNED_BIGINT_BITS = 64;
13
13
  /**
@@ -24,10 +24,7 @@ export function advisoryLockId(key) {
24
24
  if (typeof key === "bigint")
25
25
  return BigInt.asIntN(SIGNED_BIGINT_BITS, key);
26
26
  const parts = object.toOneOrMany(key);
27
- const digest = createHash("sha256")
28
- .update(parts.map((part) => object.toStableKey(part)).join("\u0000"))
29
- .digest();
30
- return digest.readBigInt64BE(0);
27
+ return nativeAdvisoryLockId(parts.map((part) => object.toStableKey(part)));
31
28
  }
32
29
  async function acquire(client, id, transaction) {
33
30
  const fn = transaction ? "pg_advisory_xact_lock" : "pg_advisory_lock";
@@ -108,4 +105,4 @@ export async function withAdvisoryTransactionLock(pool, key, fn) {
108
105
  client.release(releaseError);
109
106
  }
110
107
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZHZpc29yeS1sb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUEwQjlCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBb0I7SUFDakQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwRSxNQUFNLEVBQUUsQ0FBQztJQUNaLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsS0FBSyxVQUFVLE9BQU8sQ0FBQyxNQUFtQixFQUFFLEVBQVUsRUFBRSxXQUFvQjtJQUMxRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztJQUN0RSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxD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QUFZO2dCQUNWLGFBQWEsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZHZpc29yeS1sb2NrIGhlbHBlcnMgZm9yIGFueSBgcGcuUG9vbGAtY29tcGF0aWJsZSBwb29sLlxuICpcbiAqIFBvc3RncmVTUUwgYWR2aXNvcnkgbG9ja3MgYmVsb25nIHRvIGEgY29ubmVjdGlvbiwgbm90IGEgcG9vbC4gVGhlc2UgaGVscGVyc1xuICogcmVzZXJ2ZSBvbmUgcG9vbGVkIGNsaWVudCBmb3IgdGhlIGZ1bGwgY2FsbGJhY2ssIGFjcXVpcmUgdGhlIGxvY2sgb24gdGhhdFxuICogY2xpZW50LCBhbmQgcmVsZWFzZSBib3RoIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBQb29sLCBQb29sQ2xpZW50LCBRdWVyeVJlc3VsdCwgUXVlcnlSZXN1bHRSb3cgfSBmcm9tIFwicGdcIjtcblxuY29uc3QgU0lHTkVEX0JJR0lOVF9CSVRTID0gNjQ7XG5cbi8qKlxuICogV2hhdCBuYW1lcyBhIGxvY2suIEFueXRoaW5nIHJlZHVjaWJsZSB0byBhIHN0YWJsZSBpZGVudGl0eTogYSBzdHJpbmcsIGFuIGlkLCBhXG4gKiBgW1wiaW52b2ljZVwiLCBpZF1gIHBhaXIsIGEgY29uZmlnIG9iamVjdCwgb3IgYW4gZXhwbGljaXQgYGJpZ2ludGAgdG8gaW50ZXJvcGVyYXRlXG4gKiB3aXRoIGFub3RoZXIgaW1wbGVtZW50YXRpb24ncyBwdWJsaXNoZWQgbG9jayBpZC5cbiAqXG4gKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0cywgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZVxuICogcGFydC4gU28gYFtcImludm9pY2VcIiwgN11gIGFuZCBgXCJpbnZvaWNlXzdcImAgYXJlIGRpZmZlcmVudCBsb2Nrcywgc2luY2UgdGhlXG4gKiBjYW5vbmljYWwgZm9ybSBzZWVzIGRpZmZlcmVudCBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIEFkdmlzb3J5TG9ja0tleSA9IHVua25vd247XG5cbi8qKiBTdHJ1Y3R1cmFsIHBvb2wgc2hhcGUgYWNjZXB0ZWQgYnkgdGhlIGxvY2sgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIFBnUG9vbExpa2UgPSBQaWNrPFBvb2wsIFwiY29ubmVjdFwiPjtcblxuLyoqIFN0cnVjdHVyYWwgcXVlcnkgc2hhcGUgc2hhcmVkIGJ5IGBwZy5Qb29sQ2xpZW50YCBhbmQgQXBwS2l0IExha2ViYXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZ1F1ZXJ5YWJsZSB7XG4gIHF1ZXJ5PFQgZXh0ZW5kcyBRdWVyeVJlc3VsdFJvdyA9IFF1ZXJ5UmVzdWx0Um93PihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdmFsdWVzPzogdW5rbm93bltdLFxuICApOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PFQ+Pjtcbn1cblxudHlwZSBVbmxvY2tSb3cgPSBRdWVyeVJlc3VsdFJvdyAmIHsgdW5sb2NrZWQ6IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmVkIGtleSBpbnRvIFBvc3RncmVTUUwncyBzaWduZWQgNjQtYml0IGFkdmlzb3J5XG4gKiBsb2NrIG5hbWVzcGFjZS4gQSBiaWdpbnQgaXMgcHJlc2VydmVkIGRpcmVjdGx5IHNvIGNhbGxlcnMgY2FuIGludGVyb3BlcmF0ZVxuICogd2l0aCBhbm90aGVyIGltcGxlbWVudGF0aW9uIHRoYXQgcHVibGlzaGVzIGl0cyBsb2NrIElELlxuICpcbiAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjYW5vbmljYWxpemVkIHdpdGggYG9iamVjdC50b1N0YWJsZUtleWAgYW5kIGhhc2hlZCwgc28ga2V5XG4gKiBvcmRlciBpbiBhbiBvYmplY3QgZG9lcyBub3QgbWF0dGVyIHdoaWxlIGEgYDFgIGFuZCBhIGBcIjFcImAgc3RheSBkaWZmZXJlbnQgbG9ja3MuXG4gKiBBIGN5Y2xlLCBhIG5vbi1maW5pdGUgbnVtYmVyLCBvciBhIGZ1bmN0aW9uL3N5bWJvbCBrZXkgdGhyb3dzIGBUeXBlRXJyb3JgXG4gKiByYXRoZXIgdGhhbiB5aWVsZGluZyBhbiBpZGVudGl0eSB0d28gY2FsbGVycyBjb3VsZCBkaXNhZ3JlZSBhYm91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkdmlzb3J5TG9ja0lkKGtleTogQWR2aXNvcnlMb2NrS2V5KTogYmlnaW50IHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwiYmlnaW50XCIpIHJldHVybiBCaWdJbnQuYXNJbnROKFNJR05FRF9CSUdJTlRfQklUUywga2V5KTtcbiAgY29uc3QgcGFydHMgPSBvYmplY3QudG9PbmVPck1hbnkoa2V5KTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUocGFydHMubWFwKChwYXJ0KSA9PiBvYmplY3QudG9TdGFibGVLZXkocGFydCkpLmpvaW4oXCJcXHUwMDAwXCIpKVxuICAgIC5kaWdlc3QoKTtcbiAgcmV0dXJuIGRpZ2VzdC5yZWFkQmlnSW50NjRCRSgwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWNxdWlyZShjbGllbnQ6IFBnUXVlcnlhYmxlLCBpZDogYmlnaW50LCB0cmFuc2FjdGlvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmbiA9IHRyYW5zYWN0aW9uID8gXCJwZ19hZHZpc29yeV94YWN0X2xvY2tcIiA6IFwicGdfYWR2aXNvcnlfbG9ja1wiO1xuICBhd2FpdCBjbGllbnQucXVlcnkoYFNFTEVDVCAke2ZufSgkMTo6YmlnaW50KWAsIFtpZC50b1N0cmluZygpXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVubG9jayhjbGllbnQ6IFBnUXVlcnlhYmxlLCBpZDogYmlnaW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeTxVbmxvY2tSb3c+KFxuICAgIFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3VubG9jaygkMTo6YmlnaW50KSBBUyB1bmxvY2tlZFwiLFxuICAgIFtpZC50b1N0cmluZygpXSxcbiAgKTtcbiAgaWYgKHJlc3VsdC5yb3dzWzBdPy51bmxvY2tlZCAhPT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9zdGdyZXMgYWR2aXNvcnkgbG9jayAke2lkfSB3YXMgbm90IGhlbGQgYnkgdGhpcyBjb25uZWN0aW9uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIb2xkIGEgc2Vzc2lvbiBhZHZpc29yeSBsb2NrIGZvciB0aGUgZHVyYXRpb24gb2YgYGZuYC5cbiAqXG4gKiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGRlZGljYXRlZCBgUG9vbENsaWVudGAgdGhhdCBvd25zIHRoZSBsb2NrLiBVc2UgaXRcbiAqIGZvciBhbnkgb3BlcmF0aW9uIHRoYXQgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgdGhlIGxvY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoQWR2aXNvcnlMb2NrPFQ+KFxuICBwb29sOiBQZ1Bvb2xMaWtlLFxuICBrZXk6IEFkdmlzb3J5TG9ja0tleSxcbiAgZm46IChjbGllbnQ6IFBvb2xDbGllbnQpID0+IFByb21pc2U8VD4gfCBULFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGlkID0gYWR2aXNvcnlMb2NrSWQoa2V5KTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgcG9vbC5jb25uZWN0KCk7XG4gIGxldCBhY3F1aXJlZCA9IGZhbHNlO1xuICBsZXQgZmFpbGVkID0gZmFsc2U7XG4gIGxldCBmYWlsdXJlOiB1bmtub3duO1xuICBsZXQgdmFsdWU6IFQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhY3F1aXJlKGNsaWVudCwgaWQsIGZhbHNlKTtcbiAgICBhY3F1aXJlZCA9IHRydWU7XG4gICAgdmFsdWUgPSBhd2FpdCBmbihjbGllbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGZhaWxlZCA9IHRydWU7XG4gICAgZmFpbHVyZSA9IGVycm9yO1xuICB9XG5cbiAgbGV0IHVubG9ja0ZhaWx1cmU6IHVua25vd247XG4gIGlmIChhY3F1aXJlZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bmxvY2soY2xpZW50LCBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHVubG9ja0ZhaWx1cmUgPSBlcnJvcjtcbiAgICB9XG4gIH1cbiAgY2xpZW50LnJlbGVhc2UodW5sb2NrRmFpbHVyZSBpbnN0YW5jZW9mIEVycm9yID8gdW5sb2NrRmFpbHVyZSA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKGZhaWxlZCkgdGhyb3cgZmFpbHVyZTtcbiAgaWYgKHVubG9ja0ZhaWx1cmUgIT09IHVuZGVmaW5lZCkgdGhyb3cgdW5sb2NrRmFpbHVyZTtcbiAgcmV0dXJuIHZhbHVlIGFzIFQ7XG59XG5cbi8qKlxuICogUnVuIGBmbmAgaW4gYSB0cmFuc2FjdGlvbiB3aGlsZSBob2xkaW5nIGEgdHJhbnNhY3Rpb24gYWR2aXNvcnkgbG9jay5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWxlYXNlZCBhdG9taWNhbGx5IGJ5IGBDT01NSVRgIG9yIGBST0xMQkFDS2AsIG1ha2luZyB0aGlzIHRoZVxuICogcmlnaHQgcHJpbWl0aXZlIGZvciBvbmUtdGltZSBzY2hlbWEgaW5zdGFsbGF0aW9uIGFuZCBtaWdyYXRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrPFQ+KFxuICBwb29sOiBQZ1Bvb2xMaWtlLFxuICBrZXk6IEFkdmlzb3J5TG9ja0tleSxcbiAgZm46IChjbGllbnQ6IFBvb2xDbGllbnQpID0+IFByb21pc2U8VD4gfCBULFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGlkID0gYWR2aXNvcnlMb2NrSWQoa2V5KTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgcG9vbC5jb25uZWN0KCk7XG4gIGxldCByZWxlYXNlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuICAgIGF3YWl0IGFjcXVpcmUoY2xpZW50LCBpZCwgdHJ1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmbihjbGllbnQpO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpO1xuICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcbiAgICAgIHJlbGVhc2VFcnJvciA9XG4gICAgICAgIHJvbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHJvbGxiYWNrRXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKHJvbGxiYWNrRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxufVxuIl19
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZHZpc29yeS1sb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGNBQWMsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdoRCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQTBCOUI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFvQjtJQUNqRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxLQUFLLFVBQVUsT0FBTyxDQUFDLE1BQW1CLEVBQUUsRUFBVSxFQUFFLFdBQW9CO0lBQzFFLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0lBQ3RFLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsS0FBSyxVQUFVLE1BQU0sQ0FBQyxNQUFtQixFQUFFLEVBQVU7SUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUMv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QUN0RixDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFkdmlzb3J5LWxvY2sgaGVscGVycyBmb3IgYW55IGBwZy5Qb29sYC1jb21wYXRpYmxlIHBvb2wuXG4gKlxuICogUG9zdGdyZVNRTCBhZHZpc29yeSBsb2NrcyBiZWxvbmcgdG8gYSBjb25uZWN0aW9uLCBub3QgYSBwb29sLiBUaGVzZSBoZWxwZXJzXG4gKiByZXNlcnZlIG9uZSBwb29sZWQgY2xpZW50IGZvciB0aGUgZnVsbCBjYWxsYmFjaywgYWNxdWlyZSB0aGUgbG9jayBvbiB0aGF0XG4gKiBjbGllbnQsIGFuZCByZWxlYXNlIGJvdGggaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGFkdmlzb3J5TG9ja0lkIGFzIG5hdGl2ZUFkdmlzb3J5TG9ja0lkIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZS1yc1wiO1xuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCwgUG9vbENsaWVudCwgUXVlcnlSZXN1bHQsIFF1ZXJ5UmVzdWx0Um93IH0gZnJvbSBcInBnXCI7XG5cbmNvbnN0IFNJR05FRF9CSUdJTlRfQklUUyA9IDY0O1xuXG4vKipcbiAqIFdoYXQgbmFtZXMgYSBsb2NrLiBBbnl0aGluZyByZWR1Y2libGUgdG8gYSBzdGFibGUgaWRlbnRpdHk6IGEgc3RyaW5nLCBhbiBpZCwgYVxuICogYFtcImludm9pY2VcIiwgaWRdYCBwYWlyLCBhIGNvbmZpZyBvYmplY3QsIG9yIGFuIGV4cGxpY2l0IGBiaWdpbnRgIHRvIGludGVyb3BlcmF0ZVxuICogd2l0aCBhbm90aGVyIGltcGxlbWVudGF0aW9uJ3MgcHVibGlzaGVkIGxvY2sgaWQuXG4gKlxuICogT25lIHZhbHVlIG9yIG1hbnk6IGFuIGFycmF5IGlzIHJlYWQgYXMgbXVsdGlwbGUgcGFydHMsIGFueXRoaW5nIGVsc2UgYXMgYSBzaW5nbGVcbiAqIHBhcnQuIFNvIGBbXCJpbnZvaWNlXCIsIDddYCBhbmQgYFwiaW52b2ljZV83XCJgIGFyZSBkaWZmZXJlbnQgbG9ja3MsIHNpbmNlIHRoZVxuICogY2Fub25pY2FsIGZvcm0gc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICovXG5leHBvcnQgdHlwZSBBZHZpc29yeUxvY2tLZXkgPSB1bmtub3duO1xuXG4vKiogU3RydWN0dXJhbCBwb29sIHNoYXBlIGFjY2VwdGVkIGJ5IHRoZSBsb2NrIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBQZ1Bvb2xMaWtlID0gUGljazxQb29sLCBcImNvbm5lY3RcIj47XG5cbi8qKiBTdHJ1Y3R1cmFsIHF1ZXJ5IHNoYXBlIHNoYXJlZCBieSBgcGcuUG9vbENsaWVudGAgYW5kIEFwcEtpdCBMYWtlYmFzZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGdRdWVyeWFibGUge1xuICBxdWVyeTxUIGV4dGVuZHMgUXVlcnlSZXN1bHRSb3cgPSBRdWVyeVJlc3VsdFJvdz4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHZhbHVlcz86IHVua25vd25bXSxcbiAgKTogUHJvbWlzZTxRdWVyeVJlc3VsdDxUPj47XG59XG5cbnR5cGUgVW5sb2NrUm93ID0gUXVlcnlSZXN1bHRSb3cgJiB7IHVubG9ja2VkOiBib29sZWFuIH07XG5cbi8qKlxuICogQ29udmVydCBhbiBhcmJpdHJhcnkgc3RydWN0dXJlZCBrZXkgaW50byBQb3N0Z3JlU1FMJ3Mgc2lnbmVkIDY0LWJpdCBhZHZpc29yeVxuICogbG9jayBuYW1lc3BhY2UuIEEgYmlnaW50IGlzIHByZXNlcnZlZCBkaXJlY3RseSBzbyBjYWxsZXJzIGNhbiBpbnRlcm9wZXJhdGVcbiAqIHdpdGggYW5vdGhlciBpbXBsZW1lbnRhdGlvbiB0aGF0IHB1Ymxpc2hlcyBpdHMgbG9jayBJRC5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgY2Fub25pY2FsaXplZCB3aXRoIGBvYmplY3QudG9TdGFibGVLZXlgIGFuZCBoYXNoZWQsIHNvIGtleVxuICogb3JkZXIgaW4gYW4gb2JqZWN0IGRvZXMgbm90IG1hdHRlciB3aGlsZSBhIGAxYCBhbmQgYSBgXCIxXCJgIHN0YXkgZGlmZmVyZW50IGxvY2tzLlxuICogQSBjeWNsZSwgYSBub24tZmluaXRlIG51bWJlciwgb3IgYSBmdW5jdGlvbi9zeW1ib2wga2V5IHRocm93cyBgVHlwZUVycm9yYFxuICogcmF0aGVyIHRoYW4geWllbGRpbmcgYW4gaWRlbnRpdHkgdHdvIGNhbGxlcnMgY291bGQgZGlzYWdyZWUgYWJvdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yeUxvY2tJZChrZXk6IEFkdmlzb3J5TG9ja0tleSk6IGJpZ2ludCB7XG4gIGlmICh0eXBlb2Yga2V5ID09PSBcImJpZ2ludFwiKSByZXR1cm4gQmlnSW50LmFzSW50TihTSUdORURfQklHSU5UX0JJVFMsIGtleSk7XG4gIGNvbnN0IHBhcnRzID0gb2JqZWN0LnRvT25lT3JNYW55KGtleSk7XG4gIHJldHVybiBuYXRpdmVBZHZpc29yeUxvY2tJZChwYXJ0cy5tYXAoKHBhcnQpID0+IG9iamVjdC50b1N0YWJsZUtleShwYXJ0KSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhY3F1aXJlKGNsaWVudDogUGdRdWVyeWFibGUsIGlkOiBiaWdpbnQsIHRyYW5zYWN0aW9uOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZuID0gdHJhbnNhY3Rpb24gPyBcInBnX2Fkdmlzb3J5X3hhY3RfbG9ja1wiIDogXCJwZ19hZHZpc29yeV9sb2NrXCI7XG4gIGF3YWl0IGNsaWVudC5xdWVyeShgU0VMRUNUICR7Zm59KCQxOjpiaWdpbnQpYCwgW2lkLnRvU3RyaW5nKCldKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5sb2NrKGNsaWVudDogUGdRdWVyeWFibGUsIGlkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5PFVubG9ja1Jvdz4oXG4gICAgXCJTRUxFQ1QgcGdfYWR2aXNvcnlfdW5sb2NrKCQxOjpiaWdpbnQpIEFTIHVubG9ja2VkXCIsXG4gICAgW2lkLnRvU3RyaW5nKCldLFxuICApO1xuICBpZiAocmVzdWx0LnJvd3NbMF0/LnVubG9ja2VkICE9PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb3N0Z3JlcyBhZHZpc29yeSBsb2NrICR7aWR9IHdhcyBub3QgaGVsZCBieSB0aGlzIGNvbm5lY3Rpb25gKTtcbiAgfVxufVxuXG4vKipcbiAqIEhvbGQgYSBzZXNzaW9uIGFkdmlzb3J5IGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiBgZm5gLlxuICpcbiAqIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgZGVkaWNhdGVkIGBQb29sQ2xpZW50YCB0aGF0IG93bnMgdGhlIGxvY2suIFVzZSBpdFxuICogZm9yIGFueSBvcGVyYXRpb24gdGhhdCBtdXN0IGJlIHByb3RlY3RlZCBieSB0aGUgbG9jay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhBZHZpc29yeUxvY2s8VD4oXG4gIHBvb2w6IFBnUG9vbExpa2UsXG4gIGtleTogQWR2aXNvcnlMb2NrS2V5LFxuICBmbjogKGNsaWVudDogUG9vbENsaWVudCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgaWQgPSBhZHZpc29yeUxvY2tJZChrZXkpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBwb29sLmNvbm5lY3QoKTtcbiAgbGV0IGFjcXVpcmVkID0gZmFsc2U7XG4gIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgbGV0IGZhaWx1cmU6IHVua25vd247XG4gIGxldCB2YWx1ZTogVCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGF3YWl0IGFjcXVpcmUoY2xpZW50LCBpZCwgZmFsc2UpO1xuICAgIGFjcXVpcmVkID0gdHJ1ZTtcbiAgICB2YWx1ZSA9IGF3YWl0IGZuKGNsaWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZmFpbGVkID0gdHJ1ZTtcbiAgICBmYWlsdXJlID0gZXJyb3I7XG4gIH1cblxuICBsZXQgdW5sb2NrRmFpbHVyZTogdW5rbm93bjtcbiAgaWYgKGFjcXVpcmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVubG9jayhjbGllbnQsIGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdW5sb2NrRmFpbHVyZSA9IGVycm9yO1xuICAgIH1cbiAgfVxuICBjbGllbnQucmVsZWFzZSh1bmxvY2tGYWlsdXJlIGluc3RhbmNlb2YgRXJyb3IgPyB1bmxvY2tGYWlsdXJlIDogdW5kZWZpbmVkKTtcblxuICBpZiAoZmFpbGVkKSB0aHJvdyBmYWlsdXJlO1xuICBpZiAodW5sb2NrRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB0aHJvdyB1bmxvY2tGYWlsdXJlO1xuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cblxuLyoqXG4gKiBSdW4gYGZuYCBpbiBhIHRyYW5zYWN0aW9uIHdoaWxlIGhvbGRpbmcgYSB0cmFuc2FjdGlvbiBhZHZpc29yeSBsb2NrLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlbGVhc2VkIGF0b21pY2FsbHkgYnkgYENPTU1JVGAgb3IgYFJPTExCQUNLYCwgbWFraW5nIHRoaXMgdGhlXG4gKiByaWdodCBwcmltaXRpdmUgZm9yIG9uZS10aW1lIHNjaGVtYSBpbnN0YWxsYXRpb24gYW5kIG1pZ3JhdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2s8VD4oXG4gIHBvb2w6IFBnUG9vbExpa2UsXG4gIGtleTogQWR2aXNvcnlMb2NrS2V5LFxuICBmbjogKGNsaWVudDogUG9vbENsaWVudCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgaWQgPSBhZHZpc29yeUxvY2tJZChrZXkpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBwb29sLmNvbm5lY3QoKTtcbiAgbGV0IHJlbGVhc2VFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQkVHSU5cIik7XG4gICAgYXdhaXQgYWNxdWlyZShjbGllbnQsIGlkLCB0cnVlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGZuKGNsaWVudCk7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge1xuICAgICAgcmVsZWFzZUVycm9yID1cbiAgICAgICAgcm9sbGJhY2tFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcm9sbGJhY2tFcnJvciA6IG5ldyBFcnJvcihTdHJpbmcocm9sbGJhY2tFcnJvcikpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGllbnQucmVsZWFzZShyZWxlYXNlRXJyb3IpO1xuICB9XG59XG4iXX0=
@@ -24,7 +24,7 @@
24
24
  * @module
25
25
  */
26
26
  import { hostname } from "node:os";
27
- import { async as sharedAsync, error, hash, json, object, string } from "@dbx-tools/shared-core";
27
+ import { asyncUtils, errorUtils, hash, json, object, stringUtils } from "@dbx-tools/shared-core";
28
28
  import { cleanupExpired, decodePointer, history, persistedNotify, provisionMessageBusSchema, readPointer, resolvePersistenceOptions, } from "./persistence.js";
29
29
  /** Channel parts used when a caller names no channel of its own. */
30
30
  const DEFAULT_CHANNEL = "dbx_tools_topic_bus";
@@ -78,7 +78,7 @@ function definedMetadata(values) {
78
78
  */
79
79
  function machineMetadata() {
80
80
  return definedMetadata({
81
- project: string.firstNonEmpty([
81
+ project: stringUtils.firstNonEmpty([
82
82
  process.env.DATABRICKS_APP_NAME,
83
83
  process.env.DATABRICKS_BUNDLE_NAME,
84
84
  process.env.PROJECT_NAME,
@@ -86,10 +86,10 @@ function machineMetadata() {
86
86
  ]) ?? undefined,
87
87
  hostname: hostname(),
88
88
  platform: process.platform,
89
- environment: string.trimToNull(process.env.NODE_ENV) ?? undefined,
90
- appName: string.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
91
- deploymentId: string.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
92
- databricksHost: string.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
89
+ environment: stringUtils.trimToNull(process.env.NODE_ENV) ?? undefined,
90
+ appName: stringUtils.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
91
+ deploymentId: stringUtils.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
92
+ databricksHost: stringUtils.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
93
93
  });
94
94
  }
95
95
  /**
@@ -112,9 +112,9 @@ async function senderMetadata() {
112
112
  try {
113
113
  const context = appkit.getExecutionContext();
114
114
  return definedMetadata({
115
- senderId: string.trimToNull(context.userId) ?? undefined,
116
- senderName: string.trimToNull(context.userName) ?? undefined,
117
- senderEmail: string.trimToNull(context.userEmail) ?? undefined,
115
+ senderId: stringUtils.trimToNull(context.userId) ?? undefined,
116
+ senderName: stringUtils.trimToNull(context.userName) ?? undefined,
117
+ senderEmail: stringUtils.trimToNull(context.userEmail) ?? undefined,
118
118
  });
119
119
  }
120
120
  catch {
@@ -162,7 +162,7 @@ export function channelName(value) {
162
162
  // token longer than the budget, turning one long name into the bare fallback and
163
163
  // making every long name look alike. The hash still separates them, but the
164
164
  // channel is unreadable in a log.
165
- const body = string
165
+ const body = stringUtils
166
166
  .toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
167
167
  .slice(0, MAX_CHANNEL_LENGTH - suffix.length - 1)
168
168
  .replace(/_+$/, "");
@@ -321,7 +321,7 @@ export class PostgresTopicBus {
321
321
  encoded = JSON.stringify(message);
322
322
  }
323
323
  catch (cause) {
324
- throw new TypeError(`Message must be JSON serializable: ${error.errorMessage(cause)}`);
324
+ throw new TypeError(`Message must be JSON serializable: ${errorUtils.errorMessage(cause)}`);
325
325
  }
326
326
  if (!decode(encoded)) {
327
327
  throw new TypeError("Message type, metadata, and body must be JSON serializable");
@@ -436,7 +436,7 @@ export class PostgresTopicBus {
436
436
  await client.query(`UNLISTEN ${quoteIdentifier(this.channelName)}`);
437
437
  }
438
438
  catch (cause) {
439
- releaseError = error.toError(cause);
439
+ releaseError = errorUtils.toError(cause);
440
440
  }
441
441
  client.release(releaseError);
442
442
  }
@@ -462,7 +462,7 @@ export class PostgresTopicBus {
462
462
  catch (cause) {
463
463
  client.removeListener("notification", this.handleNotification);
464
464
  client.removeListener("error", this.handleClientError);
465
- client.release(error.toError(cause));
465
+ client.release(errorUtils.toError(cause));
466
466
  throw cause;
467
467
  }
468
468
  }
@@ -543,7 +543,7 @@ export class PostgresTopicBus {
543
543
  while (!this.closed && this.listeners.size > 0) {
544
544
  if (delay > 0) {
545
545
  try {
546
- await sharedAsync.sleep(delay, this.reconnectAbort.signal);
546
+ await asyncUtils.sleep(delay, this.reconnectAbort.signal);
547
547
  }
548
548
  catch {
549
549
  return;
@@ -562,4 +562,4 @@ export class PostgresTopicBus {
562
562
  }
563
563
  }
564
564
  }
565
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJakcsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEVBQ2IsT0FBTyxFQUNQLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsV0FBVyxFQUNYLHlCQUF5QixHQU0xQixNQUFNLGtCQUFrQixDQUFDO0FBUTFCLG9FQUFvRTtBQUNwRSxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQztBQUM5Qzs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIscUZBQXFGO0FBQ3JGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLDBFQUEwRTtBQUMxRSxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQjs7OztHQUlHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7QUFrQnJDOzs7O0dBSUc7QUFDSCxJQUFJLFlBQTJELENBQUM7QUFnSGhFOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFxRDtJQUM1RSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUF3QyxFQUFFO1FBQzVFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxL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QUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsT0FBTztZQUNULENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTztnQkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsS0FBSyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUM3RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9waWMgZmFuLW91dCBvdmVyIFBvc3RncmVTUUwgYExJU1RFTmAvYE5PVElGWWAsIGZvciB0ZWxsaW5nIGV2ZXJ5IHJ1bm5pbmdcbiAqIGluc3RhbmNlIG9mIGFuIGFwcCB0aGF0IHNvbWV0aGluZyBoYXBwZW5lZC5cbiAqXG4gKiBUaGUgc2libGluZyBgYWR2aXNvcnktbG9ja2AgbW9kdWxlIGlzIGFib3V0IG1ha2luZyBzdXJlIG9ubHkgT05FIGNvbm5lY3Rpb25cbiAqIGRvZXMgYSB0aGluZzsgdGhpcyBvbmUgaXMgdGhlIG9wcG9zaXRlIC0gRVZFUlkgbGlzdGVuaW5nIHNlc3Npb24gZ2V0cyBldmVyeVxuICogbm90aWZpY2F0aW9uLiBUaGF0IG1ha2VzIGl0IHRoZSByaWdodCBwcmltaXRpdmUgZm9yIGxpdmUgVUkgdXBkYXRlc1xuICogKGFuIFNTRSBzdHJlYW0gcGVyIGJyb3dzZXIgdGFiLCBhIGNhY2hlIGludmFsaWRhdGlvbiwgYSBwcmVzZW5jZSBwaW5nKSBhbmQgdGhlXG4gKiB3cm9uZyBvbmUgZm9yIHdvcmsgZGlzdHJpYnV0aW9uOiB0aGVyZSBhcmUgbm8gY29tcGV0aW5nIGNvbnN1bWVycywgbm8gYWNrcywgYW5kXG4gKiBubyByZXBsYXkuXG4gKlxuICogRGVsaXZlcnkgaXMgYmVzdC1lZmZvcnQgYW5kIGxpdmUuIGBOT1RJRllgIHJlYWNoZXMgc2Vzc2lvbnMgdGhhdCBhcmUgbGlzdGVuaW5nXG4gKiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMsIHNvIGEgbGlzdGVuZXIgdGhhdCBjb25uZWN0cyBhIHNlY29uZCBsYXRlciBuZXZlciBzZWVzXG4gKiBpdCwgYW5kIGEgbGlzdGVuZXIgd2hvc2UgY29ubmVjdGlvbiBkcm9wcyBtaXNzZXMgZXZlcnl0aGluZyB1bnRpbCB0aGUgYnVzXG4gKiByZWNvbm5lY3RzLiBVc2UgYSB0YWJsZSBvciBhIHF1ZXVlIHdoZW4gYSBzdWJzY3JpYmVyIG5lZWRzIGR1cmFiaWxpdHkuXG4gKlxuICogT05FIENIQU5ORUwsIE1BTlkgVE9QSUNTLiBFdmVyeSBidXMgaW5zdGFuY2UgbGlzdGVucyBvbiBhIHNpbmdsZSBQb3N0Z3Jlc1xuICogY2hhbm5lbCAoYGNoYW5uZWxgLCBkZWZhdWx0IGBkYnhfdG9vbHNfdG9waWNfYnVzYCkgYW5kIGZpbHRlcnMgYnkgdGhlXG4gKiBlbnZlbG9wZSdzIGB0b3BpY2AgaW4tcHJvY2Vzcywgc28gYWRkaW5nIGEgdG9waWMgY29zdHMgbm8gY29ubmVjdGlvbiBhbmQgbm9cbiAqIGBMSVNURU5gLiBUaGUgdHJhZGVvZmYgaXMgdGhhdCBldmVyeSBsaXN0ZW5pbmcgc2Vzc2lvbiBkZWNvZGVzIGV2ZXJ5IG1lc3NhZ2Ugb25cbiAqIHRoZSBjaGFubmVsOyBnaXZlIGEgZ2VudWluZWx5IGhpZ2gtdm9sdW1lLCB1bnJlbGF0ZWQgc3RyZWFtIGl0cyBvd24gYGNoYW5uZWxgXG4gKiByYXRoZXIgdGhhbiBhIHRvcGljLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBob3N0bmFtZSB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBhc3luYyBhcyBzaGFyZWRBc3luYywgZXJyb3IsIGhhc2gsIGpzb24sIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTm90aWZpY2F0aW9uLCBQb29sQ2xpZW50IH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLnRzXCI7XG5pbXBvcnQge1xuICBjbGVhbnVwRXhwaXJlZCxcbiAgZGVjb2RlUG9pbnRlcixcbiAgaGlzdG9yeSxcbiAgcGVyc2lzdGVkTm90aWZ5LFxuICBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hLFxuICByZWFkUG9pbnRlcixcbiAgcmVzb2x2ZVBlcnNpc3RlbmNlT3B0aW9ucyxcbiAgdHlwZSBEdXJhdGlvbklucHV0LFxuICB0eXBlIFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgVG9waWNIaXN0b3J5UGFnZSxcbiAgdHlwZSBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsXG59IGZyb20gXCIuL3BlcnNpc3RlbmNlLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBgTkFNRURBVEFMRU4gLSAxYC4gUG9zdGdyZXMgVFJVTkNBVEVTIGEgbG9uZ2VyIGNoYW5uZWwgbmFtZSByYXRoZXIgdGhhblxuICogcmVqZWN0aW5nIGl0LCB3aGljaCB3b3VsZCBzcGxpdCBwdWJsaXNoZXJzIGFuZCBsaXN0ZW5lcnMgb250byBkaWZmZXJlbnRcbiAqIGNoYW5uZWxzIHdoaWxlIGV2ZXJ5IGNhbGwgbG9va2VkIGxpa2UgaXQgc3VjY2VlZGVkLlxuICovXG5jb25zdCBNQVhfQ0hBTk5FTF9MRU5HVEggPSA2Mztcbi8qKiBCYXNlLTMyIGNoYXJzIG9mIHRoZSBjaGFubmVsJ3MgaWRlbnRpdHkgc3VmZml4LiBNYXggNyAtIHRoZSBkaWdlc3QgaXMgMzIgYml0cy4gKi9cbmNvbnN0IENIQU5ORUxfSEFTSF9MRU5HVEggPSA2O1xuLyoqIEJvZHkgdXNlZCB3aGVuIHRoZSBwYXJ0cyB0b2tlbml6ZSB0byBub3RoaW5nLCBvciBsZWFkIHdpdGggYSBkaWdpdC4gKi9cbmNvbnN0IENIQU5ORUxfRkFMTEJBQ0sgPSBcImJ1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwZXJzaXN0PzogYm9vbGVhbiB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgc3RyaW5nLmZpcnN0Tm9uRW1wdHkoW1xuICAgICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0JVTkRMRV9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX25hbWUsXG4gICAgICBdKSA/PyB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgZW52aXJvbm1lbnQ6IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52Lk5PREVfRU5WKSA/PyB1bmRlZmluZWQsXG4gICAgYXBwTmFtZTogc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfREVQTE9ZTUVOVF9JRCkgPz8gdW5kZWZpbmVkLFxuICAgIGRhdGFicmlja3NIb3N0OiBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QpID8/IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgb2YgdGhlIHNpZ25lZC1pbiB1c2VyIG9uIHdob3NlIGJlaGFsZiB0aGlzIGJyb2FkY2FzdCBoYXBwZW5zLCB3aGVuIHRoZVxuICogcHJvY2VzcyBjYW4gdGVsbC5cbiAqXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0YCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyB0aGUgaW1wb3J0IGlzIGxhenkgYW5kIGEgbWlzc2luZ1xuICogbW9kdWxlIGlzIG5vdCBhbiBlcnJvciAtIHRoaXMgaXMgYSBwbGFpbiBQb3N0Z3JlcyBwYWNrYWdlIHRoYXQgYWRkcyBzZW5kZXJcbiAqIGlkZW50aXR5IHdoZW4gaXQgaGFwcGVucyB0byBydW4gaW5zaWRlIGFuIEFwcEtpdCBhcHAuIE91dHNpZGUgYW4gYWN0aXZlXG4gKiBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCBBcHBLaXQgdGhyb3dzLCB3aGljaCBtZWFucyBcIm5vIHVzZXIgaGVyZVwiLCBzbyB0aGVcbiAqIHJlc3VsdCBpcyBlbXB0eSBtZXRhZGF0YSByYXRoZXIgdGhhbiBhIGZhaWxlZCBicm9hZGNhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRlck1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICBhcHBLaXRNb2R1bGUgPz89IGltcG9ydChcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKVxuICAgIC50aGVuKChtb2R1bGUpID0+IG1vZHVsZSBhcyBBcHBLaXRNb2R1bGUpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcGtpdCA9IGF3YWl0IGFwcEtpdE1vZHVsZTtcbiAgaWYgKCFhcHBraXQpIHJldHVybiB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXBwa2l0LmdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICAgIHNlbmRlcklkOiBzdHJpbmcudHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogc3RyaW5nLnRyaW1Ub051bGwoY29udGV4dC51c2VyTmFtZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyRW1haWw6IHN0cmluZy50cmltVG9OdWxsKGNvbnRleHQudXNlckVtYWlsKSA/PyB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSBhIGxlZ2FsIFBvc3RncmVzIGNoYW5uZWwgbmFtZSBmcm9tIHdoYXRldmVyIGEgY2FsbGVyIHVzZWQgdG8gaWRlbnRpZnlcbiAqIHRoZSBjaGFubmVsLlxuICpcbiAqIENhbGxlcnMgdGhpbmsgaW4gdGVybXMgb2Ygd2hhdCB0aGUgY2hhbm5lbCBJUyAtIGFuIGFwcCBuYW1lLCBhIHRlbmFudCBpZCwgYVxuICogYFtlbnYsIGZlYXR1cmVdYCBwYWlyLCBhIGNvbmZpZyBvYmplY3QgLSBhbmQgbm9uZSBvZiB0aG9zZSBhcmUgaWRlbnRpZmllcnMuXG4gKiBSZWplY3RpbmcgdGhlbSBwdXNoZWQgdGhlIHNhbml0aXppbmcgb250byBldmVyeSBjYWxsIHNpdGUsIHdoaWNoIGlzIGhvdyB0d29cbiAqIHNlcnZpY2VzIGVuZCB1cCBkaXNhZ3JlZWluZyBhYm91dCB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIGBteS1hcHBgLCBgbXlfYXBwYCxcbiAqIG9yIGBteUFwcGAgYW5kIHNpbGVudGx5IG5ldmVyIGhlYXIgZWFjaCBvdGhlci5cbiAqXG4gKiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBhbmQgam9pbmVkIGludG8gYW4gaWRlbnRpZmllciwgdGhlbiBhIHNob3J0IGhhc2ggb2YgdGhlXG4gKiBPUklHSU5BTCBwYXJ0cyBpcyBhcHBlbmRlZC4gVGhlIGhhc2ggaXMgd2hhdCBtYWtlcyB0aGUgbWFwcGluZyB0cnVzdHdvcnRoeTpcbiAqIHRva2VuaXppbmcgYWxvbmUgaXMgbG9zc3ksIHNvIGBteS1hcHBgIGFuZCBgbXlfYXBwYCBhbmQgYG15QXBwYCB3b3VsZCBjb2xsYXBzZVxuICogb250byBvbmUgY2hhbm5lbCwgYW5kIGEgbmFtZSBsb25nIGVub3VnaCB0byBoaXQgYE5BTUVEQVRBTEVOYCB3b3VsZCBjb2xsaWRlXG4gKiB3aXRoIGFueXRoaW5nIHNoYXJpbmcgaXRzIGxlYWRpbmcgdG9rZW5zLiBXaXRoIHRoZSBzdWZmaXgsIHRoZSByZWFkYWJsZSBwYXJ0XG4gKiBzdGF5cyByZWFkYWJsZSBhbmQgZGlzdGluY3QgaW5wdXRzIHN0YXkgZGlzdGluY3QuXG4gKlxuICogRGV0ZXJtaW5pc3RpYyBhY3Jvc3MgcHJvY2Vzc2VzIGFuZCBydW5zLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgLSB0d29cbiAqIHNlcnZpY2VzIGdpdmVuIHRoZSBzYW1lIHBhcnRzIG11c3QgbGFuZCBvbiB0aGUgc2FtZSBjaGFubmVsIHdpdGhvdXRcbiAqIGNvb3JkaW5hdGluZy4gSGFzaCBpbnB1dHMgYXJlIHN0cnVjdHVyZS1hd2FyZSwgc28gYFtcImFcIiwgXCJiXCJdYCBhbmQgYFtcImFfYlwiXWBcbiAqIGRpZmZlciwgYW5kIG9iamVjdCBrZXkgb3JkZXIgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFubmVsTmFtZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gb2JqZWN0LnRvT25lT3JNYW55KHZhbHVlKTtcbiAgLy8gSGFzaCB0aGUgQ0FOT05JQ0FMIGZvcm0sIHRoZSBzYW1lIHJ1bGUgYGFkdmlzb3J5TG9ja0lkYCB1c2VzLCBzbyBzdHJ1Y3R1cmUgYW5kXG4gIC8vIHR5cGVzIGRlY2lkZSBpZGVudGl0eTogYFtcImFcIixcImJcIl1gIGRpZmZlcnMgZnJvbSBgW1wiYWJcIl1gLCBgMWAgZnJvbSBgXCIxXCJgLCBhbmRcbiAgLy8gb2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdCBtYXR0ZXIuIEhhc2hpbmcgdGhlIHJhdyBwYXJ0cyB3b3VsZCBpbnN0ZWFkIGxlYW4gb25cbiAgLy8gdGhlIGhhc2ggbW9kdWxlJ3MgY2Fub25pY2FsaXplciwgd2hpY2ggZm9sZHMgZXZlcnkgYERhdGVgIG9udG8gb25lIHRva2VuLlxuICBjb25zdCBzdWZmaXggPSBoYXNoLmZudkhhc2hXaXRoT3B0aW9ucyhcbiAgICB7IGxlbmd0aDogQ0hBTk5FTF9IQVNIX0xFTkdUSCB9LFxuICAgIHBhcnRzLm1hcCgocGFydCkgPT4gb2JqZWN0LnRvU3RhYmxlS2V5KHBhcnQpKS5qb2luKFwiXFx1MDAwMFwiKSxcbiAgKTtcbiAgLy8gT25seSBwYXJ0cyB0aGF0IHN0cmluZ2lmeSB0byBzb21ldGhpbmcgYSByZWFkZXIgcmVjb2duaXplcyBjb250cmlidXRlIHRvIHRoZVxuICAvLyByZWFkYWJsZSBoYWxmLiBBbiBvYmplY3Qgd291bGQgdG9rZW5pemUgZnJvbSBgU3RyaW5nKHZhbHVlKWAgYXNcbiAgLy8gYG9iamVjdF9vYmplY3RgLCB3aGljaCBpcyBub2lzZSAtIGl0IHN0aWxsIHNoYXBlcyB0aGUgaGFzaCwgc28gaWRlbnRpdHkgaXNcbiAgLy8gdW5hZmZlY3RlZC5cbiAgY29uc3QgbGFiZWxsZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHBhcnQ7XG4gICAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcImJpZ2ludFwiO1xuICB9KTtcbiAgLy8gVHJ1bmNhdGUgcmF0aGVyIHRoYW4gY2FwIHRocm91Z2ggdGhlIHRva2VuaXplcjogYHRyaW1gIHdvdWxkIERST1AgYSBzaW5nbGVcbiAgLy8gdG9rZW4gbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldCwgdHVybmluZyBvbmUgbG9uZyBuYW1lIGludG8gdGhlIGJhcmUgZmFsbGJhY2sgYW5kXG4gIC8vIG1ha2luZyBldmVyeSBsb25nIG5hbWUgbG9vayBhbGlrZS4gVGhlIGhhc2ggc3RpbGwgc2VwYXJhdGVzIHRoZW0sIGJ1dCB0aGVcbiAgLy8gY2hhbm5lbCBpcyB1bnJlYWRhYmxlIGluIGEgbG9nLlxuICBjb25zdCBib2R5ID0gc3RyaW5nXG4gICAgLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgZGVsaW1pdGVyOiBcIl9cIiB9LCAuLi5sYWJlbGxlZClcbiAgICAuc2xpY2UoMCwgTUFYX0NIQU5ORUxfTEVOR1RIIC0gc3VmZml4Lmxlbmd0aCAtIDEpXG4gICAgLnJlcGxhY2UoL18rJC8sIFwiXCIpO1xuICAvLyBBbiBpZGVudGlmaWVyIGNhbm5vdCBzdGFydCB3aXRoIGEgZGlnaXQgYW5kIHRoZSBoYXNoIGFscGhhYmV0IGlzXG4gIC8vIGRpZ2l0LWxlYWRpbmcsIHNvIGEgbnVtZXJpYyBvciBlbXB0eSBib2R5IG5lZWRzIGEgbGV0dGVyIGluIGZyb250LlxuICBjb25zdCBwcmVmaXggPSAvXltBLVphLXpfXS8udGVzdChib2R5KSA/IGJvZHkgOiBgJHtDSEFOTkVMX0ZBTExCQUNLfV8ke2JvZHl9YDtcbiAgcmV0dXJuIGAke3ByZWZpeH1fJHtzdWZmaXh9YC5yZXBsYWNlKC9fKy9nLCBcIl9cIik7XG59XG5cbi8qKiBRdW90ZSBhIHZhbGlkYXRlZCBjaGFubmVsIGZvciBgTElTVEVOYC9gVU5MSVNURU5gLCB3aGljaCB0YWtlIG5vIHBhcmFtZXRlcnMuICovXG5mdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgXCIke3ZhbHVlLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImA7XG59XG5cbi8qKlxuICogUGFyc2UgYSBgTk9USUZZYCBwYXlsb2FkIGludG8gYW4gZW52ZWxvcGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHRoYXQgaXMgbm90IG9uZS5cbiAqXG4gKiBUaGUgY2hhbm5lbCBpcyBzaGFyZWQgYW5kIGFueSBQb3N0Z3JlcyBzZXNzaW9uIGNhbiBgcGdfbm90aWZ5YCBvbiBpdCwgc28gYW5cbiAqIHVucmVjb2duaXplZCBwYXlsb2FkIGlzIGV4cGVjdGVkIGlucHV0LCBub3QgYW4gZXhjZXB0aW9uLiBQdWJsaXNoZXJzIHJ1biB0aGlzXG4gKiBvdmVyIHRoZWlyIG93biBlbmNvZGVkIG1lc3NhZ2UgdG9vLCB3aGljaCBpcyBob3cgYSBib2R5IHRoYXQgc3RyaW5naWZpZXMgYnV0XG4gKiBkb2VzIG5vdCByb3VuZC10cmlwIGlzIGNhdWdodCBiZWZvcmUgaXQgc2hpcHMuXG4gKi9cbmZ1bmN0aW9uIGRlY29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVG9waWNNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVjb3JkID0ganNvbi5wYXJzZVJlY29yZCh2YWx1ZSk7XG4gIGlmIChcbiAgICAhcmVjb3JkIHx8XG4gICAgdHlwZW9mIHJlY29yZC5pZCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudG9waWMgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnR5cGUgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnB1Ymxpc2hlZEF0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgIXJlY29yZC5tZXRhZGF0YSB8fFxuICAgIHR5cGVvZiByZWNvcmQubWV0YWRhdGEgIT09IFwib2JqZWN0XCIgfHxcbiAgICBBcnJheS5pc0FycmF5KHJlY29yZC5tZXRhZGF0YSkgfHxcbiAgICAhKFwiYm9keVwiIGluIHJlY29yZCkgfHxcbiAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQuYm9keSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiByZWNvcmQuaWQsXG4gICAgdG9waWM6IHJlY29yZC50b3BpYyxcbiAgICB0eXBlOiByZWNvcmQudHlwZSxcbiAgICBtZXRhZGF0YTogcmVjb3JkLm1ldGFkYXRhIGFzIFRvcGljTWV0YWRhdGEsXG4gICAgYm9keTogcmVjb3JkLmJvZHkgYXMgU2VyaWFsaXphYmxlVmFsdWUsXG4gICAgcHVibGlzaGVkQXQ6IHJlY29yZC5wdWJsaXNoZWRBdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBCcm9hZGNhc3RzIHN0cnVjdHVyZWQgbWVzc2FnZXMgYnkgdG9waWMgYW5kIGRlbGl2ZXJzIHRoZW0gdG8gZXZlcnkgcHJvY2Vzc1xuICogbGlzdGVuaW5nIG9uIHRoZSBzYW1lIGNoYW5uZWwuXG4gKlxuICogQ09OTkVDVElPTiBTSEFQRS4gUHVibGlzaGluZyBib3Jyb3dzIGEgcG9vbGVkIGNvbm5lY3Rpb24gcGVyIGNhbGwsIGxpa2UgYW55XG4gKiBvdGhlciBxdWVyeS4gTGlzdGVuaW5nIGNhbm5vdDogYExJU1RFTmAgaXMgc2Vzc2lvbiBzdGF0ZSwgc28gdGhlIGJ1cyBob2xkcyBPTkVcbiAqIGRlZGljYXRlZCBjbGllbnQgb3V0IG9mIHRoZSBwb29sIGZvciBhcyBsb25nIGFzIGl0IGhhcyBzdWJzY3JpYmVycywgbm8gbWF0dGVyXG4gKiBob3cgbWFueSB0b3BpY3Mgb3IgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLiBTaXplIHRoZSBwb29sIHdpdGggdGhhdCBvbmVcbiAqIGxvbmctbGl2ZWQgY2hlY2tvdXQgaW4gbWluZC5cbiAqXG4gKiBMSUZFQ1lDTEUuIENvbnN0cnVjdGlvbiBpcyBpbmVydCAtIG5vdGhpbmcgY29ubmVjdHMgdW50aWwgdGhlIGZpcnN0XG4gKiB7QGxpbmsgbGlzdGVufSAob3IgYW4gZXhwbGljaXQge0BsaW5rIHN0YXJ0fSkuIHtAbGluayBjbG9zZX0gaXMgcmVxdWlyZWQgdG8gZ2l2ZVxuICogdGhlIGNvbm5lY3Rpb24gYmFjazsgYSBjbG9zZWQgYnVzIHN0YXlzIGNsb3NlZCBhbmQgdGhyb3dzIG9uIGZ1cnRoZXIgdXNlIHJhdGhlclxuICogdGhhbiBzaWxlbnRseSByZWNvbm5lY3RpbmcuIFJlZ2lzdGVyIGl0IHdpdGggdGhlIGhvc3QncyBzaHV0ZG93biBob29rLlxuICpcbiAqIEZBSUxVUkUgSEFORExJTkcuIEEgbG9zdCBub3RpZmljYXRpb24gY29ubmVjdGlvbiByZWNvbm5lY3RzIG9uIGl0cyBvd24gd2l0aFxuICogYm91bmRlZCBiYWNrb2ZmIHdoaWxlIHN1YnNjcmliZXJzIHJlbWFpbiwgcmVwb3J0aW5nIGVhY2ggZmFpbGVkIGF0dGVtcHQgdGhyb3VnaFxuICogYG9uRXJyb3JgLiBNZXNzYWdlcyBwdWJsaXNoZWQgZHVyaW5nIHRoZSBnYXAgYXJlIGxvc3QgLSBgTk9USUZZYCBoYXMgbm8gcmVwbGF5LlxuICogQSB0aHJvd2luZyBvciByZWplY3RpbmcgbGlzdGVuZXIgbmV2ZXIgYWZmZWN0cyB0aGUgcHVibGlzaGVyIG9yIHRoZSBvdGhlclxuICogbGlzdGVuZXJzOyBpdHMgZmFpbHVyZSBnb2VzIHRvIGBvbkVycm9yYC5cbiAqXG4gKiBOb3Qgc2FmZSB0byBzaGFyZSBvbmUgaW5zdGFuY2UgYWNyb3NzIHVucmVsYXRlZCBjaGFubmVscyAtIGNvbnN0cnVjdCBvbmUgYnVzXG4gKiBwZXIgY2hhbm5lbC4gVGhlIGNoYW5uZWwgaXRzZWxmIGlzIERFUklWRUQgZnJvbSB0aGUgYGNoYW5uZWxgIG9wdGlvbiByYXRoZXJcbiAqIHRoYW4gdGFrZW4gbGl0ZXJhbGx5OyBzZWUge0BsaW5rIFBvc3RncmVzVG9waWNCdXNPcHRpb25zLmNoYW5uZWx9IGFuZFxuICoge0BsaW5rIFBvc3RncmVzVG9waWNCdXMuY2hhbm5lbE5hbWV9LlxuICovXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNUb3BpY0J1cyB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgUG9zdGdyZXMgY2hhbm5lbCB0aGlzIGJ1cyBsaXN0ZW5zIGFuZCBwdWJsaXNoZXMgb24sIGRlcml2ZWQgZnJvbVxuICAgKiB0aGUgYGNoYW5uZWxgIG9wdGlvbi4gUmVhZCBpdCB0byBjb25maXJtIHR3byBwcm9jZXNzZXMgYWdyZWUsIG9yIHRvIGxvZyB3aGF0IGFcbiAgICogc2V0IG9mIHBhcnRzIGFjdHVhbGx5IHJlc29sdmVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YTogVG9waWNNZXRhZGF0YSB8IFRvcGljTWV0YWRhdGFQcm92aWRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkVycm9yOiAoY2F1c2U6IHVua25vd24pID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxUb3BpY0xpc3RlbmVyPj4oKTtcbiAgcHJpdmF0ZSBjbGllbnQ6IFBvb2xDbGllbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhcnRpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVjb25uZWN0aW5nOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29ubmVjdEFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcnNpc3RlbmNlPzogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucztcbiAgcHJpdmF0ZSBwcm92aXNpb25pbmc/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9vbDogUGdQb29sTGlrZSAmIFBnUXVlcnlhYmxlLFxuICAgIG9wdGlvbnM6IFBvc3RncmVzVG9waWNCdXNPcHRpb25zID0ge30sXG4gICkge1xuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZShcbiAgICAgIG9wdGlvbnMuY2hhbm5lbCA9PT0gdW5kZWZpbmVkID8gREVGQVVMVF9DSEFOTkVMIDogb3B0aW9ucy5jaGFubmVsLFxuICAgICk7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgdGhpcy5vbkVycm9yID0gb3B0aW9ucy5vbkVycm9yID8/ICgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHRoaXMucGVyc2lzdGVuY2UgPSBvcHRpb25zLnBlcnNpc3RcbiAgICAgID8gcmVzb2x2ZVBlcnNpc3RlbmNlT3B0aW9ucyhvcHRpb25zLnBlcnNpc3QgPT09IHRydWUgPyB0cnVlIDogb3B0aW9ucy5wZXJzaXN0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZGVkaWNhdGVkIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIGFuZCBgTElTVEVOYC5cbiAgICpcbiAgICogSWRlbXBvdGVudCwgYW5kIHNhZmUgdG8gY2FsbCBjb25jdXJyZW50bHkgLSBvdmVybGFwcGluZyBjYWxscyBhd2FpdCB0aGUgc2FtZVxuICAgKiBpbi1mbGlnaHQgY29ubmVjdC4ge0BsaW5rIGxpc3Rlbn0gY2FsbHMgdGhpcywgc28gaXQgaXMgb25seSBuZWVkZWQgdG8gc3VyZmFjZVxuICAgKiBhIGNvbm5lY3Rpb24gcHJvYmxlbSBhdCBzdGFydHVwIHJhdGhlciB0aGFuIG9uIGZpcnN0IHN1YnNjcmliZS4gVGhyb3dzIGlmIHRoZVxuICAgKiBidXMgaXMgY2xvc2VkLCBvciBpZiB0aGUgcG9vbCBjYW5ub3QgaGFuZCBvdXQgYSBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgIHRoaXMuc3RhcnRpbmcgPz89IHRoaXMuY29ubmVjdCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5zdGFydGluZyA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBtZXNzYWdlIHRvIGB0b3BpY2AsIHJldHVybmluZyB0aGUgZW52ZWxvcGUgdGhhdCB3YXMgc2VudC5cbiAgICpcbiAgICogUmVzb2x2ZXMgb25jZSBQb3N0Z3JlcyBoYXMgYWNjZXB0ZWQgdGhlIGBOT1RJRllgLCB3aGljaCBzYXlzIG5vdGhpbmcgYWJvdXRcbiAgICogYW55b25lIHJlY2VpdmluZyBpdDogc2Vzc2lvbnMgbm90IGxpc3RlbmluZyBhdCB0aGF0IG1vbWVudCBtaXNzIGl0LiBQdWJsaXNoaW5nXG4gICAqIG5lZWRzIG5vIHtAbGluayBzdGFydH0gYW5kIG5vIHN1YnNjcmliZXJzLlxuICAgKlxuICAgKiBWYWxpZGF0aW9uIGlzIGRlbGliZXJhdGVseSBmcm9udC1sb2FkZWQsIHNpbmNlIGEgbWVzc2FnZSB0aGF0IGZhaWxzIG9uIHRoZVxuICAgKiB3aXJlIGlzIGZhciBoYXJkZXIgdG8gZGlhZ25vc2UgdGhhbiBvbmUgcmVqZWN0ZWQgYXQgdGhlIGNhbGw6IGBUeXBlRXJyb3JgIGZvciBhXG4gICAqIGJsYW5rIHRvcGljIG9yIHR5cGUsIG9yIGEgYm9keS9tZXRhZGF0YSB0aGF0IHdvdWxkIG5vdCByb3VuZC10cmlwIHRocm91Z2ggSlNPTlxuICAgKiB1bmNoYW5nZWQgKGBvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZWApOyBgUmFuZ2VFcnJvcmAgd2hlbiB0aGUgZW5jb2RlZFxuICAgKiBlbnZlbG9wZSBleGNlZWRzIHRoZSBgTk9USUZZYCBwYXlsb2FkIGxpbWl0LCB3aGljaCB0aGUgYXV0b21hdGljIG1ldGFkYXRhXG4gICAqIGNvdW50cyBhZ2FpbnN0IC0gc2VuZCBhIHJlZmVyZW5jZSBhbmQgbGV0IHRoZSByZWNlaXZlciBmZXRjaCB0aGUgcGF5bG9hZC5cbiAgICogVGhyb3dzIGlmIHRoZSBidXMgaXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgaW5wdXQ6IFRvcGljUHVibGlzaElucHV0PFRCb2R5PixcbiAgKTogUHJvbWlzZTxUb3BpY01lc3NhZ2U8VEJvZHk+PiB7XG4gICAgaWYgKCF0b3BpYy50cmltKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUb3BpYyBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICBpZiAoIWlucHV0LnR5cGUudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGlmIChcbiAgICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShpbnB1dC5tZXRhZGF0YSA/PyB7fSkgfHxcbiAgICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShpbnB1dC5ib2R5KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2UgbWV0YWRhdGEgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZSB3aXRob3V0IGNvZXJjaW9uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgY29uc3QgYXV0b21hdGljID0gYXdhaXQgdGhpcy5yZXNvbHZlTWV0YWRhdGEoKTtcbiAgICBjb25zdCBtZXNzYWdlOiBUb3BpY01lc3NhZ2U8VEJvZHk+ID0ge1xuICAgICAgaWQ6IGhhc2guaWQoKSxcbiAgICAgIHRvcGljLFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1ldGFkYXRhOiB7IC4uLmF1dG9tYXRpYywgLi4uaW5wdXQubWV0YWRhdGEgfSxcbiAgICAgIGJvZHk6IGlucHV0LmJvZHksXG4gICAgICBwdWJsaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgbGV0IGVuY29kZWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNZXNzYWdlIG11c3QgYmUgSlNPTiBzZXJpYWxpemFibGU6ICR7ZXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKX1gKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvZGUoZW5jb2RlZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUsIG1ldGFkYXRhLCBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlXCIpO1xuICAgIH1cbiAgICAvLyBPbmx5IHRoZSBlbnZlbG9wZSBwYXlsb2FkIGlzIGJvdW5kZWQgYnkgdGhlIGBOT1RJRllgIGxpbWl0LiBBIHBvaW50ZXJcbiAgICAvLyBub3RpZmljYXRpb24gaXMgYSBmaXhlZCBoYW5kZnVsIG9mIGJ5dGVzLCBzbyBwZXJzaXN0ZW5jZSB3aXRoXG4gICAgLy8gYHBheWxvYWQ6IFwicG9pbnRlclwiYCBsaWZ0cyB0aGUgY2FwIGVudGlyZWx5LlxuICAgIGlmIChcbiAgICAgIEJ1ZmZlci5ieXRlTGVuZ3RoKGVuY29kZWQsIFwidXRmOFwiKSA+IE1BWF9OT1RJRllfQllURVMgJiZcbiAgICAgIHRoaXMucGVyc2lzdGVuY2U/LnBheWxvYWQgIT09IFwicG9pbnRlclwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zdGdyZXMgbm90aWZpY2F0aW9uIGV4Y2VlZHMgJHtNQVhfTk9USUZZX0JZVEVTfSBieXRlc2ApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMucG9vbC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbdGhpcy5jaGFubmVsTmFtZSwgZW5jb2RlZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZS5wcm92aXNpb24pIHtcbiAgICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm92aXNpb25pbmc7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQkVHSU5cIik7XG4gICAgICAgIGF3YWl0IHBlcnNpc3RlZE5vdGlmeShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgdGhpcy5jaGFubmVsTmFtZSxcbiAgICAgICAgICB0b3BpYyxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGVuY29kZWQsXG4gICAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgICAgICBpbnB1dC5zY29wZSA/PyB0aGlzLnBlcnNpc3RlbmNlLnNjb3BlLFxuICAgICAgICAgIGlucHV0LnR0bCA/PyB0aGlzLnBlcnNpc3RlbmNlLnR0bCxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiUk9MTEJBQ0tcIikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhyb3cgY2F1c2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGllbnQucmVsZWFzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGFzeW5jIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFmdGVyPzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUgfSA9IHt9LFxuICApOiBQcm9taXNlPFRvcGljSGlzdG9yeVBhZ2U8VEJvZHk+PiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICB0aGlzLnByb3Zpc2lvbmluZyA/Pz0gcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYSh0aGlzLnBvb2wsIHRoaXMucGVyc2lzdGVuY2UpO1xuICAgICAgYXdhaXQgdGhpcy5wcm92aXNpb25pbmc7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5PFRCb2R5Pih0aGlzLnBvb2wsIHRoaXMuY2hhbm5lbE5hbWUsIHRvcGljLCB0aGlzLnBlcnNpc3RlbmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBFeHBpcmVkKFxuICAgIG9wdGlvbnM6IHsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7IGxpbWl0PzogbnVtYmVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2UpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBwZXJzaXN0ZW5jZSBpcyBkaXNhYmxlZFwiKTtcbiAgICByZXR1cm4gY2xlYW51cEV4cGlyZWQoXG4gICAgICB0aGlzLnBvb2wsXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlLFxuICAgICAgb3B0aW9ucy5zY29wZSA/PyB0aGlzLnBlcnNpc3RlbmNlLnNjb3BlLFxuICAgICAgb3B0aW9ucy5saW1pdCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzLlxuICAgKlxuICAgKiBDb25uZWN0cyBvbiBmaXJzdCB1c2UuIFNldmVyYWwgbGlzdGVuZXJzIG1heSBzaGFyZSBhIHRvcGljOyBlYWNoIGlzIGNhbGxlZFxuICAgKiBvbmNlIHBlciBtZXNzYWdlLiBPbmx5IG1lc3NhZ2VzIHB1Ymxpc2hlZCBBRlRFUiB0aGlzIHJlc29sdmVzIGFycml2ZSwgc29cbiAgICogc3Vic2NyaWJlIGJlZm9yZSB0cmlnZ2VyaW5nIHdoYXRldmVyIHlvdSBleHBlY3QgdG8gb2JzZXJ2ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlbW92ZXMganVzdCB0aGlzIGxpc3RlbmVyIGFuZCBpcyBzYWZlIHRvIGNhbGwgdHdpY2UuXG4gICAqIFRoZSBjb25uZWN0aW9uIHN0YXlzIG9wZW4gb25jZSB0aGUgbGFzdCBsaXN0ZW5lciBsZWF2ZXMgLSB7QGxpbmsgY2xvc2V9XG4gICAqIHJlbGVhc2VzIGl0IC0gc28gYSBidXMgdGhhdCBzdWJzY3JpYmVzIGFuZCB1bnN1YnNjcmliZXMgcGVyIHJlcXVlc3QgZG9lcyBub3RcbiAgICogY2h1cm4gY29ubmVjdGlvbnMuXG4gICAqL1xuICBhc3luYyBsaXN0ZW48VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogVG9waWNMaXN0ZW5lcjxUQm9keT4sXG4gICk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmdldCh0b3BpYykgPz8gbmV3IFNldDxUb3BpY0xpc3RlbmVyPigpO1xuICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIgYXMgVG9waWNMaXN0ZW5lcik7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KHRvcGljLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgICAgaWYgKGxpc3RlbmVycy5zaXplID09PSAwKSB0aGlzLmxpc3RlbmVycy5kZWxldGUodG9waWMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGF1dG9tYXRpYyBoYWxmIG9mIGEgbWVzc2FnZSdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBQcmVjZWRlbmNlLCB3ZWFrZXN0IGZpcnN0OiBtYWNoaW5lL3Byb2Nlc3MgY29udGV4dCwgdGhlbiBBcHBLaXQgc2VuZGVyXG4gICAqIGlkZW50aXR5LCB0aGVuIHRoaXMgYnVzJ3MgY29uZmlndXJlZCBtZXRhZGF0YS4gVGhlIGNhbGxlcidzIHBlci1tZXNzYWdlXG4gICAqIG1ldGFkYXRhIGlzIGxheWVyZWQgb3ZlciB0aGUgcmVzdWx0IGluIHtAbGluayBicm9hZGNhc3R9LCBzbyB0aGUgbW9zdCBzcGVjaWZpY1xuICAgKiBzb3VyY2UgYWx3YXlzIHdpbnMgYW5kIG5vdGhpbmcgaGVyZSBjYW4gb3ZlcndyaXRlIGFuIGV4cGxpY2l0IGtleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHNlbmRlciA9IGF3YWl0IHNlbmRlck1ldGFkYXRhKCk7XG4gICAgY29uc3QgY29uZmlndXJlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdGhpcy5tZXRhZGF0YSgpIDogKHRoaXMubWV0YWRhdGEgPz8ge30pO1xuICAgIHJldHVybiB7IC4uLm1hY2hpbmVNZXRhZGF0YSgpLCAuLi5zZW5kZXIsIC4uLmNvbmZpZ3VyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgc3RvcCBkZWxpdmVyaW5nIG1lc3NhZ2VzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBDYW5jZWxzIGFueSBwZW5kaW5nIHJlY29ubmVjdCwgZHJvcHMgYWxsIGxpc3RlbmVycywgdGhlbiBgVU5MSVNURU5gcyBhbmRcbiAgICogcmV0dXJucyB0aGUgY2xpZW50IHRvIHRoZSBwb29sLiBBIGZhaWxlZCBgVU5MSVNURU5gIGlzIHJlcG9ydGVkIHRvIHRoZSBwb29sIGFzXG4gICAqIGEgcmVsZWFzZSBlcnJvciBzbyB0aGUgY29ubmVjdGlvbiBpcyBESVNDQVJERUQgcmF0aGVyIHRoYW4gaGFuZGVkIHRvIHRoZSBuZXh0XG4gICAqIGNhbGxlciBzdGlsbCBzdWJzY3JpYmVkIHRvIHRoZSBjaGFubmVsLiBEb2VzIG5vdCB0aHJvdzsgdGhlIGJ1cyBzdGF5cyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5yZWNvbm5lY3RBYm9ydC5hYm9ydChuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGF3YWl0IHRoaXMucmVjb25uZWN0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGxldCByZWxlYXNlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFVOTElTVEVOICR7cXVvdGVJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZWxlYXNlRXJyb3IgPSBlcnJvci50b0Vycm9yKGNhdXNlKTtcbiAgICB9XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBvdXQgb25lIGNsaWVudCwgYXR0YWNoIHRoZSBoYW5kbGVycywgYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBUaGUgaGFuZGxlcnMgYXJlIGF0dGFjaGVkIEJFRk9SRSB0aGUgYExJU1RFTmAgcm91bmQgdHJpcCBzbyBhIG5vdGlmaWNhdGlvbiBvclxuICAgKiBlcnJvciBhcnJpdmluZyBtaWQtc2V0dXAgaXMgbm90IG1pc3NlZC4gQW55IGZhaWx1cmUgLSBpbmNsdWRpbmcgdGhlIGJ1cyBiZWluZ1xuICAgKiBjbG9zZWQgd2hpbGUgdGhlIGNvbm5lY3Qgd2FzIGluIGZsaWdodCAtIGRldGFjaGVzIHRoZSBoYW5kbGVycyBhbmQgcmVsZWFzZXNcbiAgICogdGhlIGNsaWVudCBhcyBlcnJvcmVkLCBzbyBhIGhhbGYtY29uZmlndXJlZCBjb25uZWN0aW9uIG5ldmVyIHJldHVybnMgdG8gdGhlXG4gICAqIHBvb2wuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtxdW90ZUlkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoZXJyb3IudG9FcnJvcihjYXVzZSkpO1xuICAgICAgdGhyb3cgY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIG9uZSBpbmJvdW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIElnbm9yZXMgb3RoZXIgY2hhbm5lbHMgYW5kIHVuZGVjb2RhYmxlIHBheWxvYWRzIC0gdGhlIGNoYW5uZWwgaXMgc2hhcmVkLCBzb1xuICAgKiBib3RoIGFyZSBvcmRpbmFyeSB0cmFmZmljLiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgY29uY3VycmVudGx5IGFuZCB0aGVpclxuICAgKiByZWplY3Rpb25zIGdvIHRvIGBvbkVycm9yYCwga2VlcGluZyBvbmUgc2xvdyBvciBicm9rZW4gc3Vic2NyaWJlciBmcm9tXG4gICAqIHN0YWxsaW5nIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5jaGFubmVsICE9PSB0aGlzLmNoYW5uZWxOYW1lKSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZSA9IGRlY29kZShub3RpZmljYXRpb24ucGF5bG9hZCk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuZGVsaXZlcihtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYHBheWxvYWQ6IFwicG9pbnRlclwiYCBjYXJyaWVzIG9ubHkgcm91dGluZyBhbmQgaWRlbnRpdHksIHNvIHRoZSBlbnZlbG9wZSBoYXNcbiAgICAvLyB0byBiZSByZWFkIGJhY2sgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBkZWxpdmVyZWQuIE9ubHkgYXR0ZW1wdGVkIHdoZW4gdGhpc1xuICAgIC8vIGJ1cyBpcyBjb25maWd1cmVkIGZvciBwZXJzaXN0ZW5jZTsgb3RoZXJ3aXNlIHRoZSBwYXlsb2FkIGlzIGZvcmVpZ24gdHJhZmZpY1xuICAgIC8vIG9uIGEgc2hhcmVkIGNoYW5uZWwgYW5kIGlnbm9yZWQgYXMgYmVmb3JlLlxuICAgIGNvbnN0IHBvaW50ZXIgPSB0aGlzLnBlcnNpc3RlbmNlID8gZGVjb2RlUG9pbnRlcihub3RpZmljYXRpb24ucGF5bG9hZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb2ludGVyKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMocG9pbnRlci50b3BpYykpIHJldHVybjtcbiAgICByZWFkUG9pbnRlcih0aGlzLnBvb2wsIHRoaXMuY2hhbm5lbE5hbWUsIHBvaW50ZXIsIHRoaXMucGVyc2lzdGVuY2UhKVxuICAgICAgLnRoZW4oKHN0b3JlZCkgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkKSB0aGlzLmRlbGl2ZXIoc3RvcmVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICAvKiogSGFuZCBvbmUgZGVjb2RlZCBtZXNzYWdlIHRvIHRoZSB0b3BpYydzIGxpc3RlbmVycy4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyKG1lc3NhZ2U6IFRvcGljTWVzc2FnZSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UudG9waWMpID8/IFtdKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUobGlzdGVuZXIobWVzc2FnZSkpLmNhdGNoKHRoaXMub25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gZHlpbmcsIHdoaWNoIGBwZ2AgcmVwb3J0cyBhcyBhbiBgZXJyb3JgXG4gICAqIGV2ZW50IHJhdGhlciB0aGFuIGEgcmVqZWN0ZWQgcXVlcnkuXG4gICAqXG4gICAqIFRoZSBjbGllbnQgaXMgdW51c2FibGUgYXQgdGhpcyBwb2ludCwgc28gaXQgaXMgZGV0YWNoZWQgYW5kIHJlbGVhc2VkIGFzXG4gICAqIGVycm9yZWQgKHdoaWNoIGRpc2NhcmRzIGl0KSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gUmVjb25uZWN0aW9uIG9ubHkgc3RhcnRzXG4gICAqIHdoZW4gdGhlcmUgaXMgc3RpbGwgc29tZW9uZSB0byBkZWxpdmVyIHRvLCBzbyBhbiBpZGxlIG9yIGNsb3NpbmcgYnVzIGRvZXMgbm90XG4gICAqIGhvbGQgYSBjb25uZWN0aW9uIG9wZW4gY2hhc2luZyBhIGNoYW5uZWwgbm9ib2R5IHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDbGllbnRFcnJvciA9IChjYXVzZTogRXJyb3IpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBjbGllbnQucmVsZWFzZShjYXVzZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VkIHx8IHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29ubmVjdGluZyA/Pz0gdGhpcy5yZWNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxpc2ggdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHdpdGggYm91bmRlZCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYXR0ZW1wdCBpcyBpbW1lZGlhdGUsIHNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIHNpbmdsZSBkcm9wcGVkXG4gICAqIGNvbm5lY3Rpb24gdGhhdCByZWNvbm5lY3RzIGF0IG9uY2U7IHN1YnNlcXVlbnQgZGVsYXlzIGRvdWJsZSBmcm9tIDI1MG1zIHVwIHRvXG4gICAqIDVzIGFuZCBzdGF5IHRoZXJlLiBSZXRyaWVzIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBnaXZpbmcgdXAsIGJlY2F1c2UgYSBQb3N0Z3JlcyByZXN0YXJ0XG4gICAqIG9yIGEgcm90YXRlZCBMYWtlYmFzZSBjcmVkZW50aWFsIGlzIGEgcmVjb3ZlcmFibGUgb3V0YWdlIGFuZCBhIHNpbGVudGx5IGRlYWRcbiAgICogbGlzdGVuZXIgaXMgd29yc2UgdGhhbiBhIG5vaXN5IG9uZS4gU3RvcHMgd2hlbiB0aGUgYnVzIGNsb3NlcyBvciB0aGUgbGFzdFxuICAgKiBsaXN0ZW5lciBsZWF2ZXMsIGFuZCByZXBvcnRzIGV2ZXJ5IGZhaWxlZCBhdHRlbXB0IHRocm91Z2ggYG9uRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuY2xvc2VkICYmIHRoaXMubGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2hhcmVkQXN5bmMuc2xlZXAoZGVsYXksIHRoaXMucmVjb25uZWN0QWJvcnQuc2lnbmFsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgICAgICBkZWxheSA9IGRlbGF5ID09PSAwID8gTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA6IE1hdGgubWluKGRlbGF5ICogMiwgTUFYX1JFQ09OTkVDVF9ERUxBWV9NUyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlqRyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGFBQWEsRUFDYixPQUFPLEVBQ1AsZUFBZSxFQUNmLHlCQUF5QixFQUN6QixXQUFXLEVBQ1gseUJBQXlCLEdBTTFCLE1BQU0sa0JBQWtCLENBQUM7QUFRMUIsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQzlDOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixxRkFBcUY7QUFDckYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsMEVBQTBFO0FBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9COzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQWtCckM7Ozs7R0FJRztBQUNILElBQUksWUFBMkQsQ0FBQztBQWdIaEU7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQXFEO0lBQzVFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXdDLEVBQUU7UUFDNUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsZUFBZTtJQUN0QixPQUFPLGVBQWUsQ0FBQztRQUNyQixPQUFPLEVBQ0wsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQjtZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7U0FDN0IsQ0FBQyxJQUFJLFNBQVM7UUFDakIsUUFBUSxFQUFFLFFBQVEsRUFBRTtRQUNwQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTO1FBQ3RFLE9BQU8sRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxTQUFTO1FBQzdFLFlBQVksRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsSUFBSSxTQUFTO1FBQzNGLGNBQWMsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksU0FBUztLQUNqRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLGNBQWM7SUFDM0IsWUFBWSxLQUFLLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztTQUMxQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQXNCLENBQUM7U0FDeEMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0MsT0FBTyxlQUFlLENBQUM7WUFDckIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVM7WUFDN0QsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVM7WUFDakUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVM7U0FDcEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFjO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsaUZBQWlGO0lBQ2pGLGdGQUFnRjtJQUNoRixnRkFBZ0Y7SUFDaEYsNEVBQTRFO0lBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDcEMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDN0QsQ0FBQztJQUNGLCtFQUErRTtJQUMvRSxrRUFBa0U7SUFDbEUsNkVBQTZFO0lBQzdFLGNBQWM7SUFDZCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUM7UUFDekIsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsNkVBQTZFO0lBQzdFLGlGQUFpRjtJQUNqRiw0RUFBNEU7SUFDNUUsa0NBQWtDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLFdBQVc7U0FDckIsdUJBQXVCLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUM7U0FDeEQsS0FBSyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNoRCxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLG1FQUFtRTtJQUNuRSxxRUFBcUU7SUFDckUsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO0lBQzlFLE9BQU8sR0FBRyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxNQUFNLENBQUMsS0FBeUI7SUFDdkMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLElBQ0UsQ0FBQyxNQUFNO1FBQ1AsT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVE7UUFDN0IsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDaEMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDL0IsT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFFBQVE7UUFDdEMsQ0FBQyxNQUFNLENBQUMsUUFBUTtRQUNoQixPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUTtRQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDOUIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDbkIsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQ3hDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTztRQUNMLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtRQUNiLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUF5QjtRQUMxQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQXlCO1FBQ3RDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztLQUNoQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQW1CUjtJQWxCbkI7Ozs7T0FJRztJQUNNLFdBQVcsQ0FBUztJQUNaLFFBQVEsQ0FBb0Q7SUFDNUQsT0FBTyxDQUEyQjtJQUNsQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7SUFDM0QsTUFBTSxDQUF5QjtJQUMvQixRQUFRLENBQTRCO0lBQ3BDLFlBQVksQ0FBNEI7SUFDL0IsY0FBYyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDaEQsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNOLFdBQVcsQ0FBc0M7SUFDMUQsWUFBWSxDQUFpQjtJQUVyQyxZQUNtQixJQUE4QixFQUMvQyxVQUFtQyxFQUFFO1FBRHBCLFNBQUksR0FBSixJQUFJLENBQTBCO1FBRy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUM1QixPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNsRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU87WUFDaEMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDOUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsS0FBYSxFQUNiLEtBQStCO1FBRS9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM5RSxJQUNFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2pELENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDdkMsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsc0VBQXNFLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBd0I7WUFDbkMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDYixLQUFLO1lBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM3QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3RDLENBQUM7UUFDRixJQUFJLE9BQWUsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCx3RUFBd0U7UUFDeEUsZ0VBQWdFO1FBQ2hFLCtDQUErQztRQUMvQyxJQUNFLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQjtZQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sS0FBSyxTQUFTLEVBQ3ZDLENBQUM7WUFDRCxNQUFNLElBQUksVUFBVSxDQUFDLGlDQUFpQyxnQkFBZ0IsUUFBUSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksS0FBSyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzFCLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxlQUFlLENBQ25CLE1BQU0sRUFDTixJQUFJLENBQUMsV0FBVyxFQUNoQixLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLENBQUMsV0FBVyxFQUNoQixLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUNyQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUNsQyxDQUFDO2dCQUNGLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FDWCxLQUFhLEVBQ2IsVUFBNkUsRUFBRTtRQUUvRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDckYsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLEtBQUsseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBUSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQ2xCLFVBQTZELEVBQUU7UUFFL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sY0FBYyxDQUNuQixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxXQUFXLEVBQ2hCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsS0FBYSxFQUNiLFFBQThCO1FBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ3hFLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBeUIsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ2hCLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBeUIsQ0FBQyxDQUFDO1lBQzVDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGVBQWU7UUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLE9BQU8sRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixNQUFNLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2RCxJQUFJLFlBQStCLENBQUM7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixZQUFZLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsT0FBTztRQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0MsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvRCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNjLGtCQUFrQixHQUFHLENBQUMsWUFBMEIsRUFBUSxFQUFFO1FBQ3pFLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUNELDhFQUE4RTtRQUM5RSw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLDZDQUE2QztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbkYsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUMvQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBWSxDQUFDO2FBQ2pFLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2YsSUFBSSxNQUFNO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUM7SUFFRix5REFBeUQ7SUFDakQsT0FBTyxDQUFDLE9BQXFCO1FBQ25DLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ2MsaUJBQWlCLEdBQUcsQ0FBQyxLQUFZLEVBQVEsRUFBRTtRQUMxRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ3JELElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7O09BU0c7SUFDSyxLQUFLLENBQUMsU0FBUztRQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxPQUFPO2dCQUNULENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixPQUFPO1lBQ1QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPO2dCQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQzdGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb3BpYyBmYW4tb3V0IG92ZXIgUG9zdGdyZVNRTCBgTElTVEVOYC9gTk9USUZZYCwgZm9yIHRlbGxpbmcgZXZlcnkgcnVubmluZ1xuICogaW5zdGFuY2Ugb2YgYW4gYXBwIHRoYXQgc29tZXRoaW5nIGhhcHBlbmVkLlxuICpcbiAqIFRoZSBzaWJsaW5nIGBhZHZpc29yeS1sb2NrYCBtb2R1bGUgaXMgYWJvdXQgbWFraW5nIHN1cmUgb25seSBPTkUgY29ubmVjdGlvblxuICogZG9lcyBhIHRoaW5nOyB0aGlzIG9uZSBpcyB0aGUgb3Bwb3NpdGUgLSBFVkVSWSBsaXN0ZW5pbmcgc2Vzc2lvbiBnZXRzIGV2ZXJ5XG4gKiBub3RpZmljYXRpb24uIFRoYXQgbWFrZXMgaXQgdGhlIHJpZ2h0IHByaW1pdGl2ZSBmb3IgbGl2ZSBVSSB1cGRhdGVzXG4gKiAoYW4gU1NFIHN0cmVhbSBwZXIgYnJvd3NlciB0YWIsIGEgY2FjaGUgaW52YWxpZGF0aW9uLCBhIHByZXNlbmNlIHBpbmcpIGFuZCB0aGVcbiAqIHdyb25nIG9uZSBmb3Igd29yayBkaXN0cmlidXRpb246IHRoZXJlIGFyZSBubyBjb21wZXRpbmcgY29uc3VtZXJzLCBubyBhY2tzLCBhbmRcbiAqIG5vIHJlcGxheS5cbiAqXG4gKiBEZWxpdmVyeSBpcyBiZXN0LWVmZm9ydCBhbmQgbGl2ZS4gYE5PVElGWWAgcmVhY2hlcyBzZXNzaW9ucyB0aGF0IGFyZSBsaXN0ZW5pbmdcbiAqIGF0IHRoZSBtb21lbnQgaXQgY29tbWl0cywgc28gYSBsaXN0ZW5lciB0aGF0IGNvbm5lY3RzIGEgc2Vjb25kIGxhdGVyIG5ldmVyIHNlZXNcbiAqIGl0LCBhbmQgYSBsaXN0ZW5lciB3aG9zZSBjb25uZWN0aW9uIGRyb3BzIG1pc3NlcyBldmVyeXRoaW5nIHVudGlsIHRoZSBidXNcbiAqIHJlY29ubmVjdHMuIFVzZSBhIHRhYmxlIG9yIGEgcXVldWUgd2hlbiBhIHN1YnNjcmliZXIgbmVlZHMgZHVyYWJpbGl0eS5cbiAqXG4gKiBPTkUgQ0hBTk5FTCwgTUFOWSBUT1BJQ1MuIEV2ZXJ5IGJ1cyBpbnN0YW5jZSBsaXN0ZW5zIG9uIGEgc2luZ2xlIFBvc3RncmVzXG4gKiBjaGFubmVsIChgY2hhbm5lbGAsIGRlZmF1bHQgYGRieF90b29sc190b3BpY19idXNgKSBhbmQgZmlsdGVycyBieSB0aGVcbiAqIGVudmVsb3BlJ3MgYHRvcGljYCBpbi1wcm9jZXNzLCBzbyBhZGRpbmcgYSB0b3BpYyBjb3N0cyBubyBjb25uZWN0aW9uIGFuZCBub1xuICogYExJU1RFTmAuIFRoZSB0cmFkZW9mZiBpcyB0aGF0IGV2ZXJ5IGxpc3RlbmluZyBzZXNzaW9uIGRlY29kZXMgZXZlcnkgbWVzc2FnZSBvblxuICogdGhlIGNoYW5uZWw7IGdpdmUgYSBnZW51aW5lbHkgaGlnaC12b2x1bWUsIHVucmVsYXRlZCBzdHJlYW0gaXRzIG93biBgY2hhbm5lbGBcbiAqIHJhdGhlciB0aGFuIGEgdG9waWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGhvc3RuYW1lIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGhhc2gsIGpzb24sIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBOb3RpZmljYXRpb24sIFBvb2xDbGllbnQgfSBmcm9tIFwicGdcIjtcblxuaW1wb3J0IHR5cGUgeyBQZ1Bvb2xMaWtlLCBQZ1F1ZXJ5YWJsZSB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7XG4gIGNsZWFudXBFeHBpcmVkLFxuICBkZWNvZGVQb2ludGVyLFxuICBoaXN0b3J5LFxuICBwZXJzaXN0ZWROb3RpZnksXG4gIHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEsXG4gIHJlYWRQb2ludGVyLFxuICByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIER1cmF0aW9uSW5wdXQsXG4gIHR5cGUgUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgdHlwZSBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgdHlwZSBUb3BpY0hpc3RvcnlQYWdlLFxuICB0eXBlIFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbn0gZnJvbSBcIi4vcGVyc2lzdGVuY2UudHNcIjtcblxuLyoqXG4gKiBgQGRieC10b29scy9zaGFyZWQtY29yZWAgb3ducyB0aGUgSlNPTi1yb3VuZC10cmlwIHJ1bGU7IHRoaXMgYWxpYXMganVzdCBrZWVwcyB0aGVcbiAqIGdlbmVyaWMgc2lnbmF0dXJlcyBiZWxvdyByZWFkYWJsZS4gQ29uc3VtZXJzIGltcG9ydCB0aGUgdHlwZSBmcm9tIHNoYXJlZC1jb3JlLlxuICovXG50eXBlIFNlcmlhbGl6YWJsZVZhbHVlID0gb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlO1xuXG4vKiogQ2hhbm5lbCBwYXJ0cyB1c2VkIHdoZW4gYSBjYWxsZXIgbmFtZXMgbm8gY2hhbm5lbCBvZiBpdHMgb3duLiAqL1xuY29uc3QgREVGQVVMVF9DSEFOTkVMID0gXCJkYnhfdG9vbHNfdG9waWNfYnVzXCI7XG4vKipcbiAqIGBOQU1FREFUQUxFTiAtIDFgLiBQb3N0Z3JlcyBUUlVOQ0FURVMgYSBsb25nZXIgY2hhbm5lbCBuYW1lIHJhdGhlciB0aGFuXG4gKiByZWplY3RpbmcgaXQsIHdoaWNoIHdvdWxkIHNwbGl0IHB1Ymxpc2hlcnMgYW5kIGxpc3RlbmVycyBvbnRvIGRpZmZlcmVudFxuICogY2hhbm5lbHMgd2hpbGUgZXZlcnkgY2FsbCBsb29rZWQgbGlrZSBpdCBzdWNjZWVkZWQuXG4gKi9cbmNvbnN0IE1BWF9DSEFOTkVMX0xFTkdUSCA9IDYzO1xuLyoqIEJhc2UtMzIgY2hhcnMgb2YgdGhlIGNoYW5uZWwncyBpZGVudGl0eSBzdWZmaXguIE1heCA3IC0gdGhlIGRpZ2VzdCBpcyAzMiBiaXRzLiAqL1xuY29uc3QgQ0hBTk5FTF9IQVNIX0xFTkdUSCA9IDY7XG4vKiogQm9keSB1c2VkIHdoZW4gdGhlIHBhcnRzIHRva2VuaXplIHRvIG5vdGhpbmcsIG9yIGxlYWQgd2l0aCBhIGRpZ2l0LiAqL1xuY29uc3QgQ0hBTk5FTF9GQUxMQkFDSyA9IFwiYnVzXCI7XG4vKipcbiAqIEVuY29kZWQtZW52ZWxvcGUgY2VpbGluZy4gUG9zdGdyZVNRTCBjYXBzIGEgYE5PVElGWWAgcGF5bG9hZCBhdCA4MDAwIGJ5dGVzIGFuZFxuICogZmFpbHMgdGhlIHN0YXRlbWVudCBwYXN0IHRoYXQsIHNvIHRoZSBidXMgcmVqZWN0cyB0aGUgbWVzc2FnZSBmaXJzdCB3aXRoIGEgc2l6ZVxuICogaXQgY2FuIG5hbWUuIFRoZSBtYXJnaW4gYmVsb3cgODAwMCBjb3ZlcnMgdGhlIHNlcnZlcidzIG93biBhY2NvdW50aW5nLlxuICovXG5jb25zdCBNQVhfTk9USUZZX0JZVEVTID0gN185MDA7XG5jb25zdCBNSU5fUkVDT05ORUNUX0RFTEFZX01TID0gMjUwO1xuY29uc3QgTUFYX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDVfMDAwO1xuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgQXBwS2l0J3MgcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgdGhlIGJ1cyByZWFkcyBmb3Igc2VuZGVyXG4gKiBpZGVudGl0eS4gRmllbGRzIGFyZSBgdW5rbm93bmAgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCB2aWV3IG9mIGFuIE9QVElPTkFMXG4gKiBwZWVyOiB0aGUgdmFsdWVzIGFyZSB0cmltbWVkIGFuZCB2YWxpZGF0ZWQgcmF0aGVyIHRoYW4gdHJ1c3RlZC5cbiAqL1xudHlwZSBBcHBLaXRFeGVjdXRpb25Db250ZXh0ID0ge1xuICB1c2VyRW1haWw/OiB1bmtub3duO1xuICB1c2VySWQ/OiB1bmtub3duO1xuICB1c2VyTmFtZT86IHVua25vd247XG59O1xuXG4vKiogU3RydWN0dXJhbCB2aWV3IG9mIGBAZGF0YWJyaWNrcy9hcHBraXRgLCBpbXBvcnRlZCBsYXppbHkgYW5kIG5ldmVyIHJlcXVpcmVkLiAqL1xudHlwZSBBcHBLaXRNb2R1bGUgPSB7XG4gIGdldEV4ZWN1dGlvbkNvbnRleHQoKTogQXBwS2l0RXhlY3V0aW9uQ29udGV4dDtcbn07XG5cbi8qKlxuICogQ2FjaGVkIHJlc3VsdCBvZiB0aGUgb25lIG9wdGlvbmFsLXBlZXIgaW1wb3J0LCByZXNvbHZlZCB0byBgdW5kZWZpbmVkYCB3aGVuXG4gKiBBcHBLaXQgaXMgbm90IGluc3RhbGxlZC4gTWVtb2l6ZWQgc28gYSBidXMgaW4gYSBwbGFpbiBQb3N0Z3JlcyBwcm9jZXNzIHBheXMgZm9yXG4gKiB0aGUgZmFpbGVkIHJlc29sdXRpb24gb25jZSBpbnN0ZWFkIG9mIHBlciBicm9hZGNhc3QuXG4gKi9cbmxldCBhcHBLaXRNb2R1bGU6IFByb21pc2U8QXBwS2l0TW9kdWxlIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBGbGF0LWtleWVkIGNvbnRleHQgdHJhdmVsbGluZyBhbG9uZ3NpZGUgYSBtZXNzYWdlIGJvZHk6IHdobyBzZW50IGl0LCBmcm9tXG4gKiB3aGVyZSwgaW4gd2hpY2ggZGVwbG95bWVudC4gVmFsdWVzIG1heSBuZXN0LCBidXQgdGhlIGtleXMgYXJlIHRoZSBhZGRyZXNzYWJsZVxuICogcGFydCAtIGEgbGlzdGVuZXIgZmlsdGVyaW5nIG9yIGxhYmVsbGluZyBtZXNzYWdlcyByZWFkcyBgbWV0YWRhdGEudXNlcmAsIG5vdCBhXG4gKiBwYXRoIGludG8gdGhlIGJvZHkuXG4gKi9cbmV4cG9ydCB0eXBlIFRvcGljTWV0YWRhdGEgPSBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemFibGVWYWx1ZT47XG5cbi8qKlxuICogVGhlIHdpcmUgZW52ZWxvcGUgZXZlcnkgc3Vic2NyaWJlciByZWNlaXZlcywgYW5kIHdoYXQge0BsaW5rXG4gKiBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0gcmV0dXJucyB0byB0aGUgcHVibGlzaGVyLlxuICpcbiAqIGBpZGAsIGB0b3BpY2AsIGFuZCBgcHVibGlzaGVkQXRgIGFyZSBhc3NpZ25lZCBieSB0aGUgYnVzOyBgdHlwZWAsIGBtZXRhZGF0YWAsXG4gKiBhbmQgYGJvZHlgIGNvbWUgZnJvbSB0aGUgY2FsbGVyICh3aXRoIGF1dG9tYXRpYyBjb250ZXh0IG1lcmdlZCB1bmRlclxuICogYG1ldGFkYXRhYCkuIFRoZSBzaGFwZSBpcyBzdGFibGUgZW5vdWdoIHRvIGhhbmQgc3RyYWlnaHQgdG8gYW4gU1NFIGBkYXRhOmBcbiAqIGZyYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljTWVzc2FnZTxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlID0gU2VyaWFsaXphYmxlVmFsdWU+IHtcbiAgLyoqXG4gICAqIFBlci1tZXNzYWdlIGlkZW50aXR5IGdlbmVyYXRlZCBieSB0aGUgcHVibGlzaGVyLCB1bmlxdWUgYWNyb3NzIGluc3RhbmNlcy5cbiAgICogU3VpdGFibGUgZm9yIGRlZHVwZSB3aGVuIGEgY2xpZW50IHJlY29ubmVjdHMgYW5kIGZvciBhbiBTU0UgYGlkOmAgZmllbGQuIE5vdFxuICAgKiBvcmRlcmVkLCBhbmQgbm90IGEgZGF0YWJhc2Uga2V5LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSB0b3BpYyB0aGlzIHdhcyBicm9hZGNhc3Qgb247IGxpc3RlbmVycyBvbiBvdGhlciB0b3BpY3MgbmV2ZXIgc2VlIGl0LiAqL1xuICB0b3BpYzogc3RyaW5nO1xuICAvKiogQ2FsbGVyLWNob3NlbiBldmVudCBuYW1lLCBlLmcuIGBvcmRlci51cGRhdGVkYC4gTmV2ZXIgZW1wdHkuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqIEF1dG9tYXRpYyBjb250ZXh0IG1lcmdlZCB3aXRoIGNhbGxlciBtZXRhZGF0YS4gU2VlIHtAbGluayBUb3BpY01ldGFkYXRhfS4gKi9cbiAgbWV0YWRhdGE6IFRvcGljTWV0YWRhdGE7XG4gIC8qKiBUaGUgY2FsbGVyJ3MgcGF5bG9hZCwgdW5jaGFuZ2VkLiAqL1xuICBib2R5OiBUQm9keTtcbiAgLyoqXG4gICAqIElTTy04NjAxIHB1Ymxpc2ggdGltZSBmcm9tIHRoZSBQVUJMSVNISU5HIHByb2Nlc3MncyBjbG9jaywgbm90IHRoZSBkYXRhYmFzZSdzLlxuICAgKiBGaW5lIGZvciBkaXNwbGF5OyBkbyBub3Qgb3JkZXIgbWVzc2FnZXMgZnJvbSBkaWZmZXJlbnQgaW5zdGFuY2VzIGJ5IGl0LlxuICAgKi9cbiAgcHVibGlzaGVkQXQ6IHN0cmluZztcbn1cblxuLyoqIFdoYXQgYSBjYWxsZXIgc3VwcGxpZXMgdG8ge0BsaW5rIFBvc3RncmVzVG9waWNCdXMuYnJvYWRjYXN0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNQdWJsaXNoSW5wdXQ8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKiBFdmVudCBuYW1lLCBlLmcuIGBjaGF0Lm1lc3NhZ2VgLiBNdXN0IGJlIG5vbi1ibGFuay4gKi9cbiAgdHlwZTogc3RyaW5nO1xuICAvKipcbiAgICogQ29udGV4dCB0byBhdHRhY2guIFdpbnMgb3ZlciBhbnkgYXV0b21hdGljIGtleSBvZiB0aGUgc2FtZSBuYW1lLCBzbyBhIGNhbGxlclxuICAgKiBjYW4gb3ZlcnJpZGUgYSBtYWNoaW5lIGRlZmF1bHQgKGBwcm9qZWN0YCkgb3IgYWRkIGl0cyBvd24gKGB0cmFjZUlkYCkuXG4gICAqL1xuICBtZXRhZGF0YT86IFRvcGljTWV0YWRhdGE7XG4gIC8qKiBUaGUgcGF5bG9hZC4gTXVzdCBzYXRpc2Z5IGBvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZWAuICovXG4gIGJvZHk6IFRCb2R5O1xuICBzY29wZT86IFRvcGljUGVyc2lzdGVuY2VTY29wZTtcbiAgdHRsPzogRHVyYXRpb25JbnB1dCB8IGZhbHNlO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXIgY2FsbGJhY2suIEludm9rZWQgb25jZSBwZXIgbWF0Y2hpbmcgbWVzc2FnZSBvbiB0aGUgbm90aWZpY2F0aW9uXG4gKiBjb25uZWN0aW9uJ3MgY2FsbGJhY2ssIHNvIGl0IHNob3VsZCBub3QgYmxvY2s6IGEgcmV0dXJuZWQgcHJvbWlzZSBpcyBhd2FpdGVkXG4gKiBvbmx5IHRvIHJvdXRlIGEgcmVqZWN0aW9uIHRvIGBvbkVycm9yYCwgYW5kIGxpc3RlbmVycyBmb3Igb25lIG1lc3NhZ2UgcnVuXG4gKiBjb25jdXJyZW50bHkgcmF0aGVyIHRoYW4gaW4gcmVnaXN0cmF0aW9uIG9yZGVyLlxuICpcbiAqIGBUQm9keWAgaXMgdW5jaGVja2VkIGF0IHJ1bnRpbWUuIFRoZSBidXMgZ3VhcmFudGVlcyB0aGUgYm9keSBpcyBzZXJpYWxpemFibGUsXG4gKiBub3QgdGhhdCBpdCBtYXRjaGVzIHRoZSB0eXBlIHBhcmFtZXRlciwgc28gdmFsaWRhdGUgYW55dGhpbmcgYSBsaXN0ZW5lclxuICogYnJhbmNoZXMgb24uXG4gKi9cbmV4cG9ydCB0eXBlIFRvcGljTGlzdGVuZXI8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiA9IChcbiAgbWVzc2FnZTogVG9waWNNZXNzYWdlPFRCb2R5PixcbikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4vKipcbiAqIFJlc29sdmVzIG1ldGFkYXRhIGF0IHB1Ymxpc2ggdGltZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdGlvbiB0aW1lLCBmb3IgY29udGV4dCBhXG4gKiBwcm9jZXNzIGxlYXJucyBsYXRlIG9yIGFzeW5jaHJvbm91c2x5IC0gYW4gaW5zdGFuY2UgaWQgZnJvbSBhIGNvbnRyb2wgcGxhbmUsIGFcbiAqIGRpc2NvdmVyZWQgYWRkcmVzcyBhIGNhbGxlciBjaG9vc2VzIHRvIGF0dGFjaC4gQ2FsbGVkIG9uIGV2ZXJ5IGJyb2FkY2FzdCwgc29cbiAqIG1lbW9pemUgYW55dGhpbmcgZXhwZW5zaXZlOyBhIHJlamVjdGlvbiBmYWlscyB0aGUgYnJvYWRjYXN0LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhUHJvdmlkZXIgPSAoKSA9PiBUb3BpY01ldGFkYXRhIHwgUHJvbWlzZUxpa2U8VG9waWNNZXRhZGF0YT47XG5cbi8qKiBDb25zdHJ1Y3Rpb24gb3B0aW9ucyBmb3Ige0BsaW5rIFBvc3RncmVzVG9waWNCdXN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGF0IGlkZW50aWZpZXMgdGhpcyBjaGFubmVsIC0gYW55dGhpbmcsIG5vdCBqdXN0IGFuIGlkZW50aWZpZXI6IGEgbmFtZSwgYW5cbiAgICogaWQsIGEgYFtlbnYsIGZlYXR1cmVdYCBwYWlyLCBhIGNvbmZpZyBvYmplY3QuIFRoZSBwYXJ0cyBhcmUgdG9rZW5pemVkIGludG8gYVxuICAgKiBsZWdhbCBQb3N0Z3JlcyBjaGFubmVsIG5hbWUgd2l0aCBhIHNob3J0IGhhc2ggb2YgdGhlIG9yaWdpbmFscyBhcHBlbmRlZCwgc29cbiAgICogdGhlIGRlcml2YXRpb24gaXMgZGV0ZXJtaW5pc3RpYyBhbmQgbm8gY2FsbCBzaXRlIGhhcyB0byBzYW5pdGl6ZS4gU2VlXG4gICAqIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmNoYW5uZWxOYW1lfSBmb3IgdGhlIHJlc29sdmVkIG5hbWUuXG4gICAqXG4gICAqIE9uZSB2YWx1ZSBvciBtYW55OiBhbiBhcnJheSBpcyByZWFkIGFzIG11bHRpcGxlIHBhcnRzXG4gICAqICh7QGxpbmsgb2JqZWN0Lk9uZU9yTWFueX0pLCBhbnl0aGluZyBlbHNlIGFzIGEgc2luZ2xlIHBhcnQuIFNvXG4gICAqIGBbXCJiaWxsaW5nXCIsIFwicHJvZFwiXWAgYW5kIGBcImJpbGxpbmdfcHJvZFwiYCBhcmUgZGlmZmVyZW50IGNoYW5uZWxzLCBzaW5jZSB0aGVcbiAgICogaGFzaCBzZWVzIGRpZmZlcmVudCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEV2ZXJ5IHBhcnRpY2lwYXRpbmcgcHJvY2VzcyBtdXN0IHBhc3MgRVFVSVZBTEVOVCBwYXJ0cywgc2luY2UgYSBkaWZmZXJlbnRcbiAgICogc3BlbGxpbmcgaGFzaGVzIHRvIGEgZGlmZmVyZW50IGNoYW5uZWwuIERlZmF1bHRzIHRvIGEgc2hhcmVkXG4gICAqIGBkYnhfdG9vbHNfdG9waWNfYnVzYCBjaGFubmVsLlxuICAgKi9cbiAgY2hhbm5lbD86IHVua25vd247XG4gIC8qKlxuICAgKiBFeHRyYSBjb250ZXh0IGFkZGVkIHRvIGV2ZXJ5IG1lc3NhZ2UgdGhpcyBidXMgcHVibGlzaGVzLCBlaXRoZXIgYSBmaXhlZFxuICAgKiByZWNvcmQgb3IgYSB7QGxpbmsgVG9waWNNZXRhZGF0YVByb3ZpZGVyfSBjYWxsZWQgcGVyIGJyb2FkY2FzdC4gT3ZlcnJpZGVzXG4gICAqIGF1dG9tYXRpYyBtYWNoaW5lIGtleXM7IHBlci1jYWxsIGBtZXRhZGF0YWAgb3ZlcnJpZGVzIHRoaXMuXG4gICAqL1xuICBtZXRhZGF0YT86IFRvcGljTWV0YWRhdGEgfCBUb3BpY01ldGFkYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBTaW5rIGZvciBmYWlsdXJlcyB0aGF0IGhhdmUgbm8gY2FsbGVyIHRvIHRocm93IHRvOiBhIGxpc3RlbmVyIHRoYXQgcmVqZWN0ZWQsXG4gICAqIGEgZHJvcHBlZCBub3RpZmljYXRpb24gY29ubmVjdGlvbiwgYSBmYWlsZWQgcmVjb25uZWN0IGF0dGVtcHQuIERlZmF1bHRzIHRvXG4gICAqIHN3YWxsb3dpbmcgdGhlbSwgc28gd2lyZSB0aGlzIHRvIGEgbG9nZ2VyIGluIGFueXRoaW5nIGxvbmctcnVubmluZy5cbiAgICovXG4gIG9uRXJyb3I/OiAoY2F1c2U6IHVua25vd24pID0+IHZvaWQ7XG4gIHBlcnNpc3Q/OiBib29sZWFuIHwgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnM7XG59XG5cbi8qKlxuICogRHJvcCBrZXlzIHdob3NlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCBzbyBhbiB1bnNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBsZWF2ZXNcbiAqIHRoZSBrZXkgQUJTRU5UIHJhdGhlciB0aGFuIHByZXNlbnQtYW5kLW51bGwuIEFic2VuY2UgaXMgd2hhdCBsZXRzIGNhbGxlclxuICogbWV0YWRhdGEgYW5kIGxhdGVyIG1lcmdlIGxheWVycyBzdXBwbHkgdGhlIGtleSBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBkZWZpbmVkTWV0YWRhdGEodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemFibGVWYWx1ZSB8IHVuZGVmaW5lZD4pOiBUb3BpY01ldGFkYXRhIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBTZXJpYWxpemFibGVWYWx1ZV0gPT4ge1xuICAgICAgcmV0dXJuIGVudHJ5WzFdICE9PSB1bmRlZmluZWQ7XG4gICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogQ29udGV4dCBldmVyeSBtZXNzYWdlIGdldHMgZm9yIGZyZWU6IHdoaWNoIHByb2plY3QsIGhvc3QsIGFuZCBkZXBsb3ltZW50XG4gKiBwdWJsaXNoZWQgaXQuXG4gKlxuICogUmVhZCBmcmVzaCBwZXIgYnJvYWRjYXN0IHJhdGhlciB0aGFuIGNhY2hlZCwgYmVjYXVzZSBhIGxvbmctbGl2ZWQgcHJvY2VzcyBjYW5cbiAqIGJlIHJlLXBhcmVudGVkIChhIGRlcGxveW1lbnQgaWQgYXBwZWFyaW5nIGFmdGVyIGJvb3QpLiBLZXlzIHRoYXQgcmVzb2x2ZSB0b1xuICogbm90aGluZyBhcmUgb21pdHRlZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGluY2x1ZGVkOiBwdWJsaWMvY2xpZW50IElQLCBwcm9jZXNzIGlkLCBDUFUgYXJjaGl0ZWN0dXJlLFxuICogcnVudGltZSBuYW1lLCBhbmQgcnVudGltZSB2ZXJzaW9uLiBJUHMgYW5kIHBpZHMgYXJlIG5vaXN5LCBvZnRlbiBzZW5zaXRpdmUsXG4gKiBhbmQgYnVybiBgTk9USUZZYCBwYXlsb2FkIGJ1ZGdldDsgYXJjaGl0ZWN0dXJlL3J1bnRpbWUgYXJlIGNvbnN0YW50IHBlclxuICogZGVwbG95bWVudCBhbmQgcGF5IHRoZSBzYW1lIGNvc3QuIEEgcHJvY2VzcyB0aGF0IHdhbnRzIGFueSBvZiB0aGVtIHBhc3NlcyBhXG4gKiB7QGxpbmsgVG9waWNNZXRhZGF0YVByb3ZpZGVyfSBvciBwZXItbWVzc2FnZSBgbWV0YWRhdGFgLlxuICovXG5mdW5jdGlvbiBtYWNoaW5lTWV0YWRhdGEoKTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBkZWZpbmVkTWV0YWRhdGEoe1xuICAgIHByb2plY3Q6XG4gICAgICBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KFtcbiAgICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19CVU5ETEVfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5ucG1fcGFja2FnZV9uYW1lLFxuICAgICAgXSkgPz8gdW5kZWZpbmVkLFxuICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgIGVudmlyb25tZW50OiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHByb2Nlc3MuZW52Lk5PREVfRU5WKSA/PyB1bmRlZmluZWQsXG4gICAgYXBwTmFtZTogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9OQU1FKSA/PyB1bmRlZmluZWQsXG4gICAgZGVwbG95bWVudElkOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX0RFUExPWU1FTlRfSUQpID8/IHVuZGVmaW5lZCxcbiAgICBkYXRhYnJpY2tzSG9zdDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QpID8/IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgb2YgdGhlIHNpZ25lZC1pbiB1c2VyIG9uIHdob3NlIGJlaGFsZiB0aGlzIGJyb2FkY2FzdCBoYXBwZW5zLCB3aGVuIHRoZVxuICogcHJvY2VzcyBjYW4gdGVsbC5cbiAqXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0YCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyB0aGUgaW1wb3J0IGlzIGxhenkgYW5kIGEgbWlzc2luZ1xuICogbW9kdWxlIGlzIG5vdCBhbiBlcnJvciAtIHRoaXMgaXMgYSBwbGFpbiBQb3N0Z3JlcyBwYWNrYWdlIHRoYXQgYWRkcyBzZW5kZXJcbiAqIGlkZW50aXR5IHdoZW4gaXQgaGFwcGVucyB0byBydW4gaW5zaWRlIGFuIEFwcEtpdCBhcHAuIE91dHNpZGUgYW4gYWN0aXZlXG4gKiBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCBBcHBLaXQgdGhyb3dzLCB3aGljaCBtZWFucyBcIm5vIHVzZXIgaGVyZVwiLCBzbyB0aGVcbiAqIHJlc3VsdCBpcyBlbXB0eSBtZXRhZGF0YSByYXRoZXIgdGhhbiBhIGZhaWxlZCBicm9hZGNhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRlck1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICBhcHBLaXRNb2R1bGUgPz89IGltcG9ydChcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKVxuICAgIC50aGVuKChtb2R1bGUpID0+IG1vZHVsZSBhcyBBcHBLaXRNb2R1bGUpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcGtpdCA9IGF3YWl0IGFwcEtpdE1vZHVsZTtcbiAgaWYgKCFhcHBraXQpIHJldHVybiB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXBwa2l0LmdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICAgIHNlbmRlcklkOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbnRleHQudXNlcklkKSA/PyB1bmRlZmluZWQsXG4gICAgICBzZW5kZXJOYW1lOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbnRleHQudXNlck5hbWUpID8/IHVuZGVmaW5lZCxcbiAgICAgIHNlbmRlckVtYWlsOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbnRleHQudXNlckVtYWlsKSA/PyB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSBhIGxlZ2FsIFBvc3RncmVzIGNoYW5uZWwgbmFtZSBmcm9tIHdoYXRldmVyIGEgY2FsbGVyIHVzZWQgdG8gaWRlbnRpZnlcbiAqIHRoZSBjaGFubmVsLlxuICpcbiAqIENhbGxlcnMgdGhpbmsgaW4gdGVybXMgb2Ygd2hhdCB0aGUgY2hhbm5lbCBJUyAtIGFuIGFwcCBuYW1lLCBhIHRlbmFudCBpZCwgYVxuICogYFtlbnYsIGZlYXR1cmVdYCBwYWlyLCBhIGNvbmZpZyBvYmplY3QgLSBhbmQgbm9uZSBvZiB0aG9zZSBhcmUgaWRlbnRpZmllcnMuXG4gKiBSZWplY3RpbmcgdGhlbSBwdXNoZWQgdGhlIHNhbml0aXppbmcgb250byBldmVyeSBjYWxsIHNpdGUsIHdoaWNoIGlzIGhvdyB0d29cbiAqIHNlcnZpY2VzIGVuZCB1cCBkaXNhZ3JlZWluZyBhYm91dCB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIGBteS1hcHBgLCBgbXlfYXBwYCxcbiAqIG9yIGBteUFwcGAgYW5kIHNpbGVudGx5IG5ldmVyIGhlYXIgZWFjaCBvdGhlci5cbiAqXG4gKiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBhbmQgam9pbmVkIGludG8gYW4gaWRlbnRpZmllciwgdGhlbiBhIHNob3J0IGhhc2ggb2YgdGhlXG4gKiBPUklHSU5BTCBwYXJ0cyBpcyBhcHBlbmRlZC4gVGhlIGhhc2ggaXMgd2hhdCBtYWtlcyB0aGUgbWFwcGluZyB0cnVzdHdvcnRoeTpcbiAqIHRva2VuaXppbmcgYWxvbmUgaXMgbG9zc3ksIHNvIGBteS1hcHBgIGFuZCBgbXlfYXBwYCBhbmQgYG15QXBwYCB3b3VsZCBjb2xsYXBzZVxuICogb250byBvbmUgY2hhbm5lbCwgYW5kIGEgbmFtZSBsb25nIGVub3VnaCB0byBoaXQgYE5BTUVEQVRBTEVOYCB3b3VsZCBjb2xsaWRlXG4gKiB3aXRoIGFueXRoaW5nIHNoYXJpbmcgaXRzIGxlYWRpbmcgdG9rZW5zLiBXaXRoIHRoZSBzdWZmaXgsIHRoZSByZWFkYWJsZSBwYXJ0XG4gKiBzdGF5cyByZWFkYWJsZSBhbmQgZGlzdGluY3QgaW5wdXRzIHN0YXkgZGlzdGluY3QuXG4gKlxuICogRGV0ZXJtaW5pc3RpYyBhY3Jvc3MgcHJvY2Vzc2VzIGFuZCBydW5zLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgLSB0d29cbiAqIHNlcnZpY2VzIGdpdmVuIHRoZSBzYW1lIHBhcnRzIG11c3QgbGFuZCBvbiB0aGUgc2FtZSBjaGFubmVsIHdpdGhvdXRcbiAqIGNvb3JkaW5hdGluZy4gSGFzaCBpbnB1dHMgYXJlIHN0cnVjdHVyZS1hd2FyZSwgc28gYFtcImFcIiwgXCJiXCJdYCBhbmQgYFtcImFfYlwiXWBcbiAqIGRpZmZlciwgYW5kIG9iamVjdCBrZXkgb3JkZXIgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFubmVsTmFtZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gb2JqZWN0LnRvT25lT3JNYW55KHZhbHVlKTtcbiAgLy8gSGFzaCB0aGUgQ0FOT05JQ0FMIGZvcm0sIHRoZSBzYW1lIHJ1bGUgYGFkdmlzb3J5TG9ja0lkYCB1c2VzLCBzbyBzdHJ1Y3R1cmUgYW5kXG4gIC8vIHR5cGVzIGRlY2lkZSBpZGVudGl0eTogYFtcImFcIixcImJcIl1gIGRpZmZlcnMgZnJvbSBgW1wiYWJcIl1gLCBgMWAgZnJvbSBgXCIxXCJgLCBhbmRcbiAgLy8gb2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdCBtYXR0ZXIuIEhhc2hpbmcgdGhlIHJhdyBwYXJ0cyB3b3VsZCBpbnN0ZWFkIGxlYW4gb25cbiAgLy8gdGhlIGhhc2ggbW9kdWxlJ3MgY2Fub25pY2FsaXplciwgd2hpY2ggZm9sZHMgZXZlcnkgYERhdGVgIG9udG8gb25lIHRva2VuLlxuICBjb25zdCBzdWZmaXggPSBoYXNoLmZudkhhc2hXaXRoT3B0aW9ucyhcbiAgICB7IGxlbmd0aDogQ0hBTk5FTF9IQVNIX0xFTkdUSCB9LFxuICAgIHBhcnRzLm1hcCgocGFydCkgPT4gb2JqZWN0LnRvU3RhYmxlS2V5KHBhcnQpKS5qb2luKFwiXFx1MDAwMFwiKSxcbiAgKTtcbiAgLy8gT25seSBwYXJ0cyB0aGF0IHN0cmluZ2lmeSB0byBzb21ldGhpbmcgYSByZWFkZXIgcmVjb2duaXplcyBjb250cmlidXRlIHRvIHRoZVxuICAvLyByZWFkYWJsZSBoYWxmLiBBbiBvYmplY3Qgd291bGQgdG9rZW5pemUgZnJvbSBgU3RyaW5nKHZhbHVlKWAgYXNcbiAgLy8gYG9iamVjdF9vYmplY3RgLCB3aGljaCBpcyBub2lzZSAtIGl0IHN0aWxsIHNoYXBlcyB0aGUgaGFzaCwgc28gaWRlbnRpdHkgaXNcbiAgLy8gdW5hZmZlY3RlZC5cbiAgY29uc3QgbGFiZWxsZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHBhcnQ7XG4gICAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcImJpZ2ludFwiO1xuICB9KTtcbiAgLy8gVHJ1bmNhdGUgcmF0aGVyIHRoYW4gY2FwIHRocm91Z2ggdGhlIHRva2VuaXplcjogYHRyaW1gIHdvdWxkIERST1AgYSBzaW5nbGVcbiAgLy8gdG9rZW4gbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldCwgdHVybmluZyBvbmUgbG9uZyBuYW1lIGludG8gdGhlIGJhcmUgZmFsbGJhY2sgYW5kXG4gIC8vIG1ha2luZyBldmVyeSBsb25nIG5hbWUgbG9vayBhbGlrZS4gVGhlIGhhc2ggc3RpbGwgc2VwYXJhdGVzIHRoZW0sIGJ1dCB0aGVcbiAgLy8gY2hhbm5lbCBpcyB1bnJlYWRhYmxlIGluIGEgbG9nLlxuICBjb25zdCBib2R5ID0gc3RyaW5nVXRpbHNcbiAgICAudG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyBkZWxpbWl0ZXI6IFwiX1wiIH0sIC4uLmxhYmVsbGVkKVxuICAgIC5zbGljZSgwLCBNQVhfQ0hBTk5FTF9MRU5HVEggLSBzdWZmaXgubGVuZ3RoIC0gMSlcbiAgICAucmVwbGFjZSgvXyskLywgXCJcIik7XG4gIC8vIEFuIGlkZW50aWZpZXIgY2Fubm90IHN0YXJ0IHdpdGggYSBkaWdpdCBhbmQgdGhlIGhhc2ggYWxwaGFiZXQgaXNcbiAgLy8gZGlnaXQtbGVhZGluZywgc28gYSBudW1lcmljIG9yIGVtcHR5IGJvZHkgbmVlZHMgYSBsZXR0ZXIgaW4gZnJvbnQuXG4gIGNvbnN0IHByZWZpeCA9IC9eW0EtWmEtel9dLy50ZXN0KGJvZHkpID8gYm9keSA6IGAke0NIQU5ORUxfRkFMTEJBQ0t9XyR7Ym9keX1gO1xuICByZXR1cm4gYCR7cHJlZml4fV8ke3N1ZmZpeH1gLnJlcGxhY2UoL18rL2csIFwiX1wiKTtcbn1cblxuLyoqIFF1b3RlIGEgdmFsaWRhdGVkIGNoYW5uZWwgZm9yIGBMSVNURU5gL2BVTkxJU1RFTmAsIHdoaWNoIHRha2Ugbm8gcGFyYW1ldGVycy4gKi9cbmZ1bmN0aW9uIHF1b3RlSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGBOT1RJRllgIHBheWxvYWQgaW50byBhbiBlbnZlbG9wZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdGhhdCBpcyBub3Qgb25lLlxuICpcbiAqIFRoZSBjaGFubmVsIGlzIHNoYXJlZCBhbmQgYW55IFBvc3RncmVzIHNlc3Npb24gY2FuIGBwZ19ub3RpZnlgIG9uIGl0LCBzbyBhblxuICogdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgZXhwZWN0ZWQgaW5wdXQsIG5vdCBhbiBleGNlcHRpb24uIFB1Ymxpc2hlcnMgcnVuIHRoaXNcbiAqIG92ZXIgdGhlaXIgb3duIGVuY29kZWQgbWVzc2FnZSB0b28sIHdoaWNoIGlzIGhvdyBhIGJvZHkgdGhhdCBzdHJpbmdpZmllcyBidXRcbiAqIGRvZXMgbm90IHJvdW5kLXRyaXAgaXMgY2F1Z2h0IGJlZm9yZSBpdCBzaGlwcy5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUb3BpY01lc3NhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBqc29uLnBhcnNlUmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFyZWNvcmQgfHxcbiAgICB0eXBlb2YgcmVjb3JkLmlkICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC50b3BpYyAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudHlwZSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQucHVibGlzaGVkQXQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAhcmVjb3JkLm1ldGFkYXRhIHx8XG4gICAgdHlwZW9mIHJlY29yZC5tZXRhZGF0YSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICEoXCJib2R5XCIgaW4gcmVjb3JkKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKHJlY29yZC5ib2R5KVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7XG4gICAgaWQ6IHJlY29yZC5pZCxcbiAgICB0b3BpYzogcmVjb3JkLnRvcGljLFxuICAgIHR5cGU6IHJlY29yZC50eXBlLFxuICAgIG1ldGFkYXRhOiByZWNvcmQubWV0YWRhdGEgYXMgVG9waWNNZXRhZGF0YSxcbiAgICBib2R5OiByZWNvcmQuYm9keSBhcyBTZXJpYWxpemFibGVWYWx1ZSxcbiAgICBwdWJsaXNoZWRBdDogcmVjb3JkLnB1Ymxpc2hlZEF0LFxuICB9O1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdHMgc3RydWN0dXJlZCBtZXNzYWdlcyBieSB0b3BpYyBhbmQgZGVsaXZlcnMgdGhlbSB0byBldmVyeSBwcm9jZXNzXG4gKiBsaXN0ZW5pbmcgb24gdGhlIHNhbWUgY2hhbm5lbC5cbiAqXG4gKiBDT05ORUNUSU9OIFNIQVBFLiBQdWJsaXNoaW5nIGJvcnJvd3MgYSBwb29sZWQgY29ubmVjdGlvbiBwZXIgY2FsbCwgbGlrZSBhbnlcbiAqIG90aGVyIHF1ZXJ5LiBMaXN0ZW5pbmcgY2Fubm90OiBgTElTVEVOYCBpcyBzZXNzaW9uIHN0YXRlLCBzbyB0aGUgYnVzIGhvbGRzIE9ORVxuICogZGVkaWNhdGVkIGNsaWVudCBvdXQgb2YgdGhlIHBvb2wgZm9yIGFzIGxvbmcgYXMgaXQgaGFzIHN1YnNjcmliZXJzLCBubyBtYXR0ZXJcbiAqIGhvdyBtYW55IHRvcGljcyBvciBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuIFNpemUgdGhlIHBvb2wgd2l0aCB0aGF0IG9uZVxuICogbG9uZy1saXZlZCBjaGVja291dCBpbiBtaW5kLlxuICpcbiAqIExJRkVDWUNMRS4gQ29uc3RydWN0aW9uIGlzIGluZXJ0IC0gbm90aGluZyBjb25uZWN0cyB1bnRpbCB0aGUgZmlyc3RcbiAqIHtAbGluayBsaXN0ZW59IChvciBhbiBleHBsaWNpdCB7QGxpbmsgc3RhcnR9KS4ge0BsaW5rIGNsb3NlfSBpcyByZXF1aXJlZCB0byBnaXZlXG4gKiB0aGUgY29ubmVjdGlvbiBiYWNrOyBhIGNsb3NlZCBidXMgc3RheXMgY2xvc2VkIGFuZCB0aHJvd3Mgb24gZnVydGhlciB1c2UgcmF0aGVyXG4gKiB0aGFuIHNpbGVudGx5IHJlY29ubmVjdGluZy4gUmVnaXN0ZXIgaXQgd2l0aCB0aGUgaG9zdCdzIHNodXRkb3duIGhvb2suXG4gKlxuICogRkFJTFVSRSBIQU5ETElORy4gQSBsb3N0IG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHJlY29ubmVjdHMgb24gaXRzIG93biB3aXRoXG4gKiBib3VuZGVkIGJhY2tvZmYgd2hpbGUgc3Vic2NyaWJlcnMgcmVtYWluLCByZXBvcnRpbmcgZWFjaCBmYWlsZWQgYXR0ZW1wdCB0aHJvdWdoXG4gKiBgb25FcnJvcmAuIE1lc3NhZ2VzIHB1Ymxpc2hlZCBkdXJpbmcgdGhlIGdhcCBhcmUgbG9zdCAtIGBOT1RJRllgIGhhcyBubyByZXBsYXkuXG4gKiBBIHRocm93aW5nIG9yIHJlamVjdGluZyBsaXN0ZW5lciBuZXZlciBhZmZlY3RzIHRoZSBwdWJsaXNoZXIgb3IgdGhlIG90aGVyXG4gKiBsaXN0ZW5lcnM7IGl0cyBmYWlsdXJlIGdvZXMgdG8gYG9uRXJyb3JgLlxuICpcbiAqIE5vdCBzYWZlIHRvIHNoYXJlIG9uZSBpbnN0YW5jZSBhY3Jvc3MgdW5yZWxhdGVkIGNoYW5uZWxzIC0gY29uc3RydWN0IG9uZSBidXNcbiAqIHBlciBjaGFubmVsLiBUaGUgY2hhbm5lbCBpdHNlbGYgaXMgREVSSVZFRCBmcm9tIHRoZSBgY2hhbm5lbGAgb3B0aW9uIHJhdGhlclxuICogdGhhbiB0YWtlbiBsaXRlcmFsbHk7IHNlZSB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMuY2hhbm5lbH0gYW5kXG4gKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3Jlc1RvcGljQnVzIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjaGFubmVsIHRoaXMgYnVzIGxpc3RlbnMgYW5kIHB1Ymxpc2hlcyBvbiwgZGVyaXZlZCBmcm9tXG4gICAqIHRoZSBgY2hhbm5lbGAgb3B0aW9uLiBSZWFkIGl0IHRvIGNvbmZpcm0gdHdvIHByb2Nlc3NlcyBhZ3JlZSwgb3IgdG8gbG9nIHdoYXQgYVxuICAgKiBzZXQgb2YgcGFydHMgYWN0dWFsbHkgcmVzb2x2ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PFRvcGljTGlzdGVuZXI+PigpO1xuICBwcml2YXRlIGNsaWVudDogUG9vbENsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWNvbm5lY3Rpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb25uZWN0QWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xuICBwcml2YXRlIHByb3Zpc2lvbmluZz86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQZ1Bvb2xMaWtlICYgUGdRdWVyeWFibGUsXG4gICAgb3B0aW9uczogUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lKFxuICAgICAgb3B0aW9ucy5jaGFubmVsID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NIQU5ORUwgOiBvcHRpb25zLmNoYW5uZWwsXG4gICAgKTtcbiAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZSA9IG9wdGlvbnMucGVyc2lzdFxuICAgICAgPyByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKG9wdGlvbnMucGVyc2lzdCA9PT0gdHJ1ZSA/IHRydWUgOiBvcHRpb25zLnBlcnNpc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBkZWRpY2F0ZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LCBhbmQgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSAtIG92ZXJsYXBwaW5nIGNhbGxzIGF3YWl0IHRoZSBzYW1lXG4gICAqIGluLWZsaWdodCBjb25uZWN0LiB7QGxpbmsgbGlzdGVufSBjYWxscyB0aGlzLCBzbyBpdCBpcyBvbmx5IG5lZWRlZCB0byBzdXJmYWNlXG4gICAqIGEgY29ubmVjdGlvbiBwcm9ibGVtIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb24gZmlyc3Qgc3Vic2NyaWJlLiBUaHJvd3MgaWYgdGhlXG4gICAqIGJ1cyBpcyBjbG9zZWQsIG9yIGlmIHRoZSBwb29sIGNhbm5vdCBoYW5kIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgdGhpcy5zdGFydGluZyA/Pz0gdGhpcy5jb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIG1lc3NhZ2UgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBlbnZlbG9wZSB0aGF0IHdhcyBzZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyBvbmNlIFBvc3RncmVzIGhhcyBhY2NlcHRlZCB0aGUgYE5PVElGWWAsIHdoaWNoIHNheXMgbm90aGluZyBhYm91dFxuICAgKiBhbnlvbmUgcmVjZWl2aW5nIGl0OiBzZXNzaW9ucyBub3QgbGlzdGVuaW5nIGF0IHRoYXQgbW9tZW50IG1pc3MgaXQuIFB1Ymxpc2hpbmdcbiAgICogbmVlZHMgbm8ge0BsaW5rIHN0YXJ0fSBhbmQgbm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIFZhbGlkYXRpb24gaXMgZGVsaWJlcmF0ZWx5IGZyb250LWxvYWRlZCwgc2luY2UgYSBtZXNzYWdlIHRoYXQgZmFpbHMgb24gdGhlXG4gICAqIHdpcmUgaXMgZmFyIGhhcmRlciB0byBkaWFnbm9zZSB0aGFuIG9uZSByZWplY3RlZCBhdCB0aGUgY2FsbDogYFR5cGVFcnJvcmAgZm9yIGFcbiAgICogYmxhbmsgdG9waWMgb3IgdHlwZSwgb3IgYSBib2R5L21ldGFkYXRhIHRoYXQgd291bGQgbm90IHJvdW5kLXRyaXAgdGhyb3VnaCBKU09OXG4gICAqIHVuY2hhbmdlZCAoYG9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlYCk7IGBSYW5nZUVycm9yYCB3aGVuIHRoZSBlbmNvZGVkXG4gICAqIGVudmVsb3BlIGV4Y2VlZHMgdGhlIGBOT1RJRllgIHBheWxvYWQgbGltaXQsIHdoaWNoIHRoZSBhdXRvbWF0aWMgbWV0YWRhdGFcbiAgICogY291bnRzIGFnYWluc3QgLSBzZW5kIGEgcmVmZXJlbmNlIGFuZCBsZXQgdGhlIHJlY2VpdmVyIGZldGNoIHRoZSBwYXlsb2FkLlxuICAgKiBUaHJvd3MgaWYgdGhlIGJ1cyBpcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3Q8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBpbnB1dDogVG9waWNQdWJsaXNoSW5wdXQ8VEJvZHk+LFxuICApOiBQcm9taXNlPFRvcGljTWVzc2FnZTxUQm9keT4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGlmICghaW5wdXQudHlwZS50cmltKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0Lm1ldGFkYXRhID8/IHt9KSB8fFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0LmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBtZXRhZGF0YSBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlIHdpdGhvdXQgY29lcmNpb25cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICBjb25zdCBhdXRvbWF0aWMgPSBhd2FpdCB0aGlzLnJlc29sdmVNZXRhZGF0YSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4gPSB7XG4gICAgICBpZDogaGFzaC5pZCgpLFxuICAgICAgdG9waWMsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgbWV0YWRhdGE6IHsgLi4uYXV0b21hdGljLCAuLi5pbnB1dC5tZXRhZGF0YSB9LFxuICAgICAgYm9keTogaW5wdXQuYm9keSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBsZXQgZW5jb2RlZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1lc3NhZ2UgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgLy8gT25seSB0aGUgZW52ZWxvcGUgcGF5bG9hZCBpcyBib3VuZGVkIGJ5IHRoZSBgTk9USUZZYCBsaW1pdC4gQSBwb2ludGVyXG4gICAgLy8gbm90aWZpY2F0aW9uIGlzIGEgZml4ZWQgaGFuZGZ1bCBvZiBieXRlcywgc28gcGVyc2lzdGVuY2Ugd2l0aFxuICAgIC8vIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbGlmdHMgdGhlIGNhcCBlbnRpcmVseS5cbiAgICBpZiAoXG4gICAgICBCdWZmZXIuYnl0ZUxlbmd0aChlbmNvZGVkLCBcInV0ZjhcIikgPiBNQVhfTk9USUZZX0JZVEVTICYmXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlPy5wYXlsb2FkICE9PSBcInBvaW50ZXJcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc3RncmVzIG5vdGlmaWNhdGlvbiBleGNlZWRzICR7TUFYX05PVElGWV9CWVRFU30gYnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnBvb2wucXVlcnkoXCJTRUxFQ1QgcGdfbm90aWZ5KCQxLCAkMilcIiwgW3RoaXMuY2hhbm5lbE5hbWUsIGVuY29kZWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvdmlzaW9uaW5nID8/PSBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hKHRoaXMucG9vbCwgdGhpcy5wZXJzaXN0ZW5jZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuICAgICAgICBhd2FpdCBwZXJzaXN0ZWROb3RpZnkoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHRoaXMuY2hhbm5lbE5hbWUsXG4gICAgICAgICAgdG9waWMsXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaW5wdXQuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgICAgICBpbnB1dC50dGwgPz8gdGhpcy5wZXJzaXN0ZW5jZS50dGwsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHRocm93IGNhdXNlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBoaXN0b3J5PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBhZnRlcj86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkXCIpO1xuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlLnByb3Zpc2lvbikge1xuICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeTxUQm9keT4odGhpcy5wb29sLCB0aGlzLmNoYW5uZWxOYW1lLCB0b3BpYywgdGhpcy5wZXJzaXN0ZW5jZSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwRXhwaXJlZChcbiAgICBvcHRpb25zOiB7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlOyBsaW1pdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIGNsZWFudXBFeHBpcmVkKFxuICAgICAgdGhpcy5wb29sLFxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgIG9wdGlvbnMuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgIG9wdGlvbnMubGltaXQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBmdW5jdGlvbiB0aGF0IHVuc3Vic2NyaWJlcy5cbiAgICpcbiAgICogQ29ubmVjdHMgb24gZmlyc3QgdXNlLiBTZXZlcmFsIGxpc3RlbmVycyBtYXkgc2hhcmUgYSB0b3BpYzsgZWFjaCBpcyBjYWxsZWRcbiAgICogb25jZSBwZXIgbWVzc2FnZS4gT25seSBtZXNzYWdlcyBwdWJsaXNoZWQgQUZURVIgdGhpcyByZXNvbHZlcyBhcnJpdmUsIHNvXG4gICAqIHN1YnNjcmliZSBiZWZvcmUgdHJpZ2dlcmluZyB3aGF0ZXZlciB5b3UgZXhwZWN0IHRvIG9ic2VydmUuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiByZW1vdmVzIGp1c3QgdGhpcyBsaXN0ZW5lciBhbmQgaXMgc2FmZSB0byBjYWxsIHR3aWNlLlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF5cyBvcGVuIG9uY2UgdGhlIGxhc3QgbGlzdGVuZXIgbGVhdmVzIC0ge0BsaW5rIGNsb3NlfVxuICAgKiByZWxlYXNlcyBpdCAtIHNvIGEgYnVzIHRoYXQgc3Vic2NyaWJlcyBhbmQgdW5zdWJzY3JpYmVzIHBlciByZXF1ZXN0IGRvZXMgbm90XG4gICAqIGNodXJuIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXN5bmMgbGlzdGVuPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgbGlzdGVuZXI6IFRvcGljTGlzdGVuZXI8VEJvZHk+LFxuICApOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5nZXQodG9waWMpID8/IG5ldyBTZXQ8VG9waWNMaXN0ZW5lcj4oKTtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzLnNldCh0b3BpYywgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lciBhcyBUb3BpY0xpc3RlbmVyKTtcbiAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSA9PT0gMCkgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKHRvcGljKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBhdXRvbWF0aWMgaGFsZiBvZiBhIG1lc3NhZ2UncyBtZXRhZGF0YS5cbiAgICpcbiAgICogUHJlY2VkZW5jZSwgd2Vha2VzdCBmaXJzdDogbWFjaGluZS9wcm9jZXNzIGNvbnRleHQsIHRoZW4gQXBwS2l0IHNlbmRlclxuICAgKiBpZGVudGl0eSwgdGhlbiB0aGlzIGJ1cydzIGNvbmZpZ3VyZWQgbWV0YWRhdGEuIFRoZSBjYWxsZXIncyBwZXItbWVzc2FnZVxuICAgKiBtZXRhZGF0YSBpcyBsYXllcmVkIG92ZXIgdGhlIHJlc3VsdCBpbiB7QGxpbmsgYnJvYWRjYXN0fSwgc28gdGhlIG1vc3Qgc3BlY2lmaWNcbiAgICogc291cmNlIGFsd2F5cyB3aW5zIGFuZCBub3RoaW5nIGhlcmUgY2FuIG92ZXJ3cml0ZSBhbiBleHBsaWNpdCBrZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgICBjb25zdCBzZW5kZXIgPSBhd2FpdCBzZW5kZXJNZXRhZGF0YSgpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgdHlwZW9mIHRoaXMubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMubWV0YWRhdGEoKSA6ICh0aGlzLm1ldGFkYXRhID8/IHt9KTtcbiAgICByZXR1cm4geyAuLi5tYWNoaW5lTWV0YWRhdGEoKSwgLi4uc2VuZGVyLCAuLi5jb25maWd1cmVkIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIHN0b3AgZGVsaXZlcmluZyBtZXNzYWdlcy4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQ2FuY2VscyBhbnkgcGVuZGluZyByZWNvbm5lY3QsIGRyb3BzIGFsbCBsaXN0ZW5lcnMsIHRoZW4gYFVOTElTVEVOYHMgYW5kXG4gICAqIHJldHVybnMgdGhlIGNsaWVudCB0byB0aGUgcG9vbC4gQSBmYWlsZWQgYFVOTElTVEVOYCBpcyByZXBvcnRlZCB0byB0aGUgcG9vbCBhc1xuICAgKiBhIHJlbGVhc2UgZXJyb3Igc28gdGhlIGNvbm5lY3Rpb24gaXMgRElTQ0FSREVEIHJhdGhlciB0aGFuIGhhbmRlZCB0byB0aGUgbmV4dFxuICAgKiBjYWxsZXIgc3RpbGwgc3Vic2NyaWJlZCB0byB0aGUgY2hhbm5lbC4gRG9lcyBub3QgdGhyb3c7IHRoZSBidXMgc3RheXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb25uZWN0QWJvcnQuYWJvcnQobmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBhd2FpdCB0aGlzLnJlY29ubmVjdGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBsZXQgcmVsZWFzZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBVTkxJU1RFTiAke3F1b3RlSWRlbnRpZmllcih0aGlzLmNoYW5uZWxOYW1lKX1gKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgcmVsZWFzZUVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKTtcbiAgICB9XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBvdXQgb25lIGNsaWVudCwgYXR0YWNoIHRoZSBoYW5kbGVycywgYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBUaGUgaGFuZGxlcnMgYXJlIGF0dGFjaGVkIEJFRk9SRSB0aGUgYExJU1RFTmAgcm91bmQgdHJpcCBzbyBhIG5vdGlmaWNhdGlvbiBvclxuICAgKiBlcnJvciBhcnJpdmluZyBtaWQtc2V0dXAgaXMgbm90IG1pc3NlZC4gQW55IGZhaWx1cmUgLSBpbmNsdWRpbmcgdGhlIGJ1cyBiZWluZ1xuICAgKiBjbG9zZWQgd2hpbGUgdGhlIGNvbm5lY3Qgd2FzIGluIGZsaWdodCAtIGRldGFjaGVzIHRoZSBoYW5kbGVycyBhbmQgcmVsZWFzZXNcbiAgICogdGhlIGNsaWVudCBhcyBlcnJvcmVkLCBzbyBhIGhhbGYtY29uZmlndXJlZCBjb25uZWN0aW9uIG5ldmVyIHJldHVybnMgdG8gdGhlXG4gICAqIHBvb2wuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtxdW90ZUlkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKSk7XG4gICAgICB0aHJvdyBjYXVzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgb25lIGluYm91bmQgbm90aWZpY2F0aW9uIHRvIHRoZSB0b3BpYydzIGxpc3RlbmVycy5cbiAgICpcbiAgICogSWdub3JlcyBvdGhlciBjaGFubmVscyBhbmQgdW5kZWNvZGFibGUgcGF5bG9hZHMgLSB0aGUgY2hhbm5lbCBpcyBzaGFyZWQsIHNvXG4gICAqIGJvdGggYXJlIG9yZGluYXJ5IHRyYWZmaWMuIExpc3RlbmVycyBhcmUgaW52b2tlZCBjb25jdXJyZW50bHkgYW5kIHRoZWlyXG4gICAqIHJlamVjdGlvbnMgZ28gdG8gYG9uRXJyb3JgLCBrZWVwaW5nIG9uZSBzbG93IG9yIGJyb2tlbiBzdWJzY3JpYmVyIGZyb21cbiAgICogc3RhbGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVOb3RpZmljYXRpb24gPSAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkID0+IHtcbiAgICBpZiAobm90aWZpY2F0aW9uLmNoYW5uZWwgIT09IHRoaXMuY2hhbm5lbE5hbWUpIHJldHVybjtcbiAgICBjb25zdCBtZXNzYWdlID0gZGVjb2RlKG5vdGlmaWNhdGlvbi5wYXlsb2FkKTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgdGhpcy5kZWxpdmVyKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgcGF5bG9hZDogXCJwb2ludGVyXCJgIGNhcnJpZXMgb25seSByb3V0aW5nIGFuZCBpZGVudGl0eSwgc28gdGhlIGVudmVsb3BlIGhhc1xuICAgIC8vIHRvIGJlIHJlYWQgYmFjayBiZWZvcmUgYW55dGhpbmcgY2FuIGJlIGRlbGl2ZXJlZC4gT25seSBhdHRlbXB0ZWQgd2hlbiB0aGlzXG4gICAgLy8gYnVzIGlzIGNvbmZpZ3VyZWQgZm9yIHBlcnNpc3RlbmNlOyBvdGhlcndpc2UgdGhlIHBheWxvYWQgaXMgZm9yZWlnbiB0cmFmZmljXG4gICAgLy8gb24gYSBzaGFyZWQgY2hhbm5lbCBhbmQgaWdub3JlZCBhcyBiZWZvcmUuXG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMucGVyc2lzdGVuY2UgPyBkZWNvZGVQb2ludGVyKG5vdGlmaWNhdGlvbi5wYXlsb2FkKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBvaW50ZXIpIHJldHVybjtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhwb2ludGVyLnRvcGljKSkgcmV0dXJuO1xuICAgIHJlYWRQb2ludGVyKHRoaXMucG9vbCwgdGhpcy5jaGFubmVsTmFtZSwgcG9pbnRlciwgdGhpcy5wZXJzaXN0ZW5jZSEpXG4gICAgICAudGhlbigoc3RvcmVkKSA9PiB7XG4gICAgICAgIGlmIChzdG9yZWQpIHRoaXMuZGVsaXZlcihzdG9yZWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCh0aGlzLm9uRXJyb3IpO1xuICB9O1xuXG4gIC8qKiBIYW5kIG9uZSBkZWNvZGVkIG1lc3NhZ2UgdG8gdGhlIHRvcGljJ3MgbGlzdGVuZXJzLiAqL1xuICBwcml2YXRlIGRlbGl2ZXIobWVzc2FnZTogVG9waWNNZXNzYWdlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycy5nZXQobWVzc2FnZS50b3BpYykgPz8gW10pIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShsaXN0ZW5lcihtZXNzYWdlKSkuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBkeWluZywgd2hpY2ggYHBnYCByZXBvcnRzIGFzIGFuIGBlcnJvcmBcbiAgICogZXZlbnQgcmF0aGVyIHRoYW4gYSByZWplY3RlZCBxdWVyeS5cbiAgICpcbiAgICogVGhlIGNsaWVudCBpcyB1bnVzYWJsZSBhdCB0aGlzIHBvaW50LCBzbyBpdCBpcyBkZXRhY2hlZCBhbmQgcmVsZWFzZWQgYXNcbiAgICogZXJyb3JlZCAod2hpY2ggZGlzY2FyZHMgaXQpIGJlZm9yZSBhbnl0aGluZyBlbHNlLiBSZWNvbm5lY3Rpb24gb25seSBzdGFydHNcbiAgICogd2hlbiB0aGVyZSBpcyBzdGlsbCBzb21lb25lIHRvIGRlbGl2ZXIgdG8sIHNvIGFuIGlkbGUgb3IgY2xvc2luZyBidXMgZG9lcyBub3RcbiAgICogaG9sZCBhIGNvbm5lY3Rpb24gb3BlbiBjaGFzaW5nIGEgY2hhbm5lbCBub2JvZHkgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsaWVudEVycm9yID0gKGNhdXNlOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgIHRoaXMub25FcnJvcihjYXVzZSk7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGNsaWVudC5yZWxlYXNlKGNhdXNlKTtcbiAgICBpZiAodGhpcy5jbG9zZWQgfHwgdGhpcy5saXN0ZW5lcnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb25uZWN0aW5nID8/PSB0aGlzLnJlY29ubmVjdCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGlzaCB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gd2l0aCBib3VuZGVkIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqXG4gICAqIFRoZSBmaXJzdCBhdHRlbXB0IGlzIGltbWVkaWF0ZSwgc2luY2UgdGhlIGNvbW1vbiBjYXNlIGlzIGEgc2luZ2xlIGRyb3BwZWRcbiAgICogY29ubmVjdGlvbiB0aGF0IHJlY29ubmVjdHMgYXQgb25jZTsgc3Vic2VxdWVudCBkZWxheXMgZG91YmxlIGZyb20gMjUwbXMgdXAgdG9cbiAgICogNXMgYW5kIHN0YXkgdGhlcmUuIFJldHJpZXMgaW5kZWZpbml0ZWx5IHJhdGhlciB0aGFuIGdpdmluZyB1cCwgYmVjYXVzZSBhIFBvc3RncmVzIHJlc3RhcnRcbiAgICogb3IgYSByb3RhdGVkIExha2ViYXNlIGNyZWRlbnRpYWwgaXMgYSByZWNvdmVyYWJsZSBvdXRhZ2UgYW5kIGEgc2lsZW50bHkgZGVhZFxuICAgKiBsaXN0ZW5lciBpcyB3b3JzZSB0aGFuIGEgbm9pc3kgb25lLiBTdG9wcyB3aGVuIHRoZSBidXMgY2xvc2VzIG9yIHRoZSBsYXN0XG4gICAqIGxpc3RlbmVyIGxlYXZlcywgYW5kIHJlcG9ydHMgZXZlcnkgZmFpbGVkIGF0dGVtcHQgdGhyb3VnaCBgb25FcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZGVsYXkgPSAwO1xuICAgIHdoaWxlICghdGhpcy5jbG9zZWQgJiYgdGhpcy5saXN0ZW5lcnMuc2l6ZSA+IDApIHtcbiAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKGRlbGF5LCB0aGlzLnJlY29ubmVjdEFib3J0LnNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICAgICAgZGVsYXkgPSBkZWxheSA9PT0gMCA/IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgOiBNYXRoLm1pbihkZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@databricks/appkit": "0.81.0",
23
- "@dbx-tools/test-polyglot": "^0.9.4",
23
+ "@dbx-tools/test-polyglot": "^0.9.6",
24
24
  "@types/bun": "1.3.14",
25
25
  "@types/node": "^24.6.0",
26
26
  "@types/pg": "^8",
@@ -30,7 +30,8 @@
30
30
  "@databricks/appkit": "0.81.0"
31
31
  },
32
32
  "dependencies": {
33
- "@dbx-tools/shared-core": "^0.9.4",
33
+ "@dbx-tools/core-rs": "^0.9.6",
34
+ "@dbx-tools/shared-core": "^0.9.6",
34
35
  "pg": "^8.22.0"
35
36
  },
36
37
  "main": "./lib/index.js",
@@ -47,7 +48,7 @@
47
48
  "./package.json": "./package.json"
48
49
  }
49
50
  },
50
- "version": "0.9.4",
51
+ "version": "0.9.6",
51
52
  "types": "./lib/index.d.ts",
52
53
  "type": "module",
53
54
  "exports": {
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
 
11
- import { createHash } from "node:crypto";
11
+ import { advisoryLockId as nativeAdvisoryLockId } from "@dbx-tools/core-rs";
12
12
  import { object } from "@dbx-tools/shared-core";
13
13
  import type { Pool, PoolClient, QueryResult, QueryResultRow } from "pg";
14
14
 
@@ -51,10 +51,7 @@ type UnlockRow = QueryResultRow & { unlocked: boolean };
51
51
  export function advisoryLockId(key: AdvisoryLockKey): bigint {
52
52
  if (typeof key === "bigint") return BigInt.asIntN(SIGNED_BIGINT_BITS, key);
53
53
  const parts = object.toOneOrMany(key);
54
- const digest = createHash("sha256")
55
- .update(parts.map((part) => object.toStableKey(part)).join("\u0000"))
56
- .digest();
57
- return digest.readBigInt64BE(0);
54
+ return nativeAdvisoryLockId(parts.map((part) => object.toStableKey(part)));
58
55
  }
59
56
 
60
57
  async function acquire(client: PgQueryable, id: bigint, transaction: boolean): Promise<void> {
package/src/topic-bus.ts CHANGED
@@ -25,7 +25,7 @@
25
25
  */
26
26
 
27
27
  import { hostname } from "node:os";
28
- import { async as sharedAsync, error, hash, json, object, string } from "@dbx-tools/shared-core";
28
+ import { asyncUtils, errorUtils, hash, json, object, stringUtils } from "@dbx-tools/shared-core";
29
29
  import type { Notification, PoolClient } from "pg";
30
30
 
31
31
  import type { PgPoolLike, PgQueryable } from "./advisory-lock.ts";
@@ -234,7 +234,7 @@ function definedMetadata(values: Record<string, SerializableValue | undefined>):
234
234
  function machineMetadata(): TopicMetadata {
235
235
  return definedMetadata({
236
236
  project:
237
- string.firstNonEmpty([
237
+ stringUtils.firstNonEmpty([
238
238
  process.env.DATABRICKS_APP_NAME,
239
239
  process.env.DATABRICKS_BUNDLE_NAME,
240
240
  process.env.PROJECT_NAME,
@@ -242,10 +242,10 @@ function machineMetadata(): TopicMetadata {
242
242
  ]) ?? undefined,
243
243
  hostname: hostname(),
244
244
  platform: process.platform,
245
- environment: string.trimToNull(process.env.NODE_ENV) ?? undefined,
246
- appName: string.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
247
- deploymentId: string.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
248
- databricksHost: string.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
245
+ environment: stringUtils.trimToNull(process.env.NODE_ENV) ?? undefined,
246
+ appName: stringUtils.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
247
+ deploymentId: stringUtils.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
248
+ databricksHost: stringUtils.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
249
249
  });
250
250
  }
251
251
 
@@ -268,9 +268,9 @@ async function senderMetadata(): Promise<TopicMetadata> {
268
268
  try {
269
269
  const context = appkit.getExecutionContext();
270
270
  return definedMetadata({
271
- senderId: string.trimToNull(context.userId) ?? undefined,
272
- senderName: string.trimToNull(context.userName) ?? undefined,
273
- senderEmail: string.trimToNull(context.userEmail) ?? undefined,
271
+ senderId: stringUtils.trimToNull(context.userId) ?? undefined,
272
+ senderName: stringUtils.trimToNull(context.userName) ?? undefined,
273
+ senderEmail: stringUtils.trimToNull(context.userEmail) ?? undefined,
274
274
  });
275
275
  } catch {
276
276
  return {};
@@ -321,7 +321,7 @@ export function channelName(value: unknown): string {
321
321
  // token longer than the budget, turning one long name into the bare fallback and
322
322
  // making every long name look alike. The hash still separates them, but the
323
323
  // channel is unreadable in a log.
324
- const body = string
324
+ const body = stringUtils
325
325
  .toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
326
326
  .slice(0, MAX_CHANNEL_LENGTH - suffix.length - 1)
327
327
  .replace(/_+$/, "");
@@ -489,7 +489,7 @@ export class PostgresTopicBus {
489
489
  try {
490
490
  encoded = JSON.stringify(message);
491
491
  } catch (cause) {
492
- throw new TypeError(`Message must be JSON serializable: ${error.errorMessage(cause)}`);
492
+ throw new TypeError(`Message must be JSON serializable: ${errorUtils.errorMessage(cause)}`);
493
493
  }
494
494
  if (!decode(encoded)) {
495
495
  throw new TypeError("Message type, metadata, and body must be JSON serializable");
@@ -624,7 +624,7 @@ export class PostgresTopicBus {
624
624
  try {
625
625
  await client.query(`UNLISTEN ${quoteIdentifier(this.channelName)}`);
626
626
  } catch (cause) {
627
- releaseError = error.toError(cause);
627
+ releaseError = errorUtils.toError(cause);
628
628
  }
629
629
  client.release(releaseError);
630
630
  }
@@ -649,7 +649,7 @@ export class PostgresTopicBus {
649
649
  } catch (cause) {
650
650
  client.removeListener("notification", this.handleNotification);
651
651
  client.removeListener("error", this.handleClientError);
652
- client.release(error.toError(cause));
652
+ client.release(errorUtils.toError(cause));
653
653
  throw cause;
654
654
  }
655
655
  }
@@ -728,7 +728,7 @@ export class PostgresTopicBus {
728
728
  while (!this.closed && this.listeners.size > 0) {
729
729
  if (delay > 0) {
730
730
  try {
731
- await sharedAsync.sleep(delay, this.reconnectAbort.signal);
731
+ await asyncUtils.sleep(delay, this.reconnectAbort.signal);
732
732
  } catch {
733
733
  return;
734
734
  }