@bitgo-beta/sdk-coin-sol 2.4.3-beta.83 → 2.4.3-beta.831

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 (61) hide show
  1. package/CHANGELOG.md +910 -0
  2. package/dist/src/index.js +6 -2
  3. package/dist/src/lib/ataInitializationBuilder.js +33 -19
  4. package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
  5. package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
  6. package/dist/src/lib/closeAtaBuilder.js +69 -0
  7. package/dist/src/lib/constants.d.ts +25 -7
  8. package/dist/src/lib/constants.d.ts.map +1 -1
  9. package/dist/src/lib/constants.js +29 -9
  10. package/dist/src/lib/iface.d.ts +44 -4
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +1 -1
  13. package/dist/src/lib/index.d.ts +11 -8
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +44 -24
  16. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  17. package/dist/src/lib/instructionParamsFactory.js +251 -47
  18. package/dist/src/lib/keyPair.js +5 -5
  19. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  20. package/dist/src/lib/solInstructionFactory.js +108 -50
  21. package/dist/src/lib/stakingActivateBuilder.d.ts +9 -2
  22. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  23. package/dist/src/lib/stakingActivateBuilder.js +22 -10
  24. package/dist/src/lib/stakingAuthorizeBuilder.js +7 -7
  25. package/dist/src/lib/stakingDeactivateBuilder.d.ts +10 -0
  26. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  27. package/dist/src/lib/stakingDeactivateBuilder.js +71 -24
  28. package/dist/src/lib/stakingDelegateBuilder.d.ts +42 -0
  29. package/dist/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/stakingDelegateBuilder.js +120 -0
  31. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  32. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  34. package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
  35. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/tokenTransferBuilder.js +26 -15
  37. package/dist/src/lib/transaction.d.ts +3 -3
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +93 -16
  40. package/dist/src/lib/transactionBuilder.d.ts +2 -1
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +29 -19
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +30 -9
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +46 -9
  46. package/dist/src/lib/transferBuilder.js +4 -4
  47. package/dist/src/lib/transferBuilderV2.d.ts +11 -1
  48. package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
  49. package/dist/src/lib/transferBuilderV2.js +69 -10
  50. package/dist/src/lib/utils.d.ts +15 -6
  51. package/dist/src/lib/utils.d.ts.map +1 -1
  52. package/dist/src/lib/utils.js +114 -48
  53. package/dist/src/lib/walletInitializationBuilder.js +6 -6
  54. package/dist/src/sol.d.ts +68 -25
  55. package/dist/src/sol.d.ts.map +1 -1
  56. package/dist/src/sol.js +609 -84
  57. package/dist/src/solToken.d.ts +2 -1
  58. package/dist/src/solToken.d.ts.map +1 -1
  59. package/dist/src/solToken.js +6 -3
  60. package/dist/src/tsol.js +1 -1
  61. package/package.json +10 -9
@@ -3,24 +3,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.validateOwnerAddress = exports.validateMintAddress = exports.getAssociatedTokenAccountAddress = exports.getSolTokenFromTokenName = exports.getSolTokenFromAddress = exports.validateAddress = exports.validateRawTransaction = exports.validateIntructionTypes = exports.getInstructionType = exports.getTransactionType = exports.matchTransactionTypeByInstructionsOrder = exports.requiresAllSignatures = exports.countNotNullSignatures = exports.Uint8ArrayTobase58 = exports.base58ToUint8Array = exports.verifySignature = exports.isValidRawTransaction = exports.isValidMemo = exports.isValidStakingAmount = exports.isValidAmount = exports.isValidTransactionId = exports.isValidSignature = exports.isValidPublicKey = exports.isValidPrivateKey = exports.isValidBlockId = exports.isValidAddress = void 0;
7
- const web3_js_1 = require("@solana/web3.js");
8
- const bs58_1 = __importDefault(require("bs58"));
9
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
10
- const constants_1 = require("./constants");
6
+ exports.isValidAddress = isValidAddress;
7
+ exports.isValidBlockId = isValidBlockId;
8
+ exports.isValidPrivateKey = isValidPrivateKey;
9
+ exports.isValidPublicKey = isValidPublicKey;
10
+ exports.isValidSignature = isValidSignature;
11
+ exports.isValidTransactionId = isValidTransactionId;
12
+ exports.isValidAmount = isValidAmount;
13
+ exports.isValidStakingAmount = isValidStakingAmount;
14
+ exports.isValidMemo = isValidMemo;
15
+ exports.isValidRawTransaction = isValidRawTransaction;
16
+ exports.verifySignature = verifySignature;
17
+ exports.base58ToUint8Array = base58ToUint8Array;
18
+ exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
19
+ exports.countNotNullSignatures = countNotNullSignatures;
20
+ exports.requiresAllSignatures = requiresAllSignatures;
21
+ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
22
+ exports.getTransactionType = getTransactionType;
23
+ exports.getInstructionType = getInstructionType;
24
+ exports.validateIntructionTypes = validateIntructionTypes;
25
+ exports.validateRawMsgInstruction = validateRawMsgInstruction;
26
+ exports.validateRawTransaction = validateRawTransaction;
27
+ exports.validateAddress = validateAddress;
28
+ exports.getSolTokenFromAddress = getSolTokenFromAddress;
29
+ exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
30
+ exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
31
+ exports.validateMintAddress = validateMintAddress;
32
+ exports.validateOwnerAddress = validateOwnerAddress;
11
33
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
12
- const tweetnacl_1 = __importDefault(require("tweetnacl"));
13
- const spl_token_1 = require("@solana/spl-token");
14
34
  const statics_1 = require("@bitgo-beta/statics");
35
+ const spl_token_1 = require("@solana/spl-token");
36
+ const web3_js_1 = require("@solana/web3.js");
15
37
  const assert_1 = __importDefault(require("assert"));
