@bitgo/sdk-coin-flrp 1.6.1 → 1.7.1

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 (62) hide show
  1. package/dist/src/lib/ExportInCTxBuilder.d.ts +5 -13
  2. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -1
  3. package/dist/src/lib/ExportInCTxBuilder.js +24 -64
  4. package/dist/src/lib/ExportInPTxBuilder.d.ts +8 -26
  5. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -1
  6. package/dist/src/lib/ExportInPTxBuilder.js +84 -181
  7. package/dist/src/lib/ImportInCTxBuilder.d.ts +7 -20
  8. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -1
  9. package/dist/src/lib/ImportInCTxBuilder.js +80 -167
  10. package/dist/src/lib/ImportInPTxBuilder.d.ts +28 -13
  11. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -1
  12. package/dist/src/lib/ImportInPTxBuilder.js +136 -105
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -6
  14. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  15. package/dist/src/lib/atomicInCTransactionBuilder.js +1 -14
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts +50 -24
  17. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/atomicTransactionBuilder.js +127 -187
  19. package/dist/src/lib/iface.d.ts +31 -0
  20. package/dist/src/lib/iface.d.ts.map +1 -1
  21. package/dist/src/lib/iface.js +9 -2
  22. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -2
  23. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/permissionlessValidatorTxBuilder.js +1 -7
  25. package/dist/src/lib/transaction.d.ts +10 -6
  26. package/dist/src/lib/transaction.d.ts.map +1 -1
  27. package/dist/src/lib/transaction.js +10 -13
  28. package/dist/src/lib/transactionBuilder.d.ts +24 -16
  29. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  30. package/dist/src/lib/transactionBuilder.js +46 -28
  31. package/dist/src/lib/utils.d.ts +31 -2
  32. package/dist/src/lib/utils.d.ts.map +1 -1
  33. package/dist/src/lib/utils.js +71 -1
  34. package/dist/test/resources/account.d.ts +30 -0
  35. package/dist/test/resources/account.d.ts.map +1 -1
  36. package/dist/test/resources/account.js +27 -2
  37. package/dist/test/resources/transactionData/exportInC.d.ts +30 -0
  38. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -1
  39. package/dist/test/resources/transactionData/exportInC.js +32 -13
  40. package/dist/test/resources/transactionData/exportInP.d.ts +39 -48
  41. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -1
  42. package/dist/test/resources/transactionData/exportInP.js +70 -109
  43. package/dist/test/resources/transactionData/importInC.d.ts +39 -10
  44. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -1
  45. package/dist/test/resources/transactionData/importInC.js +101 -25
  46. package/dist/test/resources/transactionData/importInP.d.ts +46 -15
  47. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -1
  48. package/dist/test/resources/transactionData/importInP.js +65 -39
  49. package/dist/test/unit/flrp.js +15 -12
  50. package/dist/test/unit/lib/exportInCTxBuilder.js +32 -31
  51. package/dist/test/unit/lib/exportInPTxBuilder.js +112 -246
  52. package/dist/test/unit/lib/importInCTxBuilder.js +157 -353
  53. package/dist/test/unit/lib/importInPTxBuilder.js +227 -222
  54. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -1
  55. package/dist/test/unit/lib/signFlowTestSuit.js +1 -1
  56. package/dist/test/unit/lib/signatureIndex.d.ts +13 -0
  57. package/dist/test/unit/lib/signatureIndex.d.ts.map +1 -0
  58. package/dist/test/unit/lib/signatureIndex.js +591 -0
  59. package/dist/test/unit/lib/transactionBuilderFactory.js +2 -2
  60. package/dist/test/unit/lib/utils.js +94 -32
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +8 -7
@@ -30,8 +30,6 @@ class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransact
30
30
  if (!this.verifyTxType(baseTx._type)) {
31
31
  throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
32
32
  }
33
- // The outputs is a single C-Chain address result.
34
- // It's expected to have only one output to the destination C-Chain address.
35
33
  const outputs = baseTx.Outs;
36
34
  if (outputs.length !== 1) {
37
35
  throw new sdk_core_1.BuildTransactionError('Transaction can have one output');
@@ -42,89 +40,35 @@ class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransact
42
40
  }
43
41
  this.transaction._to = [Buffer.from(output.address.toBytes())];
44
42
  const inputs = baseTx.importedInputs;
43
+ const firstInput = inputs[0];
44
+ const inputThreshold = firstInput.sigIndicies().length || this.transaction._threshold;
45
+ this.transaction._threshold = inputThreshold;
45
46
  this.transaction._utxos = this.recoverUtxos(inputs);
46
- // Calculate total input and output amounts
47
47
  const totalInputAmount = inputs.reduce((t, i) => t + i.amount(), BigInt(0));
48
48
  const totalOutputAmount = output.amount.value();
49
- // Calculate fee based on input/output difference
50
49
  const fee = totalInputAmount - totalOutputAmount;
51
- // Use credentials passed from TransactionBuilderFactory (properly extracted using codec)
52
50
  const credentials = parsedCredentials || [];
53
51
  const hasCredentials = credentials.length > 0;
54
- // If it's a signed transaction, store the original raw bytes to preserve exact format
55
52
  if (hasCredentials && rawBytes) {
56
53
  this.transaction._rawSignedBytes = rawBytes;
57
54
  }
58
- // Extract threshold from first input's sigIndicies (number of required signatures)
59
- const firstInput = inputs[0];
60
- const inputThreshold = firstInput.sigIndicies().length || this.transaction._threshold;
61
- this.transaction._threshold = inputThreshold;
62
- // Create a temporary UnsignedTx for accurate fee size calculation
63
- // This includes the full structure (ImportTx, AddressMaps, Credentials)
64
- const tempAddressMap = new flarejs_1.utils.AddressMap();
65
- for (let i = 0; i < inputThreshold; i++) {
66
- if (this.transaction._fromAddresses && this.transaction._fromAddresses[i]) {
67
- tempAddressMap.set(new flarejs_1.Address(this.transaction._fromAddresses[i]), i);
68
- }
69
- }
70
- const tempAddressMaps = new flarejs_1.utils.AddressMaps([tempAddressMap]);
71
- const tempCredentials = credentials.length > 0 ? credentials : [new flarejs_1.Credential(Array(inputThreshold).fill(utils_1.default.createNewSig('')))];
72
- const tempUnsignedTx = new flarejs_1.UnsignedTx(baseTx, [], tempAddressMaps, tempCredentials);
73
- // Calculate cost units using the full UnsignedTx structure
74
- const feeSize = this.calculateImportCost(tempUnsignedTx);
75
- // Use integer division to ensure feeRate can be converted back to BigInt
76
- const feeRate = Math.floor(Number(fee) / feeSize);
77
55
  this.transaction._fee = {
78
56
  fee: fee.toString(),
79
- feeRate: feeRate,
80
- size: feeSize,
81
57
  };
