@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.492 → 1.4.3-alpha.494

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":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,eAAe,EAIhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EAAE,gBAAgB,EAAiB,iBAAiB,EAA2B,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,kBAAkB,CAAC,CAAoB;IAC/C,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,OAAO,CAAW;IAE1B;;;;OAIG;gBACS,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C;;;;OAIG;IACG,6BAA6B,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjF;;;;;OAKG;IACG,yBAAyB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C5G;;;;;;OAMG;YACW,yBAAyB;IAwBvC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IA6BjC;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C;;;;;;OAMG;IACG,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxF,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAK9B,kBAAkB;IAClB,MAAM,IAAI,iBAAiB;IAO3B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAKnB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;;;OAIG;IACH,IAAI,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED;;;;OAIG;IACH,IAAI,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAE7C;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,aAAa,SAAI,GAAG,gBAAgB,EAAE;IAO5D;;;;;OAKG;IACH,2BAA2B,IAAI;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE;CAW5D"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAA4C,MAAM,sBAAsB,CAAC;AAC1G,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EAAE,gBAAgB,EAAiB,iBAAiB,EAA2B,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,kBAAkB,CAAC,CAAoB;IAC/C,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,OAAO,CAAW;IAE1B;;;;OAIG;gBACS,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C;;;;OAIG;IACG,6BAA6B,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjF;;;;;OAKG;IACG,yBAAyB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C5G;;;;;;OAMG;YACW,yBAAyB;IAwBvC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IA6BjC;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C;;;;;;OAMG;IACG,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxF,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAK9B,kBAAkB;IAClB,MAAM,IAAI,iBAAiB;IAO3B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAKnB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;;;OAIG;IACH,IAAI,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED;;;;OAIG;IACH,IAAI,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAE7C;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,aAAa,SAAI,GAAG,gBAAgB,EAAE;IAO5D;;;;;OAKG;IACH,2BAA2B,IAAI;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE;CAW5D"}
@@ -43,6 +43,29 @@ const rpc_1 = require("@taquito/rpc");
43
43
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
44
44
  const multisigUtils_1 = require("./multisigUtils");
45
45
  const Utils = __importStar(require("./utils"));
46
+ const SIGNATURE_HEX_LENGTH = 128;
47
+ async function tryParseSigned(serialized) {
48
+ if (serialized.length <= SIGNATURE_HEX_LENGTH) {
49
+ return undefined;
50
+ }
51
+ // If `serialized` really is `forge(ops) || signature`, stripping the trailing 64
52
+ // bytes gives the exact forge bytes and forge(parse(...)) reproduces them. If
53
+ // `serialized` was unsigned, stripping cuts into the operation contents: parse
54
+ // either throws or recovers a truncated parse whose forge does not match. So a
55
+ // clean round-trip is what proves the trailing bytes were a signature.
56
+ const operationBytes = serialized.slice(0, -SIGNATURE_HEX_LENGTH);
57
+ try {
58
+ const parsed = await local_forging_1.localForger.parse(operationBytes);
59
+ const roundTrip = await local_forging_1.localForger.forge(parsed);
60
+ if (roundTrip !== operationBytes) {
61
+ return undefined;
62
+ }
63
+ return { parsed, transactionId: await Utils.calculateTransactionId(serialized) };
64
+ }
65
+ catch (_) {
66
+ return undefined;
67
+ }
68
+ }
46
69
  /**
47
70
  * Tezos transaction model.
48
71
  */