38
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
39
+ const bs58_1 = __importDefault(require("bs58"));
40
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
41
+ const constants_1 = require("./constants");
16
42
  const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
17
43
  const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
18
44
  const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
45
+ const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
19
46
  /** @inheritdoc */
20
47
  function isValidAddress(address) {
21
48
  return isValidPublicKey(address);
22
49
  }
23
- exports.isValidAddress = isValidAddress;
24
50
  /** @inheritdoc */
25
51
  function isValidBlockId(hash) {
26
52
  try {
@@ -30,7 +56,6 @@ function isValidBlockId(hash) {
30
56
  return false;
31
57
  }
32
58
  }
33
- exports.isValidBlockId = isValidBlockId;
34
59
  /** @inheritdoc */
35
60
  function isValidPrivateKey(prvKey) {
36
61
  try {
@@ -41,11 +66,10 @@ function isValidPrivateKey(prvKey) {
41
66
  return false;
42
67
  }
43
68
  }
44
- exports.isValidPrivateKey = isValidPrivateKey;
45
69
  /** @inheritdoc */
46
70
  function isValidPublicKey(pubKey) {
47
71
  try {
48
- if (sdk_core_1.isValidXpub(pubKey))
72
+ if ((0, sdk_core_1.isValidXpub)(pubKey))
49
73
  return true;
50
74
  new web3_js_1.PublicKey(pubKey);
51
75
  return true;
@@ -54,7 +78,6 @@ function isValidPublicKey(pubKey) {
54
78
  return false;
55
79
  }
56
80
  }
57
- exports.isValidPublicKey = isValidPublicKey;
58
81
  /** @inheritdoc */
59
82
  function isValidSignature(signature) {
60
83
  try {
@@ -64,13 +87,11 @@ function isValidSignature(signature) {
64
87
  return false;
65
88
  }
66
89
  }
67
- exports.isValidSignature = isValidSignature;
68
90
  /** @inheritdoc */
69
91
  // TransactionId are the first signature on a Transaction
70
92
  function isValidTransactionId(txId) {
71
93
  return isValidSignature(txId);
72
94
  }
73
- exports.isValidTransactionId = isValidTransactionId;
74
95
  /**
75
96
  * Returns whether or not the string is a valid amount of lamports number
76
97
  *
@@ -81,7 +102,6 @@ function isValidAmount(amount) {
81
102
  const bigNumberAmount = new bignumber_js_1.default(amount);
82
103
  return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
83
104
  }
84
- exports.isValidAmount = isValidAmount;
85
105
  /**
86
106
  * Check if the string is a valid amount of lamports number on staking
87
107
  *
@@ -92,7 +112,6 @@ function isValidStakingAmount(amount) {
92
112
  const bigNumberAmount = new bignumber_js_1.default(amount);
93
113
  return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
94
114
  }
95
- exports.isValidStakingAmount = isValidStakingAmount;
96
115
  /**
97
116
  * Check if this is a valid memo or not.
98
117
  *
@@ -102,24 +121,24 @@ exports.isValidStakingAmount = isValidStakingAmount;
102
121
  function isValidMemo(memo) {
103
122
  return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
104
123
  }
105
- exports.isValidMemo = isValidMemo;
106
124
  /**
107
125
  * Checks if raw transaction can be deserialized
108
126
  *
109
127
  * @param {string} rawTransaction - transaction in base64 string format
128
+ * @param {boolean} requireAllSignatures - require all signatures to be present
129
+ * @param {boolean} verifySignatures - verify signatures
110
130
  * @returns {boolean} - the validation result
111
131
  */
112
- function isValidRawTransaction(rawTransaction) {
132
+ function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
113
133
  try {
114
134
  const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
115
- tx.serialize({ requireAllSignatures: false, verifySignatures: false });
135
+ tx.serialize({ requireAllSignatures, verifySignatures });
116
136
  return true;
117
137
  }
118
138
  catch (e) {
119
139
  return false;
120
140
  }
121
141
  }
122
- exports.isValidRawTransaction = isValidRawTransaction;
123
142
  /**
124
143
  * Verifies if signature for message is valid.
125
144
  *
@@ -143,7 +162,6 @@ function verifySignature(serializedTx, signature, publicKey) {
143
162
  const pub = new web3_js_1.PublicKey(publicKey);
144
163
  return tweetnacl_1.default.sign.detached.verify(msg, sig, pub.toBuffer());
145
164
  }
146
- exports.verifySignature = verifySignature;
147
165
  /**
148
166
  * Converts a base58 string into a Uint8Array.
149
167
  *
@@ -153,7 +171,6 @@ exports.verifySignature = verifySignature;
153
171
  function base58ToUint8Array(input) {
154
172
  return new Uint8Array(bs58_1.default.decode(input));
155
173
  }
156
- exports.base58ToUint8Array = base58ToUint8Array;
157
174
  /**
158
175
  * Converts a Uint8Array to a base58 string.
159
176
  *
@@ -163,7 +180,6 @@ exports.base58ToUint8Array = base58ToUint8Array;
163
180
  function Uint8ArrayTobase58(input) {
164
181
  return bs58_1.default.encode(input);
165
182
  }
166
- exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
167
183
  /**
168
184
  * Count the amount of signatures are not null.
169
185
  *
@@ -173,7 +189,6 @@ exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
173
189
  function countNotNullSignatures(signatures) {
174
190
  return signatures.filter((sig) => !!sig.signature).length;
175
191
  }
176
- exports.countNotNullSignatures = countNotNullSignatures;
177
192
  /**
178
193
  * Check if all signatures are completed.
179
194
  *
@@ -183,7 +198,6 @@ exports.countNotNullSignatures = countNotNullSignatures;
183
198
  function requiresAllSignatures(signatures) {
184
199
  return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
185
200
  }
186
- exports.requiresAllSignatures = requiresAllSignatures;
187
201
  /**
188
202
  * Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
189
203
  * are ignored.
@@ -215,7 +229,6 @@ function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexe
215
229
  }
216
230
  return true;
217
231
  }
218
- exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
219
232
  /**
220
233
  * Returns the transaction Type based on the transaction instructions.
221
234
  * Wallet initialization, Transfer and Staking transactions are supported.
@@ -225,12 +238,18 @@ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstruct
225
238
  */
226
239
  function getTransactionType(transaction) {
227
240
  const { instructions } = transaction;
241
+ if (validateRawMsgInstruction(instructions)) {
242
+ return sdk_core_1.TransactionType.StakingAuthorizeRaw;
243
+ }
228
244
  validateIntructionTypes(instructions);
229
- for (const instruction of instructions) {
230
- const instructionType = getInstructionType(instruction);
231
- if (instructionType === constants_1.ValidInstructionTypesEnum.Transfer ||
232
- instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
233
- return sdk_core_1.TransactionType.Send;
245
+ // check if deactivate instruction does not exist because deactivate can be include a transfer instruction
246
+ if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length == 0) {
247
+ for (const instruction of instructions) {
248
+ const instructionType = getInstructionType(instruction);
249
+ if (instructionType === constants_1.ValidInstructionTypesEnum.Transfer ||
250
+ instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
251
+ return sdk_core_1.TransactionType.Send;
252
+ }
234
253
  }
235
254
  }
236
255
  if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
@@ -242,6 +261,9 @@ function getTransactionType(transaction) {
242
261
  else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
243
262
  return sdk_core_1.TransactionType.StakingAuthorize;
244
263
  }
264
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
265
+ return sdk_core_1.TransactionType.StakingDelegate;
266
+ }
245
267
  else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
246
268
  matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes)) {
247
269
  return sdk_core_1.TransactionType.StakingDeactivate;
@@ -252,11 +274,13 @@ function getTransactionType(transaction) {
252
274
  else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
253
275
  return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
254
276
  }
277
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
278
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
279
+ }
255
280
  else {
256
281
  throw new sdk_core_1.NotSupported('Invalid transaction, transaction not supported or invalid');
257
282
  }
258
283
  }
259
- exports.getTransactionType = getTransactionType;
260
284
  /**
261
285
  * Returns the instruction Type based on the solana instructions.
262
286
  * Throws if the solana instruction program is not supported
@@ -271,6 +295,16 @@ function getInstructionType(instruction) {
271
295
  case web3_js_1.SystemProgram.programId.toString():
272
296
  return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
273
297
  case spl_token_1.TOKEN_PROGRAM_ID.toString():
298
+ try {
299
+ const decodedInstruction = (0, spl_token_1.decodeCloseAccountInstruction)(instruction);
300
+ if (decodedInstruction && decodedInstruction.data.instruction === 9) {
301
+ return 'CloseAssociatedTokenAccount';
302
+ }
303
+ }
304
+ catch (e) {
305
+ // ignore error and default to TokenTransfer
306
+ return 'TokenTransfer';
307
+ }
274
308
  return 'TokenTransfer';
275
309
  case web3_js_1.StakeProgram.programId.toString():
276
310
  return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
@@ -282,11 +316,12 @@ function getInstructionType(instruction) {
282
316
  else {
283
317
  throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
284
318
  }
319
+ case COMPUTE_BUDGET:
320
+ return 'SetPriorityFee';
285
321
  default:
286
322
  throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
287
323
  }
288
324
  }
289
- exports.getInstructionType = getInstructionType;
290
325
  /**
291
326
  * Validate solana instructions types to see if they are supported by the builder.
292
327
  * Throws if the instruction type is invalid.
@@ -301,21 +336,58 @@ function validateIntructionTypes(instructions) {
301
336
  }
302
337
  }
303
338
  }
304
- exports.validateIntructionTypes = validateIntructionTypes;
339
+ /**
340
+ * Validate solana instructions match raw msg authorize transaction
341
+ *
342
+ * @param {TransactionInstruction} instructions - a solana instruction
343
+ * @returns {boolean} true if the instructions match the raw msg authorize transaction
344
+ */
345
+ function validateRawMsgInstruction(instructions) {
346
+ // as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
347
+ if (instructions.length === 2) {
348
+ const programId1 = instructions[0].programId.toString();
349
+ const programId2 = instructions[1].programId.toString();
350
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
351
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
352
+ const data = instructions[1].data.toString('hex');
353
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
354
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
355
+ return true;
356
+ }
357
+ }
358
+ }
359
+ if (instructions.length === 3) {
360
+ const programId1 = instructions[0].programId.toString();
361
+ const programId2 = instructions[1].programId.toString();
362
+ const programId3 = instructions[2].programId.toString();
363
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
364
+ programId2 === web3_js_1.StakeProgram.programId.toString() &&
365
+ programId3 === web3_js_1.StakeProgram.programId.toString()) {
366
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
367
+ const data = instructions[1].data.toString('hex');
368
+ const data2 = instructions[2].data.toString('hex');
369
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
370
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
371
+ (data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
372
+ return true;
373
+ }
374
+ }
375
+ }
376
+ return false;
377
+ }
305
378
  /**
306
379
  * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
307
380
  *
308
381
  * @param {string} rawTransaction - Transaction in base64 string format
309
382
  */