82
- // Create AddressMaps based on signature slot order (matching credential order), not sorted addresses
83
- // This matches the approach used in credentials: addressesIndex determines signature order
84
- // AddressMaps should map addresses to signature slots in the same order as credentials
85
- // If _fromAddresses is available, create AddressMap based on UTXO order (matching credential order)
86
- // Otherwise, fall back to mapping just the output address
87
- const firstUtxo = this.transaction._utxos[0];
88
- let addressMap;
89
- if (firstUtxo &&
90
- firstUtxo.addresses &&
91
- firstUtxo.addresses.length > 0 &&
92
- this.transaction._fromAddresses &&
93
- this.transaction._fromAddresses.length >= this.transaction._threshold) {
94
- // Use centralized method for AddressMap creation
95
- addressMap = this.createAddressMapForUtxo(firstUtxo, this.transaction._threshold);
96
- }
97
- else {
98
- // Fallback: map output address to slot 0 (for C-chain imports, output is the destination)
99
- // Or map addresses sequentially if _fromAddresses is available but UTXO addresses are not
100
- addressMap = new flarejs_1.utils.AddressMap();
101
- if (this.transaction._fromAddresses && this.transaction._fromAddresses.length >= this.transaction._threshold) {
102
- this.transaction._fromAddresses.slice(0, this.transaction._threshold).forEach((addr, i) => {
103
- addressMap.set(new flarejs_1.Address(addr), i);
104
- });
105
- }
106
- else {
107
- // Last resort: map output address
108
- const toAddress = new flarejs_1.Address(output.address.toBytes());
109
- addressMap.set(toAddress, 0);
110
- }
111
- }
112
- const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
113
- // When credentials were extracted, use them directly to preserve existing signatures
114
- // For initBuilder, _fromAddresses may not be set yet, so use all zeros for credential slots
58
+ this.computeAddressesIndexFromParsed();
59
+ const addressMaps = this.transaction._utxos.map((utxo) => {
60
+ const utxoThreshold = utxo.threshold || this.transaction._threshold;
61
+ return this.createAddressMapForUtxo(utxo, utxoThreshold);
62
+ });
63
+ const flareAddressMaps = new flarejs_1.utils.AddressMaps(addressMaps);
115
64
  let txCredentials;
116
65
  if (credentials.length > 0) {
117
66
  txCredentials = credentials;
118
67
  }
119
68
  else {
120
- // Create empty credential with threshold number of signature slots (all zeros)
121
- const emptySignatures = [];
122
- for (let i = 0; i < inputThreshold; i++) {
123
- emptySignatures.push(utils_1.default.createNewSig(''));
124
- }
125
- txCredentials = [new flarejs_1.Credential(emptySignatures)];
69
+ txCredentials = this.transaction._utxos.map((utxo) => this.createCredentialForUtxo(utxo, utxo.threshold || this.transaction._threshold));
126
70
  }
127
- const unsignedTx = new flarejs_1.UnsignedTx(baseTx, [], addressMaps, txCredentials);
71
+ const unsignedTx = new flarejs_1.UnsignedTx(baseTx, [], flareAddressMaps, txCredentials);
128
72
  this.transaction.setTransaction(unsignedTx);
129
73
  return this;
130
74
  }
@@ -136,133 +80,102 @@ class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransact
136
80
  }
137
81
  /**
138
82
  * Build the import in C-chain transaction
83
+ * Following AVAX P approach for UTXO handling and signature slot assignment.
139
84
  * @protected
140
85
  */
