@bitgo/sdk-coin-avaxp 5.7.23 → 5.7.26

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.
@@ -1 +1 @@
1
- {"version":3,"file":"deprecatedTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA2ChC,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAMxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CA6BrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
1
+ {"version":3,"file":"deprecatedTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAqDhC,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CA0BxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAK5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAoC3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CA6BrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
@@ -11,6 +11,16 @@ const utils_1 = __importDefault(require("./utils"));
11
11
  function isEmptySignature(s) {
12
12
  return !!s && s.startsWith(''.padStart(90, '0'));
13
13
  }
14
+ // An address placeholder is 90 zero hex chars (45-byte prefix) followed by a 20-byte address.
15
+ // A purely empty slot is all zeros. Non-zero bytes after position 90 distinguish the two.
16
+ // This matters for toBroadcastFormat(): a real ECDSA alongside an addr placeholder is the
17
+ // exact shape produced by the hasCredentials guard bypass (CECHO-1697) and must be blocked.
18
+ function isAddrPlaceholder(s) {
19
+ if (!isEmptySignature(s))
20
+ return false;
21
+ const suffix = s.substring(90);
22
+ return suffix.length > 0 && suffix !== ''.padStart(suffix.length, '0');
23
+ }
14
24
  /**
15
25
  * Signatures are prestore as empty buffer for hsm and address of signar for first signature.
16
26
  * When sign is required, this method return the function that identify a signature to be replaced.
@@ -59,17 +69,39 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
59
69
  return this._avaxTransaction.getUnsignedTx().getTransaction();
60
70
  }
61
71
  get signature() {
62
- if (this.credentials.length === 0) {
72
+ if (!this.credentials || this.credentials.length === 0) {
63
73
  return [];
64
74
  }
65
- const obj = this.credentials[0].serialize();
66
- return obj.sigArray.map((s) => s.bytes).filter((s) => !isEmptySignature(s));
75
+ // Use the intersection of non-empty ECDSAs across all credentials. A signer's
76
+ // ECDSA is counted only if it appears in every credential (every input). Since
77
+ // RFC6979 is deterministic, the same key produces identical bytes for the same
78
+ // tx across all credentials. The intersection catches corrupt states where one
79
+ // credential is missing a signature that another credential already has.
80
+ let intersection = null;
81
+ for (const c of this.credentials) {
82
+ const cs = c.serialize();
83
+ const credSigs = new Set(cs.sigArray.map((s) => s.bytes).filter((b) => !isEmptySignature(b)));
84
+ if (intersection === null) {
85
+ intersection = credSigs;
86
+ }
87
+ else {
88
+ for (const sig of intersection) {
89
+ if (!credSigs.has(sig)) {
90
+ intersection.delete(sig);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ return intersection ? [...intersection] : [];
67
96
  }
68
97
  get credentials() {
69
98
  return this._avaxTransaction?.credentials;
70
99
  }
71
100
  get hasCredentials() {
72
- return this.credentials !== undefined && this.credentials.length > 0;
101
+ // Guard against credential regeneration whenever credentials have been set from a parsed tx.
102
+ // Must use != null (not length check) so credentials=[] still blocks buildAvaxTransaction()
103
+ // from wiping a partially-signed state.
104
+ return this.credentials != null;
73
105
  }
74
106
  /** @inheritdoc */
75
107
  canSign({ key }) {
@@ -94,7 +126,7 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
94
126
  if (!this.avaxPTransaction) {
95
127
  throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
96
128
  }
97
- if (!this.hasCredentials) {
129
+ if (!this.credentials || this.credentials.length === 0) {
98
130
  throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
99
131
  }
100
132
  const signature = this.createSignature(prv);
@@ -124,6 +156,33 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
124
156
  if (!this.avaxPTransaction) {
125
157
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
126
158
  }
159
+ // Block the exact shape produced by the hasCredentials guard bypass (CECHO-1697):
160
+ // a real ECDSA alongside an address placeholder (r=0) in the same credential set.
161
+ // Normal states are safe: unsigned txs have credentials=null (not yet set); half-signed
162
+ // txs have empty-zero slots (not addr placeholders) in unfilled positions.
163
+ // credentials=[] is always a bug: hasCredentials returns true for [] but the array is
164
+ // empty, so no signer has touched the tx — serializing it would produce a zero-credential tx.
165
+ if (this.credentials != null && this.credentials.length === 0) {
166
+ throw new sdk_core_1.InvalidTransactionError('transaction has no credentials — cannot broadcast');
167
+ }
168
+ if (this.credentials && this.credentials.length > 0) {
169
+ let hasRealSig = false;
170
+ let hasAddrPlaceholder = false;
171
+ for (const c of this.credentials) {
172
+ const cs = c.serialize();
173
+ for (const s of cs.sigArray) {
174
+ if (!isEmptySignature(s.bytes)) {
175
+ hasRealSig = true;
176
+ }
177
+ else if (isAddrPlaceholder(s.bytes)) {
178
+ hasAddrPlaceholder = true;
179
+ }
180
+ }
181
+ }
182
+ if (hasRealSig && hasAddrPlaceholder) {
183
+ throw new sdk_core_1.InvalidTransactionError('transaction has a real ECDSA alongside an address placeholder (r=0): incomplete signing detected, refusing broadcast');
184
+ }
185
+ }
127
186
  return this._avaxTransaction.toStringHex();
128
187
  }
129
188
  // types - stakingTransaction, import, export
@@ -341,4 +400,4 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
341
400
  }
342
401
  }
343
402
  exports.DeprecatedTransaction = DeprecatedTransaction;
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXByZWNhdGVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBUXlCO0FBRXpCLG1DQVFpQjtBQUdqQix5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBWTVCLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFpQztJQUNsRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNqQyxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUM7WUFDekIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTix3QkFBd0I7UUFDeEIsT0FBTyxVQUFVLEdBQUcsRUFB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QUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzdCLE9BQU8sR0FBRyxDQUFDO1lBQ2I7Z0JBQ0UsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpWRCxzREFpVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHtcbiAgRGVwcmVjYXRlZEJhc2VUeCxcbiAgRGVjb2RlZFV0eG9PYmosXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIERlcHJlY2F0ZWRUeCxcbiAgVHhEYXRhLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIEFERFJFU1NfU0VQQVJBVE9SLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEFkZERlbGVnYXRvclR4LCBBbW91bnRJbnB1dCwgQmFzZVR4IGFzIFBWTUJhc2VUeCwgRXhwb3J0VHgsIEltcG9ydFR4IH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvYXBpcy9wbGF0Zm9ybXZtJztcbmltcG9ydCB7IEV4cG9ydFR4IGFzIEVWTUV4cG9ydFR4LCBJbXBvcnRUeCBhcyBFVk1JbXBvcnRUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvY29tbW9uJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbi8vIHJlZ2lvbiB1dGlscyB0byBzaWduXG5pbnRlcmZhY2Ugc2lnbmF0dXJlU2VyaWFsaXplZCB7XG4gIGJ5dGVzOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgQ2hlY2tTaWduYXR1cmUge1xuICAoc2lnYXR1cmU6IHNpZ25hdHVyZVNlcmlhbGl6ZWQsIGFkZHJlc3NIZXg6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXMgJiYgcy5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuLyoqXG4gKiBTaWduYXR1cmVzIGFyZSBwcmVzdG9yZSBhcyBlbXB0eSBidWZmZXIgZm9yIGhzbSBhbmQgYWRkcmVzcyBvZiBzaWduYXIgZm9yIGZpcnN0IHNpZ25hdHVyZS5cbiAqIFdoZW4gc2lnbiBpcyByZXF1aXJlZCwgdGhpcyBtZXRob2QgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGlkZW50aWZ5IGEgc2lnbmF0dXJlIHRvIGJlIHJlcGxhY2VkLlxuICogQHBhcmFtIHNpZ25hdHVyZXMgYW55IHNpZ25hdHVyZXMgYXMgc2FtcGxlcyB0byBpZGVudGlmeSB3aGljaCBzaWduYXR1cmUgcmVxdWlyZWQgcmVwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzaWduYXR1cmVTZXJpYWxpemVkW10pOiBDaGVja1NpZ25hdHVyZSB7XG4gIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDEgJiYgc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHViID0gc2lnLmJ5dGVzLnN1YnN0cmluZyg5MCk7XG4gICAgICAgIHJldHVybiBwdWIgPT09IGFkZHJlc3M7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICBpZiAoaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBEZXByZWNhdGVkVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogRGVwcmVjYXRlZFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBCdWZmZXJBdmF4O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWU6IEJOID0gbmV3IEJOKDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3Jld2FyZEFkZHJlc3NlczogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRCk7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCk7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBEZXByZWNhdGVkQmFzZVR4IHtcbiAgICByZXR1cm4gdGhpcy5fYXZheFRyYW5zYWN0aW9uLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5jcmVkZW50aWFsc1swXS5zZXJpYWxpemUoKTtcbiAgICByZXR1cm4gb2JqLnNpZ0FycmF5Lm1hcCgocykgPT4gcy5ieXRlcykuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBhbnkpPy5jcmVkZW50aWFscztcbiAgfVxuXG4gIGdldCBoYXNDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPKEJHLTU2NzAwKTogIEltcHJvdmUgY2FuU2lnbiBieSBjaGVjayBpbiBhZGRyZXNzZXMgaW4gZW1wdHkgY3JlZGVudGlhbHMgbWF0Y2ggc2lnbmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiB2YWxpZGF0b3IsIGRlbGVnYXRvciwgaW1wb3J0LCBleHBvcnRzIGV4dGVuZCBiYXNlVHhcbiAgICogdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCkgIChiYXNlVHggPSBhZGRWYWxpZGF0b3JUeClcbiAgICogY29uc3QgdHg6IFR4ID0gdW5zaWduZWRUeC5zaWduKGtleWNoYWluKSAodHggaXMgdHlwZSBzdGFuZGFyZCBzaWduZWQgdHgpXG4gICAqIGdldCBiYXNlVHggdGhlbiBjcmVhdGUgbmV3IHVuc2lnbmVkVHggdGhlbiBzaWduXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuY3JlYXRlU2lnbmF0dXJlKHBydik7XG4gICAgbGV0IGNoZWNrU2lnbjogQ2hlY2tTaWduYXR1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jcmVkZW50aWFscy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY3M6IGFueSA9IGMuc2VyaWFsaXplKCk7XG4gICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjcy5zaWdBcnJheSk7XG4gICAgICB9XG4gICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgY3Muc2lnQXJyYXkuZm9yRWFjaCgoc2lnKSA9PiB7XG4gICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICBzaWcuYnl0ZXMgPSBzaWduYXR1cmU7XG4gICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFmaW5kKSB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIGMuZGVzZXJpYWxpemUoY3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9TdHJpbmdIZXgoKTtcbiAgfVxuXG4gIC8vIHR5cGVzIC0gc3Rha2luZ1RyYW5zYWN0aW9uLCBpbXBvcnQsIGV4cG9ydFxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5zb3VyY2VDaGFpbixcbiAgICAgIGRlc3RpbmF0aW9uQ2hhaW46IHRoaXMuZGVzdGluYXRpb25DaGFpbixcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IERlcHJlY2F0ZWRUeCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YXhUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHNpZ25lZCBpbiBCdWZmZXIgZm9ybWF0LlxuICAgKiBPbmx5IG5lZWRlZCBmb3IgY29pbnMgdGhhdCBzdXBwb3J0IGFkZGluZyBzaWduYXR1cmVzIGRpcmVjdGx5IChlLmcuIFRTUykuXG4gICAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLnRvQnVmZmVyKCkpO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyQXZheC5mcm9tKHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9CdWZmZXIoKSkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KVxuICAgICAgICAgIC5nZXRPdXRzKClcbiAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgaWYgKHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKSkge1xuICAgICAgICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEVWTUV4cG9ydFR4KVxuICAgICAgICAgICAgLmdldEV4cG9ydGVkT3V0cHV0cygpXG4gICAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeClcbiAgICAgICAgICAgIC5nZXRFeHBvcnRPdXRwdXRzKClcbiAgICAgICAgICAgIC5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3I6XG4gICAgICAgIC8vIEdldCBzdGFrZWQgb3V0cHV0c1xuICAgICAgICBjb25zdCBhZGRWYWxpZGF0b3JUeCA9IHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBBZGREZWxlZ2F0b3JUeDtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBhZGRWYWxpZGF0b3JUeC5nZXROb2RlSURTdHJpbmcoKSxcbiAgICAgICAgICAgIHZhbHVlOiBhZGRWYWxpZGF0b3JUeC5nZXRTdGFrZUFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgVHJhbnNhc2N0aW9uIEZlZS5cbiAgICovXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIC8vIEMtY2hhaW4gdHggYWRuIEltcG9ydCBUeHMgZG9uJ3QgaGF2ZSBjaGFuZ2Ugb3V0cHV0c1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkltcG9ydCB8fFxuICAgICAgdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIGdlbmVyYWwgc3VwcG9ydCBhbnkgdHJhbnNhY3Rpb24gdHlwZSwgYnV0IGl0J3Mgc2NvcGVkIHlldFxuICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0T3V0cygpLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEVudHJ5W10ge1xuICAgIGxldCBpbnB1dHM7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRJbXBvcnRJbnB1dHMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFVk1FeHBvcnRUeCkuZ2V0SW5wdXRzKCkubWFwKChldm1JbnB1dCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcweCcgKyBldm1JbnB1dC5nZXRBZGRyZXNzU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogbmV3IEJOKChldm1JbnB1dCBhcyBhbnkpLmFtb3VudCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5vbmNlOiBldm1JbnB1dC5nZXROb25jZSgpLnRvTnVtYmVyKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgUFZNQmFzZVR4KS5nZXRJbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0SW5zKCk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgYW1vdW50SW5wdXQgPSBpbnB1dC5nZXRJbnB1dCgpIGFzIGFueSBhcyBBbW91bnRJbnB1dDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiB1dGlscy5jYjU4RW5jb2RlKGlucHV0LmdldFR4SUQoKSkgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dGlscy5vdXRwdXRpZHhCdWZmZXJUb051bWJlcihpbnB1dC5nZXRPdXRwdXRJZHgoKSksXG4gICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgIHZhbHVlOiBhbW91bnRJbnB1dC5nZXRBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4IHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ252YWwgPSB1dGlscy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKFxuICAgICAgdGhpcy5fbmV0d29yayxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnNpZ25hYmxlUGF5bG9hZCksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gICAgcmV0dXJuIHNpZ252YWwudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnaW5wdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICd0eXBlJ107XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0eEpzb24uY2hhbmdlT3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKFtUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yLCBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIFAgY2hhaW5cbiAgICovXG4gIGdldCBpc1RyYW5zYWN0aW9uRm9yQ0NoYWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBzb3VyY2UgY2hhaW4gaWQgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBjcm9zcyBjaGFpbiB0cmFuc2Zlci5cbiAgICovXG4gIGdldCBzb3VyY2VDaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRTb3VyY2VDaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeCB8IEVWTUV4cG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBkZXN0aW5hdGlvbkNoYWluIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgY3Jvc3MgY2hhaW4gdHJhbnNmZXIuXG4gICAqL1xuICBnZXQgZGVzdGluYXRpb25DaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHggfCBFVk1FeHBvcnRUeCkuZ2V0RGVzdGluYXRpb25DaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgYmxvY2tjaGFpbklkIGJ1ZmZlciB0byBzdHJpbmcgYW5kIHJldHVybiBQIG9yIEMgYWxpYXMgaWYgbWF0Y2ggb2YgYW55IG9mIHRoYXQgY2hhaW5zLlxuICAgKiBAcGFyYW0ge0J1ZmZlckF2YXh9IGJsb2NrY2hhaW5JREJ1ZmZlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJsb2NjaGFpbklEIG9yIGFsaWFzIGlmIGV4aXN0cy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSURCdWZmZXI6IEJ1ZmZlckF2YXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJsb2NrY2hhaW5JZCA9IHV0aWxzLmNiNThFbmNvZGUoYmxvY2tjaGFpbklEQnVmZmVyKTtcbiAgICBzd2l0Y2ggKGJsb2NrY2hhaW5JZCkge1xuICAgICAgY2FzZSB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRDpcbiAgICAgICAgcmV0dXJuICdDJztcbiAgICAgIGNhc2UgdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQ6XG4gICAgICAgIHJldHVybiAnUCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYmxvY2tjaGFpbklkO1xuICAgIH1cbiAgfVxufVxuIl19
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXByZWNhdGVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBUXlCO0FBRXpCLG1DQVFpQjtBQUdqQix5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBWTVCLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDBGQUEwRjtBQUMxRiw0RkFBNEY7QUFDNUYsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsVUFBaUM7SUFDbEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLG9CQUFvQjtRQUNwQixPQUFPLFVBQVUsR0FBRyxFQUFFLE9BQU87WUFDM0IsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxn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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQge1xuICBEZXByZWNhdGVkQmFzZVR4LFxuICBEZWNvZGVkVXR4b09iaixcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgRGVwcmVjYXRlZFR4LFxuICBUeERhdGEsXG4gIElOUFVUX1NFUEFSQVRPUixcbiAgQUREUkVTU19TRVBBUkFUT1IsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQWRkRGVsZWdhdG9yVHgsIEFtb3VudElucHV0LCBCYXNlVHggYXMgUFZNQmFzZVR4LCBFeHBvcnRUeCwgSW1wb3J0VHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL3BsYXRmb3Jtdm0nO1xuaW1wb3J0IHsgRXhwb3J0VHggYXMgRVZNRXhwb3J0VHgsIEltcG9ydFR4IGFzIEVWTUltcG9ydFR4IH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvYXBpcy9ldm0nO1xuaW1wb3J0IHsgQk4sIEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IENyZWRlbnRpYWwgfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9jb21tb24nO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcblxuLy8gcmVnaW9uIHV0aWxzIHRvIHNpZ25cbmludGVyZmFjZSBzaWduYXR1cmVTZXJpYWxpemVkIHtcbiAgYnl0ZXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBDaGVja1NpZ25hdHVyZSB7XG4gIChzaWdhdHVyZTogc2lnbmF0dXJlU2VyaWFsaXplZCwgYWRkcmVzc0hleDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eVNpZ25hdHVyZShzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcyAmJiBzLnN0YXJ0c1dpdGgoJycucGFkU3RhcnQoOTAsICcwJykpO1xufVxuXG4vLyBBbiBhZGRyZXNzIHBsYWNlaG9sZGVyIGlzIDkwIHplcm8gaGV4IGNoYXJzICg0NS1ieXRlIHByZWZpeCkgZm9sbG93ZWQgYnkgYSAyMC1ieXRlIGFkZHJlc3MuXG4vLyBBIHB1cmVseSBlbXB0eSBzbG90IGlzIGFsbCB6ZXJvcy4gTm9uLXplcm8gYnl0ZXMgYWZ0ZXIgcG9zaXRpb24gOTAgZGlzdGluZ3Vpc2ggdGhlIHR3by5cbi8vIFRoaXMgbWF0dGVycyBmb3IgdG9Ccm9hZGNhc3RGb3JtYXQoKTogYSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyIHBsYWNlaG9sZGVyIGlzIHRoZVxuLy8gZXhhY3Qgc2hhcGUgcHJvZHVjZWQgYnkgdGhlIGhhc0NyZWRlbnRpYWxzIGd1YXJkIGJ5cGFzcyAoQ0VDSE8tMTY5NykgYW5kIG11c3QgYmUgYmxvY2tlZC5cbmZ1bmN0aW9uIGlzQWRkclBsYWNlaG9sZGVyKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRW1wdHlTaWduYXR1cmUocykpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3VmZml4ID0gcy5zdWJzdHJpbmcoOTApO1xuICByZXR1cm4gc3VmZml4Lmxlbmd0aCA+IDAgJiYgc3VmZml4ICE9PSAnJy5wYWRTdGFydChzdWZmaXgubGVuZ3RoLCAnMCcpO1xufVxuXG4vKipcbiAqIFNpZ25hdHVyZXMgYXJlIHByZXN0b3JlIGFzIGVtcHR5IGJ1ZmZlciBmb3IgaHNtIGFuZCBhZGRyZXNzIG9mIHNpZ25hciBmb3IgZmlyc3Qgc2lnbmF0dXJlLlxuICogV2hlbiBzaWduIGlzIHJlcXVpcmVkLCB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIGZ1bmN0aW9uIHRoYXQgaWRlbnRpZnkgYSBzaWduYXR1cmUgdG8gYmUgcmVwbGFjZWQuXG4gKiBAcGFyYW0gc2lnbmF0dXJlcyBhbnkgc2lnbmF0dXJlcyBhcyBzYW1wbGVzIHRvIGlkZW50aWZ5IHdoaWNoIHNpZ25hdHVyZSByZXF1aXJlZCByZXBsYWNlLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKHNpZ25hdHVyZXM6IHNpZ25hdHVyZVNlcmlhbGl6ZWRbXSk6IENoZWNrU2lnbmF0dXJlIHtcbiAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID4gMSAmJiBzaWduYXR1cmVzLmV2ZXJ5KChzaWcpID0+IGlzRW1wdHlTaWduYXR1cmUoc2lnLmJ5dGVzKSkpIHtcbiAgICAvLyBMb29rIGZvciBhZGRyZXNzLlxuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnLmJ5dGVzKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWIgPSBzaWcuYnl0ZXMuc3Vic3RyaW5nKDkwKTtcbiAgICAgICAgcmV0dXJuIHB1YiA9PT0gYWRkcmVzcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gTG9vayBmb3IgZW1wdHkgc3RyaW5nXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIGlmIChpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cbn1cbi8vIGVuZCByZWdpb24gdXRpbHMgZm9yIHNpZ25cblxuZXhwb3J0IGNsYXNzIERlcHJlY2F0ZWRUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfYXZheFRyYW5zYWN0aW9uOiBEZXByZWNhdGVkVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEF2YWxhbmNoZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogQnVmZmVyQXZheDtcbiAgcHVibGljIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZTogQk4gPSBuZXcgQk4oMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3NlczogQnVmZmVyQXZheFtdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBCdWZmZXJBdmF4W107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90bzogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX2ZlZTogUGFydGlhbDxUcmFuc2FjdGlvbkZlZT4gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgQXZhbGFuY2hlTmV0d29yaztcbiAgICB0aGlzLl9hc3NldElkID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmF2YXhBc3NldElEKTtcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB1dGlscy5jYjU4RGVjb2RlKHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEKTtcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRDtcbiAgfVxuXG4gIGdldCBhdmF4UFRyYW5zYWN0aW9uKCk6IERlcHJlY2F0ZWRCYXNlVHgge1xuICAgIHJldHVybiB0aGlzLl9hdmF4VHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gVXNlIHRoZSBpbnRlcnNlY3Rpb24gb2Ygbm9uLWVtcHR5IEVDRFNBcyBhY3Jvc3MgYWxsIGNyZWRlbnRpYWxzLiBBIHNpZ25lcidzXG4gICAgLy8gRUNEU0EgaXMgY291bnRlZCBvbmx5IGlmIGl0IGFwcGVhcnMgaW4gZXZlcnkgY3JlZGVudGlhbCAoZXZlcnkgaW5wdXQpLiBTaW5jZVxuICAgIC8vIFJGQzY5NzkgaXMgZGV0ZXJtaW5pc3RpYywgdGhlIHNhbWUga2V5IHByb2R1Y2VzIGlkZW50aWNhbCBieXRlcyBmb3IgdGhlIHNhbWVcbiAgICAvLyB0eCBhY3Jvc3MgYWxsIGNyZWRlbnRpYWxzLiBUaGUgaW50ZXJzZWN0aW9uIGNhdGNoZXMgY29ycnVwdCBzdGF0ZXMgd2hlcmUgb25lXG4gICAgLy8gY3JlZGVudGlhbCBpcyBtaXNzaW5nIGEgc2lnbmF0dXJlIHRoYXQgYW5vdGhlciBjcmVkZW50aWFsIGFscmVhZHkgaGFzLlxuICAgIGxldCBpbnRlcnNlY3Rpb246IFNldDxzdHJpbmc+IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IGNzOiBhbnkgPSBjLnNlcmlhbGl6ZSgpO1xuICAgICAgY29uc3QgY3JlZFNpZ3MgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICAgIGNzLnNpZ0FycmF5Lm1hcCgoczogYW55KSA9PiBzLmJ5dGVzIGFzIHN0cmluZykuZmlsdGVyKChiOiBzdHJpbmcpID0+ICFpc0VtcHR5U2lnbmF0dXJlKGIpKVxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24gPT09IG51bGwpIHtcbiAgICAgICAgaW50ZXJzZWN0aW9uID0gY3JlZFNpZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBpbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgICBpZiAoIWNyZWRTaWdzLmhhcyhzaWcpKSB7XG4gICAgICAgICAgICBpbnRlcnNlY3Rpb24uZGVsZXRlKHNpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnRlcnNlY3Rpb24gPyBbLi4uaW50ZXJzZWN0aW9uXSA6IFtdO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgcmV0dXJuICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgLy8gR3VhcmQgYWdhaW5zdCBjcmVkZW50aWFsIHJlZ2VuZXJhdGlvbiB3aGVuZXZlciBjcmVkZW50aWFscyBoYXZlIGJlZW4gc2V0IGZyb20gYSBwYXJzZWQgdHguXG4gICAgLy8gTXVzdCB1c2UgIT0gbnVsbCAobm90IGxlbmd0aCBjaGVjaykgc28gY3JlZGVudGlhbHM9W10gc3RpbGwgYmxvY2tzIGJ1aWxkQXZheFRyYW5zYWN0aW9uKClcbiAgICAvLyBmcm9tIHdpcGluZyBhIHBhcnRpYWxseS1zaWduZWQgc3RhdGUuXG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPKEJHLTU2NzAwKTogIEltcHJvdmUgY2FuU2lnbiBieSBjaGVjayBpbiBhZGRyZXNzZXMgaW4gZW1wdHkgY3JlZGVudGlhbHMgbWF0Y2ggc2lnbmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiB2YWxpZGF0b3IsIGRlbGVnYXRvciwgaW1wb3J0LCBleHBvcnRzIGV4dGVuZCBiYXNlVHhcbiAgICogdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCkgIChiYXNlVHggPSBhZGRWYWxpZGF0b3JUeClcbiAgICogY29uc3QgdHg6IFR4ID0gdW5zaWduZWRUeC5zaWduKGtleWNoYWluKSAodHggaXMgdHlwZSBzdGFuZGFyZCBzaWduZWQgdHgpXG4gICAqIGdldCBiYXNlVHggdGhlbiBjcmVhdGUgbmV3IHVuc2lnbmVkVHggdGhlbiBzaWduXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuY3JlYXRlU2lnbmF0dXJlKHBydik7XG4gICAgbGV0IGNoZWNrU2lnbjogQ2hlY2tTaWduYXR1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jcmVkZW50aWFscy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY3M6IGFueSA9IGMuc2VyaWFsaXplKCk7XG4gICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjcy5zaWdBcnJheSk7XG4gICAgICB9XG4gICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgY3Muc2lnQXJyYXkuZm9yRWFjaCgoc2lnKSA9PiB7XG4gICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICBzaWcuYnl0ZXMgPSBzaWduYXR1cmU7XG4gICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFmaW5kKSB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIGMuZGVzZXJpYWxpemUoY3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIC8vIEJsb2NrIHRoZSBleGFjdCBzaGFwZSBwcm9kdWNlZCBieSB0aGUgaGFzQ3JlZGVudGlhbHMgZ3VhcmQgYnlwYXNzIChDRUNITy0xNjk3KTpcbiAgICAvLyBhIHJlYWwgRUNEU0EgYWxvbmdzaWRlIGFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHI9MCkgaW4gdGhlIHNhbWUgY3JlZGVudGlhbCBzZXQuXG4gICAgLy8gTm9ybWFsIHN0YXRlcyBhcmUgc2FmZTogdW5zaWduZWQgdHhzIGhhdmUgY3JlZGVudGlhbHM9bnVsbCAobm90IHlldCBzZXQpOyBoYWxmLXNpZ25lZFxuICAgIC8vIHR4cyBoYXZlIGVtcHR5LXplcm8gc2xvdHMgKG5vdCBhZGRyIHBsYWNlaG9sZGVycykgaW4gdW5maWxsZWQgcG9zaXRpb25zLlxuICAgIC8vIGNyZWRlbnRpYWxzPVtdIGlzIGFsd2F5cyBhIGJ1ZzogaGFzQ3JlZGVudGlhbHMgcmV0dXJucyB0cnVlIGZvciBbXSBidXQgdGhlIGFycmF5IGlzXG4gICAgLy8gZW1wdHksIHNvIG5vIHNpZ25lciBoYXMgdG91Y2hlZCB0aGUgdHgg4oCUIHNlcmlhbGl6aW5nIGl0IHdvdWxkIHByb2R1Y2UgYSB6ZXJvLWNyZWRlbnRpYWwgdHguXG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHMgIT0gbnVsbCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCd0cmFuc2FjdGlvbiBoYXMgbm8gY3JlZGVudGlhbHMg4oCUIGNhbm5vdCBicm9hZGNhc3QnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHMgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaGFzUmVhbFNpZyA9IGZhbHNlO1xuICAgICAgbGV0IGhhc0FkZHJQbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3QgY3M6IGFueSA9IGMuc2VyaWFsaXplKCk7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBjcy5zaWdBcnJheSkge1xuICAgICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzLmJ5dGVzKSkge1xuICAgICAgICAgICAgaGFzUmVhbFNpZyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0FkZHJQbGFjZWhvbGRlcihzLmJ5dGVzKSkge1xuICAgICAgICAgICAgaGFzQWRkclBsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNSZWFsU2lnICYmIGhhc0FkZHJQbGFjZWhvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3RyYW5zYWN0aW9uIGhhcyBhIHJlYWwgRUNEU0EgYWxvbmdzaWRlIGFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHI9MCk6IGluY29tcGxldGUgc2lnbmluZyBkZXRlY3RlZCwgcmVmdXNpbmcgYnJvYWRjYXN0J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXZheFRyYW5zYWN0aW9uLnRvU3RyaW5nSGV4KCk7XG4gIH1cblxuICAvLyB0eXBlcyAtIHN0YWtpbmdUcmFuc2FjdGlvbiwgaW1wb3J0LCBleHBvcnRcbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgICAgc291cmNlQ2hhaW46IHRoaXMuc291cmNlQ2hhaW4sXG4gICAgICBkZXN0aW5hdGlvbkNoYWluOiB0aGlzLmRlc3RpbmF0aW9uQ2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIHNldFRyYW5zYWN0aW9uKHR4OiBEZXByZWNhdGVkVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYodGhpcy5fYXZheFRyYW5zYWN0aW9uLmdldFVuc2lnbmVkVHgoKS50b0J1ZmZlcigpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlckF2YXguZnJvbSh1dGlscy5zaGEyNTYodGhpcy5fYXZheFRyYW5zYWN0aW9uLnRvQnVmZmVyKCkpKSk7XG4gIH1cblxuICBnZXQgZnJvbUFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21BZGRyZXNzZXMubWFwKChhKSA9PiB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy5fbmV0d29yay5ocnAsIHRoaXMuX25ldHdvcmsuYWxpYXMsIGEpKTtcbiAgfVxuXG4gIGdldCByZXdhcmRBZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXdhcmRBZGRyZXNzZXMubWFwKChhKSA9PiB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy5fbmV0d29yay5ocnAsIHRoaXMuX25ldHdvcmsuYWxpYXMsIGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2Ygb3V0cHV0cy4gQW1vdW50cyBhcmUgZXhwcmVzc2VkIGluIGFic29sdXRlIHZhbHVlLlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeClcbiAgICAgICAgICAuZ2V0T3V0cygpXG4gICAgICAgICAgLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFVk1FeHBvcnRUeClcbiAgICAgICAgICAgIC5nZXRFeHBvcnRlZE91dHB1dHMoKVxuICAgICAgICAgICAgLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHgpXG4gICAgICAgICAgICAuZ2V0RXhwb3J0T3V0cHV0cygpXG4gICAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yOlxuICAgICAgICAvLyBHZXQgc3Rha2VkIG91dHB1dHNcbiAgICAgICAgY29uc3QgYWRkVmFsaWRhdG9yVHggPSB0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgQWRkRGVsZWdhdG9yVHg7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogYWRkVmFsaWRhdG9yVHguZ2V0Tm9kZUlEU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogYWRkVmFsaWRhdG9yVHguZ2V0U3Rha2VBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFRyYW5zYXNjdGlvbiBGZWUuXG4gICAqL1xuICBnZXQgZmVlKCk6IFRyYW5zYWN0aW9uRmVlIHtcbiAgICByZXR1cm4geyBmZWU6ICcwJywgLi4udGhpcy5fZmVlIH07XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICAvLyBDLWNoYWluIHR4IGFkbiBJbXBvcnQgVHhzIGRvbid0IGhhdmUgY2hhbmdlIG91dHB1dHNcbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQgfHxcbiAgICAgIHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKVxuICAgICkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBnZW5lcmFsIHN1cHBvcnQgYW55IHRyYW5zYWN0aW9uIHR5cGUsIGJ1dCBpdCdzIHNjb3BlZCB5ZXRcbiAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldE91dHMoKS5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBFbnRyeVtdIHtcbiAgICBsZXQgaW5wdXRzO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0SW1wb3J0SW5wdXRzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpKSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRVZNRXhwb3J0VHgpLmdldElucHV0cygpLm1hcCgoZXZtSW5wdXQpID0+ICh7XG4gICAgICAgICAgICBhZGRyZXNzOiAnMHgnICsgZXZtSW5wdXQuZ2V0QWRkcmVzc1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBCTigoZXZtSW5wdXQgYXMgYW55KS5hbW91bnQpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBub25jZTogZXZtSW5wdXQuZ2V0Tm9uY2UoKS50b051bWJlcigpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0SW5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldElucygpO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudElucHV0ID0gaW5wdXQuZ2V0SW5wdXQoKSBhcyBhbnkgYXMgQW1vdW50SW5wdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogdXRpbHMuY2I1OEVuY29kZShpbnB1dC5nZXRUeElEKCkpICsgSU5QVVRfU0VQQVJBVE9SICsgdXRpbHMub3V0cHV0aWR4QnVmZmVyVG9OdW1iZXIoaW5wdXQuZ2V0T3V0cHV0SWR4KCkpLFxuICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICB2YWx1ZTogYW1vdW50SW5wdXQuZ2V0QW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheCB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIGhleHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKHBydjogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICAgIHRoaXMuX25ldHdvcmssXG4gICAgICBCdWZmZXJBdmF4LmZyb20odGhpcy5zaWduYWJsZVBheWxvYWQpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHBydilcbiAgICApO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvciwgVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRvcl0uaW5jbHVkZXModHhKc29uLnR5cGUpKSB7XG4gICAgICByZXdhcmRBZGRyZXNzZXMgPSB0aGlzLnJld2FyZEFkZHJlc3NlcztcbiAgICAgIGRpc3BsYXlPcmRlci5zcGxpY2UoNiwgMCwgJ3Jld2FyZEFkZHJlc3NlcycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgYSBQIGNoYWluXG4gICAqL1xuICBnZXQgaXNUcmFuc2FjdGlvbkZvckNDaGFpbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgc291cmNlIGNoYWluIGlkIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgY3Jvc3MgY2hhaW4gdHJhbnNmZXIuXG4gICAqL1xuICBnZXQgc291cmNlQ2hhaW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYmxvY2tjaGFpbklEO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0U291cmNlQ2hhaW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHggfCBFVk1FeHBvcnRUeCkuZ2V0QmxvY2tjaGFpbklEKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZGVzdGluYXRpb25DaGFpbiBvciB1bmRlZmluZWQgaWYgaXQncyBhIGNyb3NzIGNoYWluIHRyYW5zZmVyLlxuICAgKi9cbiAgZ2V0IGRlc3RpbmF0aW9uQ2hhaW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYmxvY2tjaGFpbklEO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0QmxvY2tjaGFpbklEKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBibG9ja2NoYWluSUQgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEV4cG9ydFR4IHwgRVZNRXhwb3J0VHgpLmdldERlc3RpbmF0aW9uQ2hhaW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGJsb2NrY2hhaW5JZCBidWZmZXIgdG8gc3RyaW5nIGFuZCByZXR1cm4gUCBvciBDIGFsaWFzIGlmIG1hdGNoIG9mIGFueSBvZiB0aGF0IGNoYWlucy5cbiAgICogQHBhcmFtIHtCdWZmZXJBdmF4fSBibG9ja2NoYWluSURCdWZmZXJcbiAgICogQHJldHVybiB7c3RyaW5nfSBibG9jY2hhaW5JRCBvciBhbGlhcyBpZiBleGlzdHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEQnVmZmVyOiBCdWZmZXJBdmF4KTogc3RyaW5nIHtcbiAgICBjb25zdCBibG9ja2NoYWluSWQgPSB1dGlscy5jYjU4RW5jb2RlKGJsb2NrY2hhaW5JREJ1ZmZlcik7XG4gICAgc3dpdGNoIChibG9ja2NoYWluSWQpIHtcbiAgICAgIGNhc2UgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQ6XG4gICAgICAgIHJldHVybiAnQyc7XG4gICAgICBjYXNlIHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEOlxuICAgICAgICByZXR1cm4gJ1AnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGJsb2NrY2hhaW5JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -156,6 +156,129 @@ describe('AvaxP Export P2C Tx Builder', () => {
156
156
  prv2: testData.EXPORT_P_2_C_WITHOUT_CHANGEOUTPUT.privKey.prv2,
157
157
  },
158
158
  });