310
- function validateRawTransaction(rawTransaction) {
383
+ function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
311
384
  if (!rawTransaction) {
312
385
  throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
313
386
  }
314
- if (!isValidRawTransaction(rawTransaction)) {
387
+ if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
315
388
  throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
316
389
  }
317
390
  }
318
- exports.validateRawTransaction = validateRawTransaction;
319
391
  /**
320
392
  * Validates address to check if it exists and is a valid Solana public key
321
393
  *
@@ -327,7 +399,6 @@ function validateAddress(address, fieldName) {
327
399
  throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
328
400
  }
329
401
  }
330
- exports.validateAddress = validateAddress;
331
402
  /**
332
403
  * Get the statics coin object matching a given Solana token address if it exists
333
404
  *
@@ -345,12 +416,11 @@ function getSolTokenFromAddress(tokenAddress, network) {
345
416
  const tokensArray = tokens.map((token) => token);
346
417
  if (tokensArray.length >= 1) {
347
418
  // there should never be two tokens with the same contract address, so we assert that here
348
- assert_1.default(tokensArray.length === 1);
419
+ (0, assert_1.default)(tokensArray.length === 1);
349
420
  return tokensArray[0];
350
421
  }
351
422
  return undefined;
352
423
  }
353
- exports.getSolTokenFromAddress = getSolTokenFromAddress;
354
424
  /**
355
425
  * Get the solana token object from token name
356
426
  * @param tokenName The token name to match against
@@ -370,33 +440,29 @@ function getSolTokenFromTokenName(tokenName) {
370
440
  return undefined;
371
441
  }
372
442
  }
373
- exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
374
443
  /**
375
444
  * Get the solana associated token account address
376
- * @param tokenAddress The token address
445
+ * @param tokenAddress token mint address
377
446
  * @param ownerAddress The owner of the associated token account
378
447
  * @returns The associated token account address
379
448
  * */