141
86
  buildFlareTransaction() {
142
- // if tx has credentials or was already recovered from raw, tx shouldn't change
143
87
  if (this.transaction.hasCredentials)
144
88
  return;
145
89
  if (this.transaction._to.length !== 1) {
146
- throw new Error('to is required');
90
+ throw new sdk_core_1.BuildTransactionError('to is required');
147
91
  }
148
- if (!this.transaction._fee.feeRate) {
149
- throw new Error('fee rate is required');
92
+ if (!this.transaction._fee.fee) {
93
+ throw new sdk_core_1.BuildTransactionError('fee is required');
150
94
  }
151
- const { inputs, amount, credentials } = this.createInputs();
152
- // Calculate import cost units (matching AVAXP's costImportTx approach)
153
- // Create a temporary UnsignedTx with full amount to calculate fee size
154
- // This includes the full structure (ImportTx, AddressMaps, Credentials) for accurate size calculation
155
- const tempOutput = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
156
- const tempImportTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [tempOutput]);
157
- // Create AddressMaps for fee calculation (same as final transaction)
158
- const firstUtxo = this.transaction._utxos[0];
159
- const tempAddressMap = firstUtxo
160
- ? this.createAddressMapForUtxo(firstUtxo, this.transaction._threshold)
161
- : new flarejs_1.utils.AddressMap();
162
- const tempAddressMaps = new flarejs_1.utils.AddressMaps([tempAddressMap]);
163
- // Create temporary UnsignedTx with full structure for accurate fee calculation
164
- const tempUnsignedTx = new flarejs_1.UnsignedTx(tempImportTx, [], tempAddressMaps, credentials);
165
- // Calculate feeSize once using full UnsignedTx (matching AVAXP approach)
166
- const feeSize = this.calculateImportCost(tempUnsignedTx);
167
- const feeRate = BigInt(this.transaction._fee.feeRate);
168
- const fee = feeRate * BigInt(feeSize);
169
- // Validate that we have enough funds to cover the fee
170
- if (amount <= fee) {
171
- throw new sdk_core_1.BuildTransactionError(`Insufficient funds: have ${amount.toString()}, need more than ${fee.toString()} for fee`);
95
+ if (!this.transaction._context) {
96
+ throw new sdk_core_1.BuildTransactionError('context is required');
172
97
  }
173
- this.transaction._fee.fee = fee.toString();
174
- this.transaction._fee.size = feeSize;
175
- // Create EVM output using proper FlareJS class with amount minus fee
176
- const output = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount - fee), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
177
- // Create the import transaction
178
- const importTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [output]);
179
- // Reuse the AddressMaps already calculated for fee calculation
180
- const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], // Empty UTXOs array, will be filled during processing
181
- tempAddressMaps, credentials);
182
- this.transaction.setTransaction(unsignedTx);
183
- }
184
- /**
185
- * Create inputs from UTXOs
186
- * @return {
187
- * inputs: TransferableInput[];
188
- * credentials: Credential[];
189
- * amount: bigint;
190
- * }
191
- */
192
- createInputs() {
193
- const sender = this.transaction._fromAddresses.slice();
194
- if (this.recoverSigner) {
195
- // switch first and last signer
196
- const tmp = sender.pop();
197
- sender.push(sender[0]);
198
- if (tmp) {
199
- sender[0] = tmp;
200
- }
98
+ if (!this.transaction._fromAddresses || this.transaction._fromAddresses.length === 0) {
99
+ throw new sdk_core_1.BuildTransactionError('fromAddresses are required');
201
100
  }
202
- let totalAmount = BigInt(0);
203
- const inputs = [];
204
- const credentials = [];
205
- this.transaction._utxos.forEach((utxo) => {
206
- const amount = BigInt(utxo.amount);
207
- totalAmount += amount;
208
- // Create signature indices for threshold
209
- const sigIndices = [];
210
- for (let i = 0; i < this.transaction._threshold; i++) {
211
- sigIndices.push(i);
212
- }
213
- // Use fromNative to create TransferableInput (same pattern as ImportInPTxBuilder)
214
- // fromNative expects cb58-encoded strings for txId and assetId
215
- const txIdCb58 = utxo.txid; // Already cb58 encoded
216
- const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
217
- const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
218
- inputs.push(transferableInput);
219
- // Create credential with empty signatures for slot identification
220
- // Match avaxp behavior: dynamic ordering based on addressesIndex from UTXO
221
- // Use centralized method for credential creation
222
- credentials.push(this.createCredentialForUtxo(utxo, this.transaction._threshold));
223
- });
224
- return {
225
- inputs,
226
- credentials,
227
- amount: totalAmount,
228
- };
229
- }
230
- /**
231
- * @param unsignedTx The UnsignedTx to calculate the cost for (includes ImportTx, AddressMaps, and Credentials)
232
- * @returns The total cost units
233
- */
234
- calculateImportCost(unsignedTx) {
235
- const signedTxBytes = unsignedTx.getSignedTx().toBytes();
236
- const txBytesGas = 1;
237
- let bytesCost = signedTxBytes.length * txBytesGas;
238
- const costPerSignature = 1000;
239
- const importTx = unsignedTx.getTx();
240
- importTx.importedInputs.forEach((input) => {
241
- const inCost = costPerSignature * input.sigIndicies().length;
242
- bytesCost += inCost;
101
+ if (!this.transaction._utxos || this.transaction._utxos.length === 0) {
102
+ throw new sdk_core_1.BuildTransactionError('UTXOs are required');
103
+ }
104
+ if (!this.transaction._threshold) {
105
+ throw new sdk_core_1.BuildTransactionError('threshold is required');
106
+ }
107
+ this.computeAddressesIndex();
108
+ this.validateUtxoAddresses();
109
+ const actualFeeNFlr = BigInt(this.transaction._fee.fee);
110
+ const sourceChain = 'P';
111
+ // Convert decoded UTXOs to native FlareJS Utxo objects
112
+ const assetId = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
113
+ const nativeUtxos = utils_1.default.decodedToUtxos(this.transaction._utxos, assetId);
114
+ // Validate UTXO balance is sufficient to cover the import fee
115
+ const totalUtxoAmount = nativeUtxos.reduce((sum, utxo) => {
116
+ const output = utxo.output;
117
+ return sum + output.amount();
118
+ }, BigInt(0));
119
+ if (totalUtxoAmount <= actualFeeNFlr) {
120
+ throw new sdk_core_1.BuildTransactionError(`Insufficient UTXO balance: have ${totalUtxoAmount.toString()} nFLR, need more than ${actualFeeNFlr.toString()} nFLR to cover import fee`);
121
+ }
122
+ const importTx = flarejs_1.evm.newImportTx(this.transaction._context, this.transaction._to[0], this.transaction._fromAddresses.map((addr) => Buffer.from(addr)), nativeUtxos, sourceChain, actualFeeNFlr);
123
+ const flareUnsignedTx = importTx;
124
+ const innerTx = flareUnsignedTx.getTx();
125
+ const utxosWithIndex = innerTx.importedInputs.map((input, idx) => {
126
+ const originalUtxo = this.transaction._utxos[idx];
127
+ return {
128
+ ...originalUtxo,
129
+ addressesIndex: originalUtxo.addressesIndex,
130
+ addresses: originalUtxo.addresses,
131
+ threshold: originalUtxo.threshold || this.transaction._threshold,
132
+ };
243
133
  });
244
- const fixedFee = 10000;
245
- return bytesCost + fixedFee;
134
+ this.transaction._utxos = utxosWithIndex;
135
+ const txCredentials = utxosWithIndex.map((utxo) => this.createCredentialForUtxo(utxo, utxo.threshold));
136
+ const addressMaps = utxosWithIndex.map((utxo) => this.createAddressMapForUtxo(utxo, utxo.threshold));
137
+ const fixedUnsignedTx = new flarejs_1.UnsignedTx(innerTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
138
+ this.transaction.setTransaction(fixedUnsignedTx);
246
139
  }
247
140
  /**
248
- * Recover UTXOs from imported inputs
141
+ * Recover UTXOs from imported inputs.
142
+ * Uses fromAddresses as proxy for UTXO addresses since they should be the same
143
+ * addresses controlling the multisig.
144
+ *
249
145
  * @param importedInputs Array of transferable inputs
250
146
  * @returns Array of decoded UTXO objects
251
147
  */
252
148
  recoverUtxos(importedInputs) {
149
+ const proxyAddresses = this.transaction._fromAddresses && this.transaction._fromAddresses.length > 0
150
+ ? this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, 'P', Buffer.from(addr)))
151
+ : [];
253
152
  return importedInputs.map((input) => {
254
153
  const txid = input.utxoID.toString();
255
154
  const outputidx = input.utxoID.outputIdx.toString();
155
+ const transferInput = input.input;
156
+ const sigIndicies = transferInput.sigIndicies();
256
157
  return {
257
158
  outputID: iface_1.SECP256K1_Transfer_Output,
258
159
  amount: input.amount().toString(),
259
160
  txid: utils_1.default.cb58Encode(Buffer.from(txid, 'hex')),
260
161
  outputidx: outputidx,
261
- threshold: this.transaction._threshold,
262
- addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
162
+ threshold: sigIndicies.length || this.transaction._threshold,
163
+ addresses: proxyAddresses,
164
+ addressesIndex: sigIndicies,
263
165
  };
264
166
  });
265
167
  }
168
+ computeAddressesIndexFromParsed() {
169
+ const sender = this.transaction._fromAddresses;
170
+ if (!sender || sender.length === 0)
171
+ return;
172
+ this.transaction._utxos.forEach((utxo) => {
173
+ if (utxo.addresses && utxo.addresses.length > 0) {
174
+ const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
175
+ utxo.addressesIndex = sender.map((senderAddr) => utxoAddresses.findIndex((utxoAddr) => Buffer.compare(Buffer.from(utxoAddr), Buffer.from(senderAddr)) === 0));
176
+ }
177
+ });
178
+ }
266
179
  }
267
180
  exports.ImportInCTxBuilder = ImportInCTxBuilder;
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBQXVGO0FBQ3ZGLCtFQUE0RTtBQUM1RSxtREFVK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUNqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxRQUFnQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENB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Q0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RzthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhWRCxnREFnVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBldm1TZXJpYWwsXG4gIFVuc2lnbmVkVHgsXG4gIENyZWRlbnRpYWwsXG4gIEJpZ0ludFByLFxuICBJbnQsXG4gIElkLFxuICBUcmFuc2ZlcmFibGVJbnB1dCxcbiAgQWRkcmVzcyxcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBGbGFyZVRyYW5zYWN0aW9uVHlwZSwgU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCwgVHggfSBmcm9tICcuL2lmYWNlJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydEluQ1R4QnVpbGRlciBleHRlbmRzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDLWNoYWluIGFkZHJlc3Mgd2hvIGlzIHRhcmdldCBvZiB0aGUgaW1wb3J0LlxuICAgKiBBZGRyZXNzIGZvcm1hdCBpcyBldGggbGlrZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY0FkZHJlc3NcbiAgICovXG4gIHRvKGNBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90byA9IFt1dGlscy5wYXJzZUFkZHJlc3MoY0FkZHJlc3MpXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHgsIHJhd0J5dGVzPzogQnVmZmVyLCBwYXJzZWRDcmVkZW50aWFscz86IENyZWRlbnRpYWxbXSk6IHRoaXMge1xuICAgIGNvbnN0IGJhc2VUeCA9IHR4IGFzIGV2bVNlcmlhbC5JbXBvcnRUeDtcbiAgICBpZiAoIXRoaXMudmVyaWZ5VHhUeXBlKGJhc2VUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgb3V0cHV0cyBpcyBhIHNpbmdsZSBDLUNoYWluIGFkZHJlc3MgcmVzdWx0LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgdG8gdGhlIGRlc3RpbmF0aW9uIEMtQ2hhaW4gYWRkcmVzcy5cbiAgICBjb25zdCBvdXRwdXRzID0gYmFzZVR4Lk91dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgb3V0cHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07XG5cbiAgICBpZiAoQnVmZmVyLmZyb20ob3V0cHV0LmFzc2V0SWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4JykgIT09IHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRJRCBhcmUgbm90IGVxdWFscycpO1xuICAgIH1cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90byA9IFtCdWZmZXIuZnJvbShvdXRwdXQuYWRkcmVzcy50b0J5dGVzKCkpXTtcblxuICAgIGNvbnN0IGlucHV0cyA9IGJhc2VUeC5pbXBvcnRlZElucHV0cztcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHRoaXMucmVjb3ZlclV0eG9zKGlucHV0cyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgaW5wdXQgYW5kIG91dHB1dCBhbW91bnRzXG4gICAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IGlucHV0cy5yZWR1Y2UoKHQsIGkpID0+IHQgKyBpLmFtb3VudCgpLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IHRvdGFsT3V0cHV0QW1vdW50ID0gb3V0cHV0LmFtb3VudC52YWx1ZSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGZlZSBiYXNlZCBvbiBpbnB1dC9vdXRwdXQgZGlmZmVyZW5jZVxuICAgIGNvbnN0IGZlZSA9IHRvdGFsSW5wdXRBbW91bnQgLSB0b3RhbE91dHB1dEFtb3VudDtcblxuICAgIC8vIFVzZSBjcmVkZW50aWFscyBwYXNzZWQgZnJvbSBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IChwcm9wZXJseSBleHRyYWN0ZWQgdXNpbmcgY29kZWMpXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBwYXJzZWRDcmVkZW50aWFscyB8fCBbXTtcbiAgICBjb25zdCBoYXNDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG5cbiAgICAvLyBJZiBpdCdzIGEgc2lnbmVkIHRyYW5zYWN0aW9uLCBzdG9yZSB0aGUgb3JpZ2luYWwgcmF3IGJ5dGVzIHRvIHByZXNlcnZlIGV4YWN0IGZvcm1hdFxuICAgIGlmIChoYXNDcmVkZW50aWFscyAmJiByYXdCeXRlcykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmF3U2lnbmVkQnl0ZXMgPSByYXdCeXRlcztcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRocmVzaG9sZCBmcm9tIGZpcnN0IGlucHV0J3Mgc2lnSW5kaWNpZXMgKG51bWJlciBvZiByZXF1aXJlZCBzaWduYXR1cmVzKVxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBpbnB1dHNbMF07XG4gICAgY29uc3QgaW5wdXRUaHJlc2hvbGQgPSBmaXJzdElucHV0LnNpZ0luZGljaWVzKCkubGVuZ3RoIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBpbnB1dFRocmVzaG9sZDtcblxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBVbnNpZ25lZFR4IGZvciBhY2N1cmF0ZSBmZWUgc2l6ZSBjYWxjdWxhdGlvblxuICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIGZ1bGwgc3RydWN0dXJlIChJbXBvcnRUeCwgQWRkcmVzc01hcHMsIENyZWRlbnRpYWxzKVxuICAgIGNvbnN0IHRlbXBBZGRyZXNzTWFwID0gbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRUaHJlc2hvbGQ7IGkrKykge1xuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgJiYgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1tpXSkge1xuICAgICAgICB0ZW1wQWRkcmVzc01hcC5zZXQobmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1tpXSksIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZW1wQWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbdGVtcEFkZHJlc3NNYXBdKTtcbiAgICBjb25zdCB0ZW1wQ3JlZGVudGlhbHMgPVxuICAgICAgY3JlZGVudGlhbHMubGVuZ3RoID4gMCA/IGNyZWRlbnRpYWxzIDogW25ldyBDcmVkZW50aWFsKEFycmF5KGlucHV0VGhyZXNob2xkKS5maWxsKHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpKV07XG4gICAgY29uc3QgdGVtcFVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgsIFtdLCB0ZW1wQWRkcmVzc01hcHMsIHRlbXBDcmVkZW50aWFscyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY29zdCB1bml0cyB1c2luZyB0aGUgZnVsbCBVbnNpZ25lZFR4IHN0cnVjdHVyZVxuICAgIGNvbnN0IGZlZVNpemUgPSB0aGlzLmNhbGN1bGF0ZUltcG9ydENvc3QodGVtcFVuc2lnbmVkVHgpO1xuICAgIC8vIFVzZSBpbnRlZ2VyIGRpdmlzaW9uIHRvIGVuc3VyZSBmZWVSYXRlIGNhbiBiZSBjb252ZXJ0ZWQgYmFjayB0byBCaWdJbnRcbiAgICBjb25zdCBmZWVSYXRlID0gTWF0aC5mbG9vcihOdW1iZXIoZmVlKSAvIGZlZVNpemUpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlID0ge1xuICAgICAgZmVlOiBmZWUudG9TdHJpbmcoKSxcbiAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICBzaXplOiBmZWVTaXplLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgQWRkcmVzc01hcHMgYmFzZWQgb24gc2lnbmF0dXJlIHNsb3Qgb3JkZXIgKG1hdGNoaW5nIGNyZWRlbnRpYWwgb3JkZXIpLCBub3Qgc29ydGVkIGFkZHJlc3Nlc1xuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgYXBwcm9hY2ggdXNlZCBpbiBjcmVkZW50aWFsczogYWRkcmVzc2VzSW5kZXggZGV0ZXJtaW5lcyBzaWduYXR1cmUgb3JkZXJcbiAgICAvLyBBZGRyZXNzTWFwcyBzaG91bGQgbWFwIGFkZHJlc3NlcyB0byBzaWduYXR1cmUgc2xvdHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgY3JlZGVudGlhbHNcbiAgICAvLyBJZiBfZnJvbUFkZHJlc3NlcyBpcyBhdmFpbGFibGUsIGNyZWF0ZSBBZGRyZXNzTWFwIGJhc2VkIG9uIFVUWE8gb3JkZXIgKG1hdGNoaW5nIGNyZWRlbnRpYWwgb3JkZXIpXG4gICAgLy8gT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gbWFwcGluZyBqdXN0IHRoZSBvdXRwdXQgYWRkcmVzc1xuICAgIGNvbnN0IGZpcnN0VXR4byA9IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zWzBdO1xuICAgIGxldCBhZGRyZXNzTWFwOiBGbGFyZVV0aWxzLkFkZHJlc3NNYXA7XG4gICAgaWYgKFxuICAgICAgZmlyc3RVdHhvICYmXG4gICAgICBmaXJzdFV0eG8uYWRkcmVzc2VzICYmXG4gICAgICBmaXJzdFV0eG8uYWRkcmVzc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgJiZcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID49IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZFxuICAgICkge1xuICAgICAgLy8gVXNlIGNlbnRyYWxpemVkIG1ldGhvZCBmb3IgQWRkcmVzc01hcCBjcmVhdGlvblxuICAgICAgYWRkcmVzc01hcCA9IHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8oZmlyc3RVdHhvLCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogbWFwIG91dHB1dCBhZGRyZXNzIHRvIHNsb3QgMCAoZm9yIEMtY2hhaW4gaW1wb3J0cywgb3V0cHV0IGlzIHRoZSBkZXN0aW5hdGlvbilcbiAgICAgIC8vIE9yIG1hcCBhZGRyZXNzZXMgc2VxdWVudGlhbGx5IGlmIF9mcm9tQWRkcmVzc2VzIGlzIGF2YWlsYWJsZSBidXQgVVRYTyBhZGRyZXNzZXMgYXJlIG5vdFxuICAgICAgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzICYmIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID49IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLnNsaWNlKDAsIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkuZm9yRWFjaCgoYWRkciwgaSkgPT4ge1xuICAgICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKGFkZHIpLCBpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMYXN0IHJlc29ydDogbWFwIG91dHB1dCBhZGRyZXNzXG4gICAgICAgIGNvbnN0IHRvQWRkcmVzcyA9IG5ldyBBZGRyZXNzKG91dHB1dC5hZGRyZXNzLnRvQnl0ZXMoKSk7XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KHRvQWRkcmVzcywgMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgLy8gV2hlbiBjcmVkZW50aWFscyB3ZXJlIGV4dHJhY3RlZCwgdXNlIHRoZW0gZGlyZWN0bHkgdG8gcHJlc2VydmUgZXhpc3Rpbmcgc2lnbmF0dXJlc1xuICAgIC8vIEZvciBpbml0QnVpbGRlciwgX2Zyb21BZGRyZXNzZXMgbWF5IG5vdCBiZSBzZXQgeWV0LCBzbyB1c2UgYWxsIHplcm9zIGZvciBjcmVkZW50aWFsIHNsb3RzXG4gICAgbGV0IHR4Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBpZiAoY3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdHhDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgZW1wdHkgY3JlZGVudGlhbCB3aXRoIHRocmVzaG9sZCBudW1iZXIgb2Ygc2lnbmF0dXJlIHNsb3RzIChhbGwgemVyb3MpXG4gICAgICBjb25zdCBlbXB0eVNpZ25hdHVyZXM6IFJldHVyblR5cGU8dHlwZW9mIHV0aWxzLmNyZWF0ZU5ld1NpZz5bXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFRocmVzaG9sZDsgaSsrKSB7XG4gICAgICAgIGVtcHR5U2lnbmF0dXJlcy5wdXNoKHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpO1xuICAgICAgfVxuICAgICAgdHhDcmVkZW50aWFscyA9IFtuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpXTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoYmFzZVR4LCBbXSwgYWRkcmVzc01hcHMsIHR4Q3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4blR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLkV2bUltcG9ydFR4O1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4blR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgaW4gQy1jaGFpbiB0cmFuc2FjdGlvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGlmIHR4IGhhcyBjcmVkZW50aWFscyBvciB3YXMgYWxyZWFkeSByZWNvdmVyZWQgZnJvbSByYXcsIHR4IHNob3VsZG4ndCBjaGFuZ2VcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLl90by5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZWUgcmF0ZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW5wdXRzLCBhbW91bnQsIGNyZWRlbnRpYWxzIH0gPSB0aGlzLmNyZWF0ZUlucHV0cygpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGltcG9ydCBjb3N0IHVuaXRzIChtYXRjaGluZyBBVkFYUCdzIGNvc3RJbXBvcnRUeCBhcHByb2FjaClcbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgVW5zaWduZWRUeCB3aXRoIGZ1bGwgYW1vdW50IHRvIGNhbGN1bGF0ZSBmZWUgc2l6ZVxuICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIGZ1bGwgc3RydWN0dXJlIChJbXBvcnRUeCwgQWRkcmVzc01hcHMsIENyZWRlbnRpYWxzKSBmb3IgYWNjdXJhdGUgc2l6ZSBjYWxjdWxhdGlvblxuICAgIGNvbnN0IHRlbXBPdXRwdXQgPSBuZXcgZXZtU2VyaWFsLk91dHB1dChcbiAgICAgIG5ldyBBZGRyZXNzKHRoaXMudHJhbnNhY3Rpb24uX3RvWzBdKSxcbiAgICAgIG5ldyBCaWdJbnRQcihhbW91bnQpLFxuICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSkpXG4gICAgKTtcbiAgICBjb25zdCB0ZW1wSW1wb3J0VHggPSBuZXcgZXZtU2VyaWFsLkltcG9ydFR4KFxuICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQpLFxuICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCwgJ2hleCcpKSksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkodGhpcy5fZXh0ZXJuYWxDaGFpbklkKSksXG4gICAgICBpbnB1dHMsXG4gICAgICBbdGVtcE91dHB1dF1cbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIEFkZHJlc3NNYXBzIGZvciBmZWUgY2FsY3VsYXRpb24gKHNhbWUgYXMgZmluYWwgdHJhbnNhY3Rpb24pXG4gICAgY29uc3QgZmlyc3RVdHhvID0gdGhpcy50cmFuc2FjdGlvbi5fdXR4b3NbMF07XG4gICAgY29uc3QgdGVtcEFkZHJlc3NNYXAgPSBmaXJzdFV0eG9cbiAgICAgID8gdGhpcy5jcmVhdGVBZGRyZXNzTWFwRm9yVXR4byhmaXJzdFV0eG8sIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZClcbiAgICAgIDogbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcCgpO1xuICAgIGNvbnN0IHRlbXBBZGRyZXNzTWFwcyA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKFt0ZW1wQWRkcmVzc01hcF0pO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSBVbnNpZ25lZFR4IHdpdGggZnVsbCBzdHJ1Y3R1cmUgZm9yIGFjY3VyYXRlIGZlZSBjYWxjdWxhdGlvblxuICAgIGNvbnN0IHRlbXBVbnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgodGVtcEltcG9ydFR4LCBbXSwgdGVtcEFkZHJlc3NNYXBzLCBjcmVkZW50aWFscyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZmVlU2l6ZSBvbmNlIHVzaW5nIGZ1bGwgVW5zaWduZWRUeCAobWF0Y2hpbmcgQVZBWFAgYXBwcm9hY2gpXG4gICAgY29uc3QgZmVlU2l6ZSA9IHRoaXMuY2FsY3VsYXRlSW1wb3J0Q29zdCh0ZW1wVW5zaWduZWRUeCk7XG4gICAgY29uc3QgZmVlUmF0ZSA9IEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlUmF0ZSk7XG4gICAgY29uc3QgZmVlID0gZmVlUmF0ZSAqIEJpZ0ludChmZWVTaXplKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gY292ZXIgdGhlIGZlZVxuICAgIGlmIChhbW91bnQgPD0gZmVlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW5zdWZmaWNpZW50IGZ1bmRzOiBoYXZlICR7YW1vdW50LnRvU3RyaW5nKCl9LCBuZWVkIG1vcmUgdGhhbiAke2ZlZS50b1N0cmluZygpfSBmb3IgZmVlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gZmVlLnRvU3RyaW5nKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLnNpemUgPSBmZWVTaXplO1xuXG4gICAgLy8gQ3JlYXRlIEVWTSBvdXRwdXQgdXNpbmcgcHJvcGVyIEZsYXJlSlMgY2xhc3Mgd2l0aCBhbW91bnQgbWludXMgZmVlXG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IGV2bVNlcmlhbC5PdXRwdXQoXG4gICAgICBuZXcgQWRkcmVzcyh0aGlzLnRyYW5zYWN0aW9uLl90b1swXSksXG4gICAgICBuZXcgQmlnSW50UHIoYW1vdW50IC0gZmVlKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLCAnaGV4JykpKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGltcG9ydCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGltcG9ydFR4ID0gbmV3IGV2bVNlcmlhbC5JbXBvcnRUeChcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lEKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQsICdoZXgnKSkpLFxuICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KHRoaXMuX2V4dGVybmFsQ2hhaW5JZCkpLFxuICAgICAgaW5wdXRzLFxuICAgICAgW291dHB1dF1cbiAgICApO1xuXG4gICAgLy8gUmV1c2UgdGhlIEFkZHJlc3NNYXBzIGFscmVhZHkgY2FsY3VsYXRlZCBmb3IgZmVlIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KFxuICAgICAgaW1wb3J0VHgsXG4gICAgICBbXSwgLy8gRW1wdHkgVVRYT3MgYXJyYXksIHdpbGwgYmUgZmlsbGVkIGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICB0ZW1wQWRkcmVzc01hcHMsXG4gICAgICBjcmVkZW50aWFsc1xuICAgICk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgZnJvbSBVVFhPc1xuICAgKiBAcmV0dXJuIHtcbiAgICogICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICogICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gICAqICAgICBhbW91bnQ6IGJpZ2ludDtcbiAgICogfVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUlucHV0cygpOiB7XG4gICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gICAgYW1vdW50OiBiaWdpbnQ7XG4gIH0ge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLmZvckVhY2goKHV0eG8pID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG4gICAgICB0b3RhbEFtb3VudCArPSBhbW91bnQ7XG5cbiAgICAgIC8vIENyZWF0ZSBzaWduYXR1cmUgaW5kaWNlcyBmb3IgdGhyZXNob2xkXG4gICAgICBjb25zdCBzaWdJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQ7IGkrKykge1xuICAgICAgICBzaWdJbmRpY2VzLnB1c2goaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBmcm9tTmF0aXZlIHRvIGNyZWF0ZSBUcmFuc2ZlcmFibGVJbnB1dCAoc2FtZSBwYXR0ZXJuIGFzIEltcG9ydEluUFR4QnVpbGRlcilcbiAgICAgIC8vIGZyb21OYXRpdmUgZXhwZWN0cyBjYjU4LWVuY29kZWQgc3RyaW5ncyBmb3IgdHhJZCBhbmQgYXNzZXRJZFxuICAgICAgY29uc3QgdHhJZENiNTggPSB1dHhvLnR4aWQ7IC8vIEFscmVhZHkgY2I1OCBlbmNvZGVkXG4gICAgICBjb25zdCBhc3NldElkQ2I1OCA9IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKTtcblxuICAgICAgY29uc3QgdHJhbnNmZXJhYmxlSW5wdXQgPSBUcmFuc2ZlcmFibGVJbnB1dC5mcm9tTmF0aXZlKFxuICAgICAgICB0eElkQ2I1OCxcbiAgICAgICAgTnVtYmVyKHV0eG8ub3V0cHV0aWR4KSxcbiAgICAgICAgYXNzZXRJZENiNTgsXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgc2lnSW5kaWNlc1xuICAgICAgKTtcblxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpO1xuXG4gICAgICAvLyBDcmVhdGUgY3JlZGVudGlhbCB3aXRoIGVtcHR5IHNpZ25hdHVyZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgIC8vIE1hdGNoIGF2YXhwIGJlaGF2aW9yOiBkeW5hbWljIG9yZGVyaW5nIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IGZyb20gVVRYT1xuICAgICAgLy8gVXNlIGNlbnRyYWxpemVkIG1ldGhvZCBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAgY3JlZGVudGlhbHMucHVzaCh0aGlzLmNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvKHV0eG8sIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB1bnNpZ25lZFR4IFRoZSBVbnNpZ25lZFR4IHRvIGNhbGN1bGF0ZSB0aGUgY29zdCBmb3IgKGluY2x1ZGVzIEltcG9ydFR4LCBBZGRyZXNzTWFwcywgYW5kIENyZWRlbnRpYWxzKVxuICAgKiBAcmV0dXJucyBUaGUgdG90YWwgY29zdCB1bml0c1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVJbXBvcnRDb3N0KHVuc2lnbmVkVHg6IFVuc2lnbmVkVHgpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ25lZFR4Qnl0ZXMgPSB1bnNpZ25lZFR4LmdldFNpZ25lZFR4KCkudG9CeXRlcygpO1xuICAgIGNvbnN0IHR4Qnl0ZXNHYXMgPSAxO1xuICAgIGxldCBieXRlc0Nvc3QgPSBzaWduZWRUeEJ5dGVzLmxlbmd0aCAqIHR4Qnl0ZXNHYXM7XG4gICAgY29uc3QgY29zdFBlclNpZ25hdHVyZSA9IDEwMDA7XG4gICAgY29uc3QgaW1wb3J0VHggPSB1bnNpZ25lZFR4LmdldFR4KCkgYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgIGltcG9ydFR4LmltcG9ydGVkSW5wdXRzLmZvckVhY2goKGlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCkgPT4ge1xuICAgICAgY29uc3QgaW5Db3N0ID0gY29zdFBlclNpZ25hdHVyZSAqIGlucHV0LnNpZ0luZGljaWVzKCkubGVuZ3RoO1xuICAgICAgYnl0ZXNDb3N0ICs9IGluQ29zdDtcbiAgICB9KTtcbiAgICBjb25zdCBmaXhlZEZlZSA9IDEwMDAwO1xuICAgIHJldHVybiBieXRlc0Nvc3QgKyBmaXhlZEZlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIFVUWE9zIGZyb20gaW1wb3J0ZWQgaW5wdXRzXG4gICAqIEBwYXJhbSBpbXBvcnRlZElucHV0cyBBcnJheSBvZiB0cmFuc2ZlcmFibGUgaW5wdXRzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRlY29kZWQgVVRYTyBvYmplY3RzXG4gICAqL1xuICBwcml2YXRlIHJlY292ZXJVdHhvcyhpbXBvcnRlZElucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIHJldHVybiBpbXBvcnRlZElucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB0eGlkID0gaW5wdXQudXR4b0lELnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBvdXRwdXRpZHggPSBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dHB1dElEOiBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LFxuICAgICAgICBhbW91bnQ6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgIHR4aWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20odHhpZCwgJ2hleCcpKSxcbiAgICAgICAgb3V0cHV0aWR4OiBvdXRwdXRpZHgsXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubWFwKChhZGRyKSA9PlxuICAgICAgICAgIHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCwgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hbGlhcywgQnVmZmVyLmZyb20oYWRkcikpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBQXVGO0FBQ3ZGLCtFQUE0RTtBQUM1RSxtREFTK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUNqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxRQUFnQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUIsSUFBSSxNQUFNLENB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Q0FBQyxDQUM1RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBNU5ELGdEQTROQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIE5vdFN1cHBvcnRlZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7XG4gIGV2bVNlcmlhbCxcbiAgVW5zaWduZWRUeCxcbiAgQ3JlZGVudGlhbCxcbiAgVHJhbnNmZXJhYmxlSW5wdXQsXG4gIFRyYW5zZmVySW5wdXQsXG4gIFRyYW5zZmVyT3V0cHV0LFxuICB1dGlscyBhcyBGbGFyZVV0aWxzLFxuICBldm0sXG59IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZWNvZGVkVXR4b09iaiwgRmxhcmVUcmFuc2FjdGlvblR5cGUsIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRJbkNUeEJ1aWxkZXIgZXh0ZW5kcyBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQy1jaGFpbiBhZGRyZXNzIHdobyBpcyB0YXJnZXQgb2YgdGhlIGltcG9ydC5cbiAgICogQWRkcmVzcyBmb3JtYXQgaXMgZXRoIGxpa2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNBZGRyZXNzXG4gICAqL1xuICB0byhjQWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBbdXRpbHMucGFyc2VBZGRyZXNzKGNBZGRyZXNzKV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuSW1wb3J0O1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFR4LCByYXdCeXRlcz86IEJ1ZmZlciwgcGFyc2VkQ3JlZGVudGlhbHM/OiBDcmVkZW50aWFsW10pOiB0aGlzIHtcbiAgICBjb25zdCBiYXNlVHggPSB0eCBhcyBldm1TZXJpYWwuSW1wb3J0VHg7XG4gICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZShiYXNlVHguX3R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGJhc2VUeC5PdXRzO1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gY2FuIGhhdmUgb25lIG91dHB1dCcpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzWzBdO1xuXG4gICAgaWYgKEJ1ZmZlci5mcm9tKG91dHB1dC5hc3NldElkLnRvQnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpICE9PSB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0SUQgYXJlIG5vdCBlcXVhbHMnKTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBbQnVmZmVyLmZyb20ob3V0cHV0LmFkZHJlc3MudG9CeXRlcygpKV07XG5cbiAgICBjb25zdCBpbnB1dHMgPSBiYXNlVHguaW1wb3J0ZWRJbnB1dHM7XG5cbiAgICBjb25zdCBmaXJzdElucHV0ID0gaW5wdXRzWzBdO1xuICAgIGNvbnN0IGlucHV0VGhyZXNob2xkID0gZmlyc3RJbnB1dC5zaWdJbmRpY2llcygpLmxlbmd0aCB8fCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQ7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gaW5wdXRUaHJlc2hvbGQ7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHRoaXMucmVjb3ZlclV0eG9zKGlucHV0cyk7XG5cbiAgICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gaW5wdXRzLnJlZHVjZSgodCwgaSkgPT4gdCArIGkuYW1vdW50KCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgdG90YWxPdXRwdXRBbW91bnQgPSBvdXRwdXQuYW1vdW50LnZhbHVlKCk7XG5cbiAgICBjb25zdCBmZWUgPSB0b3RhbElucHV0QW1vdW50IC0gdG90YWxPdXRwdXRBbW91bnQ7XG5cbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuICAgIGNvbnN0IGhhc0NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcblxuICAgIGlmIChoYXNDcmVkZW50aWFscyAmJiByYXdCeXRlcykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmF3U2lnbmVkQnl0ZXMgPSByYXdCeXRlcztcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUgPSB7XG4gICAgICBmZWU6IGZlZS50b1N0cmluZygpLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbXB1dGVBZGRyZXNzZXNJbmRleEZyb21QYXJzZWQoKTtcblxuICAgIGNvbnN0IGFkZHJlc3NNYXBzID0gdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MubWFwKCh1dHhvKSA9PiB7XG4gICAgICBjb25zdCB1dHhvVGhyZXNob2xkID0gdXR4by50aHJlc2hvbGQgfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8odXR4bywgdXR4b1RocmVzaG9sZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmbGFyZUFkZHJlc3NNYXBzID0gbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpO1xuXG4gICAgbGV0IHR4Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBpZiAoY3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdHhDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eENyZWRlbnRpYWxzID0gdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MubWFwKCh1dHhvKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvKHV0eG8sIHV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCwgW10sIGZsYXJlQWRkcmVzc01hcHMsIHR4Q3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4blR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLkV2bUltcG9ydFR4O1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4blR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgaW4gQy1jaGFpbiB0cmFuc2FjdGlvblxuICAgKiBGb2xsb3dpbmcgQVZBWCBQIGFwcHJvYWNoIGZvciBVVFhPIGhhbmRsaW5nIGFuZCBzaWduYXR1cmUgc2xvdCBhc3NpZ25tZW50LlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzKSByZXR1cm47XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX3RvLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdmZWUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9jb250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdjb250ZXh0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyB8fCB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignZnJvbUFkZHJlc3NlcyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyB8fCB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndGhyZXNob2xkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wdXRlQWRkcmVzc2VzSW5kZXgoKTtcblxuICAgIHRoaXMudmFsaWRhdGVVdHhvQWRkcmVzc2VzKCk7XG5cbiAgICBjb25zdCBhY3R1YWxGZWVORmxyID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUpO1xuICAgIGNvbnN0IHNvdXJjZUNoYWluID0gJ1AnO1xuXG4gICAgLy8gQ29udmVydCBkZWNvZGVkIFVUWE9zIHRvIG5hdGl2ZSBGbGFyZUpTIFV0eG8gb2JqZWN0c1xuICAgIGNvbnN0IGFzc2V0SWQgPSB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG4gICAgY29uc3QgbmF0aXZlVXR4b3MgPSB1dGlscy5kZWNvZGVkVG9VdHhvcyh0aGlzLnRyYW5zYWN0aW9uLl91dHhvcywgYXNzZXRJZCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBVVFhPIGJhbGFuY2UgaXMgc3VmZmljaWVudCB0byBjb3ZlciB0aGUgaW1wb3J0IGZlZVxuICAgIGNvbnN0IHRvdGFsVXR4b0Ftb3VudCA9IG5hdGl2ZVV0eG9zLnJlZHVjZSgoc3VtLCB1dHhvKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB1dHhvLm91dHB1dCBhcyBUcmFuc2Zlck91dHB1dDtcbiAgICAgIHJldHVybiBzdW0gKyBvdXRwdXQuYW1vdW50KCk7XG4gICAgfSwgQmlnSW50KDApKTtcblxuICAgIGlmICh0b3RhbFV0eG9BbW91bnQgPD0gYWN0dWFsRmVlTkZscikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEluc3VmZmljaWVudCBVVFhPIGJhbGFuY2U6IGhhdmUgJHt0b3RhbFV0eG9BbW91bnQudG9TdHJpbmcoKX0gbkZMUiwgbmVlZCBtb3JlIHRoYW4gJHthY3R1YWxGZWVORmxyLnRvU3RyaW5nKCl9IG5GTFIgdG8gY292ZXIgaW1wb3J0IGZlZWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGltcG9ydFR4ID0gZXZtLm5ld0ltcG9ydFR4KFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fY29udGV4dCxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3RvWzBdLFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIpKSxcbiAgICAgIG5hdGl2ZVV0eG9zLFxuICAgICAgc291cmNlQ2hhaW4sXG4gICAgICBhY3R1YWxGZWVORmxyXG4gICAgKTtcblxuICAgIGNvbnN0IGZsYXJlVW5zaWduZWRUeCA9IGltcG9ydFR4IGFzIFVuc2lnbmVkVHg7XG4gICAgY29uc3QgaW5uZXJUeCA9IGZsYXJlVW5zaWduZWRUeC5nZXRUeCgpIGFzIGV2bVNlcmlhbC5JbXBvcnRUeDtcblxuICAgIGNvbnN0IHV0eG9zV2l0aEluZGV4ID0gaW5uZXJUeC5pbXBvcnRlZElucHV0cy5tYXAoKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVXR4byA9IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zW2lkeF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcmlnaW5hbFV0eG8sXG4gICAgICAgIGFkZHJlc3Nlc0luZGV4OiBvcmlnaW5hbFV0eG8uYWRkcmVzc2VzSW5kZXgsXG4gICAgICAgIGFkZHJlc3Nlczogb3JpZ2luYWxVdHhvLmFkZHJlc3NlcyxcbiAgICAgICAgdGhyZXNob2xkOiBvcmlnaW5hbFV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHV0eG9zV2l0aEluZGV4O1xuXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9IHV0eG9zV2l0aEluZGV4Lm1hcCgodXR4bykgPT4gdGhpcy5jcmVhdGVDcmVkZW50aWFsRm9yVXR4byh1dHhvLCB1dHhvLnRocmVzaG9sZCkpO1xuXG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSB1dHhvc1dpdGhJbmRleC5tYXAoKHV0eG8pID0+IHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8odXR4bywgdXR4by50aHJlc2hvbGQpKTtcblxuICAgIGNvbnN0IGZpeGVkVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGlubmVyVHgsIFtdLCBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhhZGRyZXNzTWFwcyksIHR4Q3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihmaXhlZFVuc2lnbmVkVHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSBpbXBvcnRlZCBpbnB1dHMuXG4gICAqIFVzZXMgZnJvbUFkZHJlc3NlcyBhcyBwcm94eSBmb3IgVVRYTyBhZGRyZXNzZXMgc2luY2UgdGhleSBzaG91bGQgYmUgdGhlIHNhbWVcbiAgICogYWRkcmVzc2VzIGNvbnRyb2xsaW5nIHRoZSBtdWx0aXNpZy5cbiAgICpcbiAgICogQHBhcmFtIGltcG9ydGVkSW5wdXRzIEFycmF5IG9mIHRyYW5zZmVyYWJsZSBpbnB1dHNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZGVjb2RlZCBVVFhPIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgcmVjb3ZlclV0eG9zKGltcG9ydGVkSW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gICAgY29uc3QgcHJveHlBZGRyZXNzZXMgPVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyAmJiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYWRkcikgPT5cbiAgICAgICAgICAgIHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCwgJ1AnLCBCdWZmZXIuZnJvbShhZGRyKSlcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG5cbiAgICByZXR1cm4gaW1wb3J0ZWRJbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgdHhpZCA9IGlucHV0LnV0eG9JRC50b1N0cmluZygpO1xuICAgICAgY29uc3Qgb3V0cHV0aWR4ID0gaW5wdXQudXR4b0lELm91dHB1dElkeC50b1N0cmluZygpO1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dCA9IGlucHV0LmlucHV0IGFzIFRyYW5zZmVySW5wdXQ7XG4gICAgICBjb25zdCBzaWdJbmRpY2llcyA9IHRyYW5zZmVySW5wdXQuc2lnSW5kaWNpZXMoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3V0cHV0SUQ6IFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsXG4gICAgICAgIGFtb3VudDogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0eGlkLCAnaGV4JykpLFxuICAgICAgICBvdXRwdXRpZHg6IG91dHB1dGlkeCxcbiAgICAgICAgdGhyZXNob2xkOiBzaWdJbmRpY2llcy5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHByb3h5QWRkcmVzc2VzLFxuICAgICAgICBhZGRyZXNzZXNJbmRleDogc2lnSW5kaWNpZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlQWRkcmVzc2VzSW5kZXhGcm9tUGFyc2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXM7XG4gICAgaWYgKCFzZW5kZXIgfHwgc2VuZGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MuZm9yRWFjaCgodXR4bykgPT4ge1xuICAgICAgaWYgKHV0eG8uYWRkcmVzc2VzICYmIHV0eG8uYWRkcmVzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdXR4b0FkZHJlc3NlcyA9IHV0eG8uYWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcbiAgICAgICAgdXR4by5hZGRyZXNzZXNJbmRleCA9IHNlbmRlci5tYXAoKHNlbmRlckFkZHIpID0+XG4gICAgICAgICAgdXR4b0FkZHJlc3Nlcy5maW5kSW5kZXgoKHV0eG9BZGRyKSA9PiBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbSh1dHhvQWRkciksIEJ1ZmZlci5mcm9tKHNlbmRlckFkZHIpKSA9PT0gMClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,33 +1,48 @@
1
1
  import { BaseCoin as CoinConfig } from '@bitgo/statics';
2
2
  import { TransactionType } from '@bitgo/sdk-core';
3
3
  import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
4
- import { TransferableInput, Credential } from '@flarenetwork/flarejs';
4
+ import { Credential } from '@flarenetwork/flarejs';
5
5
  import { Tx } from './iface';
6
6
  export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
7
7
  constructor(_coinConfig: Readonly<CoinConfig>);
8
8
  protected get transactionType(): TransactionType;
9
+ /**
10
+ * @param {string | string[]} senderPubKey - C-chain address(es) with C- prefix
11
+ * @throws {BuildTransactionError} if any address is not a C-chain address
12
+ */
13
+ fromPubKey(senderPubKey: string | string[]): this;
14
+ /**
15
+ * @param {string[]} addresses - Array of P-chain addresses (bech32 format with P- prefix)
16
+ * @throws {BuildTransactionError} if any address is not a P-chain address
17
+ */
18
+ to(addresses: string[]): this;
9
19
  initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
10
20
  static verifyTxType(txnType: string): boolean;
11
21
  verifyTxType(txnType: string): boolean;
12
22
  /**
13
- * Build the import transaction for P-chain
23
+ * Build the import transaction for P-chain (importing FROM C-chain)
14
24
  * @protected
15
25
  */
16
- protected buildFlareTransaction(): void;
26
+ protected buildFlareTransaction(): Promise<void>;
17
27
  /**
18
- * Create inputs from UTXOs for P-chain import
19
- * @returns inputs, credentials, and total amount
20
- */
21
- protected createImportInputs(): {
22
- inputs: TransferableInput[];
23
- credentials: Credential[];
24
- totalAmount: bigint;
25
- };
26
- /**
27
- * Recover UTXOs from imported inputs
28
+ * Recover UTXOs from imported inputs.
29
+ * Uses output addresses as proxy for UTXO addresses since they should be the same
30
+ * addresses controlling the multisig (just potentially in different on-chain order).
31
+ *
28
32
  * @param importedInputs Array of transferable inputs
33
+ * @param outputAddrs Output owner addresses to use as proxy for UTXO addresses
29
34
  * @returns Array of decoded UTXO objects
30
35
  */
31
36
  private recoverUtxos;
37
+ /**
38
+ * Compute proper addressesIndex from parsed transaction's sigIndicies.
39
+ * Following AVAX P approach: addressesIndex[senderIdx] = position of sender in UTXO addresses.
40
+ *
41
+ * For parsed transactions:
42
+ * - sigIndicies tells us which UTXO positions need to sign for each slot
43
+ * - We use output addresses as proxy for UTXO addresses
44
+ * - We compute addressesIndex as sender -> utxo position mapping
45
+ */
46
+ private computeAddressesIndexFromParsed;
32
47
  }
33
48
  //# sourceMappingURL=ImportInPTxBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAuC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAML,iBAAiB,EAQjB,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAY7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IA0E9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAkEvC;;;OAGG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB;IAqDD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
1
+ {"version":3,"file":"ImportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAuC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAOL,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAUjD;;;OAGG;IACH,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAS7B,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IA4D9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;cACa,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4FtD;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAgCpB;;;;;;;;OAQG;IACH,OAAO,CAAC,+BAA+B;CAaxC"}