159
+ describe('Credential guard bypass regression (CECHO-1697)', () => {
160
+ // Regression for production incident 2026-07-16:
161
+ // tx 8xbiLpsKDKkJrN3YUqcZpFcxApLCwmQkpKUuvmHU1GL9RmAyu was broadcast
162
+ // with sig[1] still an address placeholder (r=0) because hasCredentials([])
163
+ // returned false, causing buildAvaxTransaction() to wipe Signer 1's ECDSA.
164
+ const data = testData.EXPORT_P_2_C;
165
+ it('hasCredentials returns true for credentials=[] preventing credential wipe', async () => {
166
+ // Signer 1 half-signs
167
+ const signer1Builder = factory.from(data.unsignedTxHex);
168
+ signer1Builder.sign({ key: data.privKey.prv1 });
169
+ const halfSignedTx = await signer1Builder.build();
170
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
171
+ // Simulate the bug trigger: credentials=[] on the parsed tx
172
+ const signer2Builder = factory.from(halfSignedHex);
173
+ const internalTx = signer2Builder.transaction;
174
+ // Force credentials to [] as happens in production deserialization edge case
175
+ internalTx._avaxTransaction.credentials = [];
176
+ // Before fix: hasCredentials was false → buildAvaxTransaction() would regenerate
177
+ // After fix: hasCredentials is true → guard fires → credentials preserved
178
+ internalTx.hasCredentials.should.be.true('hasCredentials must return true for credentials=[] to block credential regeneration');
179
+ });
180
+ it('credential regeneration is blocked when credentials=[] preventing Signer 1 ECDSA wipe', async () => {
181
+ // Signer 1 half-signs
182
+ const signer1Builder = factory.from(data.unsignedTxHex);
183
+ signer1Builder.sign({ key: data.privKey.prv1 });
184
+ const halfSignedTx = await signer1Builder.build();
185
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
186
+ // Simulate bug: force credentials=[] before Signer 2 calls build()
187
+ const signer2Builder = factory.from(halfSignedHex);
188
+ const internalTx = signer2Builder.transaction;
189
+ internalTx._avaxTransaction.credentials = [];
190
+ // build() must NOT regenerate fresh placeholder credentials
191
+ const rebuilt = await signer2Builder.build();
192
+ const rebuiltCreds = rebuilt.credentials;
193
+ // After fix: credentials stay as [] (guard fired, no regeneration)
194
+ // Before fix: credentials would be regenerated to N×[PLACEHOLDER, PLACEHOLDER]
195
+ rebuiltCreds.length.should.equal(0, 'build() must not regenerate credentials when credentials=[] — guard must fire');
196
+ });
197
+ it('signature getter exposes incomplete signing across all credentials', async () => {
198
+ // Signer 1 half-signs only
199
+ const signer1Builder = factory.from(data.unsignedTxHex);
200
+ signer1Builder.sign({ key: data.privKey.prv1 });
201
+ const halfSignedTx = await signer1Builder.build();
202
+ // After Signer 1: signature getter must show exactly 1 real ECDSA
203
+ halfSignedTx.signature.length.should.equal(1, 'should expose exactly 1 real ECDSA after first signer — Signer 2 slot is still empty');
204
+ // Simulate the corrupt state the PR targets: fully sign the tx, then corrupt
205
+ // one credential so that credentials[0] has both ECDSAs but credentials[1]
206
+ // only has one. A union would still return 2 (masking the corruption).
207
+ // The intersection must return 1 because the second signer's ECDSA is absent
208
+ // from credentials[1].
209
+ const fullBuilder = factory.from(data.halfsigntxHex);
210
+ fullBuilder.sign({ key: data.privKey.prv2 });
211
+ const fullTx = await fullBuilder.build();
212
+ fullTx.signature.length.should.equal(2, 'sanity: fully signed tx should have 2 signatures');
213
+ // 90 hex chars of leading zeros is the empty-signature prefix used by isEmptySignature().
214
+ const EMPTY_SIG_ZERO_PREFIX = ''.padStart(90, '0');
215
+ // Corrupt credentials[1]: zero out Signer 2's slot so the intersection drops to 1.
216
+ // Use assertions instead of guards so the test fails loudly if the tx shape changes.
217
+ const creds = fullTx.credentials;
218
+ assert_1.default.ok(creds && creds.length >= 2, 'fully signed tx must have at least 2 credentials');
219
+ const cred1 = creds[1];
220
+ const cs1 = cred1.serialize();
221
+ const targetIdx = cs1.sigArray.findIndex((s, i) => i > 0 && !s.bytes.startsWith(EMPTY_SIG_ZERO_PREFIX));
222
+ assert_1.default.ok(targetIdx !== -1, 'credentials[1] must have a non-empty slot beyond index 0 (Signer 2 slot)');
223
+ cs1.sigArray[targetIdx].bytes = ''.padStart(cs1.sigArray[targetIdx].bytes.length, '0');
224
+ cred1.deserialize(cs1);
225
+ // With intersection, removing ECDSA2 from credentials[1] must reduce the count to 1.
226
+ fullTx.signature.length.should.equal(1, 'intersection must detect that credentials[1] is missing ECDSA2 — incomplete signing visible');
227
+ });
228
+ it('full sign from half-signed hex produces 2 real ECDSAs and correct tx', async () => {
229
+ // This is the exact flow that MUST work in production after the fix:
230
+ // Signer 2 takes Signer 1's half-signed hex and fills the remaining slot.
231
+ const txBuilder = factory.from(data.halfsigntxHex);
232
+ txBuilder.sign({ key: data.privKey.prv2 });
233
+ const tx = await txBuilder.build();
234
+ tx.toBroadcastFormat().should.equal(data.fullsigntxHex);
235
+ tx.signature.length.should.equal(2, 'both HSM signer slots must be filled with real ECDSAs');
236
+ });
237
+ it('sign() throws on empty credentials rather than silently producing bad tx', async () => {
238
+ // Signer 1 half-signs
239
+ const signer1Builder = factory.from(data.unsignedTxHex);
240
+ signer1Builder.sign({ key: data.privKey.prv1 });
241
+ const halfTx = await signer1Builder.build();
242
+ // Simulate bug: credentials wiped to [] before Signer 2 signs
243
+ const signer2Builder = factory.from(halfTx.toBroadcastFormat());
244
+ signer2Builder.sign({ key: data.privKey.prv2 });
245
+ signer2Builder.transaction._avaxTransaction.credentials = [];
246
+ // build() calls transaction.sign() which must throw — not silently produce a bad tx
247
+ await signer2Builder
248
+ .build()
249
+ .then(() => assert_1.default.fail('Expected sign to throw on empty credentials'))
250
+ .catch((e) => {
251
+ e.message.should.equal('empty credentials to sign');
252
+ });
253
+ });
254
+ it('toBroadcastFormat() throws when real ECDSA coexists with address placeholder (production failure shape)', async () => {
255
+ // Reproduce the exact credential layout from the Jul 16 production failure:
256
+ // slot[0] = real ECDSA (Signer 2 filled wrong slot due to MODE 1 mismatch)
257
+ // slot[1] = ADDR_PLACEHOLDER (r=0, 90 zero hex chars + HSM1 address)
258
+ // This is the shape that AvalancheGo rejected with "failed verifySpend: invalid signature".
259
+ const EMPTY_SIG_ZERO_PREFIX = ''.padStart(90, '0');
260
+ const signer1Builder = factory.from(data.unsignedTxHex);
261
+ signer1Builder.sign({ key: data.privKey.prv1 });
262
+ const halfTx = await signer1Builder.build();
263
+ const fullBuilder = factory.from(halfTx.toBroadcastFormat());
264
+ fullBuilder.sign({ key: data.privKey.prv2 });
265
+ const fullTx = (await fullBuilder.build());
266
+ // Corrupt credentials: swap slot[0] (realECDSA1) with an addr placeholder,
267
+ // leaving slot[1] = realECDSA2. This mimics the bug output where a real ECDSA
268
+ // coexists with an addr placeholder in the same credential.
269
+ const creds = fullTx.credentials;
270
+ if (creds && creds.length > 0) {
271
+ const cred0 = creds[0];
272
+ const cs = cred0.serialize();
273
+ // Build a fake addr placeholder: 90 zeros + 40 hex chars of a mock address
274
+ const fakeAddrPlaceholder = EMPTY_SIG_ZERO_PREFIX + 'df32717bd7b7a2d50a715202795940250c7ba9e4';
275
+ cs.sigArray[0].bytes = fakeAddrPlaceholder;
276
+ cred0.deserialize(cs);
277
+ }
278
+ assert_1.default.throws(() => fullTx.toBroadcastFormat(), (e) => e.message ===
279
+ 'transaction has a real ECDSA alongside an address placeholder (r=0): incomplete signing detected, refusing broadcast');
280
+ });
281
+ });
159
282
  describe('Key cannot sign the transaction ', () => {
160
283
  const data = testData.EXPORT_P_2_C;
161
284
  it('Should full sign a export tx from unsigned raw tx', () => {
@@ -180,4 +303,4 @@ describe('AvaxP Export P2C Tx Builder', () => {
180
303
  });
181
304
  });
182
305
  });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLDRDQUF1QztBQUN2QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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O1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9GLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdmF4cCc7XG5pbXBvcnQgKiBhcyBlcnJvck1lc3NhZ2UgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdBdmF4UCBFeHBvcnQgUDJDIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgdHhCdWlsZGVyIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEJ1aWxkZXIoKTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYW1vdW50IGxvdyB0aGFuIHplcm8nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmFtb3VudCgnLTEnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQU1PVU5UXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbGVuZ3RoIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKEJ1ZmZlci5mcm9tKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfTEVOR1RIXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBub3QgYSB2YWlsZCBiYXNlNTggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX05PVF9CQVNFNThcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9JTlZBTElEX0NIRUNLU1VNXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0VNUFRZXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5vdXRwdXRzKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuaGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuZnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYxLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgcmVjb3Zlcnkgd2l0aCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0Mub3V0cHV0cylcbiAgICAgICAgLnJlY292ZXJNb2RlKCksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJVbnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5ySGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuckZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MyxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGhvdXQgY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC51bnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5oYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5mdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjEsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyByZWNvdmVyeSB3aXRob3V0IGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuclVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJIYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5yRnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYzLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBkZXNjcmliZSgnS2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbiAnLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRlc3REYXRhLkVYUE9SVF9QXzJfQztcbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCAyIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oZGF0YS5yVW5zaWduZWRUeEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKGVycm9yTWVzc2FnZS5FUlJPUl9LRVlfQ0FOTk9UX1NJR04pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLDRDQUF1QztBQUN2QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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Q3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvRixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyxTQUFTO2lCQUNOLEtBQUssRUFBRTtpQkFDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheHAnO1xuaW1wb3J0ICogYXMgZXJyb3JNZXNzYWdlIGZyb20gJy4uLy4uL3Jlc291cmNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHNpZ25GbG93VGVzdCBmcm9tICcuL3NpZ25GbG93VGVzdFN1aXQnO1xuXG5kZXNjcmliZSgnQXZheFAgRXhwb3J0IFAyQyBUeCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRFeHBvcnRCdWlsZGVyKCk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGFtb3VudCBsb3cgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoJy0xJyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0FNT1VOVFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGxlbmd0aCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZChCdWZmZXIuZnJvbSh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lEKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX0xFTkdUSFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbm90IGEgdmFpbGQgYmFzZTU4IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9OT1RfQkFTRTU4XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBjYjU4IGludmFsaWQgY2hlY2tzdW0nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5WQUxJRF9DX0NIQUlOX0lELnNsaWNlKDIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfSU5WQUxJRF9DSEVDS1NVTVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19FTVBUWVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyB3aXRob3V0IGFtb3VudCBmaWVsZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbeyBvdXRwdXRJRDogJycgfSBhcyBhbnkgYXMgRGVjb2RlZFV0eG9PYmpdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfVVRYT1NfQU1PVU5UXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgd2l0aCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0Mub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLmhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLmZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MSxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHJlY292ZXJ5IHdpdGggY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DLm91dHB1dHMpXG4gICAgICAgIC5yZWNvdmVyTW9kZSgpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5yVW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuckhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJGdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjMsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRob3V0IGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5vdXRwdXRzKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuaGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuZnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYxLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgcmVjb3Zlcnkgd2l0aG91dCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQub3V0cHV0cylcbiAgICAgICAgLnJlY292ZXJNb2RlKCksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJVbnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5ySGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuckZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MyxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NyZWRlbnRpYWwgZ3VhcmQgYnlwYXNzIHJlZ3Jlc3Npb24gKENFQ0hPLTE2OTcpJywgKCkgPT4ge1xuICAgIC8vIFJlZ3Jlc3Npb24gZm9yIHByb2R1Y3Rpb24gaW5jaWRlbnQgMjAyNi0wNy0xNjpcbiAgICAvLyB0eCA4eGJpTHBzS0RLa0pyTjNZVXFjWnBGY3hBcExDd21Ra3BLVXV2bUhVMUdMOVJtQXl1IHdhcyBicm9hZGNhc3RcbiAgICAvLyB3aXRoIHNpZ1sxXSBzdGlsbCBhbiBhZGRyZXNzIHBsYWNlaG9sZGVyIChyPTApIGJlY2F1c2UgaGFzQ3JlZGVudGlhbHMoW10pXG4gICAgLy8gcmV0dXJuZWQgZmFsc2UsIGNhdXNpbmcgYnVpbGRBdmF4VHJhbnNhY3Rpb24oKSB0byB3aXBlIFNpZ25lciAxJ3MgRUNEU0EuXG4gICAgY29uc3QgZGF0YSA9IHRlc3REYXRhLkVYUE9SVF9QXzJfQztcblxuICAgIGl0KCdoYXNDcmVkZW50aWFscyByZXR1cm5zIHRydWUgZm9yIGNyZWRlbnRpYWxzPVtdIHByZXZlbnRpbmcgY3JlZGVudGlhbCB3aXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gU2lnbmVyIDEgaGFsZi1zaWduc1xuICAgICAgY29uc3Qgc2lnbmVyMUJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHNpZ25lcjFCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYxIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgc2lnbmVyMUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRIZXggPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gU2ltdWxhdGUgdGhlIGJ1ZyB0cmlnZ2VyOiBjcmVkZW50aWFscz1bXSBvbiB0aGUgcGFyc2VkIHR4XG4gICAgICBjb25zdCBzaWduZXIyQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmU2lnbmVkSGV4KSBhcyBhbnk7XG4gICAgICBjb25zdCBpbnRlcm5hbFR4ID0gc2lnbmVyMkJ1aWxkZXIudHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIEZvcmNlIGNyZWRlbnRpYWxzIHRvIFtdIGFzIGhhcHBlbnMgaW4gcHJvZHVjdGlvbiBkZXNlcmlhbGl6YXRpb24gZWRnZSBjYXNlXG4gICAgICAoaW50ZXJuYWxUeC5fYXZheFRyYW5zYWN0aW9uIGFzIGFueSkuY3JlZGVudGlhbHMgPSBbXTtcblxuICAgICAgLy8gQmVmb3JlIGZpeDogaGFzQ3JlZGVudGlhbHMgd2FzIGZhbHNlIOKGkiBidWlsZEF2YXhUcmFuc2FjdGlvbigpIHdvdWxkIHJlZ2VuZXJhdGVcbiAgICAgIC8vIEFmdGVyIGZpeDogaGFzQ3JlZGVudGlhbHMgaXMgdHJ1ZSDihpIgZ3VhcmQgZmlyZXMg4oaSIGNyZWRlbnRpYWxzIHByZXNlcnZlZFxuICAgICAgaW50ZXJuYWxUeC5oYXNDcmVkZW50aWFscy5zaG91bGQuYmUudHJ1ZShcbiAgICAgICAgJ2hhc0NyZWRlbnRpYWxzIG11c3QgcmV0dXJuIHRydWUgZm9yIGNyZWRlbnRpYWxzPVtdIHRvIGJsb2NrIGNyZWRlbnRpYWwgcmVnZW5lcmF0aW9uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVkZW50aWFsIHJlZ2VuZXJhdGlvbiBpcyBibG9ja2VkIHdoZW4gY3JlZGVudGlhbHM9W10gcHJldmVudGluZyBTaWduZXIgMSBFQ0RTQSB3aXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gU2lnbmVyIDEgaGFsZi1zaWduc1xuICAgICAgY29uc3Qgc2lnbmVyMUJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHNpZ25lcjFCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYxIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgc2lnbmVyMUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRIZXggPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gU2ltdWxhdGUgYnVnOiBmb3JjZSBjcmVkZW50aWFscz1bXSBiZWZvcmUgU2lnbmVyIDIgY2FsbHMgYnVpbGQoKVxuICAgICAgY29uc3Qgc2lnbmVyMkJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oaGFsZlNpZ25lZEhleCkgYXMgYW55O1xuICAgICAgY29uc3QgaW50ZXJuYWxUeCA9IHNpZ25lcjJCdWlsZGVyLnRyYW5zYWN0aW9uO1xuICAgICAgKGludGVybmFsVHguX2F2YXhUcmFuc2FjdGlvbiBhcyBhbnkpLmNyZWRlbnRpYWxzID0gW107XG5cbiAgICAgIC8vIGJ1aWxkKCkgbXVzdCBOT1QgcmVnZW5lcmF0ZSBmcmVzaCBwbGFjZWhvbGRlciBjcmVkZW50aWFsc1xuICAgICAgY29uc3QgcmVidWlsdCA9IGF3YWl0IHNpZ25lcjJCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByZWJ1aWx0Q3JlZHMgPSAocmVidWlsdCBhcyBhbnkpLmNyZWRlbnRpYWxzO1xuXG4gICAgICAvLyBBZnRlciBmaXg6IGNyZWRlbnRpYWxzIHN0YXkgYXMgW10gKGd1YXJkIGZpcmVkLCBubyByZWdlbmVyYXRpb24pXG4gICAgICAvLyBCZWZvcmUgZml4OiBjcmVkZW50aWFscyB3b3VsZCBiZSByZWdlbmVyYXRlZCB0byBOw5dbUExBQ0VIT0xERVIsIFBMQUNFSE9MREVSXVxuICAgICAgcmVidWlsdENyZWRzLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIDAsXG4gICAgICAgICdidWlsZCgpIG11c3Qgbm90IHJlZ2VuZXJhdGUgY3JlZGVudGlhbHMgd2hlbiBjcmVkZW50aWFscz1bXSDigJQgZ3VhcmQgbXVzdCBmaXJlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduYXR1cmUgZ2V0dGVyIGV4cG9zZXMgaW5jb21wbGV0ZSBzaWduaW5nIGFjcm9zcyBhbGwgY3JlZGVudGlhbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zIG9ubHlcbiAgICAgIGNvbnN0IHNpZ25lcjFCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEudW5zaWduZWRUeEhleCk7XG4gICAgICBzaWduZXIxQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHNpZ25lcjFCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIEFmdGVyIFNpZ25lciAxOiBzaWduYXR1cmUgZ2V0dGVyIG11c3Qgc2hvdyBleGFjdGx5IDEgcmVhbCBFQ0RTQVxuICAgICAgaGFsZlNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKFxuICAgICAgICAxLFxuICAgICAgICAnc2hvdWxkIGV4cG9zZSBleGFjdGx5IDEgcmVhbCBFQ0RTQSBhZnRlciBmaXJzdCBzaWduZXIg4oCUIFNpZ25lciAyIHNsb3QgaXMgc3RpbGwgZW1wdHknXG4gICAgICApO1xuXG4gICAgICAvLyBTaW11bGF0ZSB0aGUgY29ycnVwdCBzdGF0ZSB0aGUgUFIgdGFyZ2V0czogZnVsbHkgc2lnbiB0aGUgdHgsIHRoZW4gY29ycnVwdFxuICAgICAgLy8gb25lIGNyZWRlbnRpYWwgc28gdGhhdCBjcmVkZW50aWFsc1swXSBoYXMgYm90aCBFQ0RTQXMgYnV0IGNyZWRlbnRpYWxzWzFdXG4gICAgICAvLyBvbmx5IGhhcyBvbmUuICBBIHVuaW9uIHdvdWxkIHN0aWxsIHJldHVybiAyIChtYXNraW5nIHRoZSBjb3JydXB0aW9uKS5cbiAgICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gbXVzdCByZXR1cm4gMSBiZWNhdXNlIHRoZSBzZWNvbmQgc2lnbmVyJ3MgRUNEU0EgaXMgYWJzZW50XG4gICAgICAvLyBmcm9tIGNyZWRlbnRpYWxzWzFdLlxuICAgICAgY29uc3QgZnVsbEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oZGF0YS5oYWxmc2lnbnR4SGV4KTtcbiAgICAgIGZ1bGxCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgY29uc3QgZnVsbFR4ID0gYXdhaXQgZnVsbEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGZ1bGxUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgyLCAnc2FuaXR5OiBmdWxseSBzaWduZWQgdHggc2hvdWxkIGhhdmUgMiBzaWduYXR1cmVzJyk7XG5cbiAgICAgIC8vIDkwIGhleCBjaGFycyBvZiBsZWFkaW5nIHplcm9zIGlzIHRoZSBlbXB0eS1zaWduYXR1cmUgcHJlZml4IHVzZWQgYnkgaXNFbXB0eVNpZ25hdHVyZSgpLlxuICAgICAgY29uc3QgRU1QVFlfU0lHX1pFUk9fUFJFRklYID0gJycucGFkU3RhcnQoOTAsICcwJyk7XG5cbiAgICAgIC8vIENvcnJ1cHQgY3JlZGVudGlhbHNbMV06IHplcm8gb3V0IFNpZ25lciAyJ3Mgc2xvdCBzbyB0aGUgaW50ZXJzZWN0aW9uIGRyb3BzIHRvIDEuXG4gICAgICAvLyBVc2UgYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIGd1YXJkcyBzbyB0aGUgdGVzdCBmYWlscyBsb3VkbHkgaWYgdGhlIHR4IHNoYXBlIGNoYW5nZXMuXG4gICAgICBjb25zdCBjcmVkcyA9IChmdWxsVHggYXMgYW55KS5jcmVkZW50aWFscztcbiAgICAgIGFzc2VydC5vayhjcmVkcyAmJiBjcmVkcy5sZW5ndGggPj0gMiwgJ2Z1bGx5IHNpZ25lZCB0eCBtdXN0IGhhdmUgYXQgbGVhc3QgMiBjcmVkZW50aWFscycpO1xuICAgICAgY29uc3QgY3JlZDE6IGFueSA9IGNyZWRzWzFdO1xuICAgICAgY29uc3QgY3MxOiBhbnkgPSBjcmVkMS5zZXJpYWxpemUoKTtcbiAgICAgIGNvbnN0IHRhcmdldElkeCA9IGNzMS5zaWdBcnJheS5maW5kSW5kZXgoXG4gICAgICAgIChzOiBhbnksIGk6IG51bWJlcikgPT4gaSA+IDAgJiYgIXMuYnl0ZXMuc3RhcnRzV2l0aChFTVBUWV9TSUdfWkVST19QUkVGSVgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKHRhcmdldElkeCAhPT0gLTEsICdjcmVkZW50aWFsc1sxXSBtdXN0IGhhdmUgYSBub24tZW1wdHkgc2xvdCBiZXlvbmQgaW5kZXggMCAoU2lnbmVyIDIgc2xvdCknKTtcbiAgICAgIGNzMS5zaWdBcnJheVt0YXJnZXRJZHhdLmJ5dGVzID0gJycucGFkU3RhcnQoY3MxLnNpZ0FycmF5W3RhcmdldElkeF0uYnl0ZXMubGVuZ3RoLCAnMCcpO1xuICAgICAgY3JlZDEuZGVzZXJpYWxpemUoY3MxKTtcblxuICAgICAgLy8gV2l0aCBpbnRlcnNlY3Rpb24sIHJlbW92aW5nIEVDRFNBMiBmcm9tIGNyZWRlbnRpYWxzWzFdIG11c3QgcmVkdWNlIHRoZSBjb3VudCB0byAxLlxuICAgICAgZnVsbFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKFxuICAgICAgICAxLFxuICAgICAgICAnaW50ZXJzZWN0aW9uIG11c3QgZGV0ZWN0IHRoYXQgY3JlZGVudGlhbHNbMV0gaXMgbWlzc2luZyBFQ0RTQTIg4oCUIGluY29tcGxldGUgc2lnbmluZyB2aXNpYmxlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmdWxsIHNpZ24gZnJvbSBoYWxmLXNpZ25lZCBoZXggcHJvZHVjZXMgMiByZWFsIEVDRFNBcyBhbmQgY29ycmVjdCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGV4YWN0IGZsb3cgdGhhdCBNVVNUIHdvcmsgaW4gcHJvZHVjdGlvbiBhZnRlciB0aGUgZml4OlxuICAgICAgLy8gU2lnbmVyIDIgdGFrZXMgU2lnbmVyIDEncyBoYWxmLXNpZ25lZCBoZXggYW5kIGZpbGxzIHRoZSByZW1haW5pbmcgc2xvdC5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLmhhbGZzaWdudHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKGRhdGEuZnVsbHNpZ250eEhleCk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgyLCAnYm90aCBIU00gc2lnbmVyIHNsb3RzIG11c3QgYmUgZmlsbGVkIHdpdGggcmVhbCBFQ0RTQXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduKCkgdGhyb3dzIG9uIGVtcHR5IGNyZWRlbnRpYWxzIHJhdGhlciB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyBiYWQgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zXG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBTaW11bGF0ZSBidWc6IGNyZWRlbnRpYWxzIHdpcGVkIHRvIFtdIGJlZm9yZSBTaWduZXIgMiBzaWduc1xuICAgICAgY29uc3Qgc2lnbmVyMkJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oaGFsZlR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpIGFzIGFueTtcbiAgICAgIHNpZ25lcjJCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgKHNpZ25lcjJCdWlsZGVyLnRyYW5zYWN0aW9uLl9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KS5jcmVkZW50aWFscyA9IFtdO1xuXG4gICAgICAvLyBidWlsZCgpIGNhbGxzIHRyYW5zYWN0aW9uLnNpZ24oKSB3aGljaCBtdXN0IHRocm93IOKAlCBub3Qgc2lsZW50bHkgcHJvZHVjZSBhIGJhZCB0eFxuICAgICAgYXdhaXQgc2lnbmVyMkJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ0V4cGVjdGVkIHNpZ24gdG8gdGhyb3cgb24gZW1wdHkgY3JlZGVudGlhbHMnKSlcbiAgICAgICAgLmNhdGNoKChlOiBhbnkpID0+IHtcbiAgICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmVxdWFsKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvQnJvYWRjYXN0Rm9ybWF0KCkgdGhyb3dzIHdoZW4gcmVhbCBFQ0RTQSBjb2V4aXN0cyB3aXRoIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHByb2R1Y3Rpb24gZmFpbHVyZSBzaGFwZSknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBSZXByb2R1Y2UgdGhlIGV4YWN0IGNyZWRlbnRpYWwgbGF5b3V0IGZyb20gdGhlIEp1bCAxNiBwcm9kdWN0aW9uIGZhaWx1cmU6XG4gICAgICAvLyBzbG90WzBdID0gcmVhbCBFQ0RTQSAoU2lnbmVyIDIgZmlsbGVkIHdyb25nIHNsb3QgZHVlIHRvIE1PREUgMSBtaXNtYXRjaClcbiAgICAgIC8vIHNsb3RbMV0gPSBBRERSX1BMQUNFSE9MREVSIChyPTAsIDkwIHplcm8gaGV4IGNoYXJzICsgSFNNMSBhZGRyZXNzKVxuICAgICAgLy8gVGhpcyBpcyB0aGUgc2hhcGUgdGhhdCBBdmFsYW5jaGVHbyByZWplY3RlZCB3aXRoIFwiZmFpbGVkIHZlcmlmeVNwZW5kOiBpbnZhbGlkIHNpZ25hdHVyZVwiLlxuICAgICAgY29uc3QgRU1QVFlfU0lHX1pFUk9fUFJFRklYID0gJycucGFkU3RhcnQoOTAsICcwJyk7XG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZnVsbEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oaGFsZlR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgZnVsbEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCBmdWxsVHggPSAoYXdhaXQgZnVsbEJ1aWxkZXIuYnVpbGQoKSkgYXMgYW55O1xuXG4gICAgICAvLyBDb3JydXB0IGNyZWRlbnRpYWxzOiBzd2FwIHNsb3RbMF0gKHJlYWxFQ0RTQTEpIHdpdGggYW4gYWRkciBwbGFjZWhvbGRlcixcbiAgICAgIC8vIGxlYXZpbmcgc2xvdFsxXSA9IHJlYWxFQ0RTQTIuIFRoaXMgbWltaWNzIHRoZSBidWcgb3V0cHV0IHdoZXJlIGEgcmVhbCBFQ0RTQVxuICAgICAgLy8gY29leGlzdHMgd2l0aCBhbiBhZGRyIHBsYWNlaG9sZGVyIGluIHRoZSBzYW1lIGNyZWRlbnRpYWwuXG4gICAgICBjb25zdCBjcmVkcyA9IGZ1bGxUeC5jcmVkZW50aWFscztcbiAgICAgIGlmIChjcmVkcyAmJiBjcmVkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNyZWQwOiBhbnkgPSBjcmVkc1swXTtcbiAgICAgICAgY29uc3QgY3M6IGFueSA9IGNyZWQwLnNlcmlhbGl6ZSgpO1xuICAgICAgICAvLyBCdWlsZCBhIGZha2UgYWRkciBwbGFjZWhvbGRlcjogOTAgemVyb3MgKyA0MCBoZXggY2hhcnMgb2YgYSBtb2NrIGFkZHJlc3NcbiAgICAgICAgY29uc3QgZmFrZUFkZHJQbGFjZWhvbGRlciA9IEVNUFRZX1NJR19aRVJPX1BSRUZJWCArICdkZjMyNzE3YmQ3YjdhMmQ1MGE3MTUyMDI3OTU5NDAyNTBjN2JhOWU0JztcbiAgICAgICAgY3Muc2lnQXJyYXlbMF0uYnl0ZXMgPSBmYWtlQWRkclBsYWNlaG9sZGVyO1xuICAgICAgICBjcmVkMC5kZXNlcmlhbGl6ZShjcyk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGZ1bGxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICAoZTogYW55KSA9PlxuICAgICAgICAgIGUubWVzc2FnZSA9PT1cbiAgICAgICAgICAndHJhbnNhY3Rpb24gaGFzIGEgcmVhbCBFQ0RTQSBhbG9uZ3NpZGUgYW4gYWRkcmVzcyBwbGFjZWhvbGRlciAocj0wKTogaW5jb21wbGV0ZSBzaWduaW5nIGRldGVjdGVkLCByZWZ1c2luZyBicm9hZGNhc3QnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnS2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbiAnLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRlc3REYXRhLkVYUE9SVF9QXzJfQztcbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCAyIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oZGF0YS5yVW5zaWduZWRUeEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKGVycm9yTWVzc2FnZS5FUlJPUl9LRVlfQ0FOTk9UX1NJR04pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==