@bitgo-beta/sdk-coin-sol 2.4.3-beta.9 → 2.4.3-beta.900
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.
- package/CHANGELOG.md +1001 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +1 -1
- package/dist/src/lib/ataInitializationBuilder.js +37 -19
- package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
- package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/src/lib/closeAtaBuilder.js +69 -0
- package/dist/src/lib/constants.d.ts +43 -8
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +48 -10
- package/dist/src/lib/iface.d.ts +55 -3
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +11 -7
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +44 -22
- package/dist/src/lib/instructionParamsFactory.d.ts +1 -1
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +315 -47
- package/dist/src/lib/keyPair.js +5 -5
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +143 -47
- package/dist/src/lib/stakingActivateBuilder.d.ts +9 -2
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +23 -10
- package/dist/src/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +26 -1
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +106 -25
- package/dist/src/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingDelegateBuilder.js +120 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +32 -16
- package/dist/src/lib/transaction.d.ts +3 -3
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +98 -16
- package/dist/src/lib/transactionBuilder.d.ts +2 -1
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +29 -19
- package/dist/src/lib/transactionBuilderFactory.d.ts +36 -7
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +56 -7
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/transferBuilderV2.d.ts +11 -1
- package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/src/lib/transferBuilderV2.js +70 -10
- package/dist/src/lib/utils.d.ts +23 -6
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +160 -51
- package/dist/src/lib/walletInitializationBuilder.js +6 -6
- package/dist/src/sol.d.ts +70 -24
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +621 -82
- package/dist/src/solToken.d.ts +2 -1
- package/dist/src/solToken.d.ts.map +1 -1
- package/dist/src/solToken.js +6 -3
- package/dist/src/tsol.js +1 -1
- package/package.json +10 -9
package/dist/src/lib/utils.js
CHANGED
|
@@ -3,24 +3,51 @@ 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.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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.getSolTokenFromAddressOnly = getSolTokenFromAddressOnly;
|
|
30
|
+
exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
|
|
31
|
+
exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
|
|
32
|
+
exports.validateMintAddress = validateMintAddress;
|
|
33
|
+
exports.validateOwnerAddress = validateOwnerAddress;
|
|
11
34
|
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
35
|
const statics_1 = require("@bitgo-beta/statics");
|
|
36
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
37
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
15
38
|
const assert_1 = __importDefault(require("assert"));
|
|
39
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
40
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
41
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
42
|
+
const constants_1 = require("./constants");
|
|
16
43
|
const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
|
|
17
44
|
const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
|
|
18
45
|
const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
|
|
46
|
+
const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
|
|
19
47
|
/** @inheritdoc */
|
|
20
48
|
function isValidAddress(address) {
|
|
21
49
|
return isValidPublicKey(address);
|
|
22
50
|
}
|
|
23
|
-
exports.isValidAddress = isValidAddress;
|
|
24
51
|
/** @inheritdoc */
|
|
25
52
|
function isValidBlockId(hash) {
|
|
26
53
|
try {
|
|
@@ -30,7 +57,6 @@ function isValidBlockId(hash) {
|
|
|
30
57
|
return false;
|
|
31
58
|
}
|
|
32
59
|
}
|
|
33
|
-
exports.isValidBlockId = isValidBlockId;
|
|
34
60
|
/** @inheritdoc */
|
|
35
61
|
function isValidPrivateKey(prvKey) {
|
|
36
62
|
try {
|
|
@@ -41,11 +67,10 @@ function isValidPrivateKey(prvKey) {
|
|
|
41
67
|
return false;
|
|
42
68
|
}
|
|
43
69
|
}
|
|
44
|
-
exports.isValidPrivateKey = isValidPrivateKey;
|
|
45
70
|
/** @inheritdoc */
|
|
46
71
|
function isValidPublicKey(pubKey) {
|
|
47
72
|
try {
|
|
48
|
-
if (sdk_core_1.isValidXpub(pubKey))
|
|
73
|
+
if ((0, sdk_core_1.isValidXpub)(pubKey))
|
|
49
74
|
return true;
|
|
50
75
|
new web3_js_1.PublicKey(pubKey);
|
|
51
76
|
return true;
|
|
@@ -54,7 +79,6 @@ function isValidPublicKey(pubKey) {
|
|
|
54
79
|
return false;
|
|
55
80
|
}
|
|
56
81
|
}
|
|
57
|
-
exports.isValidPublicKey = isValidPublicKey;
|
|
58
82
|
/** @inheritdoc */
|
|
59
83
|
function isValidSignature(signature) {
|
|
60
84
|
try {
|
|
@@ -64,13 +88,11 @@ function isValidSignature(signature) {
|
|
|
64
88
|
return false;
|
|
65
89
|
}
|
|
66
90
|
}
|
|
67
|
-
exports.isValidSignature = isValidSignature;
|
|
68
91
|
/** @inheritdoc */
|
|
69
92
|
// TransactionId are the first signature on a Transaction
|
|
70
93
|
function isValidTransactionId(txId) {
|
|
71
94
|
return isValidSignature(txId);
|
|
72
95
|
}
|
|
73
|
-
exports.isValidTransactionId = isValidTransactionId;
|
|
74
96
|
/**
|
|
75
97
|
* Returns whether or not the string is a valid amount of lamports number
|
|
76
98
|
*
|
|
@@ -81,7 +103,6 @@ function isValidAmount(amount) {
|
|
|
81
103
|
const bigNumberAmount = new bignumber_js_1.default(amount);
|
|
82
104
|
return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
|
|
83
105
|
}
|
|
84
|
-
exports.isValidAmount = isValidAmount;
|
|
85
106
|
/**
|
|
86
107
|
* Check if the string is a valid amount of lamports number on staking
|
|
87
108
|
*
|
|
@@ -92,7 +113,6 @@ function isValidStakingAmount(amount) {
|
|
|
92
113
|
const bigNumberAmount = new bignumber_js_1.default(amount);
|
|
93
114
|
return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
|
|
94
115
|
}
|
|
95
|
-
exports.isValidStakingAmount = isValidStakingAmount;
|
|
96
116
|
/**
|
|
97
117
|
* Check if this is a valid memo or not.
|
|
98
118
|
*
|
|
@@ -102,24 +122,24 @@ exports.isValidStakingAmount = isValidStakingAmount;
|
|
|
102
122
|
function isValidMemo(memo) {
|
|
103
123
|
return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
|
|
104
124
|
}
|
|
105
|
-
exports.isValidMemo = isValidMemo;
|
|
106
125
|
/**
|
|
107
126
|
* Checks if raw transaction can be deserialized
|
|
108
127
|
*
|
|
109
128
|
* @param {string} rawTransaction - transaction in base64 string format
|
|
129
|
+
* @param {boolean} requireAllSignatures - require all signatures to be present
|
|
130
|
+
* @param {boolean} verifySignatures - verify signatures
|
|
110
131
|
* @returns {boolean} - the validation result
|
|
111
132
|
*/
|
|
112
|
-
function isValidRawTransaction(rawTransaction) {
|
|
133
|
+
function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
113
134
|
try {
|
|
114
135
|
const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
|
|
115
|
-
tx.serialize({ requireAllSignatures
|
|
136
|
+
tx.serialize({ requireAllSignatures, verifySignatures });
|
|
116
137
|
return true;
|
|
117
138
|
}
|
|
118
139
|
catch (e) {
|
|
119
140
|
return false;
|
|
120
141
|
}
|
|
121
142
|
}
|
|
122
|
-
exports.isValidRawTransaction = isValidRawTransaction;
|
|
123
143
|
/**
|
|
124
144
|
* Verifies if signature for message is valid.
|
|
125
145
|
*
|
|
@@ -143,7 +163,6 @@ function verifySignature(serializedTx, signature, publicKey) {
|
|
|
143
163
|
const pub = new web3_js_1.PublicKey(publicKey);
|
|
144
164
|
return tweetnacl_1.default.sign.detached.verify(msg, sig, pub.toBuffer());
|
|
145
165
|
}
|
|
146
|
-
exports.verifySignature = verifySignature;
|
|
147
166
|
/**
|
|
148
167
|
* Converts a base58 string into a Uint8Array.
|
|
149
168
|
*
|
|
@@ -153,7 +172,6 @@ exports.verifySignature = verifySignature;
|
|
|
153
172
|
function base58ToUint8Array(input) {
|
|
154
173
|
return new Uint8Array(bs58_1.default.decode(input));
|
|
155
174
|
}
|
|
156
|
-
exports.base58ToUint8Array = base58ToUint8Array;
|
|
157
175
|
/**
|
|
158
176
|
* Converts a Uint8Array to a base58 string.
|
|
159
177
|
*
|
|
@@ -163,7 +181,6 @@ exports.base58ToUint8Array = base58ToUint8Array;
|
|
|
163
181
|
function Uint8ArrayTobase58(input) {
|
|
164
182
|
return bs58_1.default.encode(input);
|
|
165
183
|
}
|
|
166
|
-
exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
|
|
167
184
|
/**
|
|
168
185
|
* Count the amount of signatures are not null.
|
|
169
186
|
*
|
|
@@ -173,7 +190,6 @@ exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
|
|
|
173
190
|
function countNotNullSignatures(signatures) {
|
|
174
191
|
return signatures.filter((sig) => !!sig.signature).length;
|
|
175
192
|
}
|
|
176
|
-
exports.countNotNullSignatures = countNotNullSignatures;
|
|
177
193
|
/**
|
|
178
194
|
* Check if all signatures are completed.
|
|
179
195
|
*
|
|
@@ -183,7 +199,6 @@ exports.countNotNullSignatures = countNotNullSignatures;
|
|
|
183
199
|
function requiresAllSignatures(signatures) {
|
|
184
200
|
return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
|
|
185
201
|
}
|
|
186
|
-
exports.requiresAllSignatures = requiresAllSignatures;
|
|
187
202
|
/**
|
|
188
203
|
* Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
|
|
189
204
|
* are ignored.
|
|
@@ -215,7 +230,6 @@ function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexe
|
|
|
215
230
|
}
|
|
216
231
|
return true;
|
|
217
232
|
}
|
|
218
|
-
exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
|
|
219
233
|
/**
|
|
220
234
|
* Returns the transaction Type based on the transaction instructions.
|
|
221
235
|
* Wallet initialization, Transfer and Staking transactions are supported.
|
|
@@ -225,21 +239,38 @@ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstruct
|
|
|
225
239
|
*/
|
|
226
240
|
function getTransactionType(transaction) {
|
|
227
241
|
const { instructions } = transaction;
|
|
242
|
+
if (validateRawMsgInstruction(instructions)) {
|
|
243
|
+
return sdk_core_1.TransactionType.StakingAuthorizeRaw;
|
|
244
|
+
}
|
|
228
245
|
validateIntructionTypes(instructions);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
246
|
+
// check if deactivate instruction does not exist because deactivate can be include a transfer instruction
|
|
247
|
+
const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
|
|
248
|
+
const memoData = memoInstruction?.data.toString('utf-8');
|
|
249
|
+
if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length == 0) {
|
|
250
|
+
for (const instruction of instructions) {
|
|
251
|
+
const instructionType = getInstructionType(instruction);
|
|
252
|
+
// Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
|
|
253
|
+
if ((instructionType === constants_1.ValidInstructionTypesEnum.Transfer && !memoData?.includes('PrepareForRevoke')) ||
|
|
254
|
+
instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
|
|
255
|
+
return sdk_core_1.TransactionType.Send;
|
|
256
|
+
}
|
|
234
257
|
}
|
|
235
258
|
}
|
|
236
259
|
if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
|
|
237
260
|
return sdk_core_1.TransactionType.WalletInitialization;
|
|
238
261
|
}
|
|
239
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.
|
|
262
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingActivateInstructionsIndexes) ||
|
|
263
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
|
|
240
264
|
return sdk_core_1.TransactionType.StakingActivate;
|
|
241
265
|
}
|
|
242
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.
|
|
266
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
|
|
267
|
+
return sdk_core_1.TransactionType.StakingAuthorize;
|
|
268
|
+
}
|
|
269
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
|
|
270
|
+
return sdk_core_1.TransactionType.StakingDelegate;
|
|
271
|
+
}
|
|
272
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingDeactivateInstructionsIndexes) ||
|
|
273
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
|
|
243
274
|
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes)) {
|
|
244
275
|
return sdk_core_1.TransactionType.StakingDeactivate;
|
|
245
276
|
}
|
|
@@ -249,11 +280,13 @@ function getTransactionType(transaction) {
|
|
|
249
280
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
|
|
250
281
|
return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
|
|
251
282
|
}
|
|
283
|
+
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
|
|
284
|
+
return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
|
|
285
|
+
}
|
|
252
286
|
else {
|
|
253
287
|
throw new sdk_core_1.NotSupported('Invalid transaction, transaction not supported or invalid');
|
|
254
288
|
}
|
|
255
289
|
}
|
|
256
|
-
exports.getTransactionType = getTransactionType;
|
|
257
290
|
/**
|
|
258
291
|
* Returns the instruction Type based on the solana instructions.
|
|
259
292
|
* Throws if the solana instruction program is not supported
|
|
@@ -268,6 +301,16 @@ function getInstructionType(instruction) {
|
|
|
268
301
|
case web3_js_1.SystemProgram.programId.toString():
|
|
269
302
|
return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
|
|
270
303
|
case spl_token_1.TOKEN_PROGRAM_ID.toString():
|
|
304
|
+
try {
|
|
305
|
+
const decodedInstruction = (0, spl_token_1.decodeCloseAccountInstruction)(instruction);
|
|
306
|
+
if (decodedInstruction && decodedInstruction.data.instruction === 9) {
|
|
307
|
+
return 'CloseAssociatedTokenAccount';
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch (e) {
|
|
311
|
+
// ignore error and default to TokenTransfer
|
|
312
|
+
return 'TokenTransfer';
|
|
313
|
+
}
|
|
271
314
|
return 'TokenTransfer';
|
|
272
315
|
case web3_js_1.StakeProgram.programId.toString():
|
|
273
316
|
return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
|
|
@@ -279,11 +322,12 @@ function getInstructionType(instruction) {
|
|
|
279
322
|
else {
|
|
280
323
|
throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
|
|
281
324
|
}
|
|
325
|
+
case COMPUTE_BUDGET:
|
|
326
|
+
return 'SetPriorityFee';
|
|
282
327
|
default:
|
|
283
328
|
throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
|
|
284
329
|
}
|
|
285
330
|
}
|
|
286
|
-
exports.getInstructionType = getInstructionType;
|
|
287
331
|
/**
|
|
288
332
|
* Validate solana instructions types to see if they are supported by the builder.
|
|
289
333
|
* Throws if the instruction type is invalid.
|
|
@@ -298,21 +342,58 @@ function validateIntructionTypes(instructions) {
|
|
|
298
342
|
}
|
|
299
343
|
}
|
|
300
344
|
}
|
|
301
|
-
|
|
345
|
+
/**
|
|
346
|
+
* Validate solana instructions match raw msg authorize transaction
|
|
347
|
+
*
|
|
348
|
+
* @param {TransactionInstruction} instructions - a solana instruction
|
|
349
|
+
* @returns {boolean} true if the instructions match the raw msg authorize transaction
|
|
350
|
+
*/
|
|
351
|
+
function validateRawMsgInstruction(instructions) {
|
|
352
|
+
// as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
|
|
353
|
+
if (instructions.length === 2) {
|
|
354
|
+
const programId1 = instructions[0].programId.toString();
|
|
355
|
+
const programId2 = instructions[1].programId.toString();
|
|
356
|
+
if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
|
|
357
|
+
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
358
|
+
const data = instructions[1].data.toString('hex');
|
|
359
|
+
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
360
|
+
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (instructions.length === 3) {
|
|
366
|
+
const programId1 = instructions[0].programId.toString();
|
|
367
|
+
const programId2 = instructions[1].programId.toString();
|
|
368
|
+
const programId3 = instructions[2].programId.toString();
|
|
369
|
+
if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
|
|
370
|
+
programId2 === web3_js_1.StakeProgram.programId.toString() &&
|
|
371
|
+
programId3 === web3_js_1.StakeProgram.programId.toString()) {
|
|
372
|
+
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
373
|
+
const data = instructions[1].data.toString('hex');
|
|
374
|
+
const data2 = instructions[2].data.toString('hex');
|
|
375
|
+
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
376
|
+
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
|
|
377
|
+
(data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
302
384
|
/**
|
|
303
385
|
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
304
386
|
*
|
|
305
387
|
* @param {string} rawTransaction - Transaction in base64 string format
|
|
306
388
|
*/
|
|
307
|
-
function validateRawTransaction(rawTransaction) {
|
|
389
|
+
function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
308
390
|
if (!rawTransaction) {
|
|
309
391
|
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
|
|
310
392
|
}
|
|
311
|
-
if (!isValidRawTransaction(rawTransaction)) {
|
|
393
|
+
if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
|
|
312
394
|
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
|
|
313
395
|
}
|
|
314
396
|
}
|
|
315
|
-
exports.validateRawTransaction = validateRawTransaction;
|
|
316
397
|
/**
|
|
317
398
|
* Validates address to check if it exists and is a valid Solana public key
|
|
318
399
|
*
|
|
@@ -324,7 +405,6 @@ function validateAddress(address, fieldName) {
|
|
|
324
405
|
throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
|
|
325
406
|
}
|
|
326
407
|
}
|
|
327
|
-
exports.validateAddress = validateAddress;
|
|
328
408
|
/**
|
|
329
409
|
* Get the statics coin object matching a given Solana token address if it exists
|
|
330
410
|
*
|
|
@@ -342,12 +422,33 @@ function getSolTokenFromAddress(tokenAddress, network) {
|
|
|
342
422
|
const tokensArray = tokens.map((token) => token);
|
|
343
423
|
if (tokensArray.length >= 1) {
|
|
344
424
|
// there should never be two tokens with the same contract address, so we assert that here
|
|
345
|
-
assert_1.default(tokensArray.length === 1);
|
|
425
|
+
(0, assert_1.default)(tokensArray.length === 1);
|
|
426
|
+
return tokensArray[0];
|
|
427
|
+
}
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Get the statics coin object matching a given Solana token address if it exists
|
|
432
|
+
*
|
|
433
|
+
* @param tokenAddress The token address to match against
|
|
434
|
+
* @param network Solana Mainnet or Testnet
|
|
435
|
+
* @returns statics BaseCoin object for the matching token
|
|
436
|
+
*/
|
|
437
|
+
function getSolTokenFromAddressOnly(tokenAddress) {
|
|
438
|
+
const tokens = statics_1.coins.filter((coin) => {
|
|
439
|
+
if (coin instanceof statics_1.SolCoin) {
|
|
440
|
+
return coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
|
|
441
|
+
}
|
|
442
|
+
return false;
|
|
443
|
+
});
|
|
444
|
+
const tokensArray = tokens.map((token) => token);
|
|
445
|
+
if (tokensArray.length >= 1) {
|
|
446
|
+
// there should never be two tokens with the same contract address, so we assert that here
|
|
447
|
+
(0, assert_1.default)(tokensArray.length === 1);
|
|
346
448
|
return tokensArray[0];
|
|
347
449
|
}
|
|
348
450
|
return undefined;
|
|
349
451
|
}
|
|
350
|
-
exports.getSolTokenFromAddress = getSolTokenFromAddress;
|
|
351
452
|
/**
|
|
352
453
|
* Get the solana token object from token name
|
|
353
454
|
* @param tokenName The token name to match against
|
|
@@ -367,33 +468,41 @@ function getSolTokenFromTokenName(tokenName) {
|
|
|
367
468
|
return undefined;
|
|
368
469
|
}
|
|
369
470
|
}
|
|
370
|
-
exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
|
|
371
471
|
/**
|
|
372
472
|
* Get the solana associated token account address
|
|
373
|
-
* @param tokenAddress
|
|
473
|
+
* @param tokenAddress token mint address
|
|
374
474
|
* @param ownerAddress The owner of the associated token account
|
|
375
475
|
* @returns The associated token account address
|
|
376
476
|
* */
|
|
377
|
-
async function getAssociatedTokenAccountAddress(
|
|
477
|
+
async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress, allowOwnerOffCurve = false) {
|
|
478
|
+
const mintPublicKey = new web3_js_1.PublicKey(tokenMintAddress);
|
|
378
479
|
const ownerPublicKey = new web3_js_1.PublicKey(ownerAddress);
|
|
379
480
|
// tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
|
|
380
|
-
if (!web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
|
|
481
|
+
if (!allowOwnerOffCurve && !web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
|
|
381
482
|
throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
|
|
382
483
|
}
|
|
383
|
-
const
|
|
484
|
+
const coin = getSolTokenFromAddressOnly(tokenMintAddress);
|
|
485
|
+
if (!coin || !(coin instanceof statics_1.SolCoin)) {
|
|
486
|
+
throw new sdk_core_1.UtilsError(`Token not found or not a Solana token: ${tokenMintAddress}`);
|
|
487
|
+
}
|
|
488
|
+
let ataAddress;
|
|
489
|
+
const programId = coin.programId;
|
|
490
|
+
if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
491
|
+
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, false, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
|
|
495
|
+
}
|
|
384
496
|
return ataAddress.toString();
|
|
385
497
|
}
|
|
386
|
-
exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
|
|
387
498
|
function validateMintAddress(mintAddress) {
|
|
388
499
|
if (!mintAddress || !isValidAddress(mintAddress)) {
|
|
389
500
|
throw new sdk_core_1.BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
|
|
390
501
|
}
|
|
391
502
|
}
|
|
392
|
-
exports.validateMintAddress = validateMintAddress;
|
|
393
503
|
function validateOwnerAddress(ownerAddress) {
|
|
394
504
|
if (!ownerAddress || !isValidAddress(ownerAddress)) {
|
|
395
505
|
throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
|
|
396
506
|
}
|
|
397
507
|
}
|
|
398
|
-
exports.validateOwnerAddress = validateOwnerAddress;
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZDQVV5QjtBQUN6QixnREFBd0I7QUFDeEIsZ0VBQXFDO0FBQ3JDLDJDQVdxQjtBQUNyQixtREFPOEI7QUFFOUIsMERBQTZCO0FBQzdCLGlEQUE2RztBQUM3RyxpREFBaUc7QUFDakcsb0RBQTRCO0FBRTVCLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscUZBQXFGO0FBQzNILE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdEO0FBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7QUFFdkQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUZELHdDQUVDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLElBQUk7UUFDRixPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsQ0FDbkgsQ0FBQztLQUNIO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQVJELHdDQVFDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLGlCQUFpQixDQUFDLE1BQTJCO0lBQzNELElBQUk7UUFDRixNQUFNLEdBQUcsR0FBZSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekYsT0FBTyxD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LEdBQUcsV0FBVyxDQUFDLENBQUM7S0FDeEY7QUFDSCxDQUFDO0FBSkQsa0RBSUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN2RCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ2xELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx3Q0FBd0MsR0FBRyxZQUFZLENBQUMsQ0FBQztLQUMxRjtBQUNILENBQUM7QUFKRCxvREFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7XG4gIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIE1BWF9NRU1PX0xFTkdUSCxcbiAgTUVNT19QUk9HUkFNX1BLLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMsXG4gIFZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUyxcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbiAgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVmFsaWRJbnN0cnVjdGlvblR5cGVzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELCBUT0tFTl9QUk9HUkFNX0lELCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNDb3B5W2luc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXV0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyIHx8XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIH1cbiAgfVxuICBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIG5vdCBzdXBwb3J0ZWQgb3IgaW52YWxpZCcpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgc29sYW5hIGluc3RydWN0aW9ucy5cbiAqIFRocm93cyBpZiB0aGUgc29sYW5hIGluc3RydWN0aW9uIHByb2dyYW0gaXMgbm90IHN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1ZhbGlkSW5zdHJ1Y3Rpb25UeXBlc30gLSBhIHNvbGFuYSBpbnN0cnVjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBWYWxpZEluc3RydWN0aW9uVHlwZXMge1xuICBzd2l0Y2ggKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgY2FzZSBuZXcgUHVibGljS2V5KE1FTU9fUFJPR1JBTV9QSykudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiAnTWVtbyc7XG4gICAgY2FzZSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBUT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ1Rva2VuVHJhbnNmZXInO1xuICAgIGNhc2UgU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgd2hlbiBAc3BsLXRva2VuIHN1cHBvcnRzIGRlY29kaW5nIGFzc29jaWF0ZWQgdG9rZW4gaW5zdHJ1Y3Rpb25zXG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdJbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiBwcm9ncmFtIGlkIG5vdCBzdXBwb3J0ZWQ6ICcgKyBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246IFVuZGVmaW5lZCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWRkcmVzcyB0byBjaGVjayBpZiBpdCBleGlzdHMgYW5kIGlzIGEgdmFsaWQgU29sYW5hIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0aWNzIGNvaW4gb2JqZWN0IG1hdGNoaW5nIGEgZ2l2ZW4gU29sYW5hIHRva2VuIGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcGFyYW0gbmV0d29yayBTb2xhbmEgTWFpbm5ldCBvciBUZXN0bmV0XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2xUb2tlbkZyb21BZGRyZXNzKHRva2VuQWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yayk6IFJlYWRvbmx5PEJhc2VDb2luPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgIGlmIChjb2luIGluc3RhbmNlb2YgU29sQ29pbikge1xuICAgICAgcmV0dXJuIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiYgY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3NcbiAqIEBwYXJhbSBvd25lckFkZHJlc3MgVGhlIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgb3duZXJBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghUHVibGljS2V5LmlzT25DdXJ2ZShvd25lclB1YmxpY0tleS50b0J1ZmZlcigpKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIG93bmVyQWRkcmVzcyAtIGFkZHJlc3Mgb2ZmIGVkMjU1MTkgY3VydmUsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbiAgY29uc3QgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MobmV3IFB1YmxpY0tleSh0b2tlbkFkZHJlc3MpLCBvd25lclB1YmxpY0tleSk7XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKSB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuIl19
|
|
508
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBMkRBLHdDQUVDO0FBR0Qsd0NBUUM7QUFHRCw4Q0FPQztBQUdELDRDQVFDO0FBR0QsNENBTUM7QUFJRCxvREFFQztBQVFELHNDQUdDO0FBUUQsb0RBR0M7QUFRRCxrQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQTJCQztBQVNELGdEQStDQztBQVNELGdEQW1DQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQTBCQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFwakJELG1EQU84QjtBQUM5QixpREFBaUc7QUFDakcsaURBTTJCO0FBQzNCLDZDQVV5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUN4QiwwREFBNkI7QUFDN0IsMkNBbUJxQjtBQUdyQixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBRXJFLGtCQUFrQjtBQUNsQixTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsU0FBZ0IsY0FBYyxDQUFDLElBQVk7SUFDekMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMs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QyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQzNGLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICBkZWNvZGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbixcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyxcbiAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBLZXlwYWlyLFxuICBQdWJsaWNLZXksXG4gIFNpZ25hdHVyZVB1YmtleVBhaXIsXG4gIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHtcbiAgYXRhQ2xvc2VJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIE1BWF9NRU1PX0xFTkdUSCxcbiAgTUVNT19QUk9HUkFNX1BLLFxuICBub25jZUFkdmFuY2VJbnN0cnVjdGlvbixcbiAgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YSxcbiAgdmFsaWRJbnN0cnVjdGlvbkRhdGEyLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxuICB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBWYWxpZEluc3RydWN0aW9uVHlwZXMgfSBmcm9tICcuL2lmYWNlJztcblxuY29uc3QgREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSCA9IDMyOyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL3Byb2dyYW1taW5nLW1vZGVsL3RyYW5zYWN0aW9ucyNibG9ja2hhc2gtZm9ybWF0XG5jb25zdCBERUNPREVEX1NJR05BVFVSRV9MRU5HVEggPSA2NDsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjc2lnbmF0dXJlXG5jb25zdCBCQVNFXzU4X0VOQ09ORElOR19SRUdFWCA9ICdbMS05QS1ISi1OUC1aYS1rbS16XSc7XG5jb25zdCBDT01QVVRFX0JVREdFVCA9ICdDb21wdXRlQnVkZ2V0MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZUFsbFNpZ25hdHVyZXMgLSByZXF1aXJlIGFsbCBzaWduYXR1cmVzIHRvIGJlIHByZXNlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmVyaWZ5U2lnbmF0dXJlcyAtIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBpZiBzaWduYXR1cmUgZm9yIG1lc3NhZ2UgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNlcmlhbGl6ZWRUeCAtIHR4IGFzIGEgYmFzZTY0IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIHNpZ25hdHVyZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleSAtIHB1YmxpYyBrZXkgYXMgYmFzZSA1OFxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgcHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNlcmlhbGl6ZWRUeCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgcHVibGljS2V5Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxuICBjb25zdCBtc2cgPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpKS5zZXJpYWxpemVNZXNzYWdlKCk7XG4gIGNvbnN0IHNpZyA9IGJhc2U1OFRvVWludDhBcnJheShzaWduYXR1cmUpO1xuICBjb25zdCBwdWIgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gIHJldHVybiBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KG1zZywgc2lnLCBwdWIudG9CdWZmZXIoKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBiYXNlNTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gYW4gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTU4VG9VaW50OEFycmF5KGlucHV0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJzNTguZGVjb2RlKGlucHV0KSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgYmFzZTU4IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IC0gYW4gVWludDhBcnJheVxuICogQHJldHVybnMge3N0cmluZ30gLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVpbnQ4QXJyYXlUb2Jhc2U1OChpbnB1dDogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBiczU4LmVuY29kZShpbnB1dCk7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIGFtb3VudCBvZiBzaWduYXR1cmVzIGFyZSBub3QgbnVsbC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIGFuIGFycmF5IG9mIFNpZ25hdHVyZVB1YmtleVBhaXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gdGhlIGFtb3VudCBvZiB2YWxpZCBzaWduYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IG51bWJlciB7XG4gIHJldHVybiBzaWduYXR1cmVzLmZpbHRlcigoc2lnKSA9PiAhIXNpZy5zaWduYXR1cmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgc2lnbmF0dXJlcyBhcmUgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc0FsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYXR1cmVzLmxlbmd0aCA+IDAgJiYgY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzKSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyLiBNZW1vIGFuZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uc1xuICogYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IG1hdGNoZXMgYnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0cnVjdGlvbnNDb3B5ID0gWy4uLmluc3RydWN0aW9uc107IC8vIE1ha2UgYSBjb3B5IHNpbmNlIHdlIG1heSBtb2RpZnkgdGhlIGFycmF5IGJlbG93XG4gIC8vIEFkdmFuY2VOb25jZUFjY291bnQgaXMgb3B0aW9uYWwgYW5kIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZGRlZCwgaXQgZG9lcyBub3QgbWF0dGVyIHRvIG1hdGNoIHRoZSB0eXBlXG4gIGlmIChpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBpZiAoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSkgPT09ICdBZHZhbmNlTm9uY2VBY2NvdW50Jykge1xuICAgICAgaW5zdHJ1Y3Rpb25zQ29weS5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW8gaXMgb3B0aW9uYWwgYW5kIHRoZSBsYXN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgLy8gV2h5IGhhdmUgaXQgaW4gaW5zdHJ1Y3Rpb25LZXlzIGlmIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQ/XG4gIGNvbnN0IGluc3RydWN0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zS2V5c1tpbnN0cnVjdGlvbnNLZXlzLmxlbmd0aCAtIDFdID09PSAnTWVtbycpIHtcbiAgICBpbnN0cnVjdGlvbnNLZXlzLnBvcCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyIHVzaW5nIHRoZSBpbmRleC5cbiAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGluc3RydWN0aW9uc0tleXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zQ29weVtpbnN0cnVjdGlvbkluZGV4ZXNba2V5TmFtZV1dKTtcbiAgICBpZiAocmVzdWx0ICE9PSBrZXlOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zYWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlICB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBXYWxsZXQgaW5pdGlhbGl6YXRpb24sIFRyYW5zZmVyIGFuZCBTdGFraW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7U29sVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gdGhlIHNvbGFuYSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gLSB0aGUgdHlwZSBvZiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0cmFuc2FjdGlvbjtcbiAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdztcbiAgfVxuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICAvLyBjaGVjayBpZiBkZWFjdGl2YXRlIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGJlY2F1c2UgZGVhY3RpdmF0ZSBjYW4gYmUgaW5jbHVkZSBhIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gIGNvbnN0IG1lbW9JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9ucy5maW5kKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ01lbW8nKTtcbiAgY29uc3QgbWVtb0RhdGEgPSBtZW1vSW5zdHJ1Y3Rpb24/LmRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGlmIChpbnN0cnVjdGlvbnMuZmlsdGVyKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ0RlYWN0aXZhdGUnKS5sZW5ndGggPT0gMCkge1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvblR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgLy8gQ2hlY2sgaWYgbWVtbyBpbnN0cnVjdGlvbiBpcyB0aGVyZSBhbmQgaWYgaXQgY29udGFpbnMgJ1ByZXBhcmVGb3JSZXZva2UnIGJlY2F1c2UgTWFyaW5hZGUgc3Rha2luZyBkZWFjdGl2YXRlIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZSB0aGlzXG4gICAgICBpZiAoXG4gICAgICAgIChpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXIgJiYgIW1lbW9EYXRhPy5pbmNsdWRlcygnUHJlcGFyZUZvclJldm9rZScpKSB8fFxuICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBtYXJpbmFkZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcylcbiAgKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU7XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YUNsb3NlSW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIG5vdCBzdXBwb3J0ZWQgb3IgaW52YWxpZCcpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgc29sYW5hIGluc3RydWN0aW9ucy5cbiAqIFRocm93cyBpZiB0aGUgc29sYW5hIGluc3RydWN0aW9uIHByb2dyYW0gaXMgbm90IHN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1ZhbGlkSW5zdHJ1Y3Rpb25UeXBlc30gLSBhIHNvbGFuYSBpbnN0cnVjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBWYWxpZEluc3RydWN0aW9uVHlwZXMge1xuICBzd2l0Y2ggKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgY2FzZSBuZXcgUHVibGljS2V5KE1FTU9fUFJPR1JBTV9QSykudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiAnTWVtbyc7XG4gICAgY2FzZSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBUT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNvZGVkSW5zdHJ1Y3Rpb24gPSBkZWNvZGVDbG9zZUFjY291bnRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgICAgIGlmIChkZWNvZGVkSW5zdHJ1Y3Rpb24gJiYgZGVjb2RlZEluc3RydWN0aW9uLmRhdGEuaW5zdHJ1Y3Rpb24gPT09IDkpIHtcbiAgICAgICAgICByZXR1cm4gJ0Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlIGVycm9yIGFuZCBkZWZhdWx0IHRvIFRva2VuVHJhbnNmZXJcbiAgICAgICAgcmV0dXJuICdUb2tlblRyYW5zZmVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnVG9rZW5UcmFuc2Zlcic7XG4gICAgY2FzZSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB3aGVuIEBzcGwtdG9rZW4gc3VwcG9ydHMgZGVjb2RpbmcgYXNzb2NpYXRlZCB0b2tlbiBpbnN0cnVjdGlvbnNcbiAgICAgIGlmIChpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgY2FzZSBDT01QVVRFX0JVREdFVDpcbiAgICAgIHJldHVybiAnU2V0UHJpb3JpdHlGZWUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgbWF0Y2ggcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICAvLyBhcyB3ZWIzLmpzIGNhbm5vdCBkZWNvZGUgYXV0aG9yaXplIGluc3RydWN0aW9uIGZyb20gQ0xJLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IG1hbnVhbGx5IGZpcnN0XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMyA9IGluc3RydWN0aW9uc1syXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAoXG4gICAgICBwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDMgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGRhdGEyID0gaW5zdHJ1Y3Rpb25zWzJdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKSAmJlxuICAgICAgICAoZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhZGRyZXNzIHx8ICFpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBvciBtaXNzaW5nICR7ZmllbGROYW1lfSwgZ290OiAke2FkZHJlc3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuQWRkcmVzczogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFsbG93T3duZXJPZmZDdXJ2ZSA9IGZhbHNlXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtaW50UHVibGljS2V5ID0gbmV3IFB1YmxpY0tleSh0b2tlbk1pbnRBZGRyZXNzKTtcbiAgY29uc3Qgb3duZXJQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KG93bmVyQWRkcmVzcyk7XG5cbiAgLy8gdG9rZW5BZGRyZXNzIGFyZSBub3Qgb24gZWQyNTUxOSBjdXJ2ZSwgc28gdGhleSBjYW4ndCBiZSB1c2VkIGFzIG93bmVyQWRkcmVzc1xuICBpZiAoIWFsbG93T3duZXJPZmZDdXJ2ZSAmJiAhUHVibGljS2V5LmlzT25DdXJ2ZShvd25lclB1YmxpY0tleS50b0J1ZmZlcigpKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIG93bmVyQWRkcmVzcyAtIGFkZHJlc3Mgb2ZmIGVkMjU1MTkgY3VydmUsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzc09ubHkodG9rZW5NaW50QWRkcmVzcyk7XG4gIGlmICghY29pbiB8fCAhKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBUb2tlbiBub3QgZm91bmQgb3Igbm90IGEgU29sYW5hIHRva2VuOiAke3Rva2VuTWludEFkZHJlc3N9YCk7XG4gIH1cblxuICBsZXQgYXRhQWRkcmVzczogUHVibGljS2V5O1xuICBjb25zdCBwcm9ncmFtSWQgPSBjb2luLnByb2dyYW1JZDtcbiAgaWYgKHByb2dyYW1JZCA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhtaW50UHVibGljS2V5LCBvd25lclB1YmxpY0tleSwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIH0gZWxzZSB7XG4gICAgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MobWludFB1YmxpY0tleSwgb3duZXJQdWJsaWNLZXksIGFsbG93T3duZXJPZmZDdXJ2ZSk7XG4gIH1cbiAgcmV0dXJuIGF0YUFkZHJlc3MudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWludEFkZHJlc3MobWludEFkZHJlc3M6IHN0cmluZykge1xuICBpZiAoIW1pbnRBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhtaW50QWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgbWludEFkZHJlc3MsIGdvdDogJyArIG1pbnRBZGRyZXNzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPd25lckFkZHJlc3Mob3duZXJBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFvd25lckFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG93bmVyQWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgb3duZXJBZGRyZXNzLCBnb3Q6ICcgKyBvd25lckFkZHJlc3MpO1xuICB9XG59XG4iXX0=
|