@bitgo-beta/sdk-coin-near 1.3.19-beta.94 → 1.3.19-beta.940
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 +505 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/constants.d.ts +3 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +5 -2
- package/dist/src/lib/contractCallWrapper.d.ts +4 -4
- package/dist/src/lib/contractCallWrapper.d.ts.map +1 -1
- package/dist/src/lib/contractCallWrapper.js +9 -6
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +64 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.js +156 -0
- package/dist/src/lib/iface.d.ts +9 -7
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -6
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +28 -10
- package/dist/src/lib/keyPair.js +26 -12
- package/dist/src/lib/stakingActivateBuilder.d.ts +2 -2
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +32 -17
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +2 -2
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +32 -17
- package/dist/src/lib/stakingWithdrawBuilder.d.ts +2 -2
- package/dist/src/lib/stakingWithdrawBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingWithdrawBuilder.js +32 -17
- package/dist/src/lib/storageDepositTransferBuilder.d.ts +36 -0
- package/dist/src/lib/storageDepositTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/storageDepositTransferBuilder.js +115 -0
- package/dist/src/lib/transaction.d.ts +32 -5
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +376 -93
- package/dist/src/lib/transactionBuilder.d.ts +10 -4
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +43 -18
- package/dist/src/lib/transactionBuilderFactory.d.ts +4 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +14 -1
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +28 -13
- package/dist/src/lib/utils.d.ts +16 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +32 -7
- package/dist/src/near.d.ts +11 -11
- package/dist/src/near.d.ts.map +1 -1
- package/dist/src/near.js +164 -21
- package/dist/src/nep141Token.d.ts +20 -0
- package/dist/src/nep141Token.d.ts.map +1 -0
- package/dist/src/nep141Token.js +98 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/package.json +12 -10
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -11,25 +15,39 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
11
15
|
}) : function(o, v) {
|
|
12
16
|
o["default"] = v;
|
|
13
17
|
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
21
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
37
|
};
|
|
24
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
39
|
exports.Transaction = void 0;
|
|
40
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
41
|
+
const js_sha256_1 = require("js-sha256");
|
|
42
|
+
const nearAPI = __importStar(require("near-api-js"));
|
|
43
|
+
const transaction_1 = require("near-api-js/lib/transaction");
|
|
44
|
+
const crypto_1 = require("@near-js/crypto");
|
|
45
|
+
const transactions_1 = require("@near-js/transactions");
|
|
26
46
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
47
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
27
48
|
const constants_1 = require("./constants");
|
|
28
|
-
const utils_1 = __importDefault(require("./utils"));
|
|
29
49
|
const keyPair_1 = require("./keyPair");
|
|
30
|
-
const
|
|
31
|
-
const sha256 = __importStar(require("js-sha256"));
|
|
32
|
-
const bs58_1 = __importDefault(require("bs58"));
|
|
50
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
33
51
|
class Transaction extends sdk_core_1.BaseTransaction {
|
|
34
52
|
constructor(coinConfig) {
|
|
35
53
|
super(coinConfig);
|
|
@@ -66,29 +84,47 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
66
84
|
if (!this._nearTransaction) {
|
|
67
85
|
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
68
86
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
const parsedActions = [];
|
|
88
|
+
const actions = this._nearTransaction.actions;
|
|
89
|
+
actions.map((action) => {
|
|
90
|
+
let parsedAction = {};
|
|
91
|
+
if (action.enum === 'transfer' && action.transfer) {
|
|
92
|
+
parsedAction = { transfer: action.transfer };
|
|
93
|
+
}
|
|
94
|
+
else if (action.enum === 'functionCall' && action.functionCall) {
|
|
95
|
+
const functionCall = action.functionCall;
|
|
96
|
+
parsedAction = {
|
|
97
|
+
functionCall: {
|
|
98
|
+
methodName: functionCall.methodName,
|
|
99
|
+
args: JSON.parse(Buffer.from(functionCall.args).toString()),
|
|
100
|
+
gas: functionCall.gas.toString(),
|
|
101
|
+
deposit: functionCall.deposit.toString(),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
parsedActions.push(parsedAction);
|
|
106
|
+
});
|
|
107
|
+
let signature;
|
|
108
|
+
if (this._nearSignedTransaction?.signature?.ed25519Signature) {
|
|
109
|
+
signature = {
|
|
110
|
+
keyType: crypto_1.KeyType.ED25519,
|
|
111
|
+
data: new Uint8Array(this._nearSignedTransaction.signature.ed25519Signature.data),
|
|
82
112
|
};
|
|
83
113
|
}
|
|
114
|
+
let publicKey;
|
|
115
|
+
if (this._nearTransaction.publicKey?.ed25519Key) {
|
|
116
|
+
const rawBytes = new Uint8Array(this._nearTransaction.publicKey.ed25519Key.data);
|
|
117
|
+
const encoded = nearAPI.utils.serialize.base_encode(rawBytes);
|
|
118
|
+
publicKey = `ed25519:${encoded}`;
|
|
119
|
+
}
|
|
84
120
|
return {
|
|
85
121
|
id: this._id,
|
|
86
122
|
signerId: this._nearTransaction.signerId,
|
|
87
|
-
publicKey:
|
|
123
|
+
publicKey: publicKey,
|
|
88
124
|
nonce: this._nearTransaction.nonce,
|
|
89
125
|
receiverId: this._nearTransaction.receiverId,
|
|
90
|
-
actions:
|
|
91
|
-
signature:
|
|
126
|
+
actions: parsedActions,
|
|
127
|
+
signature: signature ? signature : undefined,
|
|
92
128
|
};
|
|
93
129
|
}
|
|
94
130
|
/**
|
|
@@ -107,16 +143,50 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
107
143
|
fromRawTransaction(rawTx) {
|
|
108
144
|
const bufferRawTransaction = constants_1.HEX_REGEX.test(rawTx) ? Buffer.from(rawTx, 'hex') : Buffer.from(rawTx, 'base64');
|
|
109
145
|
try {
|
|
110
|
-
const signedTx = nearAPI.utils.serialize.deserialize(nearAPI.transactions.SCHEMA
|
|
111
|
-
signedTx.transaction.
|
|
146
|
+
const signedTx = nearAPI.utils.serialize.deserialize(nearAPI.transactions.SCHEMA.SignedTransaction, bufferRawTransaction);
|
|
147
|
+
signedTx.transaction.actions = signedTx.transaction.actions.map((a) => {
|
|
148
|
+
const action = new transactions_1.Action(a);
|
|
149
|
+
switch (action.enum) {
|
|
150
|
+
case 'transfer': {
|
|
151
|
+
if (action.transfer?.deposit) {
|
|
152
|
+
return (0, transaction_1.transfer)(BigInt(action.transfer.deposit));
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case 'functionCall': {
|
|
157
|
+
if (action.functionCall) {
|
|
158
|
+
return (0, transaction_1.functionCall)(action.functionCall.methodName, new Uint8Array(action.functionCall.args), BigInt(action.functionCall.gas), BigInt(action.functionCall.deposit));
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return action;
|
|
164
|
+
});
|
|
112
165
|
this._nearSignedTransaction = signedTx;
|
|
113
166
|
this._nearTransaction = signedTx.transaction;
|
|
114
167
|
this._id = utils_1.default.base58Encode(this.getTransactionHash());
|
|
115
168
|
}
|
|
116
169
|
catch (e) {
|
|
117
170
|
try {
|
|
118
|
-
const unsignedTx = nearAPI.utils.serialize.deserialize(nearAPI.transactions.SCHEMA
|
|
119
|
-
unsignedTx.
|
|
171
|
+
const unsignedTx = nearAPI.utils.serialize.deserialize(nearAPI.transactions.SCHEMA.Transaction, bufferRawTransaction);
|
|
172
|
+
unsignedTx.actions = unsignedTx.actions.map((a) => {
|
|
173
|
+
const action = new transactions_1.Action(a);
|
|
174
|
+
switch (action.enum) {
|
|
175
|
+
case 'transfer': {
|
|
176
|
+
if (action.transfer?.deposit) {
|
|
177
|
+
return (0, transaction_1.transfer)(BigInt(action.transfer.deposit));
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case 'functionCall': {
|
|
182
|
+
if (action.functionCall) {
|
|
183
|
+
return (0, transaction_1.functionCall)(action.functionCall.methodName, new Uint8Array(action.functionCall.args), BigInt(action.functionCall.gas), BigInt(action.functionCall.deposit));
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return action;
|
|
189
|
+
});
|
|
120
190
|
this._nearTransaction = unsignedTx;
|
|
121
191
|
this._id = utils_1.default.base58Encode(this.getTransactionHash());
|
|
122
192
|
}
|
|
@@ -150,7 +220,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
150
220
|
* set transaction type by staking contract method names.
|
|
151
221
|
* @param methodName method name to match and set the transaction type
|
|
152
222
|
*/
|
|
153
|
-
|
|
223
|
+
setTypeByFunctionCall(methodName) {
|
|
154
224
|
switch (methodName) {
|
|
155
225
|
case constants_1.StakingContractMethodNames.DepositAndStake:
|
|
156
226
|
this.setTransactionType(sdk_core_1.TransactionType.StakingActivate);
|
|
@@ -161,82 +231,184 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
161
231
|
case constants_1.StakingContractMethodNames.Withdraw:
|
|
162
232
|
this.setTransactionType(sdk_core_1.TransactionType.StakingWithdraw);
|
|
163
233
|
break;
|
|
234
|
+
case constants_1.FT_TRANSFER:
|
|
235
|
+
this.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
236
|
+
break;
|
|
237
|
+
case constants_1.STORAGE_DEPOSIT:
|
|
238
|
+
this.setTransactionType(sdk_core_1.TransactionType.StorageDeposit);
|
|
239
|
+
break;
|
|
164
240
|
}
|
|
165
241
|
}
|
|
166
242
|
/**
|
|
167
243
|
* Check if method is allowed on Near account-lib implementation.
|
|
168
244
|
* This method should check on all contracts added to Near.
|
|
169
|
-
* @param methodName contract call method name to check if
|
|
245
|
+
* @param methodName contract call method name to check if it's allowed.
|
|
170
246
|
*/
|
|
171
247
|
validateMethodAllowed(methodName) {
|
|
172
|
-
|
|
248
|
+
const allowedMethods = [...Object.values(constants_1.StakingContractMethodNames), ...constants_1.FUNGIBLE_TOKEN_RELATED_METHODS];
|
|
249
|
+
if (!allowedMethods.includes(methodName)) {
|
|
173
250
|
throw new sdk_core_1.InvalidTransactionError('unsupported function call in raw transaction');
|
|
174
251
|
}
|
|
175
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Check if valid methods are present for batching of actions
|
|
255
|
+
*
|
|
256
|
+
* @param {TxAction[]} actions list of near transaction actions
|
|
257
|
+
* @returns {void}
|
|
258
|
+
*/
|
|
259
|
+
validateBatchingMethods(actions) {
|
|
260
|
+
actions.every((action) => {
|
|
261
|
+
if (action.enum !== 'functionCall' || !action.functionCall) {
|
|
262
|
+
throw new sdk_core_1.InvalidTransactionError('invalid action for batching');
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
if (actions[0].functionCall?.methodName !== constants_1.STORAGE_DEPOSIT ||
|
|
266
|
+
actions[1].functionCall?.methodName !== constants_1.FT_TRANSFER) {
|
|
267
|
+
throw new sdk_core_1.InvalidTransactionError('invalid action sequence: expected storage_deposit followed by ft_transfer');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
176
270
|
/**
|
|
177
271
|
* Build input and output field for this transaction
|
|
178
272
|
*
|
|
179
273
|
*/
|
|
180
274
|
loadInputsAndOutputs() {
|
|
181
|
-
if (this._nearTransaction.actions.length
|
|
275
|
+
if (!this._nearTransaction.actions || !this._nearTransaction.actions.length) {
|
|
276
|
+
throw new sdk_core_1.InvalidTransactionError('no actions in raw transaction');
|
|
277
|
+
}
|
|
278
|
+
// TODO: modify this for send-many support
|
|
279
|
+
// currently only storage deposit + ft transfer are allowed for batching
|
|
280
|
+
if (this._nearTransaction.actions.length > 2) {
|
|
182
281
|
throw new sdk_core_1.InvalidTransactionError('too many actions in raw transaction');
|
|
183
282
|
}
|
|
283
|
+
// check for correct sequence of actions
|
|
284
|
+
if (this._nearTransaction.actions.length === 2) {
|
|
285
|
+
this.validateBatchingMethods(this._nearTransaction.actions);
|
|
286
|
+
}
|
|
184
287
|
const action = this._nearTransaction.actions[0];
|
|
288
|
+
const actions = this._nearTransaction.actions;
|
|
185
289
|
switch (action.enum) {
|
|
186
290
|
case 'transfer':
|
|
187
291
|
this.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
188
292
|
break;
|
|
189
293
|
case 'functionCall':
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
294
|
+
if (action.functionCall) {
|
|
295
|
+
const methodName = action.functionCall.methodName;
|
|
296
|
+
this.validateMethodAllowed(methodName);
|
|
297
|
+
this.setTypeByFunctionCall(methodName);
|
|
298
|
+
}
|
|
193
299
|
break;
|
|
194
300
|
default:
|
|
195
301
|
throw new sdk_core_1.InvalidTransactionError('unsupported action in raw transaction');
|
|
196
302
|
}
|
|
303
|
+
// if there are 2 actions, we know for sure that it is storage deposit + ft transfer
|
|
304
|
+
if (actions.length === 2) {
|
|
305
|
+
this.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
306
|
+
}
|
|
197
307
|
const outputs = [];
|
|
198
308
|
const inputs = [];
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
309
|
+
actions.map((action) => {
|
|
310
|
+
switch (this.type) {
|
|
311
|
+
case sdk_core_1.TransactionType.Send:
|
|
312
|
+
if (action.transfer) {
|
|
313
|
+
const amount = action.transfer.deposit.toString();
|
|
314
|
+
inputs.push({
|
|
315
|
+
address: this._nearTransaction.signerId,
|
|
316
|
+
value: amount,
|
|
317
|
+
coin: this._coinConfig.name,
|
|
318
|
+
});
|
|
319
|
+
outputs.push({
|
|
320
|
+
address: this._nearTransaction.receiverId,
|
|
321
|
+
value: amount,
|
|
322
|
+
coin: this._coinConfig.name,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
else if (action.functionCall) {
|
|
326
|
+
if (action.functionCall.methodName === 'ft_transfer') {
|
|
327
|
+
const parsedArgs = JSON.parse(Buffer.from(action.functionCall.args).toString());
|
|
328
|
+
inputs.push({
|
|
329
|
+
address: this._nearTransaction.signerId,
|
|
330
|
+
value: parsedArgs.amount,
|
|
331
|
+
coin: this._coinConfig.name,
|
|
332
|
+
});
|
|
333
|
+
outputs.push({
|
|
334
|
+
address: parsedArgs.receiver_id,
|
|
335
|
+
value: parsedArgs.amount,
|
|
336
|
+
coin: this._coinConfig.name,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
if (action.functionCall.methodName === 'storage_deposit') {
|
|
340
|
+
const parsedArgs = JSON.parse(Buffer.from(action.functionCall.args).toString());
|
|
341
|
+
const receiverId = parsedArgs.account_id ? parsedArgs.account_id : this._nearTransaction.signerId;
|
|
342
|
+
inputs.push({
|
|
343
|
+
address: this._nearTransaction.signerId,
|
|
344
|
+
value: action.functionCall.deposit.toString(),
|
|
345
|
+
coin: this._coinConfig.network.type === statics_1.NetworkType.TESTNET
|
|
346
|
+
? `t${this._coinConfig.family}`
|
|
347
|
+
: this._coinConfig.family,
|
|
348
|
+
});
|
|
349
|
+
outputs.push({
|
|
350
|
+
address: receiverId,
|
|
351
|
+
value: action.functionCall.deposit.toString(),
|
|
352
|
+
coin: this._coinConfig.network.type === statics_1.NetworkType.TESTNET
|
|
353
|
+
? `t${this._coinConfig.family}`
|
|
354
|
+
: this._coinConfig.family,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
case sdk_core_1.TransactionType.StakingActivate:
|
|
360
|
+
if (action.functionCall) {
|
|
361
|
+
const stakingAmount = action.functionCall.deposit.toString();
|
|
362
|
+
inputs.push({
|
|
363
|
+
address: this._nearTransaction.signerId,
|
|
364
|
+
value: stakingAmount,
|
|
365
|
+
coin: this._coinConfig.name,
|
|
366
|
+
});
|
|
367
|
+
outputs.push({
|
|
368
|
+
address: this._nearTransaction.receiverId,
|
|
369
|
+
value: stakingAmount,
|
|
370
|
+
coin: this._coinConfig.name,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
case sdk_core_1.TransactionType.StakingWithdraw:
|
|
375
|
+
if (action.functionCall) {
|
|
376
|
+
const stakingWithdrawAmount = JSON.parse(Buffer.from(action.functionCall.args).toString()).amount;
|
|
377
|
+
inputs.push({
|
|
378
|
+
address: this._nearTransaction.receiverId,
|
|
379
|
+
value: stakingWithdrawAmount,
|
|
380
|
+
coin: this._coinConfig.name,
|
|
381
|
+
});
|
|
382
|
+
outputs.push({
|
|
383
|
+
address: this._nearTransaction.signerId,
|
|
384
|
+
value: stakingWithdrawAmount,
|
|
385
|
+
coin: this._coinConfig.name,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
break;
|
|
389
|
+
case sdk_core_1.TransactionType.StorageDeposit: {
|
|
390
|
+
if (action.functionCall) {
|
|
391
|
+
const parsedArgs = JSON.parse(Buffer.from(action.functionCall.args).toString());
|
|
392
|
+
const receiverId = parsedArgs.account_id ? parsedArgs.account_id : this._nearTransaction.signerId;
|
|
393
|
+
inputs.push({
|
|
394
|
+
address: this._nearTransaction.signerId,
|
|
395
|
+
value: action.functionCall.deposit.toString(),
|
|
396
|
+
coin: this._coinConfig.network.type === statics_1.NetworkType.TESTNET
|
|
397
|
+
? `t${this._coinConfig.family}`
|
|
398
|
+
: this._coinConfig.family,
|
|
399
|
+
});
|
|
400
|
+
outputs.push({
|
|
401
|
+
address: receiverId,
|
|
402
|
+
value: action.functionCall.deposit.toString(),
|
|
403
|
+
coin: this._coinConfig.network.type === statics_1.NetworkType.TESTNET
|
|
404
|
+
? `t${this._coinConfig.family}`
|
|
405
|
+
: this._coinConfig.family,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
});
|
|
240
412
|
this._outputs = outputs;
|
|
241
413
|
this._inputs = inputs;
|
|
242
414
|
}
|
|
@@ -247,14 +419,13 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
247
419
|
* @returns {TransactionExplanation}
|
|
248
420
|
*/
|
|
249
421
|
explainTransferTransaction(json, explanationResult) {
|
|
250
|
-
var _a, _b;
|
|
251
422
|
return {
|
|
252
423
|
...explanationResult,
|
|
253
|
-
outputAmount:
|
|
424
|
+
outputAmount: json.actions[0].transfer?.deposit.toString() || '',
|
|
254
425
|
outputs: [
|
|
255
426
|
{
|
|
256
427
|
address: json.receiverId,
|
|
257
|
-
amount:
|
|
428
|
+
amount: json.actions[0].transfer?.deposit.toString() || '',
|
|
258
429
|
},
|
|
259
430
|
],
|
|
260
431
|
};
|
|
@@ -266,14 +437,13 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
266
437
|
* @returns {TransactionExplanation}
|
|
267
438
|
*/
|
|
268
439
|
explainStakingActivateTransaction(json, explanationResult) {
|
|
269
|
-
var _a, _b;
|
|
270
440
|
return {
|
|
271
441
|
...explanationResult,
|
|
272
|
-
outputAmount:
|
|
442
|
+
outputAmount: json.actions[0].functionCall?.deposit.toString() || '',
|
|
273
443
|
outputs: [
|
|
274
444
|
{
|
|
275
445
|
address: json.receiverId,
|
|
276
|
-
amount:
|
|
446
|
+
amount: json.actions[0].functionCall?.deposit.toString() || '',
|
|
277
447
|
},
|
|
278
448
|
],
|
|
279
449
|
};
|
|
@@ -285,8 +455,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
285
455
|
* @returns {TransactionExplanation}
|
|
286
456
|
*/
|
|
287
457
|
explainStakingWithdrawTransaction(json, explanationResult) {
|
|
288
|
-
|
|
289
|
-
const amount = (_a = json.actions[0].functionCall) === null || _a === void 0 ? void 0 : _a.args.amount;
|
|
458
|
+
const amount = json.actions[0].functionCall?.args.amount;
|
|
290
459
|
return {
|
|
291
460
|
...explanationResult,
|
|
292
461
|
outputAmount: amount,
|
|
@@ -298,6 +467,115 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
298
467
|
],
|
|
299
468
|
};
|
|
300
469
|
}
|
|
470
|
+
/**
|
|
471
|
+
* Calculates the total fungible token amount & total native near amount
|
|
472
|
+
*
|
|
473
|
+
* @param {Action[]} actions the list of delegate transaction actions
|
|
474
|
+
* @returns {String} either native near amount or fungible token amount
|
|
475
|
+
*/
|
|
476
|
+
calculateTotalOutputAmount(actions) {
|
|
477
|
+
let hasFtTransfer = false;
|
|
478
|
+
let hasStorageDeposit = false;
|
|
479
|
+
let totalTokenAmount = BigInt(0);
|
|
480
|
+
let totalNearDeposit = BigInt(0);
|
|
481
|
+
for (const action of actions) {
|
|
482
|
+
if (action.functionCall) {
|
|
483
|
+
const functionCall = action.functionCall;
|
|
484
|
+
const methodName = functionCall.methodName;
|
|
485
|
+
const args = functionCall.args;
|
|
486
|
+
const deposit = BigInt(functionCall.deposit);
|
|
487
|
+
if (methodName === constants_1.FT_TRANSFER) {
|
|
488
|
+
hasFtTransfer = true;
|
|
489
|
+
const amountStr = args['amount'];
|
|
490
|
+
if (args.amount) {
|
|
491
|
+
totalTokenAmount += BigInt(amountStr);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if (methodName === constants_1.STORAGE_DEPOSIT) {
|
|
495
|
+
hasStorageDeposit = true;
|
|
496
|
+
totalNearDeposit += deposit;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (hasFtTransfer) {
|
|
501
|
+
return totalTokenAmount.toString();
|
|
502
|
+
}
|
|
503
|
+
else if (hasStorageDeposit) {
|
|
504
|
+
return totalNearDeposit.toString();
|
|
505
|
+
}
|
|
506
|
+
return '';
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Returns a complete explanation for a token transfer transaction
|
|
510
|
+
* @param {TxData} json The transaction data in json format
|
|
511
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
512
|
+
* @returns {TransactionExplanation}
|
|
513
|
+
*/
|
|
514
|
+
explainTokenTransferTransaction(json, explanationResult) {
|
|
515
|
+
const actions = json.actions;
|
|
516
|
+
const outputAmount = this.calculateTotalOutputAmount(actions);
|
|
517
|
+
const outputs = [];
|
|
518
|
+
actions.map((action) => {
|
|
519
|
+
if (action.functionCall) {
|
|
520
|
+
const functionCall = action.functionCall;
|
|
521
|
+
if (functionCall.methodName === constants_1.FT_TRANSFER) {
|
|
522
|
+
const amountStr = functionCall.args['amount'];
|
|
523
|
+
const receiverId = functionCall.args['receiver_id'];
|
|
524
|
+
// in ft transfer, the outer receiver id will be contract address of the token
|
|
525
|
+
const tokenName = utils_1.default.findTokenNameFromContractAddress(json.receiverId);
|
|
526
|
+
const output = {
|
|
527
|
+
address: receiverId,
|
|
528
|
+
amount: amountStr,
|
|
529
|
+
};
|
|
530
|
+
if (tokenName) {
|
|
531
|
+
output.tokenName = tokenName;
|
|
532
|
+
}
|
|
533
|
+
outputs.push(output);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
return {
|
|
538
|
+
...explanationResult,
|
|
539
|
+
outputAmount: outputAmount,
|
|
540
|
+
outputs: outputs,
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Returns a complete explanation for a storage deposit transaction
|
|
545
|
+
* @param {TxData} json The transaction data in json format
|
|
546
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
547
|
+
* @returns {TransactionExplanation}
|
|
548
|
+
*/
|
|
549
|
+
explainStorageDepositTransaction(json, explanationResult) {
|
|
550
|
+
const actions = json.actions;
|
|
551
|
+
const outputAmount = this.calculateTotalOutputAmount(actions);
|
|
552
|
+
const outputs = [];
|
|
553
|
+
actions.map((action) => {
|
|
554
|
+
if (action.functionCall) {
|
|
555
|
+
const functionCall = action.functionCall;
|
|
556
|
+
if (functionCall.methodName === constants_1.STORAGE_DEPOSIT) {
|
|
557
|
+
const receiverId = functionCall.args && functionCall.args['account_id']
|
|
558
|
+
? functionCall.args['account_id']
|
|
559
|
+
: json.signerId;
|
|
560
|
+
// in storage deposit, the outer receiver id will be contract address of the token
|
|
561
|
+
const tokenName = utils_1.default.findTokenNameFromContractAddress(json.receiverId);
|
|
562
|
+
const output = {
|
|
563
|
+
address: receiverId,
|
|
564
|
+
amount: functionCall.deposit,
|
|
565
|
+
};
|
|
566
|
+
if (tokenName) {
|
|
567
|
+
output.tokenName = tokenName;
|
|
568
|
+
}
|
|
569
|
+
outputs.push(output);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
return {
|
|
574
|
+
...explanationResult,
|
|
575
|
+
outputAmount: outputAmount,
|
|
576
|
+
outputs: outputs,
|
|
577
|
+
};
|
|
578
|
+
}
|
|
301
579
|
/** @inheritdoc */
|
|
302
580
|
explainTransaction() {
|
|
303
581
|
const result = this.toJson();
|
|
@@ -316,6 +594,9 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
316
594
|
};
|
|
317
595
|
switch (this.type) {
|
|
318
596
|
case sdk_core_1.TransactionType.Send:
|
|
597
|
+
if (result.actions.length > 1 || result.actions[0].functionCall) {
|
|
598
|
+
return this.explainTokenTransferTransaction(result, explanationResult);
|
|
599
|
+
}
|
|
319
600
|
return this.explainTransferTransaction(result, explanationResult);
|
|
320
601
|
case sdk_core_1.TransactionType.StakingActivate:
|
|
321
602
|
return this.explainStakingActivateTransaction(result, explanationResult);
|
|
@@ -323,13 +604,15 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
323
604
|
return explanationResult;
|
|
324
605
|
case sdk_core_1.TransactionType.StakingWithdraw:
|
|
325
606
|
return this.explainStakingWithdrawTransaction(result, explanationResult);
|
|
607
|
+
case sdk_core_1.TransactionType.StorageDeposit:
|
|
608
|
+
return this.explainStorageDepositTransaction(result, explanationResult);
|
|
326
609
|
default:
|
|
327
610
|
throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
|
|
328
611
|
}
|
|
329
612
|
}
|
|
330
613
|
getTransactionHash() {
|
|
331
|
-
const serializedTx = nearAPI.utils.serialize.serialize(nearAPI.transactions.SCHEMA, this._nearTransaction);
|
|
332
|
-
return new Uint8Array(
|
|
614
|
+
const serializedTx = nearAPI.utils.serialize.serialize(nearAPI.transactions.SCHEMA.Transaction, this._nearTransaction);
|
|
615
|
+
return new Uint8Array(js_sha256_1.sha256.array(serializedTx));
|
|
333
616
|
}
|
|
334
617
|
get signablePayload() {
|
|
335
618
|
if (!this._nearTransaction) {
|
|
@@ -358,11 +641,11 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
358
641
|
/** @inheritdoc **/
|
|
359
642
|
get signature() {
|
|
360
643
|
const signatures = [];
|
|
361
|
-
if (this._nearSignedTransaction) {
|
|
362
|
-
signatures.push(bs58_1.default.encode(this._nearSignedTransaction.signature.data));
|
|
644
|
+
if (this._nearSignedTransaction && this._nearSignedTransaction.signature.ed25519Signature) {
|
|
645
|
+
signatures.push(bs58_1.default.encode(this._nearSignedTransaction.signature.ed25519Signature.data));
|
|
363
646
|
}
|
|
364
647
|
return signatures;
|
|
365
648
|
}
|
|
366
649
|
}
|
|
367
650
|
exports.Transaction = Transaction;
|
|
368
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFPOEI7QUFHOUIsMkNBQW9FO0FBQ3BFLG9EQUE0QjtBQUM1Qix1Q0FBb0M7QUFDcEMscURBQXVDO0FBQ3ZDLGtEQUFvQztBQUNwQyxnREFBMEI7QUFFMUIsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFJOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxlQUFlLENBQUMsRUFBb0M7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLGVBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLElBQUk7WUFDRixJQUFJLGlCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE1BQU07WUFDTixPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQjtZQUM3QyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FB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QUFZLENBQUMsU0FBUyxDQUFDO2dCQUM1QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPO2dCQUNoRCxJQUFJLEVBQUUsU0FBUzthQUNoQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELG1CQUFtQjtJQUNuQixJQUFJLFNBQVM7UUFDWCxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM1RTtRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQTVXRCxrQ0E0V0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHhEYXRhLCBBY3Rpb24gfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEhFWF9SRUdFWCwgU3Rha2luZ0NvbnRyYWN0TWV0aG9kTmFtZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCAqIGFzIG5lYXJBUEkgZnJvbSAnbmVhci1hcGktanMnO1xuaW1wb3J0ICogYXMgc2hhMjU2IGZyb20gJ2pzLXNoYTI1Nic7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9uZWFyVHJhbnNhY3Rpb246IG5lYXJBUEkudHJhbnNhY3Rpb25zLlRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9uZWFyU2lnbmVkVHJhbnNhY3Rpb246IG5lYXJBUEkudHJhbnNhY3Rpb25zLlNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICBnZXQgbmVhclRyYW5zYWN0aW9uKCk6IG5lYXJBUEkudHJhbnNhY3Rpb25zLlRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmVhclRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2V0IG5lYXJUcmFuc2FjdGlvbih0eDogbmVhckFQSS50cmFuc2FjdGlvbnMuVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl9uZWFyVHJhbnNhY3Rpb24gPSB0eDtcbiAgICB0aGlzLl9pZCA9IHV0aWxzLmJhc2U1OEVuY29kZSh0aGlzLmdldFRyYW5zYWN0aW9uSGFzaCgpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fbmVhclRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgY29uc3QgdHhTZXJhbGl6ZWQgPSB0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb25cbiAgICAgID8gQnVmZmVyLmZyb20odGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uLmVuY29kZSgpKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgIDogQnVmZmVyLmZyb20odGhpcy5fbmVhclRyYW5zYWN0aW9uLmVuY29kZSgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIHR4U2VyYWxpemVkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fbmVhclRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyc2VkQWN0aW9uOiBBY3Rpb24gPSB7fTtcbiAgICBpZiAodGhpcy5fbmVhclRyYW5zYWN0aW9uLmFjdGlvbnNbMF0uZW51bSA9PT0gJ3RyYW5zZmVyJykge1xuICAgICAgcGFyc2VkQWN0aW9uID0geyB0cmFuc2ZlcjogdGhpcy5fbmVhclRyYW5zYWN0aW9uLmFjdGlvbnNbMF0udHJhbnNmZXIgfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX25lYXJUcmFuc2FjdGlvbi5hY3Rpb25zWzBdLmVudW0gPT09ICdmdW5jdGlvbkNhbGwnKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbkNhbGxPYmplY3QgPSB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9uc1swXS5mdW5jdGlvbkNhbGw7XG4gICAgICBwYXJzZWRBY3Rpb24gPSB7XG4gICAgICAgIGZ1bmN0aW9uQ2FsbDoge1xuICAgICAgICAgIG1ldGhvZE5hbWU6IGZ1bmN0aW9uQ2FsbE9iamVjdC5tZXRob2ROYW1lLFxuICAgICAgICAgIGFyZ3M6IEpTT04ucGFyc2UoQnVmZmVyLmZyb20oZnVuY3Rpb25DYWxsT2JqZWN0LmFyZ3MpLnRvU3RyaW5nKCkpLFxuICAgICAgICAgIGdhczogZnVuY3Rpb25DYWxsT2JqZWN0Lmdhcy50b1N0cmluZygpLFxuICAgICAgICAgIGRlcG9zaXQ6IGZ1bmN0aW9uQ2FsbE9iamVjdC5kZXBvc2l0LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5faWQsXG4gICAgICBzaWduZXJJZDogdGhpcy5fbmVhclRyYW5zYWN0aW9uLnNpZ25lcklkLFxuICAgICAgcHVibGljS2V5OiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucHVibGljS2V5LnRvU3RyaW5nKCksXG4gICAgICBub25jZTogdGhpcy5fbmVhclRyYW5zYWN0aW9uLm5vbmNlLFxuICAgICAgcmVjZWl2ZXJJZDogdGhpcy5fbmVhclRyYW5zYWN0aW9uLnJlY2VpdmVySWQsXG4gICAgICBhY3Rpb25zOiBbcGFyc2VkQWN0aW9uXSxcbiAgICAgIHNpZ25hdHVyZTogdHlwZW9mIHRoaXMuX25lYXJTaWduZWRUcmFuc2FjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiB0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1R4XG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlclJhd1RyYW5zYWN0aW9uID0gSEVYX1JFR0VYLnRlc3QocmF3VHgpID8gQnVmZmVyLmZyb20ocmF3VHgsICdoZXgnKSA6IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gbmVhckFQSS51dGlscy5zZXJpYWxpemUuZGVzZXJpYWxpemUoXG4gICAgICAgIG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQSxcbiAgICAgICAgbmVhckFQSS50cmFuc2FjdGlvbnMuU2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIGJ1ZmZlclJhd1RyYW5zYWN0aW9uXG4gICAgICApO1xuICAgICAgc2lnbmVkVHgudHJhbnNhY3Rpb24ubm9uY2UgPSBwYXJzZUludChzaWduZWRUeC50cmFuc2FjdGlvbi5ub25jZS50b1N0cmluZygpLCAxMCk7XG4gICAgICB0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduZWRUeDtcbiAgICAgIHRoaXMuX25lYXJUcmFuc2FjdGlvbiA9IHNpZ25lZFR4LnRyYW5zYWN0aW9uO1xuICAgICAgdGhpcy5faWQgPSB1dGlscy5iYXNlNThFbmNvZGUodGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdW5zaWduZWRUeCA9IG5lYXJBUEkudXRpbHMuc2VyaWFsaXplLmRlc2VyaWFsaXplKFxuICAgICAgICAgIG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQSxcbiAgICAgICAgICBuZWFyQVBJLnRyYW5zYWN0aW9ucy5UcmFuc2FjdGlvbixcbiAgICAgICAgICBidWZmZXJSYXdUcmFuc2FjdGlvblxuICAgICAgICApO1xuICAgICAgICB1bnNpZ25lZFR4Lm5vbmNlID0gcGFyc2VJbnQodW5zaWduZWRUeC5ub25jZS50b1N0cmluZygpLCAxMCk7XG4gICAgICAgIHRoaXMuX25lYXJUcmFuc2FjdGlvbiA9IHVuc2lnbmVkVHg7XG4gICAgICAgIHRoaXMuX2lkID0gdXRpbHMuYmFzZTU4RW5jb2RlKHRoaXMuZ2V0VHJhbnNhY3Rpb25IYXNoKCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3VuYWJsZSB0byBidWlsZCB0cmFuc2FjdGlvbiBmcm9tIHJhdycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRoaXMgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBzaWduZXIga2V5XG4gICAqL1xuXG4gIHNpZ24oc2lnbmVyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9uZWFyVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkVHhIYXNoID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzaWduZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2VyaWFsaXplZFR4SGFzaCk7XG4gICAgdGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uID0gbmV3IG5lYXJBUEkudHJhbnNhY3Rpb25zLlNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgIHRyYW5zYWN0aW9uOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24sXG4gICAgICBzaWduYXR1cmU6IG5ldyBuZWFyQVBJLnRyYW5zYWN0aW9ucy5TaWduYXR1cmUoe1xuICAgICAgICBrZXlUeXBlOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucHVibGljS2V5LmtleVR5cGUsXG4gICAgICAgIGRhdGE6IHNpZ25hdHVyZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdHJhbnNhY3Rpb24gdHlwZSBieSBzdGFraW5nIGNvbnRyYWN0IG1ldGhvZCBuYW1lcy5cbiAgICogQHBhcmFtIG1ldGhvZE5hbWUgbWV0aG9kIG5hbWUgdG8gbWF0Y2ggYW5kIHNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRUeXBlQnlTdGFraW5nTWV0aG9kKG1ldGhvZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHN3aXRjaCAobWV0aG9kTmFtZSkge1xuICAgICAgY2FzZSBTdGFraW5nQ29udHJhY3RNZXRob2ROYW1lcy5EZXBvc2l0QW5kU3Rha2U6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3Rha2luZ0NvbnRyYWN0TWV0aG9kTmFtZXMuVW5zdGFrZTpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YWtpbmdDb250cmFjdE1ldGhvZE5hbWVzLldpdGhkcmF3OlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1ldGhvZCBpcyBhbGxvd2VkIG9uIE5lYXIgYWNjb3VudC1saWIgaW1wbGVtZW50YXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBjaGVjayBvbiBhbGwgY29udHJhY3RzIGFkZGVkIHRvIE5lYXIuXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIGNvbnRyYWN0IGNhbGwgbWV0aG9kIG5hbWUgdG8gY2hlY2sgaWYgaXRzIGFsbG93ZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTWV0aG9kQWxsb3dlZChtZXRob2ROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoU3Rha2luZ0NvbnRyYWN0TWV0aG9kTmFtZXMpLnNvbWUoKGl0ZW0pID0+IGl0ZW0gPT09IG1ldGhvZE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3Vuc3VwcG9ydGVkIGZ1bmN0aW9uIGNhbGwgaW4gcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGlucHV0IGFuZCBvdXRwdXQgZmllbGQgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbiAgICpcbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndG9vIG1hbnkgYWN0aW9ucyBpbiByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9uc1swXTtcblxuICAgIHN3aXRjaCAoYWN0aW9uLmVudW0pIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uQ2FsbCc6XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhY3Rpb24uZnVuY3Rpb25DYWxsLm1ldGhvZE5hbWU7XG4gICAgICAgIHRoaXMudmFsaWRhdGVNZXRob2RBbGxvd2VkKG1ldGhvZE5hbWUpO1xuICAgICAgICB0aGlzLnNldFR5cGVCeVN0YWtpbmdNZXRob2QobWV0aG9kTmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCd1bnN1cHBvcnRlZCBhY3Rpb24gaW4gcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICBjb25zdCBhbW91bnQgPSBhY3Rpb24udHJhbnNmZXIuZGVwb3NpdC50b1N0cmluZygpO1xuICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogdGhpcy5fbmVhclRyYW5zYWN0aW9uLnNpZ25lcklkLFxuICAgICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICBjb25zdCBzdGFraW5nQW1vdW50ID0gYWN0aW9uLmZ1bmN0aW9uQ2FsbC5kZXBvc2l0LnRvU3RyaW5nKCk7XG4gICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uc2lnbmVySWQsXG4gICAgICAgICAgdmFsdWU6IHN0YWtpbmdBbW91bnQsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICB2YWx1ZTogc3Rha2luZ0Ftb3VudCxcbiAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3QW1vdW50ID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShhY3Rpb24uZnVuY3Rpb25DYWxsLmFyZ3MpLnRvU3RyaW5nKCkpLmFtb3VudDtcbiAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5yZWNlaXZlcklkLFxuICAgICAgICAgIHZhbHVlOiBzdGFraW5nV2l0aGRyYXdBbW91bnQsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uc2lnbmVySWQsXG4gICAgICAgICAgdmFsdWU6IHN0YWtpbmdXaXRoZHJhd0Ftb3VudCxcbiAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSB0cmFuc2ZlciB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1R4RGF0YX0ganNvbiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBpbiBqc29uIGZvcm1hdFxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbiB0byBiZSBjb21wbGV0ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259XG4gICAqL1xuICBleHBsYWluVHJhbnNmZXJUcmFuc2FjdGlvbihqc29uOiBUeERhdGEsIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50OiBqc29uLmFjdGlvbnNbMF0udHJhbnNmZXI/LmRlcG9zaXQudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGpzb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICBhbW91bnQ6IGpzb24uYWN0aW9uc1swXS50cmFuc2Zlcj8uZGVwb3NpdC50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSBzdGFraW5nIGFjdGl2YXRlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5TdGFraW5nQWN0aXZhdGVUcmFuc2FjdGlvbihqc29uOiBUeERhdGEsIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50OiBqc29uLmFjdGlvbnNbMF0uZnVuY3Rpb25DYWxsPy5kZXBvc2l0LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnJlY2VpdmVySWQsXG4gICAgICAgICAgYW1vdW50OiBqc29uLmFjdGlvbnNbMF0uZnVuY3Rpb25DYWxsPy5kZXBvc2l0LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIGZvciBhIHN0YWtpbmcgd2l0aGRyYXcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUeERhdGF9IGpzb24gVGhlIHRyYW5zYWN0aW9uIGRhdGEgaW4ganNvbiBmb3JtYXRcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYW5hdGlvblJlc3VsdCBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gdG8gYmUgY29tcGxldGVkXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufVxuICAgKi9cbiAgZXhwbGFpblN0YWtpbmdXaXRoZHJhd1RyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBhbW91bnQgPSBqc29uLmFjdGlvbnNbMF0uZnVuY3Rpb25DYWxsPy5hcmdzLmFtb3VudCBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50OiBhbW91bnQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnNpZ25lcklkLFxuICAgICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW107XG4gICAgY29uc3QgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSB7XG4gICAgICAvLyB0eGhhc2ggdXNlZCB0byBpZGVudGlmeSB0aGUgdHJhbnNhY3Rpb25zXG4gICAgICBpZDogcmVzdWx0LmlkIHx8ICcnLFxuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIGZlZTogeyBmZWU6ICcnIH0sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgfTtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5TdGFraW5nQWN0aXZhdGVUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICByZXR1cm4gZXhwbGFuYXRpb25SZXN1bHQ7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5TdGFraW5nV2l0aGRyYXdUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUcmFuc2FjdGlvbkhhc2goKTogVWludDhBcnJheSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gbmVhckFQSS51dGlscy5zZXJpYWxpemUuc2VyaWFsaXplKG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQSwgdGhpcy5fbmVhclRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoc2hhMjU2LnNoYTI1Ni5hcnJheShzZXJpYWxpemVkVHgpKTtcbiAgfVxuXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuX25lYXJUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNpZ25lZCBwYXlsb2FkIHVzaW5nIGNvbnN0cnVjdC5zaWduVHhcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBidWlsZCBzdGVwIGlmIGEgVFNTIHNpZ25hdHVyZVxuICAgKiBpcyBhZGRlZCBhbmQgd2lsbCBzZXQgdGhlIHNpZ25UcmFuc2FjdGlvbiB3aGljaCBpcyB0aGUgdHhIZXggdGhhdCB3aWxsIGJlIGJyb2FkY2FzdGVkXG4gICAqIEFzIHdlbGwgYXMgYWRkIHRoZSBzaWduYXR1cmUgdXNlZCB0byBzaWduIHRvIHRoZSBzaWduYXR1cmUgYXJyYXkgaW4gaGV4IGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgdG8gYmUgYWRkZWQgdG8gYSBuZWFyIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RTaWduZWRQYXlsb2FkKHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uID0gbmV3IG5lYXJBUEkudHJhbnNhY3Rpb25zLlNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgIHRyYW5zYWN0aW9uOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24sXG4gICAgICBzaWduYXR1cmU6IG5ldyBuZWFyQVBJLnRyYW5zYWN0aW9ucy5TaWduYXR1cmUoe1xuICAgICAgICBrZXlUeXBlOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucHVibGljS2V5LmtleVR5cGUsXG4gICAgICAgIGRhdGE6IHNpZ25hdHVyZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuICAvKiogQGluaGVyaXRkb2MgKiovXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNpZ25hdHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICBzaWduYXR1cmVzLnB1c2goYmFzZTU4LmVuY29kZSh0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmRhdGEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgfVxufVxuIl19
|
|
651
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUEwQjtBQUMxQix5Q0FBbUM7QUFDbkMscURBQXVDO0FBQ3ZDLDZEQUFxRTtBQUNyRSw0Q0FBMEM7QUFDMUMsd0RBQWtIO0FBRWxILG1EQVE4QjtBQUM5QixpREFBMEU7QUFFMUUsMkNBTXFCO0FBRXJCLHVDQUFvQztBQUNwQyxvREFBNEI7QUFFNUIsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFJOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxlQUFlLENBQUMsRUFBb0M7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLGVBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLElBQUksQ0FBQztZQUNILElBQUksaUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsd0JB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QUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFGLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQS9vQkQsa0NBK29CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdqcy1zaGEyNTYnO1xuaW1wb3J0ICogYXMgbmVhckFQSSBmcm9tICduZWFyLWFwaS1qcyc7XG5pbXBvcnQgeyBmdW5jdGlvbkNhbGwsIHRyYW5zZmVyIH0gZnJvbSAnbmVhci1hcGktanMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVR5cGUgfSBmcm9tICdAbmVhci1qcy9jcnlwdG8nO1xuaW1wb3J0IHsgQWN0aW9uIGFzIFR4QWN0aW9uLCBTaWduZWRUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BuZWFyLWpzL3RyYW5zYWN0aW9ucyc7XG5cbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBJVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmltcG9ydCB7XG4gIEZUX1RSQU5TRkVSLFxuICBGVU5HSUJMRV9UT0tFTl9SRUxBVEVEX01FVEhPRFMsXG4gIEhFWF9SRUdFWCxcbiAgU3Rha2luZ0NvbnRyYWN0TWV0aG9kTmFtZXMsXG4gIFNUT1JBR0VfREVQT1NJVCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWN0aW9uLCBTaWduYXR1cmUsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX25lYXJUcmFuc2FjdGlvbjogbmVhckFQSS50cmFuc2FjdGlvbnMuVHJhbnNhY3Rpb247XG4gIHByaXZhdGUgX25lYXJTaWduZWRUcmFuc2FjdGlvbjogbmVhckFQSS50cmFuc2FjdGlvbnMuU2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIGdldCBuZWFyVHJhbnNhY3Rpb24oKTogbmVhckFQSS50cmFuc2FjdGlvbnMuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZWFyVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgbmVhclRyYW5zYWN0aW9uKHR4OiBuZWFyQVBJLnRyYW5zYWN0aW9ucy5UcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX25lYXJUcmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX2lkID0gdXRpbHMuYmFzZTU4RW5jb2RlKHRoaXMuZ2V0VHJhbnNhY3Rpb25IYXNoKCkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9uZWFyVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICBjb25zdCB0eFNlcmFsaXplZCA9IHRoaXMuX25lYXJTaWduZWRUcmFuc2FjdGlvblxuICAgICAgPyBCdWZmZXIuZnJvbSh0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24uZW5jb2RlKCkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgOiBCdWZmZXIuZnJvbSh0aGlzLl9uZWFyVHJhbnNhY3Rpb24uZW5jb2RlKCkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICByZXR1cm4gdHhTZXJhbGl6ZWQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9uZWFyVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZEFjdGlvbnM6IEFjdGlvbltdID0gW107XG4gICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5hY3Rpb25zO1xuICAgIGFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIGxldCBwYXJzZWRBY3Rpb246IEFjdGlvbiA9IHt9O1xuICAgICAgaWYgKGFjdGlvbi5lbnVtID09PSAndHJhbnNmZXInICYmIGFjdGlvbi50cmFuc2Zlcikge1xuICAgICAgICBwYXJzZWRBY3Rpb24gPSB7IHRyYW5zZmVyOiBhY3Rpb24udHJhbnNmZXIgfTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVudW0gPT09ICdmdW5jdGlvbkNhbGwnICYmIGFjdGlvbi5mdW5jdGlvbkNhbGwpIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25DYWxsID0gYWN0aW9uLmZ1bmN0aW9uQ2FsbDtcbiAgICAgICAgcGFyc2VkQWN0aW9uID0ge1xuICAgICAgICAgIGZ1bmN0aW9uQ2FsbDoge1xuICAgICAgICAgICAgbWV0aG9kTmFtZTogZnVuY3Rpb25DYWxsLm1ldGhvZE5hbWUsXG4gICAgICAgICAgICBhcmdzOiBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGZ1bmN0aW9uQ2FsbC5hcmdzKS50b1N0cmluZygpKSxcbiAgICAgICAgICAgIGdhczogZnVuY3Rpb25DYWxsLmdhcy50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVwb3NpdDogZnVuY3Rpb25DYWxsLmRlcG9zaXQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcGFyc2VkQWN0aW9ucy5wdXNoKHBhcnNlZEFjdGlvbik7XG4gICAgfSk7XG5cbiAgICBsZXQgc2lnbmF0dXJlOiBTaWduYXR1cmUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX25lYXJTaWduZWRUcmFuc2FjdGlvbj8uc2lnbmF0dXJlPy5lZDI1NTE5U2lnbmF0dXJlKSB7XG4gICAgICBzaWduYXR1cmUgPSB7XG4gICAgICAgIGtleVR5cGU6IEtleVR5cGUuRUQyNTUxOSxcbiAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkodGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5lZDI1NTE5U2lnbmF0dXJlLmRhdGEpLFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucHVibGljS2V5Py5lZDI1NTE5S2V5KSB7XG4gICAgICBjb25zdCByYXdCeXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMuX25lYXJUcmFuc2FjdGlvbi5wdWJsaWNLZXkuZWQyNTUxOUtleS5kYXRhKTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBuZWFyQVBJLnV0aWxzLnNlcmlhbGl6ZS5iYXNlX2VuY29kZShyYXdCeXRlcyk7XG4gICAgICBwdWJsaWNLZXkgPSBgZWQyNTUxOToke2VuY29kZWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgc2lnbmVySWQ6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5zaWduZXJJZCxcbiAgICAgIHB1YmxpY0tleTogcHVibGljS2V5LFxuICAgICAgbm9uY2U6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5ub25jZSxcbiAgICAgIHJlY2VpdmVySWQ6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5yZWNlaXZlcklkLFxuICAgICAgYWN0aW9uczogcGFyc2VkQWN0aW9ucyxcbiAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlID8gc2lnbmF0dXJlIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1R4XG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlclJhd1RyYW5zYWN0aW9uID0gSEVYX1JFR0VYLnRlc3QocmF3VHgpID8gQnVmZmVyLmZyb20ocmF3VHgsICdoZXgnKSA6IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gbmVhckFQSS51dGlscy5zZXJpYWxpemUuZGVzZXJpYWxpemUoXG4gICAgICAgIG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQS5TaWduZWRUcmFuc2FjdGlvbixcbiAgICAgICAgYnVmZmVyUmF3VHJhbnNhY3Rpb25cbiAgICAgICkgYXMgU2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICBzaWduZWRUeC50cmFuc2FjdGlvbi5hY3Rpb25zID0gc2lnbmVkVHgudHJhbnNhY3Rpb24uYWN0aW9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gbmV3IFR4QWN0aW9uKGEpO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi5lbnVtKSB7XG4gICAgICAgICAgY2FzZSAndHJhbnNmZXInOiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLnRyYW5zZmVyPy5kZXBvc2l0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFuc2ZlcihCaWdJbnQoYWN0aW9uLnRyYW5zZmVyLmRlcG9zaXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmdW5jdGlvbkNhbGwnOiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmZ1bmN0aW9uQ2FsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25DYWxsKFxuICAgICAgICAgICAgICAgIGFjdGlvbi5mdW5jdGlvbkNhbGwubWV0aG9kTmFtZSxcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhY3Rpb24uZnVuY3Rpb25DYWxsLmFyZ3MpLFxuICAgICAgICAgICAgICAgIEJpZ0ludChhY3Rpb24uZnVuY3Rpb25DYWxsLmdhcyksXG4gICAgICAgICAgICAgICAgQmlnSW50KGFjdGlvbi5mdW5jdGlvbkNhbGwuZGVwb3NpdClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduZWRUeDtcbiAgICAgIHRoaXMuX25lYXJUcmFuc2FjdGlvbiA9IHNpZ25lZFR4LnRyYW5zYWN0aW9uO1xuICAgICAgdGhpcy5faWQgPSB1dGlscy5iYXNlNThFbmNvZGUodGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdW5zaWduZWRUeCA9IG5lYXJBUEkudXRpbHMuc2VyaWFsaXplLmRlc2VyaWFsaXplKFxuICAgICAgICAgIG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQS5UcmFuc2FjdGlvbixcbiAgICAgICAgICBidWZmZXJSYXdUcmFuc2FjdGlvblxuICAgICAgICApIGFzIFVuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICAgIHVuc2lnbmVkVHguYWN0aW9ucyA9IHVuc2lnbmVkVHguYWN0aW9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBhY3Rpb24gPSBuZXcgVHhBY3Rpb24oYSk7XG4gICAgICAgICAgc3dpdGNoIChhY3Rpb24uZW51bSkge1xuICAgICAgICAgICAgY2FzZSAndHJhbnNmZXInOiB7XG4gICAgICAgICAgICAgIGlmIChhY3Rpb24udHJhbnNmZXI/LmRlcG9zaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmZXIoQmlnSW50KGFjdGlvbi50cmFuc2Zlci5kZXBvc2l0KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbkNhbGwnOiB7XG4gICAgICAgICAgICAgIGlmIChhY3Rpb24uZnVuY3Rpb25DYWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uQ2FsbChcbiAgICAgICAgICAgICAgICAgIGFjdGlvbi5mdW5jdGlvbkNhbGwubWV0aG9kTmFtZSxcbiAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGFjdGlvbi5mdW5jdGlvbkNhbGwuYXJncyksXG4gICAgICAgICAgICAgICAgICBCaWdJbnQoYWN0aW9uLmZ1bmN0aW9uQ2FsbC5nYXMpLFxuICAgICAgICAgICAgICAgICAgQmlnSW50KGFjdGlvbi5mdW5jdGlvbkNhbGwuZGVwb3NpdClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbmVhclRyYW5zYWN0aW9uID0gdW5zaWduZWRUeDtcbiAgICAgICAgdGhpcy5faWQgPSB1dGlscy5iYXNlNThFbmNvZGUodGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndW5hYmxlIHRvIGJ1aWxkIHRyYW5zYWN0aW9uIGZyb20gcmF3Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdGhpcyB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IHNpZ25lciBrZXlcbiAgICovXG5cbiAgc2lnbihzaWduZXI6IEtleVBhaXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX25lYXJUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhhc2ggPSB0aGlzLmdldFRyYW5zYWN0aW9uSGFzaCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduTWVzc2FnZWluVWludDhBcnJheShzZXJpYWxpemVkVHhIYXNoKTtcbiAgICB0aGlzLl9uZWFyU2lnbmVkVHJhbnNhY3Rpb24gPSBuZXcgbmVhckFQSS50cmFuc2FjdGlvbnMuU2lnbmVkVHJhbnNhY3Rpb24oe1xuICAgICAgdHJhbnNhY3Rpb246IHRoaXMuX25lYXJUcmFuc2FjdGlvbixcbiAgICAgIHNpZ25hdHVyZTogbmV3IG5lYXJBUEkudHJhbnNhY3Rpb25zLlNpZ25hdHVyZSh7XG4gICAgICAgIGtleVR5cGU6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5wdWJsaWNLZXkua2V5VHlwZSxcbiAgICAgICAgZGF0YTogc2lnbmF0dXJlLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgdGhpcy5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0cmFuc2FjdGlvbiB0eXBlIGJ5IHN0YWtpbmcgY29udHJhY3QgbWV0aG9kIG5hbWVzLlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBtZXRob2QgbmFtZSB0byBtYXRjaCBhbmQgc2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICBwcml2YXRlIHNldFR5cGVCeUZ1bmN0aW9uQ2FsbChtZXRob2ROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG1ldGhvZE5hbWUpIHtcbiAgICAgIGNhc2UgU3Rha2luZ0NvbnRyYWN0TWV0aG9kTmFtZXMuRGVwb3NpdEFuZFN0YWtlOlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YWtpbmdDb250cmFjdE1ldGhvZE5hbWVzLlVuc3Rha2U6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGFraW5nQ29udHJhY3RNZXRob2ROYW1lcy5XaXRoZHJhdzpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGVF9UUkFOU0ZFUjpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1RPUkFHRV9ERVBPU0lUOlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3RvcmFnZURlcG9zaXQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbWV0aG9kIGlzIGFsbG93ZWQgb24gTmVhciBhY2NvdW50LWxpYiBpbXBsZW1lbnRhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGNoZWNrIG9uIGFsbCBjb250cmFjdHMgYWRkZWQgdG8gTmVhci5cbiAgICogQHBhcmFtIG1ldGhvZE5hbWUgY29udHJhY3QgY2FsbCBtZXRob2QgbmFtZSB0byBjaGVjayBpZiBpdCdzIGFsbG93ZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTWV0aG9kQWxsb3dlZChtZXRob2ROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxvd2VkTWV0aG9kcyA9IFsuLi5PYmplY3QudmFsdWVzKFN0YWtpbmdDb250cmFjdE1ldGhvZE5hbWVzKSwgLi4uRlVOR0lCTEVfVE9LRU5fUkVMQVRFRF9NRVRIT0RTXTtcbiAgICBpZiAoIWFsbG93ZWRNZXRob2RzLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3Vuc3VwcG9ydGVkIGZ1bmN0aW9uIGNhbGwgaW4gcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbGlkIG1ldGhvZHMgYXJlIHByZXNlbnQgZm9yIGJhdGNoaW5nIG9mIGFjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtUeEFjdGlvbltdfSBhY3Rpb25zIGxpc3Qgb2YgbmVhciB0cmFuc2FjdGlvbiBhY3Rpb25zXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUJhdGNoaW5nTWV0aG9kcyhhY3Rpb25zOiBUeEFjdGlvbltdKTogdm9pZCB7XG4gICAgYWN0aW9ucy5ldmVyeSgoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoYWN0aW9uLmVudW0gIT09ICdmdW5jdGlvbkNhbGwnIHx8ICFhY3Rpb24uZnVuY3Rpb25DYWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignaW52YWxpZCBhY3Rpb24gZm9yIGJhdGNoaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgYWN0aW9uc1swXS5mdW5jdGlvbkNhbGw/Lm1ldGhvZE5hbWUgIT09IFNUT1JBR0VfREVQT1NJVCB8fFxuICAgICAgYWN0aW9uc1sxXS5mdW5jdGlvbkNhbGw/Lm1ldGhvZE5hbWUgIT09IEZUX1RSQU5TRkVSXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2ludmFsaWQgYWN0aW9uIHNlcXVlbmNlOiBleHBlY3RlZCBzdG9yYWdlX2RlcG9zaXQgZm9sbG93ZWQgYnkgZnRfdHJhbnNmZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgaW5wdXQgYW5kIG91dHB1dCBmaWVsZCBmb3IgdGhpcyB0cmFuc2FjdGlvblxuICAgKlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9ucyB8fCAhdGhpcy5fbmVhclRyYW5zYWN0aW9uLmFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ25vIGFjdGlvbnMgaW4gcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIC8vIFRPRE86IG1vZGlmeSB0aGlzIGZvciBzZW5kLW1hbnkgc3VwcG9ydFxuICAgIC8vIGN1cnJlbnRseSBvbmx5IHN0b3JhZ2UgZGVwb3NpdCArIGZ0IHRyYW5zZmVyIGFyZSBhbGxvd2VkIGZvciBiYXRjaGluZ1xuICAgIGlmICh0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9ucy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3RvbyBtYW55IGFjdGlvbnMgaW4gcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIC8vIGNoZWNrIGZvciBjb3JyZWN0IHNlcXVlbmNlIG9mIGFjdGlvbnNcbiAgICBpZiAodGhpcy5fbmVhclRyYW5zYWN0aW9uLmFjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQmF0Y2hpbmdNZXRob2RzKHRoaXMuX25lYXJUcmFuc2FjdGlvbi5hY3Rpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uYWN0aW9uc1swXTtcbiAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5fbmVhclRyYW5zYWN0aW9uLmFjdGlvbnM7XG5cbiAgICBzd2l0Y2ggKGFjdGlvbi5lbnVtKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbkNhbGwnOlxuICAgICAgICBpZiAoYWN0aW9uLmZ1bmN0aW9uQ2FsbCkge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhY3Rpb24uZnVuY3Rpb25DYWxsLm1ldGhvZE5hbWU7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZU1ldGhvZEFsbG93ZWQobWV0aG9kTmFtZSk7XG4gICAgICAgICAgdGhpcy5zZXRUeXBlQnlGdW5jdGlvbkNhbGwobWV0aG9kTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3Vuc3VwcG9ydGVkIGFjdGlvbiBpbiByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgLy8gaWYgdGhlcmUgYXJlIDIgYWN0aW9ucywgd2Uga25vdyBmb3Igc3VyZSB0aGF0IGl0IGlzIHN0b3JhZ2UgZGVwb3NpdCArIGZ0IHRyYW5zZmVyXG4gICAgaWYgKGFjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgICAgaWYgKGFjdGlvbi50cmFuc2Zlcikge1xuICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gYWN0aW9uLnRyYW5zZmVyLmRlcG9zaXQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgYWRkcmVzczogdGhpcy5fbmVhclRyYW5zYWN0aW9uLnNpZ25lcklkLFxuICAgICAgICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5yZWNlaXZlcklkLFxuICAgICAgICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5mdW5jdGlvbkNhbGwpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZnVuY3Rpb25DYWxsLm1ldGhvZE5hbWUgPT09ICdmdF90cmFuc2ZlcicpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20oYWN0aW9uLmZ1bmN0aW9uQ2FsbC5hcmdzKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5zaWduZXJJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcGFyc2VkQXJncy5hbW91bnQsXG4gICAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBwYXJzZWRBcmdzLnJlY2VpdmVyX2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJzZWRBcmdzLmFtb3VudCxcbiAgICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjdGlvbi5mdW5jdGlvbkNhbGwubWV0aG9kTmFtZSA9PT0gJ3N0b3JhZ2VfZGVwb3NpdCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20oYWN0aW9uLmZ1bmN0aW9uQ2FsbC5hcmdzKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZXJJZCA9IHBhcnNlZEFyZ3MuYWNjb3VudF9pZCA/IHBhcnNlZEFyZ3MuYWNjb3VudF9pZCA6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5zaWduZXJJZDtcbiAgICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5zaWduZXJJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYWN0aW9uLmZ1bmN0aW9uQ2FsbC5kZXBvc2l0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY29pbjpcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5URVNUTkVUXG4gICAgICAgICAgICAgICAgICAgID8gYHQke3RoaXMuX2NvaW5Db25maWcuZmFtaWx5fWBcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9jb2luQ29uZmlnLmZhbWlseSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogcmVjZWl2ZXJJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYWN0aW9uLmZ1bmN0aW9uQ2FsbC5kZXBvc2l0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY29pbjpcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5URVNUTkVUXG4gICAgICAgICAgICAgICAgICAgID8gYHQke3RoaXMuX2NvaW5Db25maWcuZmFtaWx5fWBcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9jb2luQ29uZmlnLmZhbWlseSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgaWYgKGFjdGlvbi5mdW5jdGlvbkNhbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWtpbmdBbW91bnQgPSBhY3Rpb24uZnVuY3Rpb25DYWxsLmRlcG9zaXQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgYWRkcmVzczogdGhpcy5fbmVhclRyYW5zYWN0aW9uLnNpZ25lcklkLFxuICAgICAgICAgICAgICB2YWx1ZTogc3Rha2luZ0Ftb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICAgICAgdmFsdWU6IHN0YWtpbmdBbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIGlmIChhY3Rpb24uZnVuY3Rpb25DYWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXdBbW91bnQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGFjdGlvbi5mdW5jdGlvbkNhbGwuYXJncykudG9TdHJpbmcoKSkuYW1vdW50O1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICAgICAgdmFsdWU6IHN0YWtpbmdXaXRoZHJhd0Ftb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uc2lnbmVySWQsXG4gICAgICAgICAgICAgIHZhbHVlOiBzdGFraW5nV2l0aGRyYXdBbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3RvcmFnZURlcG9zaXQ6IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLmZ1bmN0aW9uQ2FsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20oYWN0aW9uLmZ1bmN0aW9uQ2FsbC5hcmdzKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVySWQgPSBwYXJzZWRBcmdzLmFjY291bnRfaWQgPyBwYXJzZWRBcmdzLmFjY291bnRfaWQgOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24uc2lnbmVySWQ7XG4gICAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25lYXJUcmFuc2FjdGlvbi5zaWduZXJJZCxcbiAgICAgICAgICAgICAgdmFsdWU6IGFjdGlvbi5mdW5jdGlvbkNhbGwuZGVwb3NpdC50b1N0cmluZygpLFxuICAgICAgICAgICAgICBjb2luOlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5URVNUTkVUXG4gICAgICAgICAgICAgICAgICA/IGB0JHt0aGlzLl9jb2luQ29uZmlnLmZhbWlseX1gXG4gICAgICAgICAgICAgICAgICA6IHRoaXMuX2NvaW5Db25maWcuZmFtaWx5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiByZWNlaXZlcklkLFxuICAgICAgICAgICAgICB2YWx1ZTogYWN0aW9uLmZ1bmN0aW9uQ2FsbC5kZXBvc2l0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIGNvaW46XG4gICAgICAgICAgICAgICAgdGhpcy5fY29pbkNvbmZpZy5uZXR3b3JrLnR5cGUgPT09IE5ldHdvcmtUeXBlLlRFU1RORVRcbiAgICAgICAgICAgICAgICAgID8gYHQke3RoaXMuX2NvaW5Db25maWcuZmFtaWx5fWBcbiAgICAgICAgICAgICAgICAgIDogdGhpcy5fY29pbkNvbmZpZy5mYW1pbHksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vdXRwdXRzID0gb3V0cHV0cztcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIGZvciBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQ6IGpzb24uYWN0aW9uc1swXS50cmFuc2Zlcj8uZGVwb3NpdC50b1N0cmluZygpIHx8ICcnLFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5yZWNlaXZlcklkLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hY3Rpb25zWzBdLnRyYW5zZmVyPy5kZXBvc2l0LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIGZvciBhIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUeERhdGF9IGpzb24gVGhlIHRyYW5zYWN0aW9uIGRhdGEgaW4ganNvbiBmb3JtYXRcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYW5hdGlvblJlc3VsdCBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gdG8gYmUgY29tcGxldGVkXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufVxuICAgKi9cbiAgZXhwbGFpblN0YWtpbmdBY3RpdmF0ZVRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQ6IGpzb24uYWN0aW9uc1swXS5mdW5jdGlvbkNhbGw/LmRlcG9zaXQudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGpzb24ucmVjZWl2ZXJJZCxcbiAgICAgICAgICBhbW91bnQ6IGpzb24uYWN0aW9uc1swXS5mdW5jdGlvbkNhbGw/LmRlcG9zaXQudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxldGUgZXhwbGFuYXRpb24gZm9yIGEgc3Rha2luZyB3aXRoZHJhdyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1R4RGF0YX0ganNvbiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBpbiBqc29uIGZvcm1hdFxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbiB0byBiZSBjb21wbGV0ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259XG4gICAqL1xuICBleHBsYWluU3Rha2luZ1dpdGhkcmF3VHJhbnNhY3Rpb24oanNvbjogVHhEYXRhLCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IGFtb3VudCA9IGpzb24uYWN0aW9uc1swXS5mdW5jdGlvbkNhbGw/LmFyZ3MuYW1vdW50IGFzIHN0cmluZztcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQ6IGFtb3VudCxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGpzb24uc2lnbmVySWQsXG4gICAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdG90YWwgZnVuZ2libGUgdG9rZW4gYW1vdW50ICYgdG90YWwgbmF0aXZlIG5lYXIgYW1vdW50XG4gICAqXG4gICAqIEBwYXJhbSB7QWN0aW9uW119IGFjdGlvbnMgdGhlIGxpc3Qgb2YgZGVsZWdhdGUgdHJhbnNhY3Rpb24gYWN0aW9uc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBlaXRoZXIgbmF0aXZlIG5lYXIgYW1vdW50IG9yIGZ1bmdpYmxlIHRva2VuIGFtb3VudFxuICAgKi9cbiAgY2FsY3VsYXRlVG90YWxPdXRwdXRBbW91bnQoYWN0aW9uczogQWN0aW9uW10pOiBzdHJpbmcge1xuICAgIGxldCBoYXNGdFRyYW5zZmVyID0gZmFsc2U7XG4gICAgbGV0IGhhc1N0b3JhZ2VEZXBvc2l0ID0gZmFsc2U7XG5cbiAgICBsZXQgdG90YWxUb2tlbkFtb3VudCA9IEJpZ0ludCgwKTtcbiAgICBsZXQgdG90YWxOZWFyRGVwb3NpdCA9IEJpZ0ludCgwKTtcblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgIGlmIChhY3Rpb24uZnVuY3Rpb25DYWxsKSB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uQ2FsbCA9IGFjdGlvbi5mdW5jdGlvbkNhbGw7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBmdW5jdGlvbkNhbGwubWV0aG9kTmFtZTtcbiAgICAgICAgY29uc3QgYXJncyA9IGZ1bmN0aW9uQ2FsbC5hcmdzO1xuICAgICAgICBjb25zdCBkZXBvc2l0ID0gQmlnSW50KGZ1bmN0aW9uQ2FsbC5kZXBvc2l0KTtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09IEZUX1RSQU5TRkVSKSB7XG4gICAgICAgICAgaGFzRnRUcmFuc2ZlciA9IHRydWU7XG4gICAgICAgICAgY29uc3QgYW1vdW50U3RyID0gYXJnc1snYW1vdW50J10gYXMgc3RyaW5nO1xuICAgICAgICAgIGlmIChhcmdzLmFtb3VudCkge1xuICAgICAgICAgICAgdG90YWxUb2tlbkFtb3VudCArPSBCaWdJbnQoYW1vdW50U3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09IFNUT1JBR0VfREVQT1NJVCkge1xuICAgICAgICAgIGhhc1N0b3JhZ2VEZXBvc2l0ID0gdHJ1ZTtcbiAgICAgICAgICB0b3RhbE5lYXJEZXBvc2l0ICs9IGRlcG9zaXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0Z0VHJhbnNmZXIpIHtcbiAgICAgIHJldHVybiB0b3RhbFRva2VuQW1vdW50LnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmIChoYXNTdG9yYWdlRGVwb3NpdCkge1xuICAgICAgcmV0dXJuIHRvdGFsTmVhckRlcG9zaXQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1R4RGF0YX0ganNvbiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBpbiBqc29uIGZvcm1hdFxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbiB0byBiZSBjb21wbGV0ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259XG4gICAqL1xuICBleHBsYWluVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBhY3Rpb25zID0ganNvbi5hY3Rpb25zO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHRoaXMuY2FsY3VsYXRlVG90YWxPdXRwdXRBbW91bnQoYWN0aW9ucyk7XG4gICAgY29uc3Qgb3V0cHV0czogSVRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoYWN0aW9uLmZ1bmN0aW9uQ2FsbCkge1xuICAgICAgICBjb25zdCBmdW5jdGlvbkNhbGwgPSBhY3Rpb24uZnVuY3Rpb25DYWxsO1xuICAgICAgICBpZiAoZnVuY3Rpb25DYWxsLm1ldGhvZE5hbWUgPT09IEZUX1RSQU5TRkVSKSB7XG4gICAgICAgICAgY29uc3QgYW1vdW50U3RyID0gZnVuY3Rpb25DYWxsLmFyZ3NbJ2Ftb3VudCddIGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCByZWNlaXZlcklkID0gZnVuY3Rpb25DYWxsLmFyZ3NbJ3JlY2VpdmVyX2lkJ10gYXMgc3RyaW5nO1xuICAgICAgICAgIC8vIGluIGZ0IHRyYW5zZmVyLCB0aGUgb3V0ZXIgcmVjZWl2ZXIgaWQgd2lsbCBiZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB0b2tlblxuICAgICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IHV0aWxzLmZpbmRUb2tlbk5hbWVGcm9tQ29udHJhY3RBZGRyZXNzKGpzb24ucmVjZWl2ZXJJZCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0OiBJVHJhbnNhY3Rpb25SZWNpcGllbnQgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiByZWNlaXZlcklkLFxuICAgICAgICAgICAgYW1vdW50OiBhbW91bnRTdHIsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodG9rZW5OYW1lKSB7XG4gICAgICAgICAgICBvdXRwdXQudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSBzdG9yYWdlIGRlcG9zaXQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUeERhdGF9IGpzb24gVGhlIHRyYW5zYWN0aW9uIGRhdGEgaW4ganNvbiBmb3JtYXRcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYW5hdGlvblJlc3VsdCBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gdG8gYmUgY29tcGxldGVkXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufVxuICAgKi9cbiAgZXhwbGFpblN0b3JhZ2VEZXBvc2l0VHJhbnNhY3Rpb24oanNvbjogVHhEYXRhLCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IGFjdGlvbnMgPSBqc29uLmFjdGlvbnM7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdGhpcy5jYWxjdWxhdGVUb3RhbE91dHB1dEFtb3VudChhY3Rpb25zKTtcbiAgICBjb25zdCBvdXRwdXRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFtdO1xuICAgIGFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIGlmIChhY3Rpb24uZnVuY3Rpb25DYWxsKSB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uQ2FsbCA9IGFjdGlvbi5mdW5jdGlvbkNhbGw7XG4gICAgICAgIGlmIChmdW5jdGlvbkNhbGwubWV0aG9kTmFtZSA9PT0gU1RPUkFHRV9ERVBPU0lUKSB7XG4gICAgICAgICAgY29uc3QgcmVjZWl2ZXJJZCA9XG4gICAgICAgICAgICBmdW5jdGlvbkNhbGwuYXJncyAmJiBmdW5jdGlvbkNhbGwuYXJnc1snYWNjb3VudF9pZCddXG4gICAgICAgICAgICAgID8gKGZ1bmN0aW9uQ2FsbC5hcmdzWydhY2NvdW50X2lkJ10gYXMgc3RyaW5nKVxuICAgICAgICAgICAgICA6IGpzb24uc2lnbmVySWQ7XG4gICAgICAgICAgLy8gaW4gc3RvcmFnZSBkZXBvc2l0LCB0aGUgb3V0ZXIgcmVjZWl2ZXIgaWQgd2lsbCBiZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB0b2tlblxuICAgICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IHV0aWxzLmZpbmRUb2tlbk5hbWVGcm9tQ29udHJhY3RBZGRyZXNzKGpzb24ucmVjZWl2ZXJJZCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0OiBJVHJhbnNhY3Rpb25SZWNpcGllbnQgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiByZWNlaXZlcklkLFxuICAgICAgICAgICAgYW1vdW50OiBmdW5jdGlvbkNhbGwuZGVwb3NpdCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0b2tlbk5hbWUpIHtcbiAgICAgICAgICAgIG91dHB1dC50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dHMucHVzaChvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIC8vIHR4aGFzaCB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0cmFuc2FjdGlvbnNcbiAgICAgIGlkOiByZXN1bHQuaWQgfHwgJycsXG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBvdXRwdXRzLFxuICAgICAgZmVlOiB7IGZlZTogJycgfSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICB9O1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICBpZiAocmVzdWx0LmFjdGlvbnMubGVuZ3RoID4gMSB8fCByZXN1bHQuYWN0aW9uc1swXS5mdW5jdGlvbkNhbGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluU3Rha2luZ0FjdGl2YXRlVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgcmV0dXJuIGV4cGxhbmF0aW9uUmVzdWx0O1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluU3Rha2luZ1dpdGhkcmF3VHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdG9yYWdlRGVwb3NpdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblN0b3JhZ2VEZXBvc2l0VHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IYXNoKCk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IG5lYXJBUEkudXRpbHMuc2VyaWFsaXplLnNlcmlhbGl6ZShcbiAgICAgIG5lYXJBUEkudHJhbnNhY3Rpb25zLlNDSEVNQS5UcmFuc2FjdGlvbixcbiAgICAgIHRoaXMuX25lYXJUcmFuc2FjdGlvblxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNoYTI1Ni5hcnJheShzZXJpYWxpemVkVHgpKTtcbiAgfVxuXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuX25lYXJUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5nZXRUcmFuc2FjdGlvbkhhc2goKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNpZ25lZCBwYXlsb2FkIHVzaW5nIGNvbnN0cnVjdC5zaWduVHhcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBidWlsZCBzdGVwIGlmIGEgVFNTIHNpZ25hdHVyZVxuICAgKiBpcyBhZGRlZCBhbmQgd2lsbCBzZXQgdGhlIHNpZ25UcmFuc2FjdGlvbiB3aGljaCBpcyB0aGUgdHhIZXggdGhhdCB3aWxsIGJlIGJyb2FkY2FzdGVkXG4gICAqIEFzIHdlbGwgYXMgYWRkIHRoZSBzaWduYXR1cmUgdXNlZCB0byBzaWduIHRvIHRoZSBzaWduYXR1cmUgYXJyYXkgaW4gaGV4IGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgdG8gYmUgYWRkZWQgdG8gYSBuZWFyIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RTaWduZWRQYXlsb2FkKHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uID0gbmV3IG5lYXJBUEkudHJhbnNhY3Rpb25zLlNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgIHRyYW5zYWN0aW9uOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24sXG4gICAgICBzaWduYXR1cmU6IG5ldyBuZWFyQVBJLnRyYW5zYWN0aW9ucy5TaWduYXR1cmUoe1xuICAgICAgICBrZXlUeXBlOiB0aGlzLl9uZWFyVHJhbnNhY3Rpb24ucHVibGljS2V5LmtleVR5cGUsXG4gICAgICAgIGRhdGE6IHNpZ25hdHVyZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuICAvKiogQGluaGVyaXRkb2MgKiovXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNpZ25hdHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uICYmIHRoaXMuX25lYXJTaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmUuZWQyNTUxOVNpZ25hdHVyZSkge1xuICAgICAgc2lnbmF0dXJlcy5wdXNoKGJhc2U1OC5lbmNvZGUodGhpcy5fbmVhclNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5lZDI1NTE5U2lnbmF0dXJlLmRhdGEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgfVxufVxuIl19
|