@@ -63,23 +86,16 @@ class Transaction extends sdk_core_1.BaseTransaction {
63
86
  */
64
87
  async initFromSerializedTransaction(serializedTransaction) {
65
88
  this._encodedTransaction = serializedTransaction;
66
- try {
67
- const parsedTransaction = await local_forging_1.localForger.parse(serializedTransaction);
68
- await this.initFromParsedTransaction(parsedTransaction);
69
- }
70
- catch (e) {
71
- // If it throws, it is possible the serialized transaction is signed, which is not supported
72
- // by local-forging. Try extracting the last 64 bytes and parse it again.
73
- const unsignedSerializedTransaction = serializedTransaction.slice(0, -128);
74
- const signature = serializedTransaction.slice(-128);
75
- if (Utils.isValidSignature(signature)) {
76
- throw new sdk_core_1.ParseTransactionError('Invalid transaction');
77
- }
89
+ // Only signed inputs have a transaction id (it is the hash of the signed bytes);
90
+ // unsigned inputs leave it unset and let the caller populate it after signing.
91
+ const signed = await tryParseSigned(serializedTransaction);
92
+ if (signed) {
78
93
  // TODO: encode the signature and save it in _signature
79
- const parsedTransaction = await local_forging_1.localForger.parse(unsignedSerializedTransaction);
80
- const transactionId = await Utils.calculateTransactionId(serializedTransaction);
81
- await this.initFromParsedTransaction(parsedTransaction, transactionId);
94
+ await this.initFromParsedTransaction(signed.parsed, signed.transactionId);
95
+ return;
82
96
  }
97
+ const parsed = await local_forging_1.localForger.parse(serializedTransaction);
98
+ await this.initFromParsedTransaction(parsed);
83
99
  }
84
100
  /**
85
101
  * Initialize the transaction fields based on another parsed transaction.
@@ -328,4 +344,4 @@ class Transaction extends sdk_core_1.BaseTransaction {
328
344
  }
329
345
  }
330
346
  exports.Transaction = Transaction;
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQU04QjtBQUU5QiwwREFBcUQ7QUFDckQsc0NBQXNDO0FBQ3RDLGdFQUFxQztBQUdyQyxtREFNeUI7QUFDekIsK0NBQWlDO0FBRWpDOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFTOUM7Ozs7T0FJRztJQUNILFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDZCQUE2QixDQUFDLHFCQUE2QjtRQUMvRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7UUFDakQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLDJCQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDekUsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLDRGQUE0RjtZQUM1Rix5RUFBeUU7WUFDekUsTUFBTSw2QkFBNkIsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0UsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7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LENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUFwVEQsa0NBb1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGxvY2FsRm9yZ2VyIH0gZnJvbSAnQHRhcXVpdG8vbG9jYWwtZm9yZ2luZyc7XG5pbXBvcnQgeyBPcEtpbmQgfSBmcm9tICdAdGFxdWl0by9ycGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgSW5kZXhlZFNpZ25hdHVyZSwgT3JpZ2luYXRpb25PcCwgUGFyc2VkVHJhbnNhY3Rpb24sIFJldmVhbE9wLCBUcmFuc2FjdGlvbk9wIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7XG4gIGdldE11bHRpc2lnVHJhbnNmZXJEYXRhRnJvbU9wZXJhdGlvbixcbiAgZ2V0TXVsdGlzaWdUcmFuc2ZlclNpZ25hdHVyZXMsXG4gIGdldE9yaWdpbmF0aW9uRGF0YUZyb21PcGVyYXRpb24sXG4gIGdldE93bmVyc1B1YmxpY0tleXMsXG4gIHVwZGF0ZU11bHRpc2lnVHJhbnNmZXJTaWduYXR1cmVzLFxufSBmcm9tICcuL211bHRpc2lnVXRpbHMnO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogVGV6b3MgdHJhbnNhY3Rpb24gbW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3BhcnNlZFRyYW5zYWN0aW9uPzogUGFyc2VkVHJhbnNhY3Rpb247IC8vIHRyYW5zYWN0aW9uIGluIEpTT04gZm9ybWF0XG4gIHByaXZhdGUgX2VuY29kZWRUcmFuc2FjdGlvbj86IHN0cmluZzsgLy8gdHJhbnNhY3Rpb24gaW4gaGV4IGZvcm1hdFxuICBwcml2YXRlIF9zb3VyY2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVsZWdhdGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2ZvcndhcmRlckRlc3RpbmF0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlIF9wdWJsaWNLZXlUb1JldmVhbD86IHN0cmluZztcbiAgcHJpdmF0ZSBfb3duZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWRvbmx5PENvaW5Db25maWc+fSBjb2luQ29uZmlnXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX293bmVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGZpZWxkcyBiYXNlZCBvbiBhbm90aGVyIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYnJvYWRjYXN0IGZvcm1hdC5cbiAgICovXG4gIGFzeW5jIGluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5jb2RlZFRyYW5zYWN0aW9uID0gc2VyaWFsaXplZFRyYW5zYWN0aW9uO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGxvY2FsRm9yZ2VyLnBhcnNlKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbik7XG4gICAgICBhd2FpdCB0aGlzLmluaXRGcm9tUGFyc2VkVHJhbnNhY3Rpb24ocGFyc2VkVHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIGl0IHRocm93cywgaXQgaXMgcG9zc2libGUgdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gaXMgc2lnbmVkLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICAvLyBieSBsb2NhbC1mb3JnaW5nLiBUcnkgZXh0cmFjdGluZyB0aGUgbGFzdCA2NCBieXRlcyBhbmQgcGFyc2UgaXQgYWdhaW4uXG4gICAgICBjb25zdCB1bnNpZ25lZFNlcmlhbGl6ZWRUcmFuc2FjdGlvbiA9IHNlcmlhbGl6ZWRUcmFuc2FjdGlvbi5zbGljZSgwLCAtMTI4KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNlcmlhbGl6ZWRUcmFuc2FjdGlvbi5zbGljZSgtMTI4KTtcbiAgICAgIGlmIChVdGlscy5pc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogZW5jb2RlIHRoZSBzaWduYXR1cmUgYW5kIHNhdmUgaXQgaW4gX3NpZ25hdHVyZVxuICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBsb2NhbEZvcmdlci5wYXJzZSh1bnNpZ25lZFNlcmlhbGl6ZWRUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gYXdhaXQgVXRpbHMuY2FsY3VsYXRlVHJhbnNhY3Rpb25JZChzZXJpYWxpemVkVHJhbnNhY3Rpb24pO1xuICAgICAgYXdhaXQgdGhpcy5pbml0RnJvbVBhcnNlZFRyYW5zYWN0aW9uKHBhcnNlZFRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbklkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gZmllbGRzIGJhc2VkIG9uIGFub3RoZXIgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlZFRyYW5zYWN0aW9ufSBwYXJzZWRUcmFuc2FjdGlvbiBBIFRlem9zIHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBUaGUgdHJhbnNhY3Rpb24gaWQgb2YgdGhlIHBhcnNlZFRyYW5zYWN0aW9uIGlmIGl0IGlzIHNpZ25lZFxuICAgKi9cbiAgYXN5bmMgaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbihwYXJzZWRUcmFuc2FjdGlvbjogUGFyc2VkVHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2VuY29kZWRUcmFuc2FjdGlvbikge1xuICAgICAgdGhpcy5fZW5jb2RlZFRyYW5zYWN0aW9uID0gYXdhaXQgbG9jYWxGb3JnZXIuZm9yZ2UocGFyc2VkVHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAodHJhbnNhY3Rpb25JZCkge1xuICAgICAgdGhpcy5faWQgPSB0cmFuc2FjdGlvbklkO1xuICAgICAgdGhpcy5faW5wdXRzID0gW107XG4gICAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lkID0gJyc7XG4gICAgfVxuICAgIHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uID0gcGFyc2VkVHJhbnNhY3Rpb247XG4gICAgbGV0IG9wZXJhdGlvbkluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBwYXJzZWRUcmFuc2FjdGlvbi5jb250ZW50cykge1xuICAgICAgLy8gTmFycm93aW5nOiBvbmx5IG9wZXJhdGlvbnMgd2l0aCBhIHNvdXJjZSBoYXZlIGEgc291cmNlIGZpZWxkXG4gICAgICBpZiAoJ3NvdXJjZScgaW4gb3BlcmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlICE9PSBvcGVyYXRpb24uc291cmNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgYFNvdXJjZSBtdXN0IGJlIHRoZSBzYW1lIGZvciBldmVyeSBvcGVyYXRpb24gYnV0IGl0IGNoYW5nZWQgZnJvbSAke3RoaXMuX3NvdXJjZX0gdG8gJHtvcGVyYXRpb24uc291cmNlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IG9wZXJhdGlvbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChvcGVyYXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIE9wS2luZC5PUklHSU5BVElPTjpcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29yZE9yaWdpbmF0aW9uT3BGaWVsZHMob3BlcmF0aW9uIGFzIE9yaWdpbmF0aW9uT3AsIG9wZXJhdGlvbkluZGV4KTtcbiAgICAgICAgICBvcGVyYXRpb25JbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9wS2luZC5SRVZFQUw6XG4gICAgICAgICAgdGhpcy5yZWNvcmRSZXZlYWxPcEZpZWxkcyhvcGVyYXRpb24gYXMgUmV2ZWFsT3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9wS2luZC5UUkFOU0FDVElPTjpcbiAgICAgICAgICB0aGlzLnJlY29yZFRyYW5zYWN0aW9uT3BGaWVsZHMob3BlcmF0aW9uIGFzIFRyYW5zYWN0aW9uT3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrOyAvLyBza2lwIG9wZXJhdGlvbnMgbGlrZSBhdHRlc3RhdGlvbnMsIGVuZG9yc2VtZW50cywgZXRjLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdGhlIG1vc3QgaW1wb3J0YW50IGZpZWxkcyBmcm9tIGFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcGVyYXRpb259IG9wZXJhdGlvbiBBbiBvcGVyYXRpb24gb2JqZWN0IGZyb20gYSBUZXpvcyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIG9yaWdpbmF0aW9uIG9wZXJhdGlvbiBpbmRleCBpbiB0aGUgdHJhbnNhY3Rpb24uIFVzZWQgdG8gY2FsY3VsYXRlIHRoZVxuICAgKiAgICAgIG9yaWdpbmF0ZWQgYWRkcmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvcmRPcmlnaW5hdGlvbk9wRmllbGRzKG9wZXJhdGlvbjogT3JpZ2luYXRpb25PcCwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yaWdpbmF0aW9uRGF0YSA9IGdldE9yaWdpbmF0aW9uRGF0YUZyb21PcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICBpZiAob3JpZ2luYXRpb25EYXRhLmZvcndhcmRlckRlc3RpbmF0aW9uKSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbjtcbiAgICAgIHRoaXMuX2ZvcndhcmRlckRlc3RpbmF0aW9uID0gb3JpZ2luYXRpb25EYXRhLmZvcndhcmRlckRlc3RpbmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICAgICAgdGhpcy5fb3duZXJzID0gZ2V0T3duZXJzUHVibGljS2V5cyhvcGVyYXRpb24pO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbGVnYXRlID0gb3BlcmF0aW9uLmRlbGVnYXRlO1xuICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICAvLyBLdCBhZGRyZXNzZXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9ucyB3aXRoIGFuIGlkXG4gICAgICBhZGRyZXNzOiB0aGlzLl9pZCA/IGF3YWl0IFV0aWxzLmNhbGN1bGF0ZU9yaWdpbmF0ZWRBZGRyZXNzKHRoaXMuX2lkLCBpbmRleCkgOiAnJyxcbiAgICAgIC8vIEJhbGFuY2VcbiAgICAgIHZhbHVlOiBvcGVyYXRpb24uYmFsYW5jZSxcbiAgICB9KTtcbiAgICB0aGlzLl9pbnB1dHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiBvcGVyYXRpb24uc291cmNlLFxuICAgICAgLy8gQmFsYW5jZSArIGZlZXMgKyBtYXggZ2FzICsgbWF4IHN0b3JhZ2UgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvcGVyYXRpb24uYmFsYW5jZSkucGx1cyhvcGVyYXRpb24uZmVlKS50b1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgbW9zdCBpbXBvcnRhbnQgZmllbGRzIGZyb20gYSByZXZlYWwgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1JldmVhbE9wfSBvcGVyYXRpb24gQSByZXZlYWwgb3BlcmF0aW9uIG9iamVjdCBmcm9tIGEgVGV6b3MgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkUmV2ZWFsT3BGaWVsZHMob3BlcmF0aW9uOiBSZXZlYWxPcCk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZTtcbiAgICB0aGlzLl9wdWJsaWNLZXlUb1JldmVhbCA9IG9wZXJhdGlvbi5wdWJsaWNfa2V5O1xuICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IG9wZXJhdGlvbi5zb3VyY2UsXG4gICAgICAvLyBCYWxhbmNlICsgZmVlcyArIG1heCBnYXMgKyBtYXggc3RvcmFnZSBhcmUgcGFpZCBieSB0aGUgc291cmNlIGFjY291bnRcbiAgICAgIHZhbHVlOiBvcGVyYXRpb24uZmVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgbW9zdCBpbXBvcnRhbnQgZmllbGRzIGZvciBhIFRyYW5zYWN0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbk9wfSBvcGVyYXRpb24gQSB0cmFuc2FjdGlvbiBvYmplY3QgZnJvbSBhIFRlem9zIG9wZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRUcmFuc2FjdGlvbk9wRmllbGRzKG9wZXJhdGlvbjogVHJhbnNhY3Rpb25PcCk6IHZvaWQge1xuICAgIGlmIChvcGVyYXRpb24ucGFyYW1ldGVycykge1xuICAgICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNpbmdsZVNpZ1NlbmQ7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zZmVyRGF0YSA9IGdldE11bHRpc2lnVHJhbnNmZXJEYXRhRnJvbU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgIC8vIEZlZXMgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50LCBhbG9uZyB3aXRoIHRoZSBhbW91bnQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgYWRkcmVzczogb3BlcmF0aW9uLnNvdXJjZSxcbiAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKHRyYW5zZmVyRGF0YS5mZWUuZmVlKS50b0ZpeGVkKDApLFxuICAgIH0pO1xuXG4gICAgaWYgKHRyYW5zZmVyRGF0YS5jb2luID09PSAnbXV0ZXonKSB7XG4gICAgICB0aGlzLl9vdXRwdXRzLnB1c2goe1xuICAgICAgICAvLyBLdCBhZGRyZXNzZXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9ucyB3aXRoIGFuIGlkXG4gICAgICAgIGFkZHJlc3M6IHRyYW5zZmVyRGF0YS50byxcbiAgICAgICAgLy8gQmFsYW5jZVxuICAgICAgICB2YWx1ZTogdHJhbnNmZXJEYXRhLmFtb3VudCxcbiAgICAgIH0pO1xuICAgICAgLy8gVGhlIGZ1bmRzIGJlaW5nIHRyYW5zZmVycmVkIGZyb20gdGhlIHdhbGxldFxuICAgICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiB0cmFuc2ZlckRhdGEuZnJvbSxcbiAgICAgICAgLy8gQmFsYW5jZSArIGZlZXMgKyBtYXggZ2FzICsgbWF4IHN0b3JhZ2UgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gICAgICAgIHZhbHVlOiB0cmFuc2ZlckRhdGEuYW1vdW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdGhlIHRyYW5zYWN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGtleS4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhlIHNpZ25lciBpcyBhbGxvd2VkIHRvIHNpZ25cbiAgICogaXQgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgVGhlIGtleSB0byBzaWduIHRoZSB0cmFuc2FjdGlvbiB3aXRoXG4gICAqL1xuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUT0RPOiBmYWlsIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHNpZ25lZFxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gdG8gc2lnblxuICAgIGlmICghdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSB0cmFuc2FjdGlvbiBib2R5IHRvIHNpZ25cbiAgICBjb25zdCBlbmNvZGVkVHJhbnNhY3Rpb24gPSBhd2FpdCBsb2NhbEZvcmdlci5mb3JnZSh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbik7XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IFV0aWxzLnNpZ24oa2V5UGFpciwgZW5jb2RlZFRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi5zYnl0ZXM7XG5cbiAgICAvLyBUaGUgdHJhbnNhY3Rpb24gaWQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAgIHRoaXMuX2lkID0gYXdhaXQgVXRpbHMuY2FsY3VsYXRlVHJhbnNhY3Rpb25JZCh0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24pO1xuICAgIGF3YWl0IHRoaXMuaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbiwgdGhpcy5faWQpO1xuXG4gICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHNpZ25lZFRyYW5zYWN0aW9uLnNpZyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBsaXN0IG9mIHNpZ25hdHVyZXMgZm9yIGEgbXVsdGlzaWcgdHJhbnNhY3Rpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0luZGV4ZWRTaWduYXR1cmVbXX0gc2lnbmF0dXJlcyBMaXN0IG9mIHNpZ25hdHVyZXMgYW5kIHRoZSBpbmRleCB0aGV5IHNob3VsZCBiZSBwdXQgb25cbiAgICogICAgaW4gdGhlIG11bHRpc2lnIHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgdHJhbnNmZXIgaW5kZXggdG8gYWRkIHRoZSBzaWduYXR1cmVzIHRvXG4gICAqL1xuICBhc3luYyBhZGRUcmFuc2ZlclNpZ25hdHVyZShzaWduYXR1cmVzOiBJbmRleGVkU2lnbmF0dXJlW10sIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHVwZGF0ZU11bHRpc2lnVHJhbnNmZXJTaWduYXR1cmVzKHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzW2luZGV4XSBhcyBUcmFuc2FjdGlvbk9wLCBzaWduYXR1cmVzKTtcbiAgICB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24gPSBhd2FpdCBsb2NhbEZvcmdlci5mb3JnZSh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPOiBjaGVjayB0aGUga2V5IGJlbG9uZ3MgdG8gdGhlIF9zb3VyY2UgYWNjb3VudCBpbiBfcGFyc2VkVHJhbnNhY3Rpb25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIGlmICghdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBlbmNvZGVkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBzb3VyY2UgaWYgaXQgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTb3VyY2Ugb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9zb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBkZWxlZ2F0aW9uIGFkZHJlc3MgaWYgaXQgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0cmFuc2FjdGlvbiBkZWxlZ2F0aW9uIGFkZHJlc3NcbiAgICovXG4gIGdldCBkZWxlZ2F0ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBrZXkgcmV2ZWFsZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGlmIGl0IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBwdWJsaWMga2V5XG4gICAqL1xuICBnZXQgcHVibGljS2V5VG9SZXZlYWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHVibGljS2V5VG9SZXZlYWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXN0aW5hdGlvbiBvZiBhbiBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uIGlmIGl0IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBmb3J3YXJkZXIgZGVzdGluYXRpb25cbiAgICovXG4gIGdldCBmb3J3YXJkZXJEZXN0aW5hdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3J3YXJkZXJEZXN0aW5hdGlvbjtcbiAgfVxuXG4gIGdldCBvd25lcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9vd25lcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzaWduYXR1cmVzIGZvciB0aGUgZ2l2ZW4gbXVsdGlzaWcgdHJhbnNmZXIsXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cmFuc2ZlckluZGV4IFRoZSB0cmFuc2ZlciBzY3JpcHQgaW5kZXggaW4gdGhlIFRlem9zIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtJbmRleGVkU2lnbmF0dXJlW119IEEgbGlzdCBvZiBzaWduYXR1cmVzIHdpdGggdGhlaXIgaW5kZXggaW5zaWRlIHRoZSBtdWx0aXNpZyB0cmFuc2ZlclxuICAgKiAgICAgIHNjcmlwdFxuICAgKi9cbiAgZ2V0VHJhbnNmZXJTaWduYXR1cmVzKHRyYW5zZmVySW5kZXggPSAwKTogSW5kZXhlZFNpZ25hdHVyZVtdIHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBnZXRNdWx0aXNpZ1RyYW5zZmVyU2lnbmF0dXJlcyh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbi5jb250ZW50c1t0cmFuc2ZlckluZGV4XSBhcyBUcmFuc2FjdGlvbk9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgaW5kZXggcGVyIHRlem9zIHRyYW5zYWN0aW9uIHR5cGUuIFRoaXMgaXMgdXNlZnVsIHRvIGxvY2F0ZSBzcGVjaWZpYyBvcGVyYXRpb25zXG4gICAqIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHZlcmlmeSBvciBzaWduIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHt7W3A6IHN0cmluZ106IG51bWJlcltdfX0gTGlzdCBvZiBpbmRleGVzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIHRyYW5zYWN0aW9uIGtpbmRcbiAgICovXG4gIGdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpOiB7IFtraW5kOiBzdHJpbmddOiBudW1iZXJbXSB9IHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBraW5kID0gdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24uY29udGVudHNbaV0ua2luZDtcbiAgICAgIGluZGV4ZXNba2luZF0gPSBpbmRleGVzW2tpbmRdID8gaW5kZXhlc1traW5kXS5jb25jYXQoW2ldKSA6IFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG4gIH1cbn1cbiJdfQ==
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUEwRztBQUUxRywwREFBcUQ7QUFDckQsc0NBQXNDO0FBQ3RDLGdFQUFxQztBQUdyQyxtREFNeUI7QUFDekIsK0NBQWlDO0FBRWpDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLEtBQUssVUFBVSxjQUFjLENBQzNCLFVBQWtCO0lBRWxCLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzlDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxpRkFBaUY7SUFDakYsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSwrRUFBK0U7SUFDL0UsdUVBQXVFO0lBQ3ZFLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNsRSxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLDJCQUFXLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLE1BQU0sMkJBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDakMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDbkYsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FB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QixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLGFBQWEsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM3QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLElBQUEsNkNBQTZCLEVBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQWtCLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCwyQkFBMkI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBOVNELGtDQThTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VLZXksIEJhc2VUcmFuc2FjdGlvbiwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGxvY2FsRm9yZ2VyIH0gZnJvbSAnQHRhcXVpdG8vbG9jYWwtZm9yZ2luZyc7XG5pbXBvcnQgeyBPcEtpbmQgfSBmcm9tICdAdGFxdWl0by9ycGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgSW5kZXhlZFNpZ25hdHVyZSwgT3JpZ2luYXRpb25PcCwgUGFyc2VkVHJhbnNhY3Rpb24sIFJldmVhbE9wLCBUcmFuc2FjdGlvbk9wIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7XG4gIGdldE11bHRpc2lnVHJhbnNmZXJEYXRhRnJvbU9wZXJhdGlvbixcbiAgZ2V0TXVsdGlzaWdUcmFuc2ZlclNpZ25hdHVyZXMsXG4gIGdldE9yaWdpbmF0aW9uRGF0YUZyb21PcGVyYXRpb24sXG4gIGdldE93bmVyc1B1YmxpY0tleXMsXG4gIHVwZGF0ZU11bHRpc2lnVHJhbnNmZXJTaWduYXR1cmVzLFxufSBmcm9tICcuL211bHRpc2lnVXRpbHMnO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IFNJR05BVFVSRV9IRVhfTEVOR1RIID0gMTI4O1xuXG5hc3luYyBmdW5jdGlvbiB0cnlQYXJzZVNpZ25lZChcbiAgc2VyaWFsaXplZDogc3RyaW5nXG4pOiBQcm9taXNlPHsgcGFyc2VkOiBQYXJzZWRUcmFuc2FjdGlvbjsgdHJhbnNhY3Rpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHNlcmlhbGl6ZWQubGVuZ3RoIDw9IFNJR05BVFVSRV9IRVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBJZiBgc2VyaWFsaXplZGAgcmVhbGx5IGlzIGBmb3JnZShvcHMpIHx8IHNpZ25hdHVyZWAsIHN0cmlwcGluZyB0aGUgdHJhaWxpbmcgNjRcbiAgLy8gYnl0ZXMgZ2l2ZXMgdGhlIGV4YWN0IGZvcmdlIGJ5dGVzIGFuZCBmb3JnZShwYXJzZSguLi4pKSByZXByb2R1Y2VzIHRoZW0uIElmXG4gIC8vIGBzZXJpYWxpemVkYCB3YXMgdW5zaWduZWQsIHN0cmlwcGluZyBjdXRzIGludG8gdGhlIG9wZXJhdGlvbiBjb250ZW50czogcGFyc2VcbiAgLy8gZWl0aGVyIHRocm93cyBvciByZWNvdmVycyBhIHRydW5jYXRlZCBwYXJzZSB3aG9zZSBmb3JnZSBkb2VzIG5vdCBtYXRjaC4gU28gYVxuICAvLyBjbGVhbiByb3VuZC10cmlwIGlzIHdoYXQgcHJvdmVzIHRoZSB0cmFpbGluZyBieXRlcyB3ZXJlIGEgc2lnbmF0dXJlLlxuICBjb25zdCBvcGVyYXRpb25CeXRlcyA9IHNlcmlhbGl6ZWQuc2xpY2UoMCwgLVNJR05BVFVSRV9IRVhfTEVOR1RIKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBsb2NhbEZvcmdlci5wYXJzZShvcGVyYXRpb25CeXRlcyk7XG4gICAgY29uc3Qgcm91bmRUcmlwID0gYXdhaXQgbG9jYWxGb3JnZXIuZm9yZ2UocGFyc2VkKTtcbiAgICBpZiAocm91bmRUcmlwICE9PSBvcGVyYXRpb25CeXRlcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgcGFyc2VkLCB0cmFuc2FjdGlvbklkOiBhd2FpdCBVdGlscy5jYWxjdWxhdGVUcmFuc2FjdGlvbklkKHNlcmlhbGl6ZWQpIH07XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogVGV6b3MgdHJhbnNhY3Rpb24gbW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3BhcnNlZFRyYW5zYWN0aW9uPzogUGFyc2VkVHJhbnNhY3Rpb247IC8vIHRyYW5zYWN0aW9uIGluIEpTT04gZm9ybWF0XG4gIHByaXZhdGUgX2VuY29kZWRUcmFuc2FjdGlvbj86IHN0cmluZzsgLy8gdHJhbnNhY3Rpb24gaW4gaGV4IGZvcm1hdFxuICBwcml2YXRlIF9zb3VyY2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVsZWdhdGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2ZvcndhcmRlckRlc3RpbmF0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlIF9wdWJsaWNLZXlUb1JldmVhbD86IHN0cmluZztcbiAgcHJpdmF0ZSBfb3duZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWRvbmx5PENvaW5Db25maWc+fSBjb2luQ29uZmlnXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX293bmVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGZpZWxkcyBiYXNlZCBvbiBhbm90aGVyIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYnJvYWRjYXN0IGZvcm1hdC5cbiAgICovXG4gIGFzeW5jIGluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5jb2RlZFRyYW5zYWN0aW9uID0gc2VyaWFsaXplZFRyYW5zYWN0aW9uO1xuICAgIC8vIE9ubHkgc2lnbmVkIGlucHV0cyBoYXZlIGEgdHJhbnNhY3Rpb24gaWQgKGl0IGlzIHRoZSBoYXNoIG9mIHRoZSBzaWduZWQgYnl0ZXMpO1xuICAgIC8vIHVuc2lnbmVkIGlucHV0cyBsZWF2ZSBpdCB1bnNldCBhbmQgbGV0IHRoZSBjYWxsZXIgcG9wdWxhdGUgaXQgYWZ0ZXIgc2lnbmluZy5cbiAgICBjb25zdCBzaWduZWQgPSBhd2FpdCB0cnlQYXJzZVNpZ25lZChzZXJpYWxpemVkVHJhbnNhY3Rpb24pO1xuICAgIGlmIChzaWduZWQpIHtcbiAgICAgIC8vIFRPRE86IGVuY29kZSB0aGUgc2lnbmF0dXJlIGFuZCBzYXZlIGl0IGluIF9zaWduYXR1cmVcbiAgICAgIGF3YWl0IHRoaXMuaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbihzaWduZWQucGFyc2VkLCBzaWduZWQudHJhbnNhY3Rpb25JZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGxvY2FsRm9yZ2VyLnBhcnNlKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbik7XG4gICAgYXdhaXQgdGhpcy5pbml0RnJvbVBhcnNlZFRyYW5zYWN0aW9uKHBhcnNlZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gZmllbGRzIGJhc2VkIG9uIGFub3RoZXIgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlZFRyYW5zYWN0aW9ufSBwYXJzZWRUcmFuc2FjdGlvbiBBIFRlem9zIHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBUaGUgdHJhbnNhY3Rpb24gaWQgb2YgdGhlIHBhcnNlZFRyYW5zYWN0aW9uIGlmIGl0IGlzIHNpZ25lZFxuICAgKi9cbiAgYXN5bmMgaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbihwYXJzZWRUcmFuc2FjdGlvbjogUGFyc2VkVHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2VuY29kZWRUcmFuc2FjdGlvbikge1xuICAgICAgdGhpcy5fZW5jb2RlZFRyYW5zYWN0aW9uID0gYXdhaXQgbG9jYWxGb3JnZXIuZm9yZ2UocGFyc2VkVHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAodHJhbnNhY3Rpb25JZCkge1xuICAgICAgdGhpcy5faWQgPSB0cmFuc2FjdGlvbklkO1xuICAgICAgdGhpcy5faW5wdXRzID0gW107XG4gICAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lkID0gJyc7XG4gICAgfVxuICAgIHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uID0gcGFyc2VkVHJhbnNhY3Rpb247XG4gICAgbGV0IG9wZXJhdGlvbkluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBwYXJzZWRUcmFuc2FjdGlvbi5jb250ZW50cykge1xuICAgICAgLy8gTmFycm93aW5nOiBvbmx5IG9wZXJhdGlvbnMgd2l0aCBhIHNvdXJjZSBoYXZlIGEgc291cmNlIGZpZWxkXG4gICAgICBpZiAoJ3NvdXJjZScgaW4gb3BlcmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlICE9PSBvcGVyYXRpb24uc291cmNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgYFNvdXJjZSBtdXN0IGJlIHRoZSBzYW1lIGZvciBldmVyeSBvcGVyYXRpb24gYnV0IGl0IGNoYW5nZWQgZnJvbSAke3RoaXMuX3NvdXJjZX0gdG8gJHtvcGVyYXRpb24uc291cmNlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IG9wZXJhdGlvbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChvcGVyYXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIE9wS2luZC5PUklHSU5BVElPTjpcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29yZE9yaWdpbmF0aW9uT3BGaWVsZHMob3BlcmF0aW9uIGFzIE9yaWdpbmF0aW9uT3AsIG9wZXJhdGlvbkluZGV4KTtcbiAgICAgICAgICBvcGVyYXRpb25JbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9wS2luZC5SRVZFQUw6XG4gICAgICAgICAgdGhpcy5yZWNvcmRSZXZlYWxPcEZpZWxkcyhvcGVyYXRpb24gYXMgUmV2ZWFsT3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9wS2luZC5UUkFOU0FDVElPTjpcbiAgICAgICAgICB0aGlzLnJlY29yZFRyYW5zYWN0aW9uT3BGaWVsZHMob3BlcmF0aW9uIGFzIFRyYW5zYWN0aW9uT3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrOyAvLyBza2lwIG9wZXJhdGlvbnMgbGlrZSBhdHRlc3RhdGlvbnMsIGVuZG9yc2VtZW50cywgZXRjLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdGhlIG1vc3QgaW1wb3J0YW50IGZpZWxkcyBmcm9tIGFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcGVyYXRpb259IG9wZXJhdGlvbiBBbiBvcGVyYXRpb24gb2JqZWN0IGZyb20gYSBUZXpvcyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIG9yaWdpbmF0aW9uIG9wZXJhdGlvbiBpbmRleCBpbiB0aGUgdHJhbnNhY3Rpb24uIFVzZWQgdG8gY2FsY3VsYXRlIHRoZVxuICAgKiAgICAgIG9yaWdpbmF0ZWQgYWRkcmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvcmRPcmlnaW5hdGlvbk9wRmllbGRzKG9wZXJhdGlvbjogT3JpZ2luYXRpb25PcCwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yaWdpbmF0aW9uRGF0YSA9IGdldE9yaWdpbmF0aW9uRGF0YUZyb21PcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICBpZiAob3JpZ2luYXRpb25EYXRhLmZvcndhcmRlckRlc3RpbmF0aW9uKSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbjtcbiAgICAgIHRoaXMuX2ZvcndhcmRlckRlc3RpbmF0aW9uID0gb3JpZ2luYXRpb25EYXRhLmZvcndhcmRlckRlc3RpbmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICAgICAgdGhpcy5fb3duZXJzID0gZ2V0T3duZXJzUHVibGljS2V5cyhvcGVyYXRpb24pO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbGVnYXRlID0gb3BlcmF0aW9uLmRlbGVnYXRlO1xuICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICAvLyBLdCBhZGRyZXNzZXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9ucyB3aXRoIGFuIGlkXG4gICAgICBhZGRyZXNzOiB0aGlzLl9pZCA/IGF3YWl0IFV0aWxzLmNhbGN1bGF0ZU9yaWdpbmF0ZWRBZGRyZXNzKHRoaXMuX2lkLCBpbmRleCkgOiAnJyxcbiAgICAgIC8vIEJhbGFuY2VcbiAgICAgIHZhbHVlOiBvcGVyYXRpb24uYmFsYW5jZSxcbiAgICB9KTtcbiAgICB0aGlzLl9pbnB1dHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiBvcGVyYXRpb24uc291cmNlLFxuICAgICAgLy8gQmFsYW5jZSArIGZlZXMgKyBtYXggZ2FzICsgbWF4IHN0b3JhZ2UgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvcGVyYXRpb24uYmFsYW5jZSkucGx1cyhvcGVyYXRpb24uZmVlKS50b1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgbW9zdCBpbXBvcnRhbnQgZmllbGRzIGZyb20gYSByZXZlYWwgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1JldmVhbE9wfSBvcGVyYXRpb24gQSByZXZlYWwgb3BlcmF0aW9uIG9iamVjdCBmcm9tIGEgVGV6b3MgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkUmV2ZWFsT3BGaWVsZHMob3BlcmF0aW9uOiBSZXZlYWxPcCk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZTtcbiAgICB0aGlzLl9wdWJsaWNLZXlUb1JldmVhbCA9IG9wZXJhdGlvbi5wdWJsaWNfa2V5O1xuICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IG9wZXJhdGlvbi5zb3VyY2UsXG4gICAgICAvLyBCYWxhbmNlICsgZmVlcyArIG1heCBnYXMgKyBtYXggc3RvcmFnZSBhcmUgcGFpZCBieSB0aGUgc291cmNlIGFjY291bnRcbiAgICAgIHZhbHVlOiBvcGVyYXRpb24uZmVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgbW9zdCBpbXBvcnRhbnQgZmllbGRzIGZvciBhIFRyYW5zYWN0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbk9wfSBvcGVyYXRpb24gQSB0cmFuc2FjdGlvbiBvYmplY3QgZnJvbSBhIFRlem9zIG9wZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRUcmFuc2FjdGlvbk9wRmllbGRzKG9wZXJhdGlvbjogVHJhbnNhY3Rpb25PcCk6IHZvaWQge1xuICAgIGlmIChvcGVyYXRpb24ucGFyYW1ldGVycykge1xuICAgICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNpbmdsZVNpZ1NlbmQ7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zZmVyRGF0YSA9IGdldE11bHRpc2lnVHJhbnNmZXJEYXRhRnJvbU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgIC8vIEZlZXMgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50LCBhbG9uZyB3aXRoIHRoZSBhbW91bnQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgYWRkcmVzczogb3BlcmF0aW9uLnNvdXJjZSxcbiAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKHRyYW5zZmVyRGF0YS5mZWUuZmVlKS50b0ZpeGVkKDApLFxuICAgIH0pO1xuXG4gICAgaWYgKHRyYW5zZmVyRGF0YS5jb2luID09PSAnbXV0ZXonKSB7XG4gICAgICB0aGlzLl9vdXRwdXRzLnB1c2goe1xuICAgICAgICAvLyBLdCBhZGRyZXNzZXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9ucyB3aXRoIGFuIGlkXG4gICAgICAgIGFkZHJlc3M6IHRyYW5zZmVyRGF0YS50byxcbiAgICAgICAgLy8gQmFsYW5jZVxuICAgICAgICB2YWx1ZTogdHJhbnNmZXJEYXRhLmFtb3VudCxcbiAgICAgIH0pO1xuICAgICAgLy8gVGhlIGZ1bmRzIGJlaW5nIHRyYW5zZmVycmVkIGZyb20gdGhlIHdhbGxldFxuICAgICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiB0cmFuc2ZlckRhdGEuZnJvbSxcbiAgICAgICAgLy8gQmFsYW5jZSArIGZlZXMgKyBtYXggZ2FzICsgbWF4IHN0b3JhZ2UgYXJlIHBhaWQgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gICAgICAgIHZhbHVlOiB0cmFuc2ZlckRhdGEuYW1vdW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdGhlIHRyYW5zYWN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGtleS4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhlIHNpZ25lciBpcyBhbGxvd2VkIHRvIHNpZ25cbiAgICogaXQgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgVGhlIGtleSB0byBzaWduIHRoZSB0cmFuc2FjdGlvbiB3aXRoXG4gICAqL1xuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUT0RPOiBmYWlsIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHNpZ25lZFxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gdG8gc2lnblxuICAgIGlmICghdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSB0cmFuc2FjdGlvbiBib2R5IHRvIHNpZ25cbiAgICBjb25zdCBlbmNvZGVkVHJhbnNhY3Rpb24gPSBhd2FpdCBsb2NhbEZvcmdlci5mb3JnZSh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbik7XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IFV0aWxzLnNpZ24oa2V5UGFpciwgZW5jb2RlZFRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi5zYnl0ZXM7XG5cbiAgICAvLyBUaGUgdHJhbnNhY3Rpb24gaWQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3Igc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAgIHRoaXMuX2lkID0gYXdhaXQgVXRpbHMuY2FsY3VsYXRlVHJhbnNhY3Rpb25JZCh0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24pO1xuICAgIGF3YWl0IHRoaXMuaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbiwgdGhpcy5faWQpO1xuXG4gICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHNpZ25lZFRyYW5zYWN0aW9uLnNpZyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBsaXN0IG9mIHNpZ25hdHVyZXMgZm9yIGEgbXVsdGlzaWcgdHJhbnNhY3Rpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0luZGV4ZWRTaWduYXR1cmVbXX0gc2lnbmF0dXJlcyBMaXN0IG9mIHNpZ25hdHVyZXMgYW5kIHRoZSBpbmRleCB0aGV5IHNob3VsZCBiZSBwdXQgb25cbiAgICogICAgaW4gdGhlIG11bHRpc2lnIHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgdHJhbnNmZXIgaW5kZXggdG8gYWRkIHRoZSBzaWduYXR1cmVzIHRvXG4gICAqL1xuICBhc3luYyBhZGRUcmFuc2ZlclNpZ25hdHVyZShzaWduYXR1cmVzOiBJbmRleGVkU2lnbmF0dXJlW10sIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHVwZGF0ZU11bHRpc2lnVHJhbnNmZXJTaWduYXR1cmVzKHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzW2luZGV4XSBhcyBUcmFuc2FjdGlvbk9wLCBzaWduYXR1cmVzKTtcbiAgICB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24gPSBhd2FpdCBsb2NhbEZvcmdlci5mb3JnZSh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPOiBjaGVjayB0aGUga2V5IGJlbG9uZ3MgdG8gdGhlIF9zb3VyY2UgYWNjb3VudCBpbiBfcGFyc2VkVHJhbnNhY3Rpb25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIGlmICghdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBlbmNvZGVkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVkVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBzb3VyY2UgaWYgaXQgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTb3VyY2Ugb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9zb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBkZWxlZ2F0aW9uIGFkZHJlc3MgaWYgaXQgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0cmFuc2FjdGlvbiBkZWxlZ2F0aW9uIGFkZHJlc3NcbiAgICovXG4gIGdldCBkZWxlZ2F0ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBrZXkgcmV2ZWFsZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGlmIGl0IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBwdWJsaWMga2V5XG4gICAqL1xuICBnZXQgcHVibGljS2V5VG9SZXZlYWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHVibGljS2V5VG9SZXZlYWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXN0aW5hdGlvbiBvZiBhbiBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uIGlmIGl0IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBmb3J3YXJkZXIgZGVzdGluYXRpb25cbiAgICovXG4gIGdldCBmb3J3YXJkZXJEZXN0aW5hdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3J3YXJkZXJEZXN0aW5hdGlvbjtcbiAgfVxuXG4gIGdldCBvd25lcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9vd25lcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzaWduYXR1cmVzIGZvciB0aGUgZ2l2ZW4gbXVsdGlzaWcgdHJhbnNmZXIsXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cmFuc2ZlckluZGV4IFRoZSB0cmFuc2ZlciBzY3JpcHQgaW5kZXggaW4gdGhlIFRlem9zIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtJbmRleGVkU2lnbmF0dXJlW119IEEgbGlzdCBvZiBzaWduYXR1cmVzIHdpdGggdGhlaXIgaW5kZXggaW5zaWRlIHRoZSBtdWx0aXNpZyB0cmFuc2ZlclxuICAgKiAgICAgIHNjcmlwdFxuICAgKi9cbiAgZ2V0VHJhbnNmZXJTaWduYXR1cmVzKHRyYW5zZmVySW5kZXggPSAwKTogSW5kZXhlZFNpZ25hdHVyZVtdIHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBnZXRNdWx0aXNpZ1RyYW5zZmVyU2lnbmF0dXJlcyh0aGlzLl9wYXJzZWRUcmFuc2FjdGlvbi5jb250ZW50c1t0cmFuc2ZlckluZGV4XSBhcyBUcmFuc2FjdGlvbk9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgaW5kZXggcGVyIHRlem9zIHRyYW5zYWN0aW9uIHR5cGUuIFRoaXMgaXMgdXNlZnVsIHRvIGxvY2F0ZSBzcGVjaWZpYyBvcGVyYXRpb25zXG4gICAqIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHZlcmlmeSBvciBzaWduIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHt7W3A6IHN0cmluZ106IG51bWJlcltdfX0gTGlzdCBvZiBpbmRleGVzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIHRyYW5zYWN0aW9uIGtpbmRcbiAgICovXG4gIGdldEluZGV4ZXNCeVRyYW5zYWN0aW9uVHlwZSgpOiB7IFtraW5kOiBzdHJpbmddOiBudW1iZXJbXSB9IHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3BhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBraW5kID0gdGhpcy5fcGFyc2VkVHJhbnNhY3Rpb24uY29udGVudHNbaV0ua2luZDtcbiAgICAgIGluZGV4ZXNba2luZF0gPSBpbmRleGVzW2tpbmRdID8gaW5kZXhlc1traW5kXS5jb25jYXQoW2ldKSA6IFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG4gIH1cbn1cbiJdfQ==
@@ -8,6 +8,13 @@ const should_1 = __importDefault(require("should"));
8
8
  const statics_1 = require("@bitgo-beta/statics");
9
9
  const resources_1 = require("../resources");
10
10
  const src_1 = require("../../src");
11
+ // Signing the fixture origination with this seed produces a 64-byte signature
12
+ // whose bytes are coincidentally valid Michelson contents.
13
+ function signerSeedProducingMichelsonShapedSignature() {
14
+ const seed = Buffer.alloc(16);
15
+ seed.writeUInt32BE(174, 0);
16
+ return seed;
17
+ }
11
18
  describe('Tezos transaction', function () {
12
19
  describe('should parse', () => {
13
20
  it('unsigned transaction', async () => {
@@ -38,6 +45,22 @@ describe('Tezos transaction', function () {
38
45
  JSON.stringify(tx.toJson()).should.equal(JSON.stringify(resources_1.parsedTransaction));
39
46
  tx.toBroadcastFormat().should.equal(resources_1.signedSerializedOriginationTransaction);
40
47
  });
48
+ it('signed transaction whose signature suffix forges as valid Michelson', async () => {
49
+ const signerWithMichelsonShapedSignature = new src_1.XtzLib.KeyPair({
50
+ seed: signerSeedProducingMichelsonShapedSignature(),
51
+ });
52
+ const signedTx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
53
+ await signedTx.initFromSerializedTransaction(resources_1.unsignedSerializedOriginationTransaction);
54
+ await signedTx.sign(signerWithMichelsonShapedSignature);
55
+ const signedBytes = signedTx.toBroadcastFormat();
56
+ const expectedTxId = signedTx.id;
57
+ expectedTxId.should.match(/^o[a-zA-Z0-9]+$/);
58
+ const reparsed = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
59
+ await reparsed.initFromSerializedTransaction(signedBytes);
60
+ reparsed.id.should.equal(expectedTxId);
61
+ reparsed.outputs.length.should.equal(1);
62
+ reparsed.outputs[0].address.should.startWith('KT1');
63
+ });
41
64
  });
42
65
  describe('should sign', () => {
43
66
  it('an unsigned origination transaction', async () => {
@@ -98,4 +121,4 @@ describe('Tezos transaction', function () {
98
121
  });
99
122
  });
100
123
  });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1Qyw0Q0FJc0I7QUFFdEIsbUNBQW1DO0FBRW5DLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxvREFBd0MsQ0FBQyxDQUFDO1lBRWpGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDNUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvREFBd0MsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxFQUFFLENBQUMsNkJBQTZCLENBQUMsa0RBQXNDLENBQUMsQ0FBQztZQUUvRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzNFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDNUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBc0MsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMscUNBQXFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxvREFBd0MsQ0FBQyxDQUFDO1lBRWpGLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSx3REFBd0QsRUFBRSxDQUFDLENBQUM7WUFDckcsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDM0UsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMxQixrR0FBa0csQ0FDbkcsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sRUFBRSxHQUFHLElBQUksWUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxFQUFFLENBQUMsNkJBQTZCLENBQUMsa0RBQXNDLENBQUMsQ0FBQztZQUUvRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsd0RBQXdELEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzNFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDMUIsa0dBQWtHLENBQ25HLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDM0IsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELE1BQU0sRUFBRSxHQUFHLElBQUksWUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxFQUFFLENBQUMseUJBQXlCLENBQUMsRUFBd0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFlBQU0sQ0FBQyxXQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSx3REFBd0QsRUFBRSxDQUFDLENBQUM7WUFDckcsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakMsR0FBRyw2QkFBaUI7Z0JBQ3BCLFFBQVEsRUFBRSw2QkFBaUIsQ0FBQyxRQUErQjthQUM1RCxDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUseURBQXlELEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICB1bnNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICBzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbixcbiAgcGFyc2VkVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Db250ZW50cyB9IGZyb20gJ0B0YXF1aXRvL3JwYyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVGV6b3MgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdzaG91bGQgcGFyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Vuc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHR4LmRlbGVnYXRlKTtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKS5zaG91bGQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocGFyc2VkVHJhbnNhY3Rpb24pKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R4dHonKSk7XG4gICAgICBhd2FpdCB0eC5pbml0RnJvbVNlcmlhbGl6ZWRUcmFuc2FjdGlvbihzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUxKdnA1NWZiZE53YmlzSkZpZ245d0E0Y1BncTlUOW9jNCcpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgSlNPTi5zdHJpbmdpZnkodHgudG9Kc29uKCkpLnNob3VsZC5lcXVhbChKU09OLnN0cmluZ2lmeShwYXJzZWRUcmFuc2FjdGlvbikpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHNpZ24nLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzaWduZXIgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxRGg2MnFQWmhKdk1NdEw0ckFuRFMydUFTcHRUNkdOTE15Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWd1M2NqUWg4cmY3OWFYRzU1NWZSeEt6dVRhMmJ5Wm52TUpxa0pFTnBkS2pFd0NyaTZTVU05Zkx5d0RDM3c4ZTZkSFJUOFJSYUpWUWlpakM5eXp3cUw2RlNtMkpqOWEnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMURoNjJxUFpoSnZNTXRMNHJBbkRTMnVBU3B0VDZHTkxNeScpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lndTNjalFoOHJmNzlhWEc1NTVmUnhLenVUYTJieVpudk1KcWtKRU5wZEtqRXdDcmk2U1VNOWZMeXdEQzN3OGU2ZEhSVDhSUmFKVlFpaWpDOXl6d3FMNkZTbTJKajlhJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCd0byBwYXJzZSBhbmQgaW52YWxpZCBwYXJzZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXdhaXQgdHguaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih7fSBhcyBYdHpMaWIuSW50ZXJmYWNlLlBhcnNlZFRyYW5zYWN0aW9uKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBnZXQgdGhlIHRyYW5zYWN0aW9uIEpTT04gaWYgaXQgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG8gc2lnbiBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvIHNpZ24gdGhlIHRyYW5zYWN0aW9uIGlmIHRoZSBrZXlzIGFyZSBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tUGFyc2VkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJzZWRUcmFuc2FjdGlvbixcbiAgICAgICAgY29udGVudHM6IHBhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzIGFzIE9wZXJhdGlvbkNvbnRlbnRzW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lciA9IG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1Qyw0Q0FJc0I7QUFFdEIsbUNBQW1DO0FBRW5DLDhFQUE4RTtBQUM5RSwyREFBMkQ7QUFDM0QsU0FBUywyQ0FBMkM7SUFDbEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxFQUFFLENBQUMsNkJBQTZCLENBQUMsb0RBQXdDLENBQUMsQ0FBQztZQUVqRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxN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QUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakMsR0FBRyw2QkFBaUI7Z0JBQ3BCLFFBQVEsRUFBRSw2QkFBaUIsQ0FBQyxRQUErQjthQUM1RCxDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUseURBQXlELEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICB1bnNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICBzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbixcbiAgcGFyc2VkVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Db250ZW50cyB9IGZyb20gJ0B0YXF1aXRvL3JwYyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG4vLyBTaWduaW5nIHRoZSBmaXh0dXJlIG9yaWdpbmF0aW9uIHdpdGggdGhpcyBzZWVkIHByb2R1Y2VzIGEgNjQtYnl0ZSBzaWduYXR1cmVcbi8vIHdob3NlIGJ5dGVzIGFyZSBjb2luY2lkZW50YWxseSB2YWxpZCBNaWNoZWxzb24gY29udGVudHMuXG5mdW5jdGlvbiBzaWduZXJTZWVkUHJvZHVjaW5nTWljaGVsc29uU2hhcGVkU2lnbmF0dXJlKCk6IEJ1ZmZlciB7XG4gIGNvbnN0IHNlZWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICBzZWVkLndyaXRlVUludDMyQkUoMTc0LCAwKTtcbiAgcmV0dXJuIHNlZWQ7XG59XG5cbmRlc2NyaWJlKCdUZXpvcyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3Nob3VsZCBwYXJzZScsICgpID0+IHtcbiAgICBpdCgndW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXdhaXQgdHguaW5pdEZyb21TZXJpYWxpemVkVHJhbnNhY3Rpb24odW5zaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgSlNPTi5zdHJpbmdpZnkodHgudG9Kc29uKCkpLnNob3VsZC5lcXVhbChKU09OLnN0cmluZ2lmeShwYXJzZWRUcmFuc2FjdGlvbikpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodW5zaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxTEp2cDU1ZmJkTndiaXNKRmlnbjl3QTRjUGdxOVQ5b2M0Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICBKU09OLnN0cmluZ2lmeSh0eC50b0pzb24oKSkuc2hvdWxkLmVxdWFsKEpTT04uc3RyaW5naWZ5KHBhcnNlZFRyYW5zYWN0aW9uKSk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbmVkIHRyYW5zYWN0aW9uIHdob3NlIHNpZ25hdHVyZSBzdWZmaXggZm9yZ2VzIGFzIHZhbGlkIE1pY2hlbHNvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lcldpdGhNaWNoZWxzb25TaGFwZWRTaWduYXR1cmUgPSBuZXcgWHR6TGliLktleVBhaXIoe1xuICAgICAgICBzZWVkOiBzaWduZXJTZWVkUHJvZHVjaW5nTWljaGVsc29uU2hhcGVkU2lnbmF0dXJlKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2lnbmVkVHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHNpZ25lZFR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgICAgYXdhaXQgc2lnbmVkVHguc2lnbihzaWduZXJXaXRoTWljaGVsc29uU2hhcGVkU2lnbmF0dXJlKTtcbiAgICAgIGNvbnN0IHNpZ25lZEJ5dGVzID0gc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHhJZCA9IHNpZ25lZFR4LmlkO1xuICAgICAgZXhwZWN0ZWRUeElkLnNob3VsZC5tYXRjaCgvXm9bYS16QS1aMC05XSskLyk7XG5cbiAgICAgIGNvbnN0IHJlcGFyc2VkID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R4dHonKSk7XG4gICAgICBhd2FpdCByZXBhcnNlZC5pbml0RnJvbVNlcmlhbGl6ZWRUcmFuc2FjdGlvbihzaWduZWRCeXRlcyk7XG5cbiAgICAgIHJlcGFyc2VkLmlkLnNob3VsZC5lcXVhbChleHBlY3RlZFR4SWQpO1xuICAgICAgcmVwYXJzZWQub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVwYXJzZWQub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5zdGFydFdpdGgoJ0tUMScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHNpZ24nLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzaWduZXIgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxRGg2MnFQWmhKdk1NdEw0ckFuRFMydUFTcHRUNkdOTE15Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWd1M2NqUWg4cmY3OWFYRzU1NWZSeEt6dVRhMmJ5Wm52TUpxa0pFTnBkS2pFd0NyaTZTVU05Zkx5d0RDM3c4ZTZkSFJUOFJSYUpWUWlpakM5eXp3cUw2RlNtMkpqOWEnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMURoNjJxUFpoSnZNTXRMNHJBbkRTMnVBU3B0VDZHTkxNeScpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lndTNjalFoOHJmNzlhWEc1NTVmUnhLenVUYTJieVpudk1KcWtKRU5wZEtqRXdDcmk2U1VNOWZMeXdEQzN3OGU2ZEhSVDhSUmFKVlFpaWpDOXl6d3FMNkZTbTJKajlhJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCd0byBwYXJzZSBhbmQgaW52YWxpZCBwYXJzZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXdhaXQgdHguaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih7fSBhcyBYdHpMaWIuSW50ZXJmYWNlLlBhcnNlZFRyYW5zYWN0aW9uKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBnZXQgdGhlIHRyYW5zYWN0aW9uIEpTT04gaWYgaXQgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG8gc2lnbiBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvIHNpZ24gdGhlIHRyYW5zYWN0aW9uIGlmIHRoZSBrZXlzIGFyZSBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tUGFyc2VkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJzZWRUcmFuc2FjdGlvbixcbiAgICAgICAgY29udGVudHM6IHBhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzIGFzIE9wZXJhdGlvbkNvbnRlbnRzW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lciA9IG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==