@bitgo/sdk-coin-avaxp 4.0.0 → 5.0.0

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +191 -0
  3. package/dist/src/avaxp.d.ts.map +1 -1
  4. package/dist/src/avaxp.js +1 -3
  5. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +2 -2
  6. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  7. package/dist/src/lib/atomicInCTransactionBuilder.js +1 -1
  8. package/dist/src/lib/atomicTransactionBuilder.d.ts +2 -2
  9. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  10. package/dist/src/lib/atomicTransactionBuilder.js +3 -3
  11. package/dist/src/lib/delegatorTxBuilder.d.ts +5 -5
  12. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -1
  13. package/dist/src/lib/delegatorTxBuilder.js +4 -4
  14. package/dist/src/lib/deprecatedTransaction.d.ts +100 -0
  15. package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
  16. package/dist/src/lib/deprecatedTransaction.js +345 -0
  17. package/dist/src/lib/deprecatedTransactionBuilder.d.ts +115 -0
  18. package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
  19. package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
  20. package/dist/src/lib/exportInCTxBuilder.d.ts +7 -7
  21. package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
  22. package/dist/src/lib/exportInCTxBuilder.js +3 -3
  23. package/dist/src/lib/exportTxBuilder.d.ts +3 -3
  24. package/dist/src/lib/exportTxBuilder.d.ts.map +1 -1
  25. package/dist/src/lib/exportTxBuilder.js +2 -2
  26. package/dist/src/lib/iface.d.ts +11 -8
  27. package/dist/src/lib/iface.d.ts.map +1 -1
  28. package/dist/src/lib/iface.js +1 -1
  29. package/dist/src/lib/importInCTxBuilder.d.ts +3 -3
  30. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/importInCTxBuilder.js +2 -2
  32. package/dist/src/lib/importTxBuilder.d.ts +3 -3
  33. package/dist/src/lib/importTxBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/importTxBuilder.js +2 -2
  35. package/dist/src/lib/index.d.ts +2 -0
  36. package/dist/src/lib/index.d.ts.map +1 -1
  37. package/dist/src/lib/index.js +6 -2
  38. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +71 -31
  39. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  40. package/dist/src/lib/permissionlessValidatorTxBuilder.js +286 -48
  41. package/dist/src/lib/transaction.d.ts +21 -42
  42. package/dist/src/lib/transaction.d.ts.map +1 -1
  43. package/dist/src/lib/transaction.js +66 -151
  44. package/dist/src/lib/transactionBuilder.d.ts +32 -76
  45. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  46. package/dist/src/lib/transactionBuilder.js +65 -137
  47. package/dist/src/lib/transactionBuilderFactory.d.ts +9 -8
  48. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  49. package/dist/src/lib/transactionBuilderFactory.js +69 -19
  50. package/dist/src/lib/utils.d.ts +20 -5
  51. package/dist/src/lib/utils.d.ts.map +1 -1
  52. package/dist/src/lib/utils.js +44 -6
  53. package/dist/src/lib/utxoEngine.d.ts +10 -1
  54. package/dist/src/lib/utxoEngine.d.ts.map +1 -1
  55. package/dist/src/lib/utxoEngine.js +27 -3
  56. package/dist/src/lib/validatorTxBuilder.d.ts +3 -3
  57. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -1
  58. package/dist/src/lib/validatorTxBuilder.js +1 -1
  59. package/dist/test/resources/avaxp.d.ts +77 -0
  60. package/dist/test/resources/avaxp.d.ts.map +1 -1
  61. package/dist/test/resources/avaxp.js +124 -2
  62. package/dist/test/unit/avaxp.js +45 -1
  63. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
  64. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  65. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +288 -0
  66. package/dist/test/unit/lib/validateTxBuilder.js +5 -5
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +7 -6
@@ -1,50 +1,51 @@
1
- /// <reference types="bn.js" />
2
1
  /// <reference types="node" />
3
- import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo/statics';
2
+ import { avaxSerial, Credential } from '@bitgo/avalanchejs';
4
3
  import { BaseKey, BaseTransaction, Entry, TransactionFee, TransactionType } from '@bitgo/sdk-core';
5
- import { KeyPair } from './keyPair';
6
- import { BaseTx, DecodedUtxoObj, TransactionExplanation, DeprecatedTx, TxData } from './iface';
7
- import { BN, Buffer as BufferAvax } from 'avalanche';
8
- import { Credential } from 'avalanche/dist/common';
4
+ import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo/statics';
5
+ import { Buffer as BufferAvax } from 'avalanche';
9
6
  import { Buffer } from 'buffer';
