@bitgo-beta/sdk-coin-avaxp 5.7.3-beta.31 → 5.7.3-beta.310

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.
@@ -17,6 +17,21 @@ const utils_1 = __importDefault(require("./utils"));
17
17
  function isEmptySignature(signature) {
18
18
  return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
19
19
  }
20
+ /**
21
+ * An address placeholder is 90 zero hex chars (45-byte prefix) followed by a 20-byte address.
22
+ * A purely empty slot is all zeros. Non-zero bytes after position 90 distinguish the two.
23
+ * A real ECDSA alongside an addr placeholder in the same credential set means one signer's
24
+ * pass never replaced the placeholder -- signing is incomplete and must not be broadcast.
25
+ * @see CECHO-1697, CSHLD-1550
26
+ */
27
+ function isAddrPlaceholder(signature) {
28
+ if (!isEmptySignature(signature)) {
29
+ return false;
30
+ }
31
+ const stripped = utils_1.default.removeHexPrefix(signature);
32
+ const suffix = stripped.substring(90);
33
+ return suffix.length > 0 && suffix !== ''.padStart(suffix.length, '0');
34
+ }
20
35
  function generateSelectorSignature(signatures) {
21
36
  if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig))) {
22
37
  // Look for address.
@@ -61,16 +76,37 @@ class Transaction extends sdk_core_1.BaseTransaction {
61
76
  return this._avaxTransaction.getTx().baseTx;
62
77
  }
63
78
  get signature() {
64
- if (this.credentials.length === 0) {
79
+ if (!this.credentials || this.credentials.length === 0) {
65
80
  return [];
66
81
  }
67
- return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
82
+ // Use the intersection of non-empty signatures across all credentials. A signer's
83
+ // ECDSA is counted only if it appears in every credential (every input), so a
84
+ // credential that is still missing a signature another credential already has
85
+ // does not surface a false-complete signature set.
86
+ let intersection = null;
87
+ for (const c of this.credentials) {
88
+ const credSigs = new Set(c.getSignatures().filter((s) => !isEmptySignature(s)));
89
+ if (intersection === null) {
90
+ intersection = credSigs;
91
+ }
92
+ else {
93
+ for (const sig of intersection) {
94
+ if (!credSigs.has(sig)) {
95
+ intersection.delete(sig);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ return intersection ? [...intersection] : [];
68
101
  }
69
102
  get credentials() {
70
103
  return this._avaxTransaction?.credentials;
71
104
  }
72
105
  get hasCredentials() {
73
- return this.credentials !== undefined && this.credentials.length > 0;
106
+ // Guard against credential regeneration whenever credentials have been set from a parsed
107
+ // tx. Must use != null (not a length check) so credentials=[] is still recognized as an
108
+ // established (if buggy) state rather than "never built".
109
+ return this.credentials != null;
74
110
  }
75
111
  /** @inheritdoc */
76
112
  canSign({ key }) {
@@ -90,7 +126,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
90
126
  if (!this.avaxPTransaction) {
91
127
  throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
92
128
  }
93
- if (!this.hasCredentials) {
129
+ if (!this.credentials || this.credentials.length === 0) {
94
130
  throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
95
131
  }
96
132
  const unsignedTx = this._avaxTransaction;
@@ -127,6 +163,29 @@ class Transaction extends sdk_core_1.BaseTransaction {
127
163
  if (!this.avaxPTransaction) {
128
164
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
129
165
  }
166
+ // credentials=[] is always a bug: hasCredentials treats it as "established" so a rebuild
167
+ // won't silently regenerate placeholders over it, but an empty array means no signer has
168
+ // actually touched the tx -- serializing it would produce a zero-credential tx.
169
+ if (this.credentials != null && this.credentials.length === 0) {
170
+ throw new sdk_core_1.InvalidTransactionError('transaction has no credentials — cannot broadcast');
171
+ }
172
+ if (this.credentials && this.credentials.length > 0) {
173
+ let hasRealSig = false;
174
+ let hasAddrPlaceholder = false;
175
+ for (const c of this.credentials) {
176
+ for (const s of c.getSignatures()) {
177
+ if (!isEmptySignature(s)) {
178
+ hasRealSig = true;
179
+ }
180
+ else if (isAddrPlaceholder(s)) {
181
+ hasAddrPlaceholder = true;
182
+ }
183
+ }
184
+ }
185
+ if (hasRealSig && hasAddrPlaceholder) {
186
+ throw new sdk_core_1.InvalidTransactionError('transaction has a real ECDSA alongside an address placeholder (r=0): incomplete signing detected, refusing broadcast');
187
+ }
188
+ }
130
189
  return this.toHexString(avalanchejs_1.utils.addChecksum(this._avaxTransaction.getSignedTx().toBytes()));
131
190
  }
132
191
  // types - stakingTransaction, import, export
@@ -251,4 +310,4 @@ class Transaction extends sdk_core_1.BaseTransaction {
251
310
  }
252
311
  }
253
312
  exports.Transaction = Transaction;
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUF3SDtBQUN4SCxtREFROEI7QUFFOUIseUNBQXFEO0FBRXJELG1DQUFpSDtBQUVqSCxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQU1ELFNBQVMseUJBQXlCLENBQUMsVUFBb0I7SUFDckQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUUsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLEtBQUssT0FBTyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFD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QUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFekcsSUFBSSxlQUFlLENBQUM7UUFDcEIsSUFBSSxDQUFDLDBCQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkUsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU87WUFDTCxZQUFZO1lBQ1osRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RSxZQUFZO1lBQ1osYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFlBQVk7WUFDWixlQUFlO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFqUUQsa0NBaVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXZheFNlcmlhbCwgdXRpbHMgYXMgYXZheFV0aWxzLCBDcmVkZW50aWFsLCBwdm1TZXJpYWwsIHNlY3AyNTZrMSwgVW5zaWduZWRUeCB9IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IEFERFJFU1NfU0VQQVJBVE9SLCBEZWNvZGVkVXR4b09iaiwgSU5QVVRfU0VQQVJBVE9SLCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUeCwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzaWduYXR1cmUgaXMgZW1wdHlcbiAqIEBwYXJhbSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXNpZ25hdHVyZSAmJiB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ2F0dXJlOiBzdHJpbmcsIGFkZHJlc3NIZXg6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlczogc3RyaW5nW10pOiBDaGVja1NpZ25hdHVyZSB7XG4gIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDEgJiYgc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZy5zdGFydHNXaXRoKCcweCcpKSBzaWcgPSBzaWcuc3Vic3RyaW5nKDIpO1xuICAgICAgICBjb25zdCBwdWIgPSBzaWcuc3Vic3RyaW5nKDkwKTtcbiAgICAgICAgcmV0dXJuIHB1YiA9PT0gYWRkcmVzcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gTG9vayBmb3IgZW1wdHkgc3RyaW5nXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBpc0VtcHR5U2lnbmF0dXJlKHNpZyk7XG4gICAgfTtcbiAgfVxufVxuLy8gZW5kIHJlZ2lvbiB1dGlscyBmb3Igc2lnblxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEF2YWxhbmNoZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogc3RyaW5nO1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogc3RyaW5nO1xuICBwdWJsaWMgX25vZGVJRDogc3RyaW5nO1xuICBwdWJsaWMgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwdWJsaWMgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWUgPSBCaWdJbnQoMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3NlczogVWludDhBcnJheVtdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBCdWZmZXJBdmF4W10gPSBbXTtcbiAgcHVibGljIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdO1xuICBwdWJsaWMgX3RvOiBCdWZmZXJBdmF4W107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICBwdWJsaWMgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwdWJsaWMgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fbmV0d29yayA9IGNvaW5Db25maWcubmV0d29yayBhcyBBdmFsYW5jaGVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSB0aGlzLl9uZXR3b3JrLmF2YXhBc3NldElEO1xuICAgIHRoaXMuX2Jsb2NrY2hhaW5JRCA9IHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEO1xuICAgIHRoaXMuX25ldHdvcmtJRCA9IHRoaXMuX25ldHdvcmsubmV0d29ya0lEO1xuICB9XG5cbiAgZ2V0IGF2YXhQVHJhbnNhY3Rpb24oKTogYXZheFNlcmlhbC5CYXNlVHgge1xuICAgIHJldHVybiAoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5iYXNlVHg7XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHNbMF0uZ2V0U2lnbmF0dXJlcygpLmZpbHRlcigocykgPT4gIWlzRW1wdHlTaWduYXR1cmUocykpO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgcmV0dXJuICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCk/LmNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oeyBrZXkgfTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8oQkctNTY3MDApOiAgSW1wcm92ZSBjYW5TaWduIGJ5IGNoZWNrIGluIGFkZHJlc3NlcyBpbiBlbXB0eSBjcmVkZW50aWFscyBtYXRjaCBzaWduZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGFuIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIFVpbnQ4QXJyYXk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgICBjb25zdCB1bnNpZ25lZEJ5dGVzID0gdW5zaWduZWRUeC50b0J5dGVzKCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZWNwMjU2azEuZ2V0UHVibGljS2V5KHBydik7XG4gICAgaWYgKHVuc2lnbmVkVHguaGFzUHVia2V5KHB1YmxpY0tleSkpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkQnl0ZXMsIHBydik7XG4gICAgICBsZXQgY2hlY2tTaWduOiBDaGVja1NpZ25hdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIHVuc2lnbmVkVHguY3JlZGVudGlhbHMuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjLmdldFNpZ25hdHVyZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgICAgYy5nZXRTaWduYXR1cmVzKCkuZm9yRWFjaCgoc2lnLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICAgIGMuc2V0U2lnbmF0dXJlKGluZGV4LCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihcbiAgICAgICAgICAgIGBQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24sIGFkZHJlc3MgaGV4ICR7YWRkcmVzc0hleH0sIHB1YmxpYyBrZXk6ICR7cHVibGljS2V5fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBhdmF4VXRpbHMuYnVmZmVyVG9IZXgoYnl0ZUFycmF5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAvKipcbiAgICogc2hvdWxkIGJlIG9mIHNpZ25lZFR4IGRvaW5nIHRoaXMgd2l0aCBiYXNlVHhcbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b0hleFN0cmluZyhhdmF4VXRpbHMuYWRkQ2hlY2tzdW0oKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRTaWduZWRUeCgpLnRvQnl0ZXMoKSkpO1xuICB9XG5cbiAgLy8gdHlwZXMgLSBzdGFraW5nVHJhbnNhY3Rpb24sIGltcG9ydCwgZXhwb3J0XG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fYXZheFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkIGluIEJ1ZmZlciBmb3JtYXQuXG4gICAqIE9ubHkgbmVlZGVkIGZvciBjb2lucyB0aGF0IHN1cHBvcnQgYWRkaW5nIHNpZ25hdHVyZXMgZGlyZWN0bHkgKGUuZy4gVFNTKS5cbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgICByZXR1cm4gdXRpbHMuY2I1OEVuY29kZShCdWZmZXJBdmF4LmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IGF2YXhVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCByZXdhcmRBZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXdhcmRBZGRyZXNzZXMubWFwKChhKSA9PiBhdmF4VXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG91dHB1dHMuIEFtb3VudHMgYXJlIGV4cHJlc3NlZCBpbiBhYnNvbHV0ZSB2YWx1ZS5cbiAgICovXG4gIGdldCBvdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAoXG4gICAgICAgICAgICAgICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeFxuICAgICAgICAgICAgKS5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLm5vZGVJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IChcbiAgICAgICAgICAgICAgKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4XG4gICAgICAgICAgICApLnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iud2VpZ2h0LnRvSlNPTigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZlZSgpOiBUcmFuc2FjdGlvbkZlZSB7XG4gICAgcmV0dXJuIHsgZmVlOiAnMCcsIC4uLnRoaXMuX2ZlZSB9O1xuICB9XG5cbiAgZ2V0IGNoYW5nZU91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgcmV0dXJuICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeC5vdXRwdXRzLm1hcChcbiAgICAgIHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaylcbiAgICApO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBFbnRyeVtdIHtcbiAgICBsZXQgaW5wdXRzO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlucHV0cyA9ICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeFxuICAgICAgICAgIC5pbnB1dHM7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbnB1dC51dHhvSUQudHhJRC50b1N0cmluZygpICsgSU5QVVRfU0VQQVJBVE9SICsgaW5wdXQudXR4b0lELm91dHB1dElkeC52YWx1ZSgpLFxuICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICB2YWx1ZTogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheCB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIGhleHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKHBydjogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICAgIHRoaXMuX25ldHdvcmssXG4gICAgICBCdWZmZXJBdmF4LmZyb20odGhpcy5zaWduYWJsZVBheWxvYWQpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHBydilcbiAgICApO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUF3SDtBQUN4SCxtREFROEI7QUFFOUIseUNBQXFEO0FBRXJELG1DQUFpSDtBQUVqSCxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsU0FBaUI7SUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBTUQsU0FBUyx5QkFBeUIsQ0FBQyxVQUFvQjtJQUNyRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RSxvQkFBb0I7UUFDcEIsT0FBTyxVQUFV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QUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsT0FBTztZQUNMLFlBQVk7WUFDWixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDYixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLFlBQVk7WUFDWixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekYsWUFBWTtZQUNaLGVBQWU7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7U0FDbEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTdTRCxrQ0E2U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhdmF4U2VyaWFsLCB1dGlscyBhcyBhdmF4VXRpbHMsIENyZWRlbnRpYWwsIHB2bVNlcmlhbCwgc2VjcDI1NmsxLCBVbnNpZ25lZFR4IH0gZnJvbSAnQGJpdGdvLWZvcmtzL2F2YWxhbmNoZWpzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uRmVlLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgQUREUkVTU19TRVBBUkFUT1IsIERlY29kZWRVdHhvT2JqLCBJTlBVVF9TRVBBUkFUT1IsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4LCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBpcyBlbXB0eVxuICogQHBhcmFtIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpLnN0YXJ0c1dpdGgoJycucGFkU3RhcnQoOTAsICcwJykpO1xufVxuXG4vKipcbiAqIEFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgaXMgOTAgemVybyBoZXggY2hhcnMgKDQ1LWJ5dGUgcHJlZml4KSBmb2xsb3dlZCBieSBhIDIwLWJ5dGUgYWRkcmVzcy5cbiAqIEEgcHVyZWx5IGVtcHR5IHNsb3QgaXMgYWxsIHplcm9zLiBOb24temVybyBieXRlcyBhZnRlciBwb3NpdGlvbiA5MCBkaXN0aW5ndWlzaCB0aGUgdHdvLlxuICogQSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyIHBsYWNlaG9sZGVyIGluIHRoZSBzYW1lIGNyZWRlbnRpYWwgc2V0IG1lYW5zIG9uZSBzaWduZXInc1xuICogcGFzcyBuZXZlciByZXBsYWNlZCB0aGUgcGxhY2Vob2xkZXIgLS0gc2lnbmluZyBpcyBpbmNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBicm9hZGNhc3QuXG4gKiBAc2VlIENFQ0hPLTE2OTcsIENTSExELTE1NTBcbiAqL1xuZnVuY3Rpb24gaXNBZGRyUGxhY2Vob2xkZXIoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgc3RyaXBwZWQgPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKTtcbiAgY29uc3Qgc3VmZml4ID0gc3RyaXBwZWQuc3Vic3RyaW5nKDkwKTtcbiAgcmV0dXJuIHN1ZmZpeC5sZW5ndGggPiAwICYmIHN1ZmZpeCAhPT0gJycucGFkU3RhcnQoc3VmZml4Lmxlbmd0aCwgJzAnKTtcbn1cblxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ25hdHVyZTogc3RyaW5nLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKHNpZ25hdHVyZXM6IHN0cmluZ1tdKTogQ2hlY2tTaWduYXR1cmUge1xuICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPiAxICYmIHNpZ25hdHVyZXMuZXZlcnkoKHNpZykgPT4gaXNFbXB0eVNpZ25hdHVyZShzaWcpKSkge1xuICAgIC8vIExvb2sgZm9yIGFkZHJlc3MuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWcpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaWcuc3RhcnRzV2l0aCgnMHgnKSkgc2lnID0gc2lnLnN1YnN0cmluZygyKTtcbiAgICAgICAgY29uc3QgcHViID0gc2lnLnN1YnN0cmluZyg5MCk7XG4gICAgICAgIHJldHVybiBwdWIgPT09IGFkZHJlc3M7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gaXNFbXB0eVNpZ25hdHVyZShzaWcpO1xuICAgIH07XG4gIH1cbn1cbi8vIGVuZCByZWdpb24gdXRpbHMgZm9yIHNpZ25cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9hdmF4VHJhbnNhY3Rpb246IFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IHN0cmluZztcbiAgcHVibGljIF9ibG9ja2NoYWluSUQ6IHN0cmluZztcbiAgcHVibGljIF9ub2RlSUQ6IHN0cmluZztcbiAgcHVibGljIF9zdGFydFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9lbmRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfc3Rha2VBbW91bnQ6IGJpZ2ludDtcbiAgcHVibGljIF90aHJlc2hvbGQgPSAyO1xuICBwdWJsaWMgX2xvY2t0aW1lID0gQmlnSW50KDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBwdWJsaWMgX3Jld2FyZEFkZHJlc3NlczogQnVmZmVyQXZheFtdID0gW107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90bzogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX2ZlZTogUGFydGlhbDxUcmFuc2FjdGlvbkZlZT4gPSB7fTtcbiAgcHVibGljIF9ibHNQdWJsaWNLZXk6IHN0cmluZztcbiAgcHVibGljIF9ibHNTaWduYXR1cmU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgQXZhbGFuY2hlTmV0d29yaztcbiAgICB0aGlzLl9hc3NldElkID0gdGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRDtcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRDtcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRDtcbiAgfVxuXG4gIGdldCBhdmF4UFRyYW5zYWN0aW9uKCk6IGF2YXhTZXJpYWwuQmFzZVR4IHtcbiAgICByZXR1cm4gKCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4O1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgaW50ZXJzZWN0aW9uIG9mIG5vbi1lbXB0eSBzaWduYXR1cmVzIGFjcm9zcyBhbGwgY3JlZGVudGlhbHMuIEEgc2lnbmVyJ3NcbiAgICAvLyBFQ0RTQSBpcyBjb3VudGVkIG9ubHkgaWYgaXQgYXBwZWFycyBpbiBldmVyeSBjcmVkZW50aWFsIChldmVyeSBpbnB1dCksIHNvIGFcbiAgICAvLyBjcmVkZW50aWFsIHRoYXQgaXMgc3RpbGwgbWlzc2luZyBhIHNpZ25hdHVyZSBhbm90aGVyIGNyZWRlbnRpYWwgYWxyZWFkeSBoYXNcbiAgICAvLyBkb2VzIG5vdCBzdXJmYWNlIGEgZmFsc2UtY29tcGxldGUgc2lnbmF0dXJlIHNldC5cbiAgICBsZXQgaW50ZXJzZWN0aW9uOiBTZXQ8c3RyaW5nPiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNyZWRlbnRpYWxzKSB7XG4gICAgICBjb25zdCBjcmVkU2lncyA9IG5ldyBTZXQ8c3RyaW5nPihjLmdldFNpZ25hdHVyZXMoKS5maWx0ZXIoKHMpID0+ICFpc0VtcHR5U2lnbmF0dXJlKHMpKSk7XG4gICAgICBpZiAoaW50ZXJzZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgIGludGVyc2VjdGlvbiA9IGNyZWRTaWdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBzaWcgb2YgaW50ZXJzZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKCFjcmVkU2lncy5oYXMoc2lnKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uLmRlbGV0ZShzaWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9uID8gWy4uLmludGVyc2VjdGlvbl0gOiBbXTtcbiAgfVxuXG4gIGdldCBjcmVkZW50aWFscygpOiBDcmVkZW50aWFsW10ge1xuICAgIHJldHVybiAodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpPy5jcmVkZW50aWFscztcbiAgfVxuXG4gIGdldCBoYXNDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICAvLyBHdWFyZCBhZ2FpbnN0IGNyZWRlbnRpYWwgcmVnZW5lcmF0aW9uIHdoZW5ldmVyIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBzZXQgZnJvbSBhIHBhcnNlZFxuICAgIC8vIHR4LiBNdXN0IHVzZSAhPSBudWxsIChub3QgYSBsZW5ndGggY2hlY2spIHNvIGNyZWRlbnRpYWxzPVtdIGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW5cbiAgICAvLyBlc3RhYmxpc2hlZCAoaWYgYnVnZ3kpIHN0YXRlIHJhdGhlciB0aGFuIFwibmV2ZXIgYnVpbHRcIi5cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFscyAhPSBudWxsO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oeyBrZXkgfTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8oQkctNTY3MDApOiAgSW1wcm92ZSBjYW5TaWduIGJ5IGNoZWNrIGluIGFkZHJlc3NlcyBpbiBlbXB0eSBjcmVkZW50aWFscyBtYXRjaCBzaWduZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGFuIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIFVpbnQ4QXJyYXk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgICBjb25zdCB1bnNpZ25lZEJ5dGVzID0gdW5zaWduZWRUeC50b0J5dGVzKCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZWNwMjU2azEuZ2V0UHVibGljS2V5KHBydik7XG4gICAgaWYgKHVuc2lnbmVkVHguaGFzUHVia2V5KHB1YmxpY0tleSkpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkQnl0ZXMsIHBydik7XG4gICAgICBsZXQgY2hlY2tTaWduOiBDaGVja1NpZ25hdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIHVuc2lnbmVkVHguY3JlZGVudGlhbHMuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjLmdldFNpZ25hdHVyZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgICAgYy5nZXRTaWduYXR1cmVzKCkuZm9yRWFjaCgoc2lnLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICAgIGMuc2V0U2lnbmF0dXJlKGluZGV4LCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihcbiAgICAgICAgICAgIGBQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24sIGFkZHJlc3MgaGV4ICR7YWRkcmVzc0hleH0sIHB1YmxpYyBrZXk6ICR7cHVibGljS2V5fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBhdmF4VXRpbHMuYnVmZmVyVG9IZXgoYnl0ZUFycmF5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAvKipcbiAgICogc2hvdWxkIGJlIG9mIHNpZ25lZFR4IGRvaW5nIHRoaXMgd2l0aCBiYXNlVHhcbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICAvLyBjcmVkZW50aWFscz1bXSBpcyBhbHdheXMgYSBidWc6IGhhc0NyZWRlbnRpYWxzIHRyZWF0cyBpdCBhcyBcImVzdGFibGlzaGVkXCIgc28gYSByZWJ1aWxkXG4gICAgLy8gd29uJ3Qgc2lsZW50bHkgcmVnZW5lcmF0ZSBwbGFjZWhvbGRlcnMgb3ZlciBpdCwgYnV0IGFuIGVtcHR5IGFycmF5IG1lYW5zIG5vIHNpZ25lciBoYXNcbiAgICAvLyBhY3R1YWxseSB0b3VjaGVkIHRoZSB0eCAtLSBzZXJpYWxpemluZyBpdCB3b3VsZCBwcm9kdWNlIGEgemVyby1jcmVkZW50aWFsIHR4LlxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzICE9IG51bGwgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndHJhbnNhY3Rpb24gaGFzIG5vIGNyZWRlbnRpYWxzIOKAlCBjYW5ub3QgYnJvYWRjYXN0Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzICYmIHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGhhc1JlYWxTaWcgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNBZGRyUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBjLmdldFNpZ25hdHVyZXMoKSkge1xuICAgICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzKSkge1xuICAgICAgICAgICAgaGFzUmVhbFNpZyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0FkZHJQbGFjZWhvbGRlcihzKSkge1xuICAgICAgICAgICAgaGFzQWRkclBsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNSZWFsU2lnICYmIGhhc0FkZHJQbGFjZWhvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3RyYW5zYWN0aW9uIGhhcyBhIHJlYWwgRUNEU0EgYWxvbmdzaWRlIGFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHI9MCk6IGluY29tcGxldGUgc2lnbmluZyBkZXRlY3RlZCwgcmVmdXNpbmcgYnJvYWRjYXN0J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b0hleFN0cmluZyhhdmF4VXRpbHMuYWRkQ2hlY2tzdW0oKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRTaWduZWRUeCgpLnRvQnl0ZXMoKSkpO1xuICB9XG5cbiAgLy8gdHlwZXMgLSBzdGFraW5nVHJhbnNhY3Rpb24sIGltcG9ydCwgZXhwb3J0XG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fYXZheFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkIGluIEJ1ZmZlciBmb3JtYXQuXG4gICAqIE9ubHkgbmVlZGVkIGZvciBjb2lucyB0aGF0IHN1cHBvcnQgYWRkaW5nIHNpZ25hdHVyZXMgZGlyZWN0bHkgKGUuZy4gVFNTKS5cbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgICByZXR1cm4gdXRpbHMuY2I1OEVuY29kZShCdWZmZXJBdmF4LmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IGF2YXhVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCByZXdhcmRBZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXdhcmRBZGRyZXNzZXMubWFwKChhKSA9PiBhdmF4VXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG91dHB1dHMuIEFtb3VudHMgYXJlIGV4cHJlc3NlZCBpbiBhYnNvbHV0ZSB2YWx1ZS5cbiAgICovXG4gIGdldCBvdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAoXG4gICAgICAgICAgICAgICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeFxuICAgICAgICAgICAgKS5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLm5vZGVJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IChcbiAgICAgICAgICAgICAgKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4XG4gICAgICAgICAgICApLnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iud2VpZ2h0LnRvSlNPTigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZlZSgpOiBUcmFuc2FjdGlvbkZlZSB7XG4gICAgcmV0dXJuIHsgZmVlOiAnMCcsIC4uLnRoaXMuX2ZlZSB9O1xuICB9XG5cbiAgZ2V0IGNoYW5nZU91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgcmV0dXJuICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeC5vdXRwdXRzLm1hcChcbiAgICAgIHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaylcbiAgICApO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBFbnRyeVtdIHtcbiAgICBsZXQgaW5wdXRzO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlucHV0cyA9ICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeFxuICAgICAgICAgIC5pbnB1dHM7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbnB1dC51dHhvSUQudHhJRC50b1N0cmluZygpICsgSU5QVVRfU0VQQVJBVE9SICsgaW5wdXQudXR4b0lELm91dHB1dElkeC52YWx1ZSgpLFxuICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICB2YWx1ZTogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheCB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIGhleHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKHBydjogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICAgIHRoaXMuX25ldHdvcmssXG4gICAgICBCdWZmZXJBdmF4LmZyb20odGhpcy5zaWduYWJsZVBheWxvYWQpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHBydilcbiAgICApO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLGlEQUE0QztBQUM1QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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O1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9GLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdmF4cCc7XG5pbXBvcnQgKiBhcyBlcnJvck1lc3NhZ2UgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcblxuZGVzY3JpYmUoJ0F2YXhQIEV4cG9ydCBQMkMgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RXhwb3J0QnVpbGRlcigpO1xuICAgIGl0KCdzaG91bGQgZmFpbCBhbW91bnQgbG93IHRoYW4gemVybycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KCctMScpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQoQnVmZmVyLmZyb20odGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCkpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9MRU5HVEhcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIG5vdCBhIHZhaWxkIGJhc2U1OCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lEKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfTk9UX0JBU0U1OFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgY2I1OCBpbnZhbGlkIGNoZWNrc3VtJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuVkFMSURfQ19DSEFJTl9JRC5zbGljZSgyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX0lOVkFMSURfQ0hFQ0tTVU1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3MgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfVVRYT1NfRU1QVFlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3Mgd2l0aG91dCBhbW91bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW3sgb3V0cHV0SUQ6ICcnIH0gYXMgYW55IGFzIERlY29kZWRVdHhvT2JqXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0FNT1VOVFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGggY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy51bnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5oYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5mdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjEsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyByZWNvdmVyeSB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuclVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJIYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5yRnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYzLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgd2l0aG91dCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MSxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHJlY292ZXJ5IHdpdGhvdXQgY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULm91dHB1dHMpXG4gICAgICAgIC5yZWNvdmVyTW9kZSgpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5yVW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuckhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJGdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjMsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uICcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbChlcnJvck1lc3NhZ2UuRVJST1JfS0VZX0NBTk5PVF9TSUdOKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIDIgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnJVbnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLGlEQUE0QztBQUM1QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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Q3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvRixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyxTQUFTO2lCQUNOLEtBQUssRUFBRTtpQkFDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheHAnO1xuaW1wb3J0ICogYXMgZXJyb3JNZXNzYWdlIGZyb20gJy4uLy4uL3Jlc291cmNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdBdmF4UCBFeHBvcnQgUDJDIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgdHhCdWlsZGVyIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEJ1aWxkZXIoKTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYW1vdW50IGxvdyB0aGFuIHplcm8nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmFtb3VudCgnLTEnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQU1PVU5UXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbGVuZ3RoIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKEJ1ZmZlci5mcm9tKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfTEVOR1RIXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBub3QgYSB2YWlsZCBiYXNlNTggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX05PVF9CQVNFNThcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9JTlZBTElEX0NIRUNLU1VNXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0VNUFRZXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5vdXRwdXRzKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuaGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuZnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYxLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgcmVjb3Zlcnkgd2l0aCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0Mub3V0cHV0cylcbiAgICAgICAgLnJlY292ZXJNb2RlKCksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJVbnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5ySGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuckZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MyxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGhvdXQgY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC51bnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5oYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5mdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjEsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyByZWNvdmVyeSB3aXRob3V0IGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuclVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJIYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5yRnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYzLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBkZXNjcmliZSgnQ3JlZGVudGlhbCBndWFyZCBieXBhc3MgcmVncmVzc2lvbiAoQ0VDSE8tMTY5NyknLCAoKSA9PiB7XG4gICAgLy8gUmVncmVzc2lvbiBmb3IgcHJvZHVjdGlvbiBpbmNpZGVudCAyMDI2LTA3LTE2OlxuICAgIC8vIHR4IDh4YmlMcHNLREtrSnJOM1lVcWNacEZjeEFwTEN3bVFrcEtVdXZtSFUxR0w5Um1BeXUgd2FzIGJyb2FkY2FzdFxuICAgIC8vIHdpdGggc2lnWzFdIHN0aWxsIGFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHI9MCkgYmVjYXVzZSBoYXNDcmVkZW50aWFscyhbXSlcbiAgICAvLyByZXR1cm5lZCBmYWxzZSwgY2F1c2luZyBidWlsZEF2YXhUcmFuc2FjdGlvbigpIHRvIHdpcGUgU2lnbmVyIDEncyBFQ0RTQS5cbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuXG4gICAgaXQoJ2hhc0NyZWRlbnRpYWxzIHJldHVybnMgdHJ1ZSBmb3IgY3JlZGVudGlhbHM9W10gcHJldmVudGluZyBjcmVkZW50aWFsIHdpcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zXG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZEhleCA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBTaW11bGF0ZSB0aGUgYnVnIHRyaWdnZXI6IGNyZWRlbnRpYWxzPVtdIG9uIHRoZSBwYXJzZWQgdHhcbiAgICAgIGNvbnN0IHNpZ25lcjJCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGhhbGZTaWduZWRIZXgpIGFzIGFueTtcbiAgICAgIGNvbnN0IGludGVybmFsVHggPSBzaWduZXIyQnVpbGRlci50cmFuc2FjdGlvbjtcblxuICAgICAgLy8gRm9yY2UgY3JlZGVudGlhbHMgdG8gW10gYXMgaGFwcGVucyBpbiBwcm9kdWN0aW9uIGRlc2VyaWFsaXphdGlvbiBlZGdlIGNhc2VcbiAgICAgIChpbnRlcm5hbFR4Ll9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KS5jcmVkZW50aWFscyA9IFtdO1xuXG4gICAgICAvLyBCZWZvcmUgZml4OiBoYXNDcmVkZW50aWFscyB3YXMgZmFsc2Ug4oaSIGJ1aWxkQXZheFRyYW5zYWN0aW9uKCkgd291bGQgcmVnZW5lcmF0ZVxuICAgICAgLy8gQWZ0ZXIgZml4OiBoYXNDcmVkZW50aWFscyBpcyB0cnVlIOKGkiBndWFyZCBmaXJlcyDihpIgY3JlZGVudGlhbHMgcHJlc2VydmVkXG4gICAgICBpbnRlcm5hbFR4Lmhhc0NyZWRlbnRpYWxzLnNob3VsZC5iZS50cnVlKFxuICAgICAgICAnaGFzQ3JlZGVudGlhbHMgbXVzdCByZXR1cm4gdHJ1ZSBmb3IgY3JlZGVudGlhbHM9W10gdG8gYmxvY2sgY3JlZGVudGlhbCByZWdlbmVyYXRpb24nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWRlbnRpYWwgcmVnZW5lcmF0aW9uIGlzIGJsb2NrZWQgd2hlbiBjcmVkZW50aWFscz1bXSBwcmV2ZW50aW5nIFNpZ25lciAxIEVDRFNBIHdpcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zXG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZEhleCA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBTaW11bGF0ZSBidWc6IGZvcmNlIGNyZWRlbnRpYWxzPVtdIGJlZm9yZSBTaWduZXIgMiBjYWxscyBidWlsZCgpXG4gICAgICBjb25zdCBzaWduZXIyQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmU2lnbmVkSGV4KSBhcyBhbnk7XG4gICAgICBjb25zdCBpbnRlcm5hbFR4ID0gc2lnbmVyMkJ1aWxkZXIudHJhbnNhY3Rpb247XG4gICAgICAoaW50ZXJuYWxUeC5fYXZheFRyYW5zYWN0aW9uIGFzIGFueSkuY3JlZGVudGlhbHMgPSBbXTtcblxuICAgICAgLy8gYnVpbGQoKSBtdXN0IE5PVCByZWdlbmVyYXRlIGZyZXNoIHBsYWNlaG9sZGVyIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCByZWJ1aWx0ID0gYXdhaXQgc2lnbmVyMkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRDcmVkcyA9IChyZWJ1aWx0IGFzIGFueSkuY3JlZGVudGlhbHM7XG5cbiAgICAgIC8vIEFmdGVyIGZpeDogY3JlZGVudGlhbHMgc3RheSBhcyBbXSAoZ3VhcmQgZmlyZWQsIG5vIHJlZ2VuZXJhdGlvbilcbiAgICAgIC8vIEJlZm9yZSBmaXg6IGNyZWRlbnRpYWxzIHdvdWxkIGJlIHJlZ2VuZXJhdGVkIHRvIE7Dl1tQTEFDRUhPTERFUiwgUExBQ0VIT0xERVJdXG4gICAgICByZWJ1aWx0Q3JlZHMubGVuZ3RoLnNob3VsZC5lcXVhbChcbiAgICAgICAgMCxcbiAgICAgICAgJ2J1aWxkKCkgbXVzdCBub3QgcmVnZW5lcmF0ZSBjcmVkZW50aWFscyB3aGVuIGNyZWRlbnRpYWxzPVtdIOKAlCBndWFyZCBtdXN0IGZpcmUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25hdHVyZSBnZXR0ZXIgZXhwb3NlcyBpbmNvbXBsZXRlIHNpZ25pbmcgYWNyb3NzIGFsbCBjcmVkZW50aWFscycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNpZ25lciAxIGhhbGYtc2lnbnMgb25seVxuICAgICAgY29uc3Qgc2lnbmVyMUJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHNpZ25lcjFCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYxIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgc2lnbmVyMUJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gQWZ0ZXIgU2lnbmVyIDE6IHNpZ25hdHVyZSBnZXR0ZXIgbXVzdCBzaG93IGV4YWN0bHkgMSByZWFsIEVDRFNBXG4gICAgICBoYWxmU2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIDEsXG4gICAgICAgICdzaG91bGQgZXhwb3NlIGV4YWN0bHkgMSByZWFsIEVDRFNBIGFmdGVyIGZpcnN0IHNpZ25lciDigJQgU2lnbmVyIDIgc2xvdCBpcyBzdGlsbCBlbXB0eSdcbiAgICAgICk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIHRoZSBjb3JydXB0IHN0YXRlIHRoZSBQUiB0YXJnZXRzOiBmdWxseSBzaWduIHRoZSB0eCwgdGhlbiBjb3JydXB0XG4gICAgICAvLyBvbmUgY3JlZGVudGlhbCBzbyB0aGF0IGNyZWRlbnRpYWxzWzBdIGhhcyBib3RoIEVDRFNBcyBidXQgY3JlZGVudGlhbHNbMV1cbiAgICAgIC8vIG9ubHkgaGFzIG9uZS4gIEEgdW5pb24gd291bGQgc3RpbGwgcmV0dXJuIDIgKG1hc2tpbmcgdGhlIGNvcnJ1cHRpb24pLlxuICAgICAgLy8gVGhlIGludGVyc2VjdGlvbiBtdXN0IHJldHVybiAxIGJlY2F1c2UgdGhlIHNlY29uZCBzaWduZXIncyBFQ0RTQSBpcyBhYnNlbnRcbiAgICAgIC8vIGZyb20gY3JlZGVudGlhbHNbMV0uXG4gICAgICBjb25zdCBmdWxsQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLmhhbGZzaWdudHhIZXgpO1xuICAgICAgZnVsbEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCBmdWxsVHggPSBhd2FpdCBmdWxsQnVpbGRlci5idWlsZCgpO1xuICAgICAgZnVsbFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDIsICdzYW5pdHk6IGZ1bGx5IHNpZ25lZCB0eCBzaG91bGQgaGF2ZSAyIHNpZ25hdHVyZXMnKTtcblxuICAgICAgLy8gOTAgaGV4IGNoYXJzIG9mIGxlYWRpbmcgemVyb3MgaXMgdGhlIGVtcHR5LXNpZ25hdHVyZSBwcmVmaXggdXNlZCBieSBpc0VtcHR5U2lnbmF0dXJlKCkuXG4gICAgICBjb25zdCBFTVBUWV9TSUdfWkVST19QUkVGSVggPSAnJy5wYWRTdGFydCg5MCwgJzAnKTtcblxuICAgICAgLy8gQ29ycnVwdCBjcmVkZW50aWFsc1sxXTogemVybyBvdXQgU2lnbmVyIDIncyBzbG90IHNvIHRoZSBpbnRlcnNlY3Rpb24gZHJvcHMgdG8gMS5cbiAgICAgIC8vIFVzZSBhc3NlcnRpb25zIGluc3RlYWQgb2YgZ3VhcmRzIHNvIHRoZSB0ZXN0IGZhaWxzIGxvdWRseSBpZiB0aGUgdHggc2hhcGUgY2hhbmdlcy5cbiAgICAgIGNvbnN0IGNyZWRzID0gKGZ1bGxUeCBhcyBhbnkpLmNyZWRlbnRpYWxzO1xuICAgICAgYXNzZXJ0Lm9rKGNyZWRzICYmIGNyZWRzLmxlbmd0aCA+PSAyLCAnZnVsbHkgc2lnbmVkIHR4IG11c3QgaGF2ZSBhdCBsZWFzdCAyIGNyZWRlbnRpYWxzJyk7XG4gICAgICBjb25zdCBjcmVkMTogYW55ID0gY3JlZHNbMV07XG4gICAgICBjb25zdCBjczE6IGFueSA9IGNyZWQxLnNlcmlhbGl6ZSgpO1xuICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gY3MxLnNpZ0FycmF5LmZpbmRJbmRleChcbiAgICAgICAgKHM6IGFueSwgaTogbnVtYmVyKSA9PiBpID4gMCAmJiAhcy5ieXRlcy5zdGFydHNXaXRoKEVNUFRZX1NJR19aRVJPX1BSRUZJWClcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2sodGFyZ2V0SWR4ICE9PSAtMSwgJ2NyZWRlbnRpYWxzWzFdIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBzbG90IGJleW9uZCBpbmRleCAwIChTaWduZXIgMiBzbG90KScpO1xuICAgICAgY3MxLnNpZ0FycmF5W3RhcmdldElkeF0uYnl0ZXMgPSAnJy5wYWRTdGFydChjczEuc2lnQXJyYXlbdGFyZ2V0SWR4XS5ieXRlcy5sZW5ndGgsICcwJyk7XG4gICAgICBjcmVkMS5kZXNlcmlhbGl6ZShjczEpO1xuXG4gICAgICAvLyBXaXRoIGludGVyc2VjdGlvbiwgcmVtb3ZpbmcgRUNEU0EyIGZyb20gY3JlZGVudGlhbHNbMV0gbXVzdCByZWR1Y2UgdGhlIGNvdW50IHRvIDEuXG4gICAgICBmdWxsVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIDEsXG4gICAgICAgICdpbnRlcnNlY3Rpb24gbXVzdCBkZXRlY3QgdGhhdCBjcmVkZW50aWFsc1sxXSBpcyBtaXNzaW5nIEVDRFNBMiDigJQgaW5jb21wbGV0ZSBzaWduaW5nIHZpc2libGUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Z1bGwgc2lnbiBmcm9tIGhhbGYtc2lnbmVkIGhleCBwcm9kdWNlcyAyIHJlYWwgRUNEU0FzIGFuZCBjb3JyZWN0IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZXhhY3QgZmxvdyB0aGF0IE1VU1Qgd29yayBpbiBwcm9kdWN0aW9uIGFmdGVyIHRoZSBmaXg6XG4gICAgICAvLyBTaWduZXIgMiB0YWtlcyBTaWduZXIgMSdzIGhhbGYtc2lnbmVkIGhleCBhbmQgZmlsbHMgdGhlIHJlbWFpbmluZyBzbG90LlxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEuaGFsZnNpZ250eEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoZGF0YS5mdWxsc2lnbnR4SGV4KTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDIsICdib3RoIEhTTSBzaWduZXIgc2xvdHMgbXVzdCBiZSBmaWxsZWQgd2l0aCByZWFsIEVDRFNBcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24oKSB0aHJvd3Mgb24gZW1wdHkgY3JlZGVudGlhbHMgcmF0aGVyIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIGJhZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNpZ25lciAxIGhhbGYtc2lnbnNcbiAgICAgIGNvbnN0IHNpZ25lcjFCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEudW5zaWduZWRUeEhleCk7XG4gICAgICBzaWduZXIxQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IGhhbGZUeCA9IGF3YWl0IHNpZ25lcjFCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIGJ1ZzogY3JlZGVudGlhbHMgd2lwZWQgdG8gW10gYmVmb3JlIFNpZ25lciAyIHNpZ25zXG4gICAgICBjb25zdCBzaWduZXIyQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkgYXMgYW55O1xuICAgICAgc2lnbmVyMkJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICAoc2lnbmVyMkJ1aWxkZXIudHJhbnNhY3Rpb24uX2F2YXhUcmFuc2FjdGlvbiBhcyBhbnkpLmNyZWRlbnRpYWxzID0gW107XG5cbiAgICAgIC8vIGJ1aWxkKCkgY2FsbHMgdHJhbnNhY3Rpb24uc2lnbigpIHdoaWNoIG11c3QgdGhyb3cg4oCUIG5vdCBzaWxlbnRseSBwcm9kdWNlIGEgYmFkIHR4XG4gICAgICBhd2FpdCBzaWduZXIyQnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnRXhwZWN0ZWQgc2lnbiB0byB0aHJvdyBvbiBlbXB0eSBjcmVkZW50aWFscycpKVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ2VtcHR5IGNyZWRlbnRpYWxzIHRvIHNpZ24nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9Ccm9hZGNhc3RGb3JtYXQoKSB0aHJvd3Mgd2hlbiByZWFsIEVDRFNBIGNvZXhpc3RzIHdpdGggYWRkcmVzcyBwbGFjZWhvbGRlciAocHJvZHVjdGlvbiBmYWlsdXJlIHNoYXBlKScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFJlcHJvZHVjZSB0aGUgZXhhY3QgY3JlZGVudGlhbCBsYXlvdXQgZnJvbSB0aGUgSnVsIDE2IHByb2R1Y3Rpb24gZmFpbHVyZTpcbiAgICAgIC8vIHNsb3RbMF0gPSByZWFsIEVDRFNBIChTaWduZXIgMiBmaWxsZWQgd3Jvbmcgc2xvdCBkdWUgdG8gTU9ERSAxIG1pc21hdGNoKVxuICAgICAgLy8gc2xvdFsxXSA9IEFERFJfUExBQ0VIT0xERVIgKHI9MCwgOTAgemVybyBoZXggY2hhcnMgKyBIU00xIGFkZHJlc3MpXG4gICAgICAvLyBUaGlzIGlzIHRoZSBzaGFwZSB0aGF0IEF2YWxhbmNoZUdvIHJlamVjdGVkIHdpdGggXCJmYWlsZWQgdmVyaWZ5U3BlbmQ6IGludmFsaWQgc2lnbmF0dXJlXCIuXG4gICAgICBjb25zdCBFTVBUWV9TSUdfWkVST19QUkVGSVggPSAnJy5wYWRTdGFydCg5MCwgJzAnKTtcbiAgICAgIGNvbnN0IHNpZ25lcjFCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEudW5zaWduZWRUeEhleCk7XG4gICAgICBzaWduZXIxQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IGhhbGZUeCA9IGF3YWl0IHNpZ25lcjFCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBmdWxsQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBmdWxsQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIGNvbnN0IGZ1bGxUeCA9IChhd2FpdCBmdWxsQnVpbGRlci5idWlsZCgpKSBhcyBhbnk7XG5cbiAgICAgIC8vIENvcnJ1cHQgY3JlZGVudGlhbHM6IHN3YXAgc2xvdFswXSAocmVhbEVDRFNBMSkgd2l0aCBhbiBhZGRyIHBsYWNlaG9sZGVyLFxuICAgICAgLy8gbGVhdmluZyBzbG90WzFdID0gcmVhbEVDRFNBMi4gVGhpcyBtaW1pY3MgdGhlIGJ1ZyBvdXRwdXQgd2hlcmUgYSByZWFsIEVDRFNBXG4gICAgICAvLyBjb2V4aXN0cyB3aXRoIGFuIGFkZHIgcGxhY2Vob2xkZXIgaW4gdGhlIHNhbWUgY3JlZGVudGlhbC5cbiAgICAgIGNvbnN0IGNyZWRzID0gZnVsbFR4LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKGNyZWRzICYmIGNyZWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3JlZDA6IGFueSA9IGNyZWRzWzBdO1xuICAgICAgICBjb25zdCBjczogYW55ID0gY3JlZDAuc2VyaWFsaXplKCk7XG4gICAgICAgIC8vIEJ1aWxkIGEgZmFrZSBhZGRyIHBsYWNlaG9sZGVyOiA5MCB6ZXJvcyArIDQwIGhleCBjaGFycyBvZiBhIG1vY2sgYWRkcmVzc1xuICAgICAgICBjb25zdCBmYWtlQWRkclBsYWNlaG9sZGVyID0gRU1QVFlfU0lHX1pFUk9fUFJFRklYICsgJ2RmMzI3MTdiZDdiN2EyZDUwYTcxNTIwMjc5NTk0MDI1MGM3YmE5ZTQnO1xuICAgICAgICBjcy5zaWdBcnJheVswXS5ieXRlcyA9IGZha2VBZGRyUGxhY2Vob2xkZXI7XG4gICAgICAgIGNyZWQwLmRlc2VyaWFsaXplKGNzKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZnVsbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIChlOiBhbnkpID0+XG4gICAgICAgICAgZS5tZXNzYWdlID09PVxuICAgICAgICAgICd0cmFuc2FjdGlvbiBoYXMgYSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyZXNzIHBsYWNlaG9sZGVyIChyPTApOiBpbmNvbXBsZXRlIHNpZ25pbmcgZGV0ZWN0ZWQsIHJlZnVzaW5nIGJyb2FkY2FzdCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uICcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbChlcnJvck1lc3NhZ2UuRVJST1JfS0VZX0NBTk5PVF9TSUdOKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIDIgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnJVbnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19