380
- async function getAssociatedTokenAccountAddress(tokenAddress, ownerAddress) {
449
+ async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress) {
381
450
  const ownerPublicKey = new web3_js_1.PublicKey(ownerAddress);
382
451
  // tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
383
452
  if (!web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
384
453
  throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
385
454
  }
386
- const ataAddress = await spl_token_1.getAssociatedTokenAddress(new web3_js_1.PublicKey(tokenAddress), ownerPublicKey);
455
+ const ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(new web3_js_1.PublicKey(tokenMintAddress), ownerPublicKey);
387
456
  return ataAddress.toString();
388
457
  }
389
- exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
390
458
  function validateMintAddress(mintAddress) {
391
459
  if (!mintAddress || !isValidAddress(mintAddress)) {
392
460
  throw new sdk_core_1.BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
393
461
  }
394
462
  }
395
- exports.validateMintAddress = validateMintAddress;
396
463
  function validateOwnerAddress(ownerAddress) {
397
464
  if (!ownerAddress || !isValidAddress(ownerAddress)) {
398
465
  throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
399
466
  }
400
467
  }
401
- exports.validateOwnerAddress = validateOwnerAddress;
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZDQVV5QjtBQUN6QixnREFBd0I7QUFDeEIsZ0VBQXFDO0FBQ3JDLDJDQVlxQjtBQUNyQixtREFPOEI7QUFFOUIsMERBQTZCO0FBQzdCLGlEQUE2RztBQUM3RyxpREFBaUc7QUFDakcsb0RBQTRCO0FBRTVCLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscUZBQXFGO0FBQzNILE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdEO0FBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7QUFFdkQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUZELHdDQUVDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLElBQUk7UUFDRixPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsQ0FDbkgsQ0FBQztLQUNIO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQVJELHdDQVFDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGlCQUFpQixDQUFDLE1BQTJCO0lBQzNELElBQUk7UUFDRixNQUFNLEdBQUcsR0FBZSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekYsT0FBTyxD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QUNyRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ2hELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx1Q0FBdUMsR0FBRyxXQUFXLENBQUMsQ0FBQztLQUN4RjtBQUNILENBQUM7QUFKRCxrREFJQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLFlBQW9CO0lBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDbEQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHdDQUF3QyxHQUFHLFlBQVksQ0FBQyxDQUFDO0tBQzFGO0FBQ0gsQ0FBQztBQUpELG9EQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgS2V5cGFpcixcbiAgUHVibGljS2V5LFxuICBTaWduYXR1cmVQdWJrZXlQYWlyLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHtcbiAgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgTUFYX01FTU9fTEVOR1RILFxuICBNRU1PX1BST0dSQU1fUEssXG4gIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIFZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUyxcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbiAgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVmFsaWRJbnN0cnVjdGlvblR5cGVzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELCBUT0tFTl9QUk9HUkFNX0lELCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNDb3B5W2luc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXV0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyIHx8XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIH1cbiAgfVxuICBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplO1xuICB9IGVsc2UgaWYgKFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbiBub3Qgc3VwcG9ydGVkIG9yIGludmFsaWQnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlIHNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBUaHJvd3MgaWYgdGhlIHNvbGFuYSBpbnN0cnVjdGlvbiBwcm9ncmFtIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtWYWxpZEluc3RydWN0aW9uVHlwZXN9IC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogVmFsaWRJbnN0cnVjdGlvblR5cGVzIHtcbiAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIGNhc2UgbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ01lbW8nO1xuICAgIGNhc2UgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuICdUb2tlblRyYW5zZmVyJztcbiAgICBjYXNlIFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHdoZW4gQHNwbC10b2tlbiBzdXBwb3J0cyBkZWNvZGluZyBhc3NvY2lhdGVkIHRva2VuIGluc3RydWN0aW9uc1xuICAgICAgaWYgKGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29sYW5hIGluc3RydWN0aW9ucyB0eXBlcyB0byBzZWUgaWYgdGhleSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBidWlsZGVyLlxuICogVGhyb3dzIGlmIHRoZSBpbnN0cnVjdGlvbiB0eXBlIGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbnMgLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGlmICghVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLmluY2x1ZGVzKGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyAgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFkZHJlc3MgdG8gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIFNvbGFuYSBwdWJsaWMga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWFkZHJlc3MgfHwgIWlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG9yIG1pc3NpbmcgJHtmaWVsZE5hbWV9LCBnb3Q6ICR7YWRkcmVzc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIFNvbGFuYSB0b2tlbiBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgU29sYW5hIE1haW5uZXQgb3IgVGVzdG5ldFxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgbmV0d29yazogQmFzZU5ldHdvcmspOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pIHtcbiAgICAgIHJldHVybiBjb2luLm5ldHdvcmsudHlwZSA9PT0gbmV0d29yay50eXBlICYmIGNvaW4udG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gIGlmICh0b2tlbnNBcnJheS5sZW5ndGggPj0gMSkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBuZXZlciBiZSB0d28gdG9rZW5zIHdpdGggdGhlIHNhbWUgY29udHJhY3QgYWRkcmVzcywgc28gd2UgYXNzZXJ0IHRoYXQgaGVyZVxuICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgIHJldHVybiB0b2tlbnNBcnJheVswXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc29sYW5hIHRva2VuIG9iamVjdCBmcm9tIHRva2VuIG5hbWVcbiAqIEBwYXJhbSB0b2tlbk5hbWUgVGhlIHRva2VuIG5hbWUgdG8gbWF0Y2ggYWdhaW5zdFxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUodG9rZW5OYW1lOiBzdHJpbmcpOiBSZWFkb25seTxTb2xDb2luPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBjb2lucy5nZXQodG9rZW5OYW1lKTtcbiAgICBpZiAoISh0b2tlbi5pc1Rva2VuICYmIHRva2VuIGluc3RhbmNlb2YgU29sQ29pbikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghKGUgaW5zdGFuY2VvZiBDb2luTm90RGVmaW5lZEVycm9yKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc29sYW5hIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG93bmVyQWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb3duZXJQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KG93bmVyQWRkcmVzcyk7XG5cbiAgLy8gdG9rZW5BZGRyZXNzIGFyZSBub3Qgb24gZWQyNTUxOSBjdXJ2ZSwgc28gdGhleSBjYW4ndCBiZSB1c2VkIGFzIG93bmVyQWRkcmVzc1xuICBpZiAoIVB1YmxpY0tleS5pc09uQ3VydmUob3duZXJQdWJsaWNLZXkudG9CdWZmZXIoKSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBvd25lckFkZHJlc3MgLSBhZGRyZXNzIG9mZiBlZDI1NTE5IGN1cnZlLCBnb3Q6ICcgKyBvd25lckFkZHJlc3MpO1xuICB9XG4gIGNvbnN0IGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKG5ldyBQdWJsaWNLZXkodG9rZW5BZGRyZXNzKSwgb3duZXJQdWJsaWNLZXkpO1xuICByZXR1cm4gYXRhQWRkcmVzcy50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNaW50QWRkcmVzcyhtaW50QWRkcmVzczogc3RyaW5nKSB7XG4gIGlmICghbWludEFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG1pbnRBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBtaW50QWRkcmVzcywgZ290OiAnICsgbWludEFkZHJlc3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU93bmVyQWRkcmVzcyhvd25lckFkZHJlc3M6IHN0cmluZykge1xuICBpZiAoIW93bmVyQWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3Mob3duZXJBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBvd25lckFkZHJlc3MsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbn1cbiJdfQ==
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBd0RBLHdDQUVDO0FBR0Qsd0NBUUM7QUFHRCw4Q0FPQztBQUdELDRDQVFDO0FBR0QsNENBTUM7QUFJRCxvREFFQztBQVFELHNDQUdDO0FBUUQsb0RBR0M7QUFRRCxrQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQTJCQztBQVNELGdEQXdDQztBQVNELGdEQW1DQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBTUQsNERBYUM7QUFRRCw0RUFZQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFyZ0JELG1EQU84QjtBQUM5QixpREFBaUc7QUFDakcsaURBSzJCO0FBQzNCLDZDQVV5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUN4QiwwREFBNkI7QUFDN0IsMkNBaUJxQjtBQUdyQixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBRXJFLGtCQUFrQjtBQUNsQixTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsU0FBZ0IsY0FBYyxDQUFDLElBQVk7SUFDekMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsdUJBQXVCLENBQUMs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QztJQUNqRyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFBLHFDQUF5QixFQUFDLElBQUksbUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3BHLE9BQU8sVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHVDQUF1QyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx3Q0FBd0MsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUMzRixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdFN1cHBvcnRlZCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFV0aWxzRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgQ29pbk5vdERlZmluZWRFcnJvciwgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgZGVjb2RlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24sXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQge1xuICBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcyxcbiAgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgTUFYX01FTU9fTEVOR1RILFxuICBNRU1PX1BST0dSQU1fUEssXG4gIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YTIsXG4gIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sXG4gIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB9IGZyb20gJy4vaWZhY2UnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcbmNvbnN0IENPTVBVVEVfQlVER0VUID0gJ0NvbXB1dGVCdWRnZXQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnO1xuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzcyk7XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWhhc2ggJiYgbmV3IFJlZ0V4cChCQVNFXzU4X0VOQ09ORElOR19SRUdFWCkudGVzdChoYXNoKSAmJiBiczU4LmRlY29kZShoYXNoKS5sZW5ndGggPT09IERFQ09ERURfQkxPQ0tfSEFTSF9MRU5HVEhcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQcml2YXRlS2V5KHBydktleTogc3RyaW5nIHwgVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleTogVWludDhBcnJheSA9IHR5cGVvZiBwcnZLZXkgPT09ICdzdHJpbmcnID8gYmFzZTU4VG9VaW50OEFycmF5KHBydktleSkgOiBwcnZLZXk7XG4gICAgcmV0dXJuICEhS2V5cGFpci5mcm9tU2VjcmV0S2V5KGtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWJLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChpc1ZhbGlkWHB1YihwdWJLZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBuZXcgUHVibGljS2V5KHB1YktleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhc2lnbmF0dXJlICYmIGJzNTguZGVjb2RlKHNpZ25hdHVyZSkubGVuZ3RoID09PSBERUNPREVEX1NJR05BVFVSRV9MRU5HVEg7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG4vLyBUcmFuc2FjdGlvbklkIGFyZSB0aGUgZmlyc3Qgc2lnbmF0dXJlIG9uIGEgVHJhbnNhY3Rpb25cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRTaWduYXR1cmUodHhJZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgb2YgbGFtcG9ydHMgbnVtYmVyIG9uIHN0YWtpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3Rha2luZ0Ftb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW4oMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIG1lbW8gb3Igbm90LlxuICpcbiAqIEBwYXJhbSBtZW1vIC0gdGhlIG1lbW8gc3RyaW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRNZW1vKG1lbW86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQnVmZmVyLmZyb20obWVtbykubGVuZ3RoIDw9IE1BWF9NRU1PX0xFTkdUSDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSB0cmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nIGZvcm1hdFxuICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlQWxsU2lnbmF0dXJlcyAtIHJlcXVpcmUgYWxsIHNpZ25hdHVyZXMgdG8gYmUgcHJlc2VudFxuICogQHBhcmFtIHtib29sZWFufSB2ZXJpZnlTaWduYXR1cmVzIC0gdmVyaWZ5IHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKFxuICByYXdUcmFuc2FjdGlvbjogc3RyaW5nLFxuICByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IGZhbHNlLFxuICB2ZXJpZnlTaWduYXR1cmVzID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHR4ID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpKTtcbiAgICB0eC5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcywgdmVyaWZ5U2lnbmF0dXJlcyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNDb3B5W2luc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXV0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICBpZiAodmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3O1xuICB9XG4gIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9ucyk7XG4gIC8vIGNoZWNrIGlmIGRlYWN0aXZhdGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgZXhpc3QgYmVjYXVzZSBkZWFjdGl2YXRlIGNhbiBiZSBpbmNsdWRlIGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25cbiAgaWYgKGluc3RydWN0aW9ucy5maWx0ZXIoKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnRGVhY3RpdmF0ZScpLmxlbmd0aCA9PSAwKSB7XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uVHlwZSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlciB8fFxuICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlO1xuICB9IGVsc2UgaWYgKFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbiBub3Qgc3VwcG9ydGVkIG9yIGludmFsaWQnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlIHNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBUaHJvd3MgaWYgdGhlIHNvbGFuYSBpbnN0cnVjdGlvbiBwcm9ncmFtIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtWYWxpZEluc3RydWN0aW9uVHlwZXN9IC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogVmFsaWRJbnN0cnVjdGlvblR5cGVzIHtcbiAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIGNhc2UgbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ01lbW8nO1xuICAgIGNhc2UgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlZEluc3RydWN0aW9uID0gZGVjb2RlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBpZiAoZGVjb2RlZEluc3RydWN0aW9uICYmIGRlY29kZWRJbnN0cnVjdGlvbi5kYXRhLmluc3RydWN0aW9uID09PSA5KSB7XG4gICAgICAgICAgcmV0dXJuICdDbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlnbm9yZSBlcnJvciBhbmQgZGVmYXVsdCB0byBUb2tlblRyYW5zZmVyXG4gICAgICAgIHJldHVybiAnVG9rZW5UcmFuc2Zlcic7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1Rva2VuVHJhbnNmZXInO1xuICAgIGNhc2UgU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgd2hlbiBAc3BsLXRva2VuIHN1cHBvcnRzIGRlY29kaW5nIGFzc29jaWF0ZWQgdG9rZW4gaW5zdHJ1Y3Rpb25zXG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdJbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiBwcm9ncmFtIGlkIG5vdCBzdXBwb3J0ZWQ6ICcgKyBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIGNhc2UgQ09NUFVURV9CVURHRVQ6XG4gICAgICByZXR1cm4gJ1NldFByaW9yaXR5RmVlJztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29sYW5hIGluc3RydWN0aW9ucyB0eXBlcyB0byBzZWUgaWYgdGhleSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBidWlsZGVyLlxuICogVGhyb3dzIGlmIHRoZSBpbnN0cnVjdGlvbiB0eXBlIGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbnMgLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGlmICghVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLmluY2x1ZGVzKGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIG1hdGNoIHJhdyBtc2cgYXV0aG9yaXplIHRyYW5zYWN0aW9uXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbnMgLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGluc3RydWN0aW9ucyBtYXRjaCB0aGUgcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBib29sZWFuIHtcbiAgLy8gYXMgd2ViMy5qcyBjYW5ub3QgZGVjb2RlIGF1dGhvcml6ZSBpbnN0cnVjdGlvbiBmcm9tIENMSSwgd2UgbmVlZCB0byBjaGVjayBpdCBtYW51YWxseSBmaXJzdFxuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IHByb2dyYW1JZDEgPSBpbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMiA9IGluc3RydWN0aW9uc1sxXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAocHJvZ3JhbUlkMSA9PT0gU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJiBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTmFtZTEgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uTmFtZTEgPT09IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uICYmXG4gICAgICAgIChkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDMgPSBpbnN0cnVjdGlvbnNbMl0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgaWYgKFxuICAgICAgcHJvZ3JhbUlkMSA9PT0gU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJlxuICAgICAgcHJvZ3JhbUlkMiA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQzID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTmFtZTEgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBkYXRhMiA9IGluc3RydWN0aW9uc1syXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMikgJiZcbiAgICAgICAgKGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhMiA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oXG4gIHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcsXG4gIHJlcXVpcmVBbGxTaWduYXR1cmVzID0gZmFsc2UsXG4gIHZlcmlmeVNpZ25hdHVyZXMgPSBmYWxzZVxuKTogdm9pZCB7XG4gIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24sIHJlcXVpcmVBbGxTaWduYXR1cmVzLCB2ZXJpZnlTaWduYXR1cmVzKSkge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWRkcmVzcyB0byBjaGVjayBpZiBpdCBleGlzdHMgYW5kIGlzIGEgdmFsaWQgU29sYW5hIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0aWNzIGNvaW4gb2JqZWN0IG1hdGNoaW5nIGEgZ2l2ZW4gU29sYW5hIHRva2VuIGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcGFyYW0gbmV0d29yayBTb2xhbmEgTWFpbm5ldCBvciBUZXN0bmV0XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2xUb2tlbkZyb21BZGRyZXNzKHRva2VuQWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yayk6IFJlYWRvbmx5PEJhc2VDb2luPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgIGlmIChjb2luIGluc3RhbmNlb2YgU29sQ29pbikge1xuICAgICAgcmV0dXJuIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiYgY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpO1xuXG4gIC8vIHRva2VuQWRkcmVzcyBhcmUgbm90IG9uIGVkMjU1MTkgY3VydmUsIHNvIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBvd25lckFkZHJlc3NcbiAgaWYgKCFQdWJsaWNLZXkuaXNPbkN1cnZlKG93bmVyUHVibGljS2V5LnRvQnVmZmVyKCkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgb3duZXJBZGRyZXNzIC0gYWRkcmVzcyBvZmYgZWQyNTUxOSBjdXJ2ZSwgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxuICBjb25zdCBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhuZXcgUHVibGljS2V5KHRva2VuTWludEFkZHJlc3MpLCBvd25lclB1YmxpY0tleSk7XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKSB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuIl19
@@ -34,7 +34,7 @@ class WalletInitializationBuilder extends transactionBuilder_1.TransactionBuilde
34
34
  * @param amount amount in lamports to fund the nonce account