7
+ import { DecodedUtxoObj, TransactionExplanation, Tx, TxData } from './iface';
8
+ import { KeyPair } from './keyPair';
10
9
  export declare class Transaction extends BaseTransaction {
11
- protected _avaxTransaction: DeprecatedTx;
10
+ protected _avaxTransaction: Tx;
12
11
  _type: TransactionType;
13
12
  _network: AvalancheNetwork;
14
13
  _networkID: number;
15
- _assetId: BufferAvax;
16
- _blockchainID: BufferAvax;
14
+ _assetId: string;
15
+ _blockchainID: string;
16
+ _nodeID: string;
17
+ _startTime: bigint;
18
+ _endTime: bigint;
19
+ _stakeAmount: bigint;
17
20
  _threshold: number;
18
- _locktime: BN;
19
- _fromAddresses: BufferAvax[];
21
+ _locktime: bigint;
22
+ _fromAddresses: Uint8Array[];
20
23
  _rewardAddresses: BufferAvax[];
21
24
  _utxos: DecodedUtxoObj[];
22
25
  _to: BufferAvax[];
23
26
  _fee: Partial<TransactionFee>;
27
+ _blsPublicKey: string;
28
+ _blsSignature: string;
24
29
  constructor(coinConfig: Readonly<CoinConfig>);
25
- get avaxPTransaction(): BaseTx;
30
+ get avaxPTransaction(): avaxSerial.BaseTx;
26
31
  get signature(): string[];
27
32
  get credentials(): Credential[];
28
33
  get hasCredentials(): boolean;
29
34
  /** @inheritdoc */
30
35
  canSign({ key }: BaseKey): boolean;
31
36
  /**
32
- * Sign a avaxp transaction and update the transaction hex
33
- * validator, delegator, import, exports extend baseTx
34
- * unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
35
- * const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
36
- * get baseTx then create new unsignedTx then sign
37
- *
37
+ * Sign an avaxp transaction and update the transaction hex
38
38
  * @param {KeyPair} keyPair
39
39
  */
40
- sign(keyPair: KeyPair): void;
40
+ sign(keyPair: KeyPair): Promise<void>;
41
+ toHexString(byteArray: Uint8Array): string;
41
42
  /** @inheritdoc */
42
43
  /**
43
44
  * should be of signedTx doing this with baseTx
44
45
  */
45
46
  toBroadcastFormat(): string;
46
47
  toJson(): TxData;
47
- setTransaction(tx: DeprecatedTx): void;
48
+ setTransaction(tx: Tx): void;
48
49
  /**
49
50
  * Set the transaction type
50
51
  *
@@ -63,9 +64,6 @@ export declare class Transaction extends BaseTransaction {
63
64
  * Get the list of outputs. Amounts are expressed in absolute value.
64
65
  */
65
66
  get outputs(): Entry[];
66
- /**
67
- * Get a Transasction Fee.
68
- */
69
67
  get fee(): TransactionFee;
70
68
  get changeOutputs(): Entry[];
71
69
  get inputs(): Entry[];
@@ -77,24 +75,5 @@ export declare class Transaction extends BaseTransaction {
77
75
  createSignature(prv: Buffer): string;
78
76
  /** @inheritdoc */
79
77
  explainTransaction(): TransactionExplanation;
80
- /**
81
- * Check if this transaction is a P chain
82
- */
83
- get isTransactionForCChain(): boolean;
84
- /**
85
- * get the source chain id or undefined if it's a cross chain transfer.
86
- */
87
- get sourceChain(): string | undefined;
88
- /**
89
- * get the destinationChain or undefined if it's a cross chain transfer.
90
- */
91
- get destinationChain(): string | undefined;
92
- /**
93
- * Convert a blockchainId buffer to string and return P or C alias if match of any of that chains.
94
- * @param {BufferAvax} blockchainIDBuffer
95
- * @return {string} blocchainID or alias if exists.
96
- * @private
97
- */
98
- private blockchainIDtoAlias;
99
78
  }
100
79
  //# sourceMappingURL=transaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA2ChC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAMxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAG9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CAuBrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsB,UAAU,EAAoC,MAAM,oBAAoB,CAAC;AAClH,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAM,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAqB,cAAc,EAAmB,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCpC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,SAAK;IACf,SAAS,SAAa;IACtB,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAM;IACpC,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,UAAU,CAAC,MAAM,CAExC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAKxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC3C,WAAW,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;IAI1C,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAiBhB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAI5B;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAO1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAGf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CAgBrB;IAED,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAI3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CAgBpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;CA0B7C"}
@@ -4,27 +4,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Transaction = void 0;
7
+ const avalanchejs_1 = require("@bitgo/avalanchejs");
7
8
  const sdk_core_1 = require("@bitgo/sdk-core");
8
- const iface_1 = require("./iface");
9
9
  const avalanche_1 = require("avalanche");
10
+ const iface_1 = require("./iface");
10
11
  const utils_1 = __importDefault(require("./utils"));
11
- function isEmptySignature(s) {
12
- return !!s && s.startsWith(''.padStart(90, '0'));
13
- }
14
12
  /**
15
- * Signatures are prestore as empty buffer for hsm and address of signar for first signature.
16
- * When sign is required, this method return the function that identify a signature to be replaced.
17
- * @param signatures any signatures as samples to identify which signature required replace.
13
+ * Checks if a signature is empty
14
+ * @param signature
15
+ * @returns {boolean}
18
16
  */
17
+ function isEmptySignature(signature) {
18
+ return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
19
+ }
19
20
  function generateSelectorSignature(signatures) {
20
- if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig.bytes))) {
21
+ if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig))) {
21
22
  // Look for address.
22
23
  return function (sig, address) {
23
24
  try {
24
- if (!isEmptySignature(sig.bytes)) {
25
+ if (!isEmptySignature(sig)) {
25
26
  return false;
26
27
  }
27
- const pub = sig.bytes.substring(90);
28
+ if (sig.startsWith('0x'))
29
+ sig = sig.substring(2);
30
+ const pub = sig.substring(90);
28
31
  return pub === address;
29
32
  }
30
33
  catch (e) {
@@ -35,9 +38,7 @@ function generateSelectorSignature(signatures) {
35
38
  else {
36
39
  // Look for empty string
37
40
  return function (sig, address) {
38
- if (isEmptySignature(sig.bytes))
39
- return true;
40
- return false;
41
+ return isEmptySignature(sig);
41
42
  };
42
43
  }
43
44
  }
@@ -46,28 +47,27 @@ class Transaction extends sdk_core_1.BaseTransaction {
46
47
  constructor(coinConfig) {
47
48
  super(coinConfig);
48
49
  this._threshold = 2;
49
- this._locktime = new avalanche_1.BN(0);
50
+ this._locktime = BigInt(0);
50
51
  this._fromAddresses = [];
52
+ this._rewardAddresses = [];
51
53
  this._utxos = [];
52
54
  this._fee = {};
53
55
  this._network = coinConfig.network;
54
- this._assetId = utils_1.default.cb58Decode(this._network.avaxAssetID);
55
- this._blockchainID = utils_1.default.cb58Decode(this._network.blockchainID);
56
+ this._assetId = this._network.avaxAssetID;
57
+ this._blockchainID = this._network.blockchainID;
56
58
  this._networkID = this._network.networkID;
57
59
  }
58
60
  get avaxPTransaction() {
59
- return this._avaxTransaction.getUnsignedTx().getTransaction();
61
+ return this._avaxTransaction.getTx().baseTx;
60
62
  }
61
63
  get signature() {
62
64
  if (this.credentials.length === 0) {
63
65
  return [];
64
66
  }
65
- const obj = this.credentials[0].serialize();
66
- return obj.sigArray.map((s) => s.bytes).filter((s) => !isEmptySignature(s));
67
+ return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
67
68
  }
68
69
  get credentials() {
69
70
  var _a;
70
- // it should be this._avaxpTransaction?.getCredentials(), but EVMTx doesn't have it
71
71
  return (_a = this._avaxTransaction) === null || _a === void 0 ? void 0 : _a.credentials;
72
72
  }
73
73
  get hasCredentials() {
@@ -79,15 +79,10 @@ class Transaction extends sdk_core_1.BaseTransaction {
79
79
  return true;
80
80
  }
81
81
  /**
82
- * Sign a avaxp transaction and update the transaction hex
83
- * validator, delegator, import, exports extend baseTx
84
- * unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
85
- * const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
86
- * get baseTx then create new unsignedTx then sign
87
- *
82
+ * Sign an avaxp transaction and update the transaction hex
88
83
  * @param {KeyPair} keyPair
89
84
  */
90
- sign(keyPair) {
85
+ async sign(keyPair) {
91
86
  const prv = keyPair.getPrivateKey();
92
87
  const addressHex = keyPair.getAddressBuffer().toString('hex');
93
88
  if (!prv) {
@@ -99,24 +94,31 @@ class Transaction extends sdk_core_1.BaseTransaction {
99
94
  if (!this.hasCredentials) {
100
95
  throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
101
96
  }
102
- const signature = this.createSignature(prv);
103
- let checkSign = undefined;
104
- this.credentials.forEach((c) => {
105
- const cs = c.serialize();
106
- if (checkSign === undefined) {
107
- checkSign = generateSelectorSignature(cs.sigArray);
108
- }
109
- let find = false;
110
- cs.sigArray.forEach((sig) => {
111
- if (checkSign && checkSign(sig, addressHex)) {
112
- sig.bytes = signature;
113
- find = true;
97
+ const unsignedTx = this._avaxTransaction;
98
+ const unsignedBytes = unsignedTx.toBytes();
99
+ const publicKey = avalanchejs_1.secp256k1.getPublicKey(prv);
100
+ if (unsignedTx.hasPubkey(publicKey)) {
101
+ const signature = await avalanchejs_1.secp256k1.sign(unsignedBytes, prv);
102
+ let checkSign = undefined;
103
+ unsignedTx.credentials.forEach((c, index) => {
104
+ if (checkSign === undefined) {
105
+ checkSign = generateSelectorSignature(c.getSignatures());
106
+ }
107
+ let find = false;
108
+ c.getSignatures().forEach((sig, index) => {
109
+ if (checkSign && checkSign(sig, addressHex)) {
110
+ c.setSignature(index, signature);
111
+ find = true;
112
+ }
113
+ });
114
+ if (!find) {
115
+ throw new sdk_core_1.SigningError(`Private key cannot sign the transaction, address hex ${addressHex}, public key: ${publicKey}`);
114
116
  }
115
117
  });
116
- if (!find)
117
- throw new sdk_core_1.SigningError('Private key cannot sign the transaction');
118
- c.deserialize(cs);
119
- });
118
+ }
119
+ }
120
+ toHexString(byteArray) {
121
+ return avalanchejs_1.utils.bufferToHex(byteArray);
120
122
  }
121
123
  /** @inheritdoc */
122
124
  /**
@@ -126,7 +128,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
126
128
  if (!this.avaxPTransaction) {
127
129
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
128
130
  }
129
- return this._avaxTransaction.toStringHex();
131
+ return this.toHexString(avalanchejs_1.utils.addChecksum(this._avaxTransaction.getSignedTx().toBytes()));
130
132
  }
131
133
  // types - stakingTransaction, import, export
132
134
  toJson() {
@@ -143,8 +145,6 @@ class Transaction extends sdk_core_1.BaseTransaction {
143
145
  signatures: this.signature,
144
146
  outputs: this.outputs,
145
147
  changeOutputs: this.changeOutputs,
146
- sourceChain: this.sourceChain,
147
- destinationChain: this.destinationChain,
148
148
  };
149
149
  }
150
150
  setTransaction(tx) {
@@ -156,6 +156,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
156
156
  * @param {TransactionType} transactionType The transaction type to be set
157
157
  */
158
158
  setTransactionType(transactionType) {
159
+ if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
160
+ throw new Error(`Transaction type ${transactionType} is not supported`);
161
+ }
159
162
  this._type = transactionType;
160
163
  }
161
164
  /**
@@ -163,85 +166,54 @@ class Transaction extends sdk_core_1.BaseTransaction {
163
166
  * Only needed for coins that support adding signatures directly (e.g. TSS).
164
167
  */
165
168
  get signablePayload() {
166
- return utils_1.default.sha256(this._avaxTransaction.getUnsignedTx().toBuffer());
169
+ return utils_1.default.sha256(this._avaxTransaction.toBytes());
167
170
  }
168
171
  get id() {
169
- return utils_1.default.cb58Encode(avalanche_1.Buffer.from(utils_1.default.sha256(this._avaxTransaction.toBuffer())));
172
+ const bufferArray = utils_1.default.sha256(this._avaxTransaction.toBytes());
173
+ return utils_1.default.cb58Encode(avalanche_1.Buffer.from(bufferArray));
170
174
  }
171
175
  get fromAddresses() {
172
- return this._fromAddresses.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a));
176
+ return this._fromAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
173
177
  }
174
178
  get rewardAddresses() {
175
- return this._rewardAddresses.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a));
179
+ return this._rewardAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
176
180
  }
177
181
  /**
178
182
  * Get the list of outputs. Amounts are expressed in absolute value.
179
183
  */
180
184
  get outputs() {
181
185
  switch (this.type) {
182
- case sdk_core_1.TransactionType.Import:
183
- return this.avaxPTransaction.getOuts().map(utils_1.default.mapOutputToEntry(this._network));
184
- case sdk_core_1.TransactionType.Export:
185
- if (utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
186
- return this.avaxPTransaction.getExportedOutputs().map(utils_1.default.mapOutputToEntry(this._network));
187
- }
188
- else {
189
- return this.avaxPTransaction.getExportOutputs().map(utils_1.default.mapOutputToEntry(this._network));
190
- }
191
- case sdk_core_1.TransactionType.AddDelegator:
192
- case sdk_core_1.TransactionType.AddValidator:
193
- // Get staked outputs
194
- const addValidatorTx = this.avaxPTransaction;
186
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
195
187
  return [
196
188
  {
197
- address: addValidatorTx.getNodeIDString(),
198
- value: addValidatorTx.getStakeAmount().toString(),
189
+ address: this._avaxTransaction.getTx().subnetValidator.validator.nodeId.toString(),
190
+ value: this._avaxTransaction.getTx().subnetValidator.validator.weight.toJSON(),
199
191
  },
200
192
  ];
201
193
  default:
202
194
  return [];
203
195
  }
204
196
  }
205
- /**
206
- * Get a Transasction Fee.
207
- */
208
197
  get fee() {
209
198
  return { fee: '0', ...this._fee };
210
199
  }
211
200
  get changeOutputs() {
212
- // C-chain tx adn Import Txs don't have change outputs
213
- if (this.type === sdk_core_1.TransactionType.Import ||
214
- utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
215
- return [];
216
- }
217
- // general support any transaction type, but it's scoped yet
218
- return this.avaxPTransaction.getOuts().map(utils_1.default.mapOutputToEntry(this._network));
201
+ return this._avaxTransaction.getTx().baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
219
202
  }
220
203
  get inputs() {
221
204
  let inputs;
222
205
  switch (this.type) {
223
- case sdk_core_1.TransactionType.Import:
224
- inputs = this.avaxPTransaction.getImportInputs();
225
- break;
226
- case sdk_core_1.TransactionType.Export:
227
- if (utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
228
- return this.avaxPTransaction.getInputs().map((evmInput) => ({
229
- address: '0x' + evmInput.getAddressString(),
230
- value: new avalanche_1.BN(evmInput.amount).toString(),
231
- nonce: evmInput.getNonce().toNumber(),
232
- }));
233
- }
234
- inputs = this.avaxPTransaction.getIns();
235
- break;
206
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
236
207
  default:
237
- inputs = this.avaxPTransaction.getIns();
208
+ inputs = this._avaxTransaction.getTx().baseTx
209
+ .inputs;
210
+ break;
238
211
  }
239
212
  return inputs.map((input) => {
240
- const amountInput = input.getInput();
241
213
  return {
242
- id: utils_1.default.cb58Encode(input.getTxID()) + iface_1.INPUT_SEPARATOR + utils_1.default.outputidxBufferToNumber(input.getOutputIdx()),
214
+ id: input.utxoID.txID.toString() + iface_1.INPUT_SEPARATOR + input.utxoID.outputIdx.value(),
243
215
  address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
244
- value: amountInput.getAmount().toString(),
216
+ value: input.amount().toString(),
245
217
  };
246
218
  });
247
219
  }
@@ -261,7 +233,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
261
233
  const outputAmount = txJson.outputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
262
234
  const changeAmount = txJson.changeOutputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
263
235
  let rewardAddresses;
264
- if ([sdk_core_1.TransactionType.AddValidator, sdk_core_1.TransactionType.AddDelegator].includes(txJson.type)) {
236
+ if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
265
237
  rewardAddresses = this.rewardAddresses;
266
238
  displayOrder.splice(6, 0, 'rewardAddresses');
267
239
  }
@@ -278,63 +250,6 @@ class Transaction extends sdk_core_1.BaseTransaction {
278
250
  type: txJson.type,
279
251
  };
280
252
  }
281
- /**
282
- * Check if this transaction is a P chain
283
- */
284
- get isTransactionForCChain() {
285
- return utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID);
286
- }
287
- /**
288
- * get the source chain id or undefined if it's a cross chain transfer.
289
- */
290
- get sourceChain() {
291
- let blockchainID;
292
- switch (this.type) {
293
- case sdk_core_1.TransactionType.Import:
294
- blockchainID = this.avaxPTransaction.getSourceChain();
295
- break;
296
- case sdk_core_1.TransactionType.Export:
297
- blockchainID = this.avaxPTransaction.getBlockchainID();
298
- break;
299
- default:
300
- return undefined;
301
- }
302
- return this.blockchainIDtoAlias(blockchainID);
303
- }
304
- /**
305
- * get the destinationChain or undefined if it's a cross chain transfer.
306
- */
307
- get destinationChain() {
308
- let blockchainID;
309
- switch (this.type) {
310
- case sdk_core_1.TransactionType.Import:
311
- blockchainID = this.avaxPTransaction.getBlockchainID();
312
- break;
313
- case sdk_core_1.TransactionType.Export:
314
- blockchainID = this.avaxPTransaction.getDestinationChain();
315
- break;
316
- default:
317
- return undefined;
318
- }
319
- return this.blockchainIDtoAlias(blockchainID);
320
- }
321
- /**
322
- * Convert a blockchainId buffer to string and return P or C alias if match of any of that chains.
323
- * @param {BufferAvax} blockchainIDBuffer
324
- * @return {string} blocchainID or alias if exists.
325
- * @private
326
- */
327
- blockchainIDtoAlias(blockchainIDBuffer) {
328
- const blockchainId = utils_1.default.cb58Encode(blockchainIDBuffer);
329
- switch (blockchainId) {
330
- case this._network.cChainBlockchainID:
331
- return 'C';
332
- case this._network.blockchainID:
333
- return 'P';
334
- default:
335
- return blockchainId;
336
- }
337
- }
338
253
  }
339
254
  exports.Transaction = Transaction;
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDhDQVF5QjtBQUV6QixtQ0FRaUI7QUFHakIseUNBQXFEO0FBQ3JELG9EQUE0QjtBQVk1QixTQUFTLGdCQUFnQixDQUFDLENBQVM7SUFDakMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsVUFBaUM7SUFDbEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNuRixvQkFBb0I7UUFDcEIsT0FBTyxVQUFVLEdBQUcsRUFBRSxPQUFPO1lBQzNCLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDaEMsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sR0FBRyxLQUFLLE9BQU8sQ0FBQzthQUN4QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7S0FDSDtTQUFNO1FBQ0wsd0JBQXdCO1FBQ3hCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJ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QkFDbkYsTUFBTTtZQUNSO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxZQUFZLENBQUM7UUFDakIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssMEJBQWUsQ0FBQyxNQUFNO2dCQUN6QixZQUFZLEdBQUksSUFBSSxDQUFDLGdCQUEyQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNuRixNQUFNO1lBQ1IsS0FBSywwQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLFlBQVksR0FBSSxJQUFJLENBQUMsZ0JBQTJDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdkYsTUFBTTtZQUNSO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssbUJBQW1CLENBQUMsa0JBQThCO1FBQ3hELE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxRQUFRLFlBQVksRUFBRTtZQUNwQixLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCO2dCQUNuQyxPQUFPLEdBQUcsQ0FBQztZQUNiLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUM3QixPQUFPLEdBQUcsQ0FBQztZQUNiO2dCQUNFLE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztDQUNGO0FBNVVELGtDQTRVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQge1xuICBCYXNlVHgsXG4gIERlY29kZWRVdHhvT2JqLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBEZXByZWNhdGVkVHgsXG4gIFR4RGF0YSxcbiAgSU5QVVRfU0VQQVJBVE9SLFxuICBBRERSRVNTX1NFUEFSQVRPUixcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBBZGREZWxlZ2F0b3JUeCwgQW1vdW50SW5wdXQsIEJhc2VUeCBhcyBQVk1CYXNlVHgsIEV4cG9ydFR4LCBJbXBvcnRUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bSc7XG5pbXBvcnQgeyBFeHBvcnRUeCBhcyBFVk1FeHBvcnRUeCwgSW1wb3J0VHggYXMgRVZNSW1wb3J0VHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL2V2bSc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2NvbW1vbic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuXG4vLyByZWdpb24gdXRpbHMgdG8gc2lnblxuaW50ZXJmYWNlIHNpZ25hdHVyZVNlcmlhbGl6ZWQge1xuICBieXRlczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ2F0dXJlOiBzaWduYXR1cmVTZXJpYWxpemVkLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzICYmIHMuc3RhcnRzV2l0aCgnJy5wYWRTdGFydCg5MCwgJzAnKSk7XG59XG5cbi8qKlxuICogU2lnbmF0dXJlcyBhcmUgcHJlc3RvcmUgYXMgZW1wdHkgYnVmZmVyIGZvciBoc20gYW5kIGFkZHJlc3Mgb2Ygc2lnbmFyIGZvciBmaXJzdCBzaWduYXR1cmUuXG4gKiBXaGVuIHNpZ24gaXMgcmVxdWlyZWQsIHRoaXMgbWV0aG9kIHJldHVybiB0aGUgZnVuY3Rpb24gdGhhdCBpZGVudGlmeSBhIHNpZ25hdHVyZSB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSBzaWduYXR1cmVzIGFueSBzaWduYXR1cmVzIGFzIHNhbXBsZXMgdG8gaWRlbnRpZnkgd2hpY2ggc2lnbmF0dXJlIHJlcXVpcmVkIHJlcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlczogc2lnbmF0dXJlU2VyaWFsaXplZFtdKTogQ2hlY2tTaWduYXR1cmUge1xuICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPiAxICYmIHNpZ25hdHVyZXMuZXZlcnkoKHNpZykgPT4gaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSkge1xuICAgIC8vIExvb2sgZm9yIGFkZHJlc3MuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1YiA9IHNpZy5ieXRlcy5zdWJzdHJpbmcoOTApO1xuICAgICAgICByZXR1cm4gcHViID09PSBhZGRyZXNzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBlbXB0eSBzdHJpbmdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGlzRW1wdHlTaWduYXR1cmUoc2lnLmJ5dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxufVxuLy8gZW5kIHJlZ2lvbiB1dGlscyBmb3Igc2lnblxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogRGVwcmVjYXRlZFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBCdWZmZXJBdmF4O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWU6IEJOID0gbmV3IEJOKDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3Jld2FyZEFkZHJlc3NlczogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRCk7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCk7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBCYXNlVHgge1xuICAgIHJldHVybiB0aGlzLl9hdmF4VHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLmNyZWRlbnRpYWxzWzBdLnNlcmlhbGl6ZSgpO1xuICAgIHJldHVybiBvYmouc2lnQXJyYXkubWFwKChzKSA9PiBzLmJ5dGVzKS5maWx0ZXIoKHMpID0+ICFpc0VtcHR5U2lnbmF0dXJlKHMpKTtcbiAgfVxuXG4gIGdldCBjcmVkZW50aWFscygpOiBDcmVkZW50aWFsW10ge1xuICAgIC8vIGl0IHNob3VsZCBiZSB0aGlzLl9hdmF4cFRyYW5zYWN0aW9uPy5nZXRDcmVkZW50aWFscygpLCBidXQgRVZNVHggZG9lc24ndCBoYXZlIGl0XG4gICAgcmV0dXJuICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBhdmF4cCB0cmFuc2FjdGlvbiBhbmQgdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogdmFsaWRhdG9yLCBkZWxlZ2F0b3IsIGltcG9ydCwgZXhwb3J0cyBleHRlbmQgYmFzZVR4XG4gICAqIHVuc2lnbmVkVHg6IFVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgpICAoYmFzZVR4ID0gYWRkVmFsaWRhdG9yVHgpXG4gICAqIGNvbnN0IHR4OiBUeCA9IHVuc2lnbmVkVHguc2lnbihrZXljaGFpbikgKHR4IGlzIHR5cGUgc3RhbmRhcmQgc2lnbmVkIHR4KVxuICAgKiBnZXQgYmFzZVR4IHRoZW4gY3JlYXRlIG5ldyB1bnNpZ25lZFR4IHRoZW4gc2lnblxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpO1xuICAgIGNvbnN0IGFkZHJlc3NIZXggPSBrZXlQYWlyLmdldEFkZHJlc3NCdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgY3JlZGVudGlhbHMgdG8gc2lnbicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmNyZWF0ZVNpZ25hdHVyZShwcnYpO1xuICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3JlZGVudGlhbHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgY29uc3QgY3M6IGFueSA9IGMuc2VyaWFsaXplKCk7XG4gICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjcy5zaWdBcnJheSk7XG4gICAgICB9XG4gICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgY3Muc2lnQXJyYXkuZm9yRWFjaCgoc2lnKSA9PiB7XG4gICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICBzaWcuYnl0ZXMgPSBzaWduYXR1cmU7XG4gICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFmaW5kKSB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIGMuZGVzZXJpYWxpemUoY3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9TdHJpbmdIZXgoKTtcbiAgfVxuXG4gIC8vIHR5cGVzIC0gc3Rha2luZ1RyYW5zYWN0aW9uLCBpbXBvcnQsIGV4cG9ydFxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5zb3VyY2VDaGFpbixcbiAgICAgIGRlc3RpbmF0aW9uQ2hhaW46IHRoaXMuZGVzdGluYXRpb25DaGFpbixcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IERlcHJlY2F0ZWRUeCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YXhUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHNpZ25lZCBpbiBCdWZmZXIgZm9ybWF0LlxuICAgKiBPbmx5IG5lZWRlZCBmb3IgY29pbnMgdGhhdCBzdXBwb3J0IGFkZGluZyBzaWduYXR1cmVzIGRpcmVjdGx5IChlLmcuIFRTUykuXG4gICAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLnRvQnVmZmVyKCkpO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyQXZheC5mcm9tKHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9CdWZmZXIoKSkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRPdXRzKCkubWFwKHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpKSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRVZNRXhwb3J0VHgpLmdldEV4cG9ydGVkT3V0cHV0cygpLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeCkuZ2V0RXhwb3J0T3V0cHV0cygpLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yOlxuICAgICAgICAvLyBHZXQgc3Rha2VkIG91dHB1dHNcbiAgICAgICAgY29uc3QgYWRkVmFsaWRhdG9yVHggPSB0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgQWRkRGVsZWdhdG9yVHg7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogYWRkVmFsaWRhdG9yVHguZ2V0Tm9kZUlEU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogYWRkVmFsaWRhdG9yVHguZ2V0U3Rha2VBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFRyYW5zYXNjdGlvbiBGZWUuXG4gICAqL1xuICBnZXQgZmVlKCk6IFRyYW5zYWN0aW9uRmVlIHtcbiAgICByZXR1cm4geyBmZWU6ICcwJywgLi4udGhpcy5fZmVlIH07XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICAvLyBDLWNoYWluIHR4IGFkbiBJbXBvcnQgVHhzIGRvbid0IGhhdmUgY2hhbmdlIG91dHB1dHNcbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQgfHxcbiAgICAgIHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKVxuICAgICkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBnZW5lcmFsIHN1cHBvcnQgYW55IHRyYW5zYWN0aW9uIHR5cGUsIGJ1dCBpdCdzIHNjb3BlZCB5ZXRcbiAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldE91dHMoKS5tYXAodXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEVudHJ5W10ge1xuICAgIGxldCBpbnB1dHM7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRJbXBvcnRJbnB1dHMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFVk1FeHBvcnRUeCkuZ2V0SW5wdXRzKCkubWFwKChldm1JbnB1dCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcweCcgKyBldm1JbnB1dC5nZXRBZGRyZXNzU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogbmV3IEJOKChldm1JbnB1dCBhcyBhbnkpLmFtb3VudCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5vbmNlOiBldm1JbnB1dC5nZXROb25jZSgpLnRvTnVtYmVyKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgUFZNQmFzZVR4KS5nZXRJbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0SW5zKCk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgYW1vdW50SW5wdXQgPSBpbnB1dC5nZXRJbnB1dCgpIGFzIGFueSBhcyBBbW91bnRJbnB1dDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiB1dGlscy5jYjU4RW5jb2RlKGlucHV0LmdldFR4SUQoKSkgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dGlscy5vdXRwdXRpZHhCdWZmZXJUb051bWJlcihpbnB1dC5nZXRPdXRwdXRJZHgoKSksXG4gICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgIHZhbHVlOiBhbW91bnRJbnB1dC5nZXRBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4IHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ252YWwgPSB1dGlscy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKFxuICAgICAgdGhpcy5fbmV0d29yayxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnNpZ25hYmxlUGF5bG9hZCksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gICAgcmV0dXJuIHNpZ252YWwudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnaW5wdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICd0eXBlJ107XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0eEpzb24uY2hhbmdlT3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKFtUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yLCBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIFAgY2hhaW5cbiAgICovXG4gIGdldCBpc1RyYW5zYWN0aW9uRm9yQ0NoYWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBzb3VyY2UgY2hhaW4gaWQgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBjcm9zcyBjaGFpbiB0cmFuc2Zlci5cbiAgICovXG4gIGdldCBzb3VyY2VDaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRTb3VyY2VDaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeCB8IEVWTUV4cG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBkZXN0aW5hdGlvbkNoYWluIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgY3Jvc3MgY2hhaW4gdHJhbnNmZXIuXG4gICAqL1xuICBnZXQgZGVzdGluYXRpb25DaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHggfCBFVk1FeHBvcnRUeCkuZ2V0RGVzdGluYXRpb25DaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgYmxvY2tjaGFpbklkIGJ1ZmZlciB0byBzdHJpbmcgYW5kIHJldHVybiBQIG9yIEMgYWxpYXMgaWYgbWF0Y2ggb2YgYW55IG9mIHRoYXQgY2hhaW5zLlxuICAgKiBAcGFyYW0ge0J1ZmZlckF2YXh9IGJsb2NrY2hhaW5JREJ1ZmZlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJsb2NjaGFpbklEIG9yIGFsaWFzIGlmIGV4aXN0cy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSURCdWZmZXI6IEJ1ZmZlckF2YXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJsb2NrY2hhaW5JZCA9IHV0aWxzLmNiNThFbmNvZGUoYmxvY2tjaGFpbklEQnVmZmVyKTtcbiAgICBzd2l0Y2ggKGJsb2NrY2hhaW5JZCkge1xuICAgICAgY2FzZSB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRDpcbiAgICAgICAgcmV0dXJuICdDJztcbiAgICAgIGNhc2UgdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQ6XG4gICAgICAgIHJldHVybiAnUCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYmxvY2tjaGFpbklkO1xuICAgIH1cbiAgfVxufVxuIl19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUFrSDtBQUNsSCw4Q0FReUI7QUFFekIseUNBQXFEO0FBRXJELG1DQUFpSDtBQUVqSCxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQU1ELFNBQVMseUJBQXlCLENBQUMsVUFBb0I7SUFDckQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQzdFLG9CQUFvQjtRQUNwQixPQUFPLFVBQVUsR0FBRyxFQUFFLE9BQU87WUFDM0IsSUFBSTtnQkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzFCLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2dCQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxLQUFLLE9BQU8sQ0FBQzthQUN4QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7S0FDSDtTQUFN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QUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUM5QztRQUVELE9BQU87WUFDTCxZQUFZO1lBQ1osRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RSxZQUFZO1lBQ1osYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFlBQVk7WUFDWixlQUFlO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFqUUQsa0NBaVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXZheFNlcmlhbCwgdXRpbHMgYXMgYXZheFV0aWxzLCBDcmVkZW50aWFsLCBwdm1TZXJpYWwsIHNlY3AyNTZrMSwgVW5zaWduZWRUeCB9IGZyb20gJ0BiaXRnby9hdmFsYW5jaGVqcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXZhbGFuY2hlTmV0d29yaywgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgQUREUkVTU19TRVBBUkFUT1IsIERlY29kZWRVdHhvT2JqLCBJTlBVVF9TRVBBUkFUT1IsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4LCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBpcyBlbXB0eVxuICogQHBhcmFtIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpLnN0YXJ0c1dpdGgoJycucGFkU3RhcnQoOTAsICcwJykpO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYXR1cmUge1xuICAoc2lnYXR1cmU6IHN0cmluZywgYWRkcmVzc0hleDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENoZWNrU2lnbmF0dXJlIHtcbiAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID4gMSAmJiBzaWduYXR1cmVzLmV2ZXJ5KChzaWcpID0+IGlzRW1wdHlTaWduYXR1cmUoc2lnKSkpIHtcbiAgICAvLyBMb29rIGZvciBhZGRyZXNzLlxuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnLnN0YXJ0c1dpdGgoJzB4JykpIHNpZyA9IHNpZy5zdWJzdHJpbmcoMik7XG4gICAgICAgIGNvbnN0IHB1YiA9IHNpZy5zdWJzdHJpbmcoOTApO1xuICAgICAgICByZXR1cm4gcHViID09PSBhZGRyZXNzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBlbXB0eSBzdHJpbmdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGlzRW1wdHlTaWduYXR1cmUoc2lnKTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfYXZheFRyYW5zYWN0aW9uOiBUeDtcbiAgcHVibGljIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHB1YmxpYyBfbmV0d29yazogQXZhbGFuY2hlTmV0d29yaztcbiAgcHVibGljIF9uZXR3b3JrSUQ6IG51bWJlcjtcbiAgcHVibGljIF9hc3NldElkOiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBzdHJpbmc7XG4gIHB1YmxpYyBfbm9kZUlEOiBzdHJpbmc7XG4gIHB1YmxpYyBfc3RhcnRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfZW5kVGltZTogYmlnaW50O1xuICBwdWJsaWMgX3N0YWtlQW1vdW50OiBiaWdpbnQ7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZSA9IEJpZ0ludCgwKTtcbiAgcHVibGljIF9mcm9tQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG4gIHB1YmxpYyBfYmxzUHVibGljS2V5OiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxzU2lnbmF0dXJlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHRoaXMuX25ldHdvcmsuYXZheEFzc2V0SUQ7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQ7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBhdmF4U2VyaWFsLkJhc2VUeCB7XG4gICAgcmV0dXJuICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1swXS5nZXRTaWduYXR1cmVzKCkuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYW4gYXZheHAgdHJhbnNhY3Rpb24gYW5kIHVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgVWludDhBcnJheTtcbiAgICBjb25zdCBhZGRyZXNzSGV4ID0ga2V5UGFpci5nZXRBZGRyZXNzQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2VtcHR5IHRyYW5zYWN0aW9uIHRvIHNpZ24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2VtcHR5IGNyZWRlbnRpYWxzIHRvIHNpZ24nKTtcbiAgICB9XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4O1xuICAgIGNvbnN0IHVuc2lnbmVkQnl0ZXMgPSB1bnNpZ25lZFR4LnRvQnl0ZXMoKTtcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlY3AyNTZrMS5nZXRQdWJsaWNLZXkocHJ2KTtcbiAgICBpZiAodW5zaWduZWRUeC5oYXNQdWJrZXkocHVibGljS2V5KSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgc2VjcDI1NmsxLnNpZ24odW5zaWduZWRCeXRlcywgcHJ2KTtcbiAgICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgdW5zaWduZWRUeC5jcmVkZW50aWFscy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjaGVja1NpZ24gPSBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKGMuZ2V0U2lnbmF0dXJlcygpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgICBjLmdldFNpZ25hdHVyZXMoKS5mb3JFYWNoKChzaWcsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGNoZWNrU2lnbiAmJiBjaGVja1NpZ24oc2lnLCBhZGRyZXNzSGV4KSkge1xuICAgICAgICAgICAgYy5zZXRTaWduYXR1cmUoaW5kZXgsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICBmaW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZpbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKFxuICAgICAgICAgICAgYFByaXZhdGUga2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbiwgYWRkcmVzcyBoZXggJHthZGRyZXNzSGV4fSwgcHVibGljIGtleTogJHtwdWJsaWNLZXl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvSGV4U3RyaW5nKGJ5dGVBcnJheTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGF2YXhVdGlscy5idWZmZXJUb0hleChieXRlQXJyYXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRvSGV4U3RyaW5nKGF2YXhVdGlscy5hZGRDaGVja3N1bSgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFNpZ25lZFR4KCkudG9CeXRlcygpKSk7XG4gIH1cblxuICAvLyB0eXBlcyAtIHN0YWtpbmdUcmFuc2FjdGlvbiwgaW1wb3J0LCBleHBvcnRcbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIGlmICghW1RyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcl0uaW5jbHVkZXModHJhbnNhY3Rpb25UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS50b0J5dGVzKCkpO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVmZmVyQXJyYXkgPSB1dGlscy5zaGEyNTYoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS50b0J5dGVzKCkpO1xuICAgIHJldHVybiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlckF2YXguZnJvbShidWZmZXJBcnJheSkpO1xuICB9XG5cbiAgZ2V0IGZyb21BZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT4gYXZheFV0aWxzLmZvcm1hdCh0aGlzLl9uZXR3b3JrLmFsaWFzLCB0aGlzLl9uZXR3b3JrLmhycCwgYSkpO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGEpID0+IGF2YXhVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2Ygb3V0cHV0cy4gQW1vdW50cyBhcmUgZXhwcmVzc2VkIGluIGFic29sdXRlIHZhbHVlLlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IChcbiAgICAgICAgICAgICAgKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4XG4gICAgICAgICAgICApLnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iubm9kZUlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogKFxuICAgICAgICAgICAgICAodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhcbiAgICAgICAgICAgICkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci53ZWlnaHQudG9KU09OKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmVlKCk6IFRyYW5zYWN0aW9uRmVlIHtcbiAgICByZXR1cm4geyBmZWU6ICcwJywgLi4udGhpcy5fZmVlIH07XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICByZXR1cm4gKCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4Lm91dHB1dHMubWFwKFxuICAgICAgdXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKVxuICAgICk7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEVudHJ5W10ge1xuICAgIGxldCBpbnB1dHM7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5wdXRzID0gKCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4XG4gICAgICAgICAgLmlucHV0cztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlucHV0LnV0eG9JRC50eElELnRvU3RyaW5nKCkgKyBJTlBVVF9TRVBBUkFUT1IgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgIHZhbHVlOiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4IHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ252YWwgPSB1dGlscy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKFxuICAgICAgdGhpcy5fbmV0d29yayxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnNpZ25hYmxlUGF5bG9hZCksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gICAgcmV0dXJuIHNpZ252YWwudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnaW5wdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICd0eXBlJ107XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0eEpzb24uY2hhbmdlT3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKFtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHR4SnNvbi5pZCxcbiAgICAgIGlucHV0czogdHhKc29uLmlucHV0cyxcbiAgICAgIG91dHB1dHM6IHR4SnNvbi5vdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgY2hhbmdlT3V0cHV0czogdHhKc29uLmNoYW5nZU91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBjaGFuZ2VBbW91bnQsXG4gICAgICByZXdhcmRBZGRyZXNzZXMsXG4gICAgICBmZWU6IHRoaXMuZmVlLFxuICAgICAgdHlwZTogdHhKc29uLnR5cGUsXG4gICAgfTtcbiAgfVxufVxuIl19