35
35
  */
36
36
  amount(amount) {
37
- if (!amount || !utils_1.isValidAmount(amount)) {
37
+ if (!amount || !(0, utils_1.isValidAmount)(amount)) {
38
38
  throw new sdk_core_1.BuildTransactionError('Invalid or missing amount, got: ' + amount);
39
39
  }
40
40
  this._amount = amount;
@@ -45,15 +45,15 @@ class WalletInitializationBuilder extends transactionBuilder_1.TransactionBuilde
45
45
  * @param nonceAddress address of the new nonce account
46
46
  */
47
47
  address(nonceAddress) {
48
- utils_1.validateAddress(nonceAddress, 'nonceAddress');
48
+ (0, utils_1.validateAddress)(nonceAddress, 'nonceAddress');
49
49
  this._nonceAddress = nonceAddress;
50
50
  return this;
51
51
  }
52
52
  /** @inheritdoc */
53
53
  async buildImplementation() {
54
- assert_1.default(this._sender, 'Sender must be set before building the transaction');
55
- assert_1.default(this._amount, 'Amount must be set before building the transaction');
56
- assert_1.default(this._nonceAddress, 'Nonce Address must be set before building the transaction');
54
+ (0, assert_1.default)(this._sender, 'Sender must be set before building the transaction');
55
+ (0, assert_1.default)(this._amount, 'Amount must be set before building the transaction');
56
+ (0, assert_1.default)(this._nonceAddress, 'Nonce Address must be set before building the transaction');
57
57
  const walletInitData = {
58
58
  type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
59
59
  params: {
@@ -68,4 +68,4 @@ class WalletInitializationBuilder extends transactionBuilder_1.TransactionBuilde
68
68
  }
69
69
  }
70
70
  exports.WalletInitializationBuilder = WalletInitializationBuilder;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTRCO0FBRzVCLG1EQUE4RTtBQUU5RSw2REFBMEQ7QUFDMUQsbUNBQXlEO0FBRXpELDJDQUFzRDtBQUV0RCxNQUFhLDJCQUE0QixTQUFRLHVDQUFrQjtJQUlqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDaEQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLG1DQUF1QixDQUFDLGtCQUFrQixFQUFFO2dCQUNuRSxNQUFNLHFCQUFxQixHQUFlLFdBQVcsQ0FBQztnQkFFdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2RDtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMscUJBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsa0NBQWtDLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDOUU7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsWUFBb0I7UUFDMUIsdUJBQWUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFFbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztRQUMzRSxnQkFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztRQUMzRSxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUV4RixNQUFNLGNBQWMsR0FBZTtZQUNqQyxJQUFJLEVBQUUsbUNBQXVCLENBQUMsa0JBQWtCO1lBQ2hELE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDckI7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFMUMsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXRFRCxrRUFzRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IGlzVmFsaWRBbW91bnQsIHZhbGlkYXRlQWRkcmVzcyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgV2FsbGV0SW5pdCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9ub25jZUFkZHJlc3M6IHN0cmluZztcbiAgcHJpdmF0ZSBfYW1vdW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuX2luc3RydWN0aW9uc0RhdGEpIHtcbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0SW5pdEluc3RydWN0aW9uOiBXYWxsZXRJbml0ID0gaW5zdHJ1Y3Rpb247XG5cbiAgICAgICAgdGhpcy5hZGRyZXNzKHdhbGxldEluaXRJbnN0cnVjdGlvbi5wYXJhbXMubm9uY2VBZGRyZXNzKTtcbiAgICAgICAgdGhpcy5hbW91bnQod2FsbGV0SW5pdEluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICB0aGlzLnNlbmRlcih3YWxsZXRJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLmF1dGhBZGRyZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYW1vdW50IHRvIGZ1bmQgdGhlIG5vbmNlIGFjY291bnRcbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCBhbW91bnQgaW4gbGFtcG9ydHMgdG8gZnVuZCB0aGUgbm9uY2UgYWNjb3VudFxuICAgKi9cbiAgYW1vdW50KGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFhbW91bnQgfHwgIWlzVmFsaWRBbW91bnQoYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgYW1vdW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl9hbW91bnQgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWRkcmVzcyBmb3IgdGhlIG5vbmNlIGFjY291bnRcbiAgICogQHBhcmFtIG5vbmNlQWRkcmVzcyBhZGRyZXNzIG9mIHRoZSBuZXcgbm9uY2UgYWNjb3VudFxuICAgKi9cbiAgYWRkcmVzcyhub25jZUFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHZhbGlkYXRlQWRkcmVzcyhub25jZUFkZHJlc3MsICdub25jZUFkZHJlc3MnKTtcbiAgICB0aGlzLl9ub25jZUFkZHJlc3MgPSBub25jZUFkZHJlc3M7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgJ1NlbmRlciBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgYXNzZXJ0KHRoaXMuX2Ftb3VudCwgJ0Ftb3VudCBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgYXNzZXJ0KHRoaXMuX25vbmNlQWRkcmVzcywgJ05vbmNlIEFkZHJlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuXG4gICAgY29uc3Qgd2FsbGV0SW5pdERhdGE6IFdhbGxldEluaXQgPSB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgbm9uY2VBZGRyZXNzOiB0aGlzLl9ub25jZUFkZHJlc3MsXG4gICAgICAgIGF1dGhBZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgIGFtb3VudDogdGhpcy5fYW1vdW50LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbd2FsbGV0SW5pdERhdGFdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTRCO0FBRzVCLG1EQUE4RTtBQUU5RSw2REFBMEQ7QUFDMUQsbUNBQXlEO0FBRXpELDJDQUFzRDtBQUV0RCxNQUFhLDJCQUE0QixTQUFRLHVDQUFrQjtJQUlqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxxQkFBcUIsR0FBZSxXQUFXLENBQUM7Z0JBRXRELElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxNQUFjO1FBQ25CLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFBLHFCQUFhLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsa0NBQWtDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxZQUFvQjtRQUMxQixJQUFBLHVCQUFlLEVBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtJQUNSLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztRQUMzRSxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxvREFBb0QsQ0FBQyxDQUFDO1FBQzNFLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLDJEQUEyRCxDQUFDLENBQUM7UUFFeEYsTUFBTSxjQUFjLEdBQWU7WUFDakMsSUFBSSxFQUFFLG1DQUF1QixDQUFDLGtCQUFrQjtZQUNoRCxNQUFNLEVBQUU7Z0JBQ04sV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ2hDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ3JCO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTFDLE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUF0RUQsa0VBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBpc1ZhbGlkQW1vdW50LCB2YWxpZGF0ZUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFdhbGxldEluaXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgV2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfbm9uY2VBZGRyZXNzOiBzdHJpbmc7XG4gIHByaXZhdGUgX2Ftb3VudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50KSB7XG4gICAgICAgIGNvbnN0IHdhbGxldEluaXRJbnN0cnVjdGlvbjogV2FsbGV0SW5pdCA9IGluc3RydWN0aW9uO1xuXG4gICAgICAgIHRoaXMuYWRkcmVzcyh3YWxsZXRJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLm5vbmNlQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuYW1vdW50KHdhbGxldEluaXRJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50KTtcbiAgICAgICAgdGhpcy5zZW5kZXIod2FsbGV0SW5pdEluc3RydWN0aW9uLnBhcmFtcy5hdXRoQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFtb3VudCB0byBmdW5kIHRoZSBub25jZSBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgYW1vdW50IGluIGxhbXBvcnRzIHRvIGZ1bmQgdGhlIG5vbmNlIGFjY291bnRcbiAgICovXG4gIGFtb3VudChhbW91bnQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghYW1vdW50IHx8ICFpc1ZhbGlkQW1vdW50KGFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIGFtb3VudCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFkZHJlc3MgZm9yIHRoZSBub25jZSBhY2NvdW50XG4gICAqIEBwYXJhbSBub25jZUFkZHJlc3MgYWRkcmVzcyBvZiB0aGUgbmV3IG5vbmNlIGFjY291bnRcbiAgICovXG4gIGFkZHJlc3Mobm9uY2VBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3Mobm9uY2VBZGRyZXNzLCAnbm9uY2VBZGRyZXNzJyk7XG4gICAgdGhpcy5fbm9uY2VBZGRyZXNzID0gbm9uY2VBZGRyZXNzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsICdTZW5kZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGFzc2VydCh0aGlzLl9hbW91bnQsICdBbW91bnQgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGFzc2VydCh0aGlzLl9ub25jZUFkZHJlc3MsICdOb25jZSBBZGRyZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24nKTtcblxuICAgIGNvbnN0IHdhbGxldEluaXREYXRhOiBXYWxsZXRJbml0ID0ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGZyb21BZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgIG5vbmNlQWRkcmVzczogdGhpcy5fbm9uY2VBZGRyZXNzLFxuICAgICAgICBhdXRoQWRkcmVzczogdGhpcy5fc2VuZGVyLFxuICAgICAgICBhbW91bnQ6IHRoaXMuX2Ftb3VudCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gW3dhbGxldEluaXREYXRhXTtcblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cbn1cbiJdfQ==