@bitgo-beta/sdk-api 1.10.1-beta.99 → 1.10.1-beta.991
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 +905 -0
- package/dist/package.json +13 -25
- package/dist/src/api.d.ts +3 -3
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +39 -33
- package/dist/src/bitgoAPI.d.ts +64 -11
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +357 -121
- package/dist/src/encrypt.d.ts +4 -4
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +44 -7
- package/dist/src/index.js +6 -2
- package/dist/src/types.d.ts +54 -43
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +4 -2
- package/dist/src/util.d.ts +12 -0
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +57 -4
- package/dist/src/v1/blockchain.js +25 -12
- package/dist/src/v1/keychains.js +27 -22
- package/dist/src/v1/markets.js +10 -5
- package/dist/src/v1/pendingapproval.d.ts.map +1 -1
- package/dist/src/v1/pendingapproval.js +57 -18
- package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
- package/dist/src/v1/pendingapprovals.js +41 -7
- package/dist/src/v1/signPsbt.d.ts +14 -0
- package/dist/src/v1/signPsbt.d.ts.map +1 -0
- package/dist/src/v1/signPsbt.js +69 -0
- package/dist/src/v1/transactionBuilder.js +144 -92
- package/dist/src/v1/travelRule.js +60 -23
- package/dist/src/v1/verifyAddress.d.ts +6 -0
- package/dist/src/v1/verifyAddress.d.ts.map +1 -0
- package/dist/src/v1/verifyAddress.js +50 -0
- package/dist/src/v1/wallet.d.ts.map +1 -1
- package/dist/src/v1/wallet.js +428 -224
- package/dist/src/v1/wallets.js +93 -37
- package/package.json +13 -25
- package/dist/web/main.js +0 -2
- package/dist/web/main.js.LICENSE.txt +0 -110
package/dist/src/v1/wallet.js
CHANGED
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @hidden
|
|
4
4
|
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
5
41
|
/**
|
|
6
42
|
*/
|
|
7
43
|
//
|
|
@@ -11,14 +47,15 @@
|
|
|
11
47
|
// Copyright 2014, BitGo, Inc. All Rights Reserved.
|
|
12
48
|
//
|
|
13
49
|
const unspents_1 = require("@bitgo-beta/unspents");
|
|
50
|
+
const assert_1 = __importDefault(require("assert"));
|
|
51
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
14
52
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
53
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
54
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
55
|
+
const signPsbt_1 = require("./signPsbt");
|
|
56
|
+
const util_1 = require("../util");
|
|
15
57
|
const TransactionBuilder = require('./transactionBuilder');
|
|
16
|
-
const utxolib = require("@bitgo-beta/utxo-lib");
|
|
17
58
|
const PendingApproval = require('./pendingapproval');
|
|
18
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
19
|
-
const Bluebird = require("bluebird");
|
|
20
|
-
const co = Bluebird.coroutine;
|
|
21
|
-
const _ = require("lodash");
|
|
22
59
|
const { getExternalChainCode, getInternalChainCode, isChainCode, scriptTypeForChain } = utxolib.bitgo;
|
|
23
60
|
const request = require('superagent');
|
|
24
61
|
//
|
|
@@ -144,13 +181,15 @@ Wallet.prototype.get = function (params, callback) {
|
|
|
144
181
|
params = params || {};
|
|
145
182
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
146
183
|
const self = this;
|
|
147
|
-
return
|
|
184
|
+
return Promise.resolve(this.bitgo
|
|
148
185
|
.get(this.url())
|
|
149
186
|
.result()
|
|
150
187
|
.then(function (res) {
|
|
151
188
|
self.wallet = res;
|
|
152
189
|
return self;
|
|
153
|
-
}))
|
|
190
|
+
}))
|
|
191
|
+
.then(callback)
|
|
192
|
+
.catch(callback);
|
|
154
193
|
};
|
|
155
194
|
//
|
|
156
195
|
// updateApprovalsRequired
|
|
@@ -162,7 +201,7 @@ Wallet.prototype.updateApprovalsRequired = function (params, callback) {
|
|
|
162
201
|
params = params || {};
|
|
163
202
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
164
203
|
if (params.approvalsRequired === undefined ||
|
|
165
|
-
!
|
|
204
|
+
!lodash_1.default.isInteger(params.approvalsRequired) ||
|
|
166
205
|
params.approvalsRequired < 1) {
|
|
167
206
|
throw new Error('invalid approvalsRequired: must be a nonzero positive number');
|
|
168
207
|
}
|
|
@@ -170,19 +209,21 @@ Wallet.prototype.updateApprovalsRequired = function (params, callback) {
|
|
|
170
209
|
const currentApprovalsRequired = this.approvalsRequired();
|
|
171
210
|
if (currentApprovalsRequired === params.approvalsRequired) {
|
|
172
211
|
// no-op, just return the current wallet
|
|
173
|
-
return
|
|
212
|
+
return (0, util_1.tryPromise)(function () {
|
|
174
213
|
return self.wallet;
|
|
175
|
-
})
|
|
214
|
+
})
|
|
215
|
+
.then(callback)
|
|
216
|
+
.catch(callback);
|
|
176
217
|
}
|
|
177
|
-
return
|
|
218
|
+
return Promise.resolve(this.bitgo.put(this.url()).send(params).result()).then(callback).catch(callback);
|
|
178
219
|
};
|
|
179
220
|
/**
|
|
180
221
|
* Returns the correct chain for change, taking into consideration segwit
|
|
181
222
|
*/
|
|
182
223
|
Wallet.prototype.getChangeChain = function (params) {
|
|
183
224
|
let useSegwitChange = !!this.bitgo.getConstants().enableSegwit;
|
|
184
|
-
if (!
|
|
185
|
-
if (!
|
|
225
|
+
if (!lodash_1.default.isUndefined(params.segwitChange)) {
|
|
226
|
+
if (!lodash_1.default.isBoolean(params.segwitChange)) {
|
|
186
227
|
throw new Error('segwitChange must be a boolean');
|
|
187
228
|
}
|
|
188
229
|
// if segwit is disabled through the constants, segwit change should still not be created
|
|
@@ -213,7 +254,7 @@ Wallet.prototype.createAddress = function (params, callback) {
|
|
|
213
254
|
if (chain === null || chain === undefined) {
|
|
214
255
|
chain = defaultChain;
|
|
215
256
|
}
|
|
216
|
-
return
|
|
257
|
+
return Promise.resolve(this.bitgo
|
|
217
258
|
.post(this.url('/address/' + chain))
|
|
218
259
|
.send(params)
|
|
219
260
|
.result()
|
|
@@ -222,7 +263,9 @@ Wallet.prototype.createAddress = function (params, callback) {
|
|
|
222
263
|
self.validateAddress(addr);
|
|
223
264
|
}
|
|
224
265
|
return addr;
|
|
225
|
-
}))
|
|
266
|
+
}))
|
|
267
|
+
.then(callback)
|
|
268
|
+
.catch(callback);
|
|
226
269
|
};
|
|
227
270
|
/**
|
|
228
271
|
* Generate address locally without calling server
|
|
@@ -232,7 +275,7 @@ Wallet.prototype.createAddress = function (params, callback) {
|
|
|
232
275
|
Wallet.prototype.generateAddress = function ({ segwit, path, keychains, threshold }) {
|
|
233
276
|
const isSegwit = !!segwit;
|
|
234
277
|
let signatureThreshold = 2;
|
|
235
|
-
if (
|
|
278
|
+
if (lodash_1.default.isInteger(threshold)) {
|
|
236
279
|
signatureThreshold = threshold;
|
|
237
280
|
if (signatureThreshold <= 0) {
|
|
238
281
|
throw new Error('threshold has to be positive');
|
|
@@ -250,15 +293,15 @@ Wallet.prototype.generateAddress = function ({ segwit, path, keychains, threshol
|
|
|
250
293
|
const derivedKeys = rootKeys.map(function (k) {
|
|
251
294
|
const hdnode = utxo_lib_1.bip32.fromBase58(k.xpub);
|
|
252
295
|
const derivationPath = k.path + (k.walletSubPath || '') + path;
|
|
253
|
-
return hdnode.derivePath(sdk_core_1.sanitizeLegacyPath(derivationPath)).publicKey;
|
|
296
|
+
return hdnode.derivePath((0, sdk_core_1.sanitizeLegacyPath)(derivationPath)).publicKey;
|
|
254
297
|
});
|
|
255
298
|
const pathComponents = path.split('/');
|
|
256
|
-
const normalizedPathComponents =
|
|
299
|
+
const normalizedPathComponents = lodash_1.default.map(pathComponents, (component) => {
|
|
257
300
|
if (component && component.length > 0) {
|
|
258
301
|
return parseInt(component, 10);
|
|
259
302
|
}
|
|
260
303
|
});
|
|
261
|
-
const pathDetails =
|
|
304
|
+
const pathDetails = lodash_1.default.filter(normalizedPathComponents, lodash_1.default.isInteger);
|
|
262
305
|
const addressDetails = {
|
|
263
306
|
chainPath: path,
|
|
264
307
|
path: path,
|
|
@@ -267,10 +310,10 @@ Wallet.prototype.generateAddress = function ({ segwit, path, keychains, threshol
|
|
|
267
310
|
wallet: this.id(),
|
|
268
311
|
};
|
|
269
312
|
const { scriptPubKey: outputScript, redeemScript, witnessScript, } = utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, isSegwit ? 'p2shP2wsh' : 'p2sh');
|
|
270
|
-
addressDetails.witnessScript = witnessScript
|
|
271
|
-
addressDetails.redeemScript = redeemScript
|
|
313
|
+
addressDetails.witnessScript = witnessScript?.toString('hex');
|
|
314
|
+
addressDetails.redeemScript = redeemScript?.toString('hex');
|
|
272
315
|
addressDetails.outputScript = outputScript.toString('hex');
|
|
273
|
-
addressDetails.address = utxolib.address.fromOutputScript(outputScript, sdk_core_1.getNetwork(network));
|
|
316
|
+
addressDetails.address = utxolib.address.fromOutputScript(outputScript, (0, sdk_core_1.getNetwork)(network));
|
|
274
317
|
return addressDetails;
|
|
275
318
|
};
|
|
276
319
|
//
|
|
@@ -301,7 +344,7 @@ Wallet.prototype.addresses = function (params, callback) {
|
|
|
301
344
|
const chain = params.chain;
|
|
302
345
|
if (chain !== null && chain !== undefined) {
|
|
303
346
|
if (Array.isArray(chain)) {
|
|
304
|
-
query.chain =
|
|
347
|
+
query.chain = lodash_1.default.uniq(lodash_1.default.filter(chain, lodash_1.default.isInteger));
|
|
305
348
|
}
|
|
306
349
|
else {
|
|
307
350
|
if (chain !== 0 && chain !== 1) {
|
|
@@ -311,32 +354,32 @@ Wallet.prototype.addresses = function (params, callback) {
|
|
|
311
354
|
}
|
|
312
355
|
}
|
|
313
356
|
if (params.limit) {
|
|
314
|
-
if (!
|
|
357
|
+
if (!lodash_1.default.isInteger(params.limit)) {
|
|
315
358
|
throw new Error('invalid limit argument, expecting number');
|
|
316
359
|
}
|
|
317
360
|
query.limit = params.limit;
|
|
318
361
|
}
|
|
319
362
|
if (params.skip) {
|
|
320
|
-
if (!
|
|
363
|
+
if (!lodash_1.default.isInteger(params.skip)) {
|
|
321
364
|
throw new Error('invalid skip argument, expecting number');
|
|
322
365
|
}
|
|
323
366
|
query.skip = params.skip;
|
|
324
367
|
}
|
|
325
368
|
if (params.sort) {
|
|
326
|
-
if (!
|
|
369
|
+
if (!lodash_1.default.isNumber(params.sort)) {
|
|
327
370
|
throw new Error('invalid sort argument, expecting number');
|
|
328
371
|
}
|
|
329
372
|
query.sort = params.sort;
|
|
330
373
|
}
|
|
331
374
|
const url = this.url('/addresses');
|
|
332
|
-
return
|
|
375
|
+
return Promise.resolve(this.bitgo.get(url).query(query).result()).then(callback).catch(callback);
|
|
333
376
|
};
|
|
334
377
|
Wallet.prototype.stats = function (params, callback) {
|
|
335
378
|
params = params || {};
|
|
336
379
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
337
380
|
const args = [];
|
|
338
381
|
if (params.limit) {
|
|
339
|
-
if (!
|
|
382
|
+
if (!lodash_1.default.isInteger(params.limit)) {
|
|
340
383
|
throw new Error('invalid limit argument, expecting number');
|
|
341
384
|
}
|
|
342
385
|
args.push('limit=' + params.limit);
|
|
@@ -346,7 +389,7 @@ Wallet.prototype.stats = function (params, callback) {
|
|
|
346
389
|
query = '?' + args.join('&');
|
|
347
390
|
}
|
|
348
391
|
const url = this.url('/stats' + query);
|
|
349
|
-
return
|
|
392
|
+
return Promise.resolve(this.bitgo.get(url).result()).then(callback).catch(callback);
|
|
350
393
|
};
|
|
351
394
|
/**
|
|
352
395
|
* Refresh the wallet object by syncing with the back-end
|
|
@@ -354,18 +397,19 @@ Wallet.prototype.stats = function (params, callback) {
|
|
|
354
397
|
* @returns {Wallet}
|
|
355
398
|
*/
|
|
356
399
|
Wallet.prototype.refresh = function (params, callback) {
|
|
357
|
-
return
|
|
400
|
+
return async function () {
|
|
358
401
|
// when set to true, gpk returns the private data of safe wallets
|
|
359
|
-
const query =
|
|
402
|
+
const query = lodash_1.default.extend({}, lodash_1.default.pick(params, ['gpk']));
|
|
360
403
|
// @ts-expect-error - no implicit this
|
|
361
|
-
const res =
|
|
404
|
+
const res = await this.bitgo.get(this.url()).query(query).result();
|
|
362
405
|
// @ts-expect-error - no implicit this
|
|
363
406
|
this.wallet = res;
|
|
364
407
|
// @ts-expect-error - no implicit this
|
|
365
408
|
return this;
|
|
366
|
-
}
|
|
409
|
+
}
|
|
367
410
|
.call(this)
|
|
368
|
-
.
|
|
411
|
+
.then(callback)
|
|
412
|
+
.catch(callback);
|
|
369
413
|
};
|
|
370
414
|
//
|
|
371
415
|
// address
|
|
@@ -378,7 +422,7 @@ Wallet.prototype.address = function (params, callback) {
|
|
|
378
422
|
params = params || {};
|
|
379
423
|
sdk_core_1.common.validateParams(params, ['address'], [], callback);
|
|
380
424
|
const url = this.url('/addresses/' + params.address);
|
|
381
|
-
return
|
|
425
|
+
return Promise.resolve(this.bitgo.get(url).result()).then(callback).catch(callback);
|
|
382
426
|
};
|
|
383
427
|
/**
|
|
384
428
|
* Freeze the wallet for a duration of choice, stopping BitGo from signing any transactions.
|
|
@@ -388,11 +432,13 @@ Wallet.prototype.freeze = function (params, callback) {
|
|
|
388
432
|
params = params || {};
|
|
389
433
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
390
434
|
if (params.duration) {
|
|
391
|
-
if (!
|
|
435
|
+
if (!lodash_1.default.isNumber(params.duration)) {
|
|
392
436
|
throw new Error('invalid duration - should be number of seconds');
|
|
393
437
|
}
|
|
394
438
|
}
|
|
395
|
-
return
|
|
439
|
+
return Promise.resolve(this.bitgo.post(this.url('/freeze')).send(params).result())
|
|
440
|
+
.then(callback)
|
|
441
|
+
.catch(callback);
|
|
396
442
|
};
|
|
397
443
|
//
|
|
398
444
|
// delete
|
|
@@ -401,7 +447,7 @@ Wallet.prototype.freeze = function (params, callback) {
|
|
|
401
447
|
Wallet.prototype.delete = function (params, callback) {
|
|
402
448
|
params = params || {};
|
|
403
449
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
404
|
-
return
|
|
450
|
+
return Promise.resolve(this.bitgo.del(this.url()).result()).then(callback).catch(callback);
|
|
405
451
|
};
|
|
406
452
|
//
|
|
407
453
|
// labels
|
|
@@ -411,7 +457,7 @@ Wallet.prototype.labels = function (params, callback) {
|
|
|
411
457
|
params = params || {};
|
|
412
458
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
413
459
|
const url = this.bitgo.url('/labels/' + this.id());
|
|
414
|
-
return
|
|
460
|
+
return Promise.resolve(this.bitgo.get(url).result('labels')).then(callback).catch(callback);
|
|
415
461
|
};
|
|
416
462
|
/**
|
|
417
463
|
* Rename a wallet
|
|
@@ -424,7 +470,9 @@ Wallet.prototype.setWalletName = function (params, callback) {
|
|
|
424
470
|
params = params || {};
|
|
425
471
|
sdk_core_1.common.validateParams(params, ['label'], [], callback);
|
|
426
472
|
const url = this.bitgo.url('/wallet/' + this.id());
|
|
427
|
-
return
|
|
473
|
+
return Promise.resolve(this.bitgo.put(url).send({ label: params.label }).result())
|
|
474
|
+
.then(callback)
|
|
475
|
+
.catch(callback);
|
|
428
476
|
};
|
|
429
477
|
//
|
|
430
478
|
// setLabel
|
|
@@ -438,7 +486,9 @@ Wallet.prototype.setLabel = function (params, callback) {
|
|
|
438
486
|
throw new Error('Invalid bitcoin address: ' + params.address);
|
|
439
487
|
}
|
|
440
488
|
const url = this.bitgo.url('/labels/' + this.id() + '/' + params.address);
|
|
441
|
-
return
|
|
489
|
+
return Promise.resolve(this.bitgo.put(url).send({ label: params.label }).result())
|
|
490
|
+
.then(callback)
|
|
491
|
+
.catch(callback);
|
|
442
492
|
};
|
|
443
493
|
//
|
|
444
494
|
// deleteLabel
|
|
@@ -452,7 +502,7 @@ Wallet.prototype.deleteLabel = function (params, callback) {
|
|
|
452
502
|
throw new Error('Invalid bitcoin address: ' + params.address);
|
|
453
503
|
}
|
|
454
504
|
const url = this.bitgo.url('/labels/' + this.id() + '/' + params.address);
|
|
455
|
-
return
|
|
505
|
+
return Promise.resolve(this.bitgo.del(url).result()).then(callback).catch(callback);
|
|
456
506
|
};
|
|
457
507
|
//
|
|
458
508
|
// unspents
|
|
@@ -471,7 +521,7 @@ Wallet.prototype.unspents = function (params, callback) {
|
|
|
471
521
|
const allUnspents = [];
|
|
472
522
|
const self = this;
|
|
473
523
|
const getUnspentsBatch = function (skip, limit) {
|
|
474
|
-
const queryObject =
|
|
524
|
+
const queryObject = lodash_1.default.cloneDeep(params);
|
|
475
525
|
if (skip > 0) {
|
|
476
526
|
queryObject.skip = skip;
|
|
477
527
|
}
|
|
@@ -506,7 +556,7 @@ Wallet.prototype.unspents = function (params, callback) {
|
|
|
506
556
|
return allUnspents;
|
|
507
557
|
});
|
|
508
558
|
};
|
|
509
|
-
return getUnspentsBatch(0, params.limit).
|
|
559
|
+
return getUnspentsBatch(0, params.limit).then(callback).catch(callback);
|
|
510
560
|
};
|
|
511
561
|
/**
|
|
512
562
|
* List the unspents (paged) for a given wallet, returning the result as an object of unspents, count, skip and total
|
|
@@ -527,53 +577,55 @@ Wallet.prototype.unspents = function (params, callback) {
|
|
|
527
577
|
Wallet.prototype.unspentsPaged = function (params, callback) {
|
|
528
578
|
params = params || {};
|
|
529
579
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
530
|
-
if (!
|
|
580
|
+
if (!lodash_1.default.isUndefined(params.limit) && !lodash_1.default.isInteger(params.limit)) {
|
|
531
581
|
throw new Error('invalid limit - should be number');
|
|
532
582
|
}
|
|
533
|
-
if (!
|
|
583
|
+
if (!lodash_1.default.isUndefined(params.skip) && !lodash_1.default.isInteger(params.skip)) {
|
|
534
584
|
throw new Error('invalid skip - should be number');
|
|
535
585
|
}
|
|
536
|
-
if (!
|
|
586
|
+
if (!lodash_1.default.isUndefined(params.minConfirms) && !lodash_1.default.isInteger(params.minConfirms)) {
|
|
537
587
|
throw new Error('invalid minConfirms - should be number');
|
|
538
588
|
}
|
|
539
|
-
if (!
|
|
589
|
+
if (!lodash_1.default.isUndefined(params.target) && !lodash_1.default.isNumber(params.target)) {
|
|
540
590
|
throw new Error('invalid target - should be number');
|
|
541
591
|
}
|
|
542
|
-
if (!
|
|
592
|
+
if (!lodash_1.default.isUndefined(params.instant) && !lodash_1.default.isBoolean(params.instant)) {
|
|
543
593
|
throw new Error('invalid instant flag - should be boolean');
|
|
544
594
|
}
|
|
545
|
-
if (!
|
|
595
|
+
if (!lodash_1.default.isUndefined(params.segwit) && !lodash_1.default.isBoolean(params.segwit)) {
|
|
546
596
|
throw new Error('invalid segwit flag - should be boolean');
|
|
547
597
|
}
|
|
548
|
-
if (!
|
|
598
|
+
if (!lodash_1.default.isUndefined(params.targetWalletUnspents) && !lodash_1.default.isInteger(params.targetWalletUnspents)) {
|
|
549
599
|
throw new Error('invalid targetWalletUnspents flag - should be number');
|
|
550
600
|
}
|
|
551
|
-
if (!
|
|
601
|
+
if (!lodash_1.default.isUndefined(params.minSize) && !lodash_1.default.isNumber(params.minSize)) {
|
|
552
602
|
throw new Error('invalid argument: minSize must be a number');
|
|
553
603
|
}
|
|
554
|
-
if (!
|
|
604
|
+
if (!lodash_1.default.isUndefined(params.instant) && !lodash_1.default.isUndefined(params.minConfirms)) {
|
|
555
605
|
throw new Error('only one of instant and minConfirms may be defined');
|
|
556
606
|
}
|
|
557
|
-
if (!
|
|
607
|
+
if (!lodash_1.default.isUndefined(params.targetWalletUnspents) && lodash_1.default.isUndefined(params.target)) {
|
|
558
608
|
throw new Error('targetWalletUnspents can only be specified in conjunction with a target');
|
|
559
609
|
}
|
|
560
|
-
if (!
|
|
610
|
+
if (!lodash_1.default.isUndefined(params.allowLedgerSegwit) && !lodash_1.default.isBoolean(params.allowLedgerSegwit)) {
|
|
561
611
|
throw new Error('invalid argument: allowLedgerSegwit must be a boolean');
|
|
562
612
|
}
|
|
563
|
-
const queryObject =
|
|
564
|
-
if (!
|
|
613
|
+
const queryObject = lodash_1.default.cloneDeep(params);
|
|
614
|
+
if (!lodash_1.default.isUndefined(params.target)) {
|
|
565
615
|
// skip and limit are unavailable when a target is specified
|
|
566
616
|
delete queryObject.skip;
|
|
567
617
|
delete queryObject.limit;
|
|
568
618
|
}
|
|
569
619
|
queryObject.segwit = true;
|
|
570
|
-
if (!
|
|
620
|
+
if (!lodash_1.default.isUndefined(params.segwit)) {
|
|
571
621
|
queryObject.segwit = params.segwit;
|
|
572
622
|
}
|
|
573
|
-
if (!
|
|
623
|
+
if (!lodash_1.default.isUndefined(params.allowLedgerSegwit)) {
|
|
574
624
|
queryObject.allowLedgerSegwit = params.allowLedgerSegwit;
|
|
575
625
|
}
|
|
576
|
-
return
|
|
626
|
+
return Promise.resolve(this.bitgo.get(this.url('/unspents')).query(queryObject).result())
|
|
627
|
+
.then(callback)
|
|
628
|
+
.catch(callback);
|
|
577
629
|
};
|
|
578
630
|
//
|
|
579
631
|
// transactions
|
|
@@ -585,37 +637,37 @@ Wallet.prototype.transactions = function (params, callback) {
|
|
|
585
637
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
586
638
|
const args = [];
|
|
587
639
|
if (params.limit) {
|
|
588
|
-
if (!
|
|
640
|
+
if (!lodash_1.default.isInteger(params.limit)) {
|
|
589
641
|
throw new Error('invalid limit argument, expecting number');
|
|
590
642
|
}
|
|
591
643
|
args.push('limit=' + params.limit);
|
|
592
644
|
}
|
|
593
645
|
if (params.skip) {
|
|
594
|
-
if (!
|
|
646
|
+
if (!lodash_1.default.isInteger(params.skip)) {
|
|
595
647
|
throw new Error('invalid skip argument, expecting number');
|
|
596
648
|
}
|
|
597
649
|
args.push('skip=' + params.skip);
|
|
598
650
|
}
|
|
599
651
|
if (params.minHeight) {
|
|
600
|
-
if (!
|
|
652
|
+
if (!lodash_1.default.isInteger(params.minHeight)) {
|
|
601
653
|
throw new Error('invalid minHeight argument, expecting number');
|
|
602
654
|
}
|
|
603
655
|
args.push('minHeight=' + params.minHeight);
|
|
604
656
|
}
|
|
605
657
|
if (params.maxHeight) {
|
|
606
|
-
if (!
|
|
658
|
+
if (!lodash_1.default.isInteger(params.maxHeight) || params.maxHeight < 0) {
|
|
607
659
|
throw new Error('invalid maxHeight argument, expecting positive integer');
|
|
608
660
|
}
|
|
609
661
|
args.push('maxHeight=' + params.maxHeight);
|
|
610
662
|
}
|
|
611
663
|
if (params.minConfirms) {
|
|
612
|
-
if (!
|
|
664
|
+
if (!lodash_1.default.isInteger(params.minConfirms) || params.minConfirms < 0) {
|
|
613
665
|
throw new Error('invalid minConfirms argument, expecting positive integer');
|
|
614
666
|
}
|
|
615
667
|
args.push('minConfirms=' + params.minConfirms);
|
|
616
668
|
}
|
|
617
|
-
if (!
|
|
618
|
-
if (!
|
|
669
|
+
if (!lodash_1.default.isUndefined(params.compact)) {
|
|
670
|
+
if (!lodash_1.default.isBoolean(params.compact)) {
|
|
619
671
|
throw new Error('invalid compact argument, expecting boolean');
|
|
620
672
|
}
|
|
621
673
|
args.push('compact=' + params.compact);
|
|
@@ -625,7 +677,7 @@ Wallet.prototype.transactions = function (params, callback) {
|
|
|
625
677
|
query = '?' + args.join('&');
|
|
626
678
|
}
|
|
627
679
|
const url = this.url('/tx' + query);
|
|
628
|
-
return
|
|
680
|
+
return Promise.resolve(this.bitgo.get(url).result()).then(callback).catch(callback);
|
|
629
681
|
};
|
|
630
682
|
//
|
|
631
683
|
// transaction
|
|
@@ -634,7 +686,7 @@ Wallet.prototype.getTransaction = function (params, callback) {
|
|
|
634
686
|
params = params || {};
|
|
635
687
|
sdk_core_1.common.validateParams(params, ['id'], [], callback);
|
|
636
688
|
const url = this.url('/tx/' + params.id);
|
|
637
|
-
return
|
|
689
|
+
return Promise.resolve(this.bitgo.get(url).result()).then(callback).catch(callback);
|
|
638
690
|
};
|
|
639
691
|
//
|
|
640
692
|
// pollForTransaction
|
|
@@ -647,10 +699,10 @@ Wallet.prototype.pollForTransaction = function (params, callback) {
|
|
|
647
699
|
const self = this;
|
|
648
700
|
params = params || {};
|
|
649
701
|
sdk_core_1.common.validateParams(params, ['id'], [], callback);
|
|
650
|
-
if (params.delay && !
|
|
702
|
+
if (params.delay && !lodash_1.default.isNumber(params.delay)) {
|
|
651
703
|
throw new Error('invalid delay parameter');
|
|
652
704
|
}
|
|
653
|
-
if (params.timeout && !
|
|
705
|
+
if (params.timeout && !lodash_1.default.isNumber(params.timeout)) {
|
|
654
706
|
throw new Error('invalid timeout parameter');
|
|
655
707
|
}
|
|
656
708
|
params.delay = params.delay || 1000;
|
|
@@ -666,7 +718,7 @@ Wallet.prototype.pollForTransaction = function (params, callback) {
|
|
|
666
718
|
if (err.status !== 404 || new Date().valueOf() - start.valueOf() > params.timeout) {
|
|
667
719
|
throw err;
|
|
668
720
|
}
|
|
669
|
-
return
|
|
721
|
+
return new Promise((resolve) => setTimeout(resolve, params.delay)).then(function () {
|
|
670
722
|
return doNextPoll();
|
|
671
723
|
});
|
|
672
724
|
});
|
|
@@ -680,7 +732,7 @@ Wallet.prototype.getWalletTransactionBySequenceId = function (params, callback)
|
|
|
680
732
|
params = params || {};
|
|
681
733
|
sdk_core_1.common.validateParams(params, ['sequenceId'], [], callback);
|
|
682
734
|
const url = this.url('/tx/sequence/' + params.sequenceId);
|
|
683
|
-
return
|
|
735
|
+
return Promise.resolve(this.bitgo.get(url).result()).then(callback).catch(callback);
|
|
684
736
|
};
|
|
685
737
|
//
|
|
686
738
|
// Key chains
|
|
@@ -688,30 +740,31 @@ Wallet.prototype.getWalletTransactionBySequenceId = function (params, callback)
|
|
|
688
740
|
// The user key chain is typically the first keychain of the wallet and has the encrypted xpriv stored on BitGo.
|
|
689
741
|
// Useful when trying to get the users' keychain from the server before decrypting to sign a transaction.
|
|
690
742
|
Wallet.prototype.getEncryptedUserKeychain = function (params, callback) {
|
|
691
|
-
return
|
|
743
|
+
return async function () {
|
|
692
744
|
params = params || {};
|
|
693
745
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
694
746
|
// @ts-expect-error - no implicit this
|
|
695
747
|
const self = this;
|
|
696
|
-
|
|
748
|
+
async function tryKeyChain(index) {
|
|
697
749
|
if (!self.keychains || index >= self.keychains.length) {
|
|
698
750
|
const error = new Error('No encrypted keychains on this wallet.');
|
|
699
751
|
error.code = 'no_encrypted_keychain_on_wallet';
|
|
700
752
|
throw error;
|
|
701
753
|
}
|
|
702
754
|
const params = { xpub: self.keychains[index].xpub };
|
|
703
|
-
const keychain =
|
|
755
|
+
const keychain = await self.bitgo.keychains().get(params);
|
|
704
756
|
// If we find the xprv, then this is probably the user keychain we're looking for
|
|
705
757
|
keychain.walletSubPath = self.keychains[index].path;
|
|
706
758
|
if (keychain.encryptedXprv) {
|
|
707
759
|
return keychain;
|
|
708
760
|
}
|
|
709
761
|
return tryKeyChain(index + 1);
|
|
710
|
-
}
|
|
762
|
+
}
|
|
711
763
|
return tryKeyChain(0);
|
|
712
|
-
}
|
|
764
|
+
}
|
|
713
765
|
.call(this)
|
|
714
|
-
.
|
|
766
|
+
.then(callback)
|
|
767
|
+
.catch(callback);
|
|
715
768
|
};
|
|
716
769
|
//
|
|
717
770
|
// createTransaction
|
|
@@ -728,23 +781,23 @@ Wallet.prototype.getEncryptedUserKeychain = function (params, callback) {
|
|
|
728
781
|
// Returns:
|
|
729
782
|
// callback(err, { transactionHex: string, unspents: [inputs], fee: satoshis })
|
|
730
783
|
Wallet.prototype.createTransaction = function (params, callback) {
|
|
731
|
-
params =
|
|
784
|
+
params = lodash_1.default.extend({}, params);
|
|
732
785
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
733
|
-
if ((!
|
|
734
|
-
(!
|
|
735
|
-
(!
|
|
736
|
-
(!
|
|
737
|
-
(!
|
|
738
|
-
(!
|
|
739
|
-
(!
|
|
786
|
+
if ((!lodash_1.default.isNumber(params.fee) && !lodash_1.default.isUndefined(params.fee)) ||
|
|
787
|
+
(!lodash_1.default.isNumber(params.feeRate) && !lodash_1.default.isUndefined(params.feeRate)) ||
|
|
788
|
+
(!lodash_1.default.isNumber(params.minConfirms) && !lodash_1.default.isUndefined(params.minConfirms)) ||
|
|
789
|
+
(!lodash_1.default.isBoolean(params.forceChangeAtEnd) && !lodash_1.default.isUndefined(params.forceChangeAtEnd)) ||
|
|
790
|
+
(!lodash_1.default.isString(params.changeAddress) && !lodash_1.default.isUndefined(params.changeAddress)) ||
|
|
791
|
+
(!lodash_1.default.isBoolean(params.validate) && !lodash_1.default.isUndefined(params.validate)) ||
|
|
792
|
+
(!lodash_1.default.isBoolean(params.instant) && !lodash_1.default.isUndefined(params.instant))) {
|
|
740
793
|
throw new Error('invalid argument');
|
|
741
794
|
}
|
|
742
|
-
if (!
|
|
795
|
+
if (!lodash_1.default.isObject(params.recipients)) {
|
|
743
796
|
throw new Error('expecting recipients object');
|
|
744
797
|
}
|
|
745
798
|
params.validate = params.validate !== undefined ? params.validate : this.bitgo.getValidate();
|
|
746
799
|
params.wallet = this;
|
|
747
|
-
return TransactionBuilder.createTransaction(params).
|
|
800
|
+
return TransactionBuilder.createTransaction(params).then(callback).catch(callback);
|
|
748
801
|
};
|
|
749
802
|
//
|
|
750
803
|
// signTransaction
|
|
@@ -760,12 +813,17 @@ Wallet.prototype.createTransaction = function (params, callback) {
|
|
|
760
813
|
// Returns:
|
|
761
814
|
// callback(err, transaction)
|
|
762
815
|
Wallet.prototype.signTransaction = function (params, callback) {
|
|
763
|
-
params =
|
|
816
|
+
params = lodash_1.default.extend({}, params);
|
|
817
|
+
if (params.psbt) {
|
|
818
|
+
return (0, util_1.tryPromise)(() => (0, signPsbt_1.signPsbtRequest)(params))
|
|
819
|
+
.then(callback)
|
|
820
|
+
.catch(callback);
|
|
821
|
+
}
|
|
764
822
|
sdk_core_1.common.validateParams(params, ['transactionHex'], [], callback);
|
|
765
823
|
if (!Array.isArray(params.unspents)) {
|
|
766
824
|
throw new Error('expecting the unspents array');
|
|
767
825
|
}
|
|
768
|
-
if ((!
|
|
826
|
+
if ((!lodash_1.default.isObject(params.keychain) || !params.keychain.xprv) && !lodash_1.default.isString(params.signingKey)) {
|
|
769
827
|
// allow passing in a WIF private key for legacy safe wallet support
|
|
770
828
|
const error = new Error('expecting keychain object with xprv or signingKey WIF');
|
|
771
829
|
error.code = 'missing_keychain_or_signingKey';
|
|
@@ -779,7 +837,8 @@ Wallet.prototype.signTransaction = function (params, callback) {
|
|
|
779
837
|
tx: result.transactionHex,
|
|
780
838
|
};
|
|
781
839
|
})
|
|
782
|
-
.
|
|
840
|
+
.then(callback)
|
|
841
|
+
.catch(callback);
|
|
783
842
|
};
|
|
784
843
|
//
|
|
785
844
|
// send
|
|
@@ -792,13 +851,13 @@ Wallet.prototype.signTransaction = function (params, callback) {
|
|
|
792
851
|
Wallet.prototype.sendTransaction = function (params, callback) {
|
|
793
852
|
params = params || {};
|
|
794
853
|
sdk_core_1.common.validateParams(params, ['tx'], ['message', 'otp'], callback);
|
|
795
|
-
return
|
|
854
|
+
return Promise.resolve(this.bitgo.post(this.bitgo.url('/tx/send')).send(params).result())
|
|
796
855
|
.then(function (body) {
|
|
797
856
|
if (body.pendingApproval) {
|
|
798
|
-
return
|
|
857
|
+
return lodash_1.default.extend(body, { status: 'pendingApproval' });
|
|
799
858
|
}
|
|
800
859
|
if (body.otp) {
|
|
801
|
-
return
|
|
860
|
+
return lodash_1.default.extend(body, { status: 'otp' });
|
|
802
861
|
}
|
|
803
862
|
return {
|
|
804
863
|
status: 'accepted',
|
|
@@ -808,7 +867,8 @@ Wallet.prototype.sendTransaction = function (params, callback) {
|
|
|
808
867
|
instantId: body.instantId,
|
|
809
868
|
};
|
|
810
869
|
})
|
|
811
|
-
.
|
|
870
|
+
.then(callback)
|
|
871
|
+
.catch(callback);
|
|
812
872
|
};
|
|
813
873
|
/**
|
|
814
874
|
* Share the wallet with an existing BitGo user.
|
|
@@ -820,7 +880,7 @@ Wallet.prototype.sendTransaction = function (params, callback) {
|
|
|
820
880
|
Wallet.prototype.createShare = function (params, callback) {
|
|
821
881
|
params = params || {};
|
|
822
882
|
sdk_core_1.common.validateParams(params, ['user', 'permissions'], [], callback);
|
|
823
|
-
if (params.keychain && !
|
|
883
|
+
if (params.keychain && !lodash_1.default.isEmpty(params.keychain)) {
|
|
824
884
|
if (!params.keychain.xpub ||
|
|
825
885
|
!params.keychain.encryptedXprv ||
|
|
826
886
|
!params.keychain.fromPubKey ||
|
|
@@ -829,7 +889,9 @@ Wallet.prototype.createShare = function (params, callback) {
|
|
|
829
889
|
throw new Error('requires keychain parameters - xpub, encryptedXprv, fromPubKey, toPubKey, path');
|
|
830
890
|
}
|
|
831
891
|
}
|
|
832
|
-
return
|
|
892
|
+
return Promise.resolve(this.bitgo.post(this.url('/share')).send(params).result())
|
|
893
|
+
.then(callback)
|
|
894
|
+
.catch(callback);
|
|
833
895
|
};
|
|
834
896
|
//
|
|
835
897
|
// createInvite
|
|
@@ -849,7 +911,9 @@ Wallet.prototype.createInvite = function (params, callback) {
|
|
|
849
911
|
if (params.message) {
|
|
850
912
|
options.message = params.message;
|
|
851
913
|
}
|
|
852
|
-
return
|
|
914
|
+
return Promise.resolve(this.bitgo.post(this.url('/invite')).send(options).result())
|
|
915
|
+
.then(callback)
|
|
916
|
+
.catch(callback);
|
|
853
917
|
};
|
|
854
918
|
//
|
|
855
919
|
// confirmInviteAndShareWallet
|
|
@@ -869,7 +933,7 @@ Wallet.prototype.confirmInviteAndShareWallet = function (params, callback) {
|
|
|
869
933
|
.listInvites()
|
|
870
934
|
.then(function (invites) {
|
|
871
935
|
const outgoing = invites.outgoing;
|
|
872
|
-
const invite =
|
|
936
|
+
const invite = lodash_1.default.find(outgoing, function (out) {
|
|
873
937
|
return out.id === params.walletInviteId;
|
|
874
938
|
});
|
|
875
939
|
if (!invite) {
|
|
@@ -887,7 +951,8 @@ Wallet.prototype.confirmInviteAndShareWallet = function (params, callback) {
|
|
|
887
951
|
// @ts-expect-error - no implicit this
|
|
888
952
|
return this.bitgo.put(this.bitgo.url('/walletinvite/' + params.walletInviteId));
|
|
889
953
|
})
|
|
890
|
-
.
|
|
954
|
+
.then(callback)
|
|
955
|
+
.catch(callback);
|
|
891
956
|
};
|
|
892
957
|
//
|
|
893
958
|
// sendCoins
|
|
@@ -910,12 +975,12 @@ Wallet.prototype.confirmInviteAndShareWallet = function (params, callback) {
|
|
|
910
975
|
Wallet.prototype.sendCoins = function (params, callback) {
|
|
911
976
|
params = params || {};
|
|
912
977
|
sdk_core_1.common.validateParams(params, ['address'], ['message'], callback);
|
|
913
|
-
if (!
|
|
978
|
+
if (!lodash_1.default.isNumber(params.amount)) {
|
|
914
979
|
throw new Error('invalid argument for amount - number expected');
|
|
915
980
|
}
|
|
916
981
|
params.recipients = {};
|
|
917
982
|
params.recipients[params.address] = params.amount;
|
|
918
|
-
return this.sendMany(params).
|
|
983
|
+
return this.sendMany(params).then(callback).catch(callback);
|
|
919
984
|
};
|
|
920
985
|
//
|
|
921
986
|
// sendMany
|
|
@@ -937,16 +1002,16 @@ Wallet.prototype.sendMany = function (params, callback) {
|
|
|
937
1002
|
params = params || {};
|
|
938
1003
|
sdk_core_1.common.validateParams(params, [], ['message', 'otp'], callback);
|
|
939
1004
|
const self = this;
|
|
940
|
-
if (!
|
|
1005
|
+
if (!lodash_1.default.isObject(params.recipients)) {
|
|
941
1006
|
throw new Error('expecting recipients object');
|
|
942
1007
|
}
|
|
943
|
-
if (params.fee && !
|
|
1008
|
+
if (params.fee && !lodash_1.default.isNumber(params.fee)) {
|
|
944
1009
|
throw new Error('invalid argument for fee - number expected');
|
|
945
1010
|
}
|
|
946
|
-
if (params.feeRate && !
|
|
1011
|
+
if (params.feeRate && !lodash_1.default.isNumber(params.feeRate)) {
|
|
947
1012
|
throw new Error('invalid argument for feeRate - number expected');
|
|
948
1013
|
}
|
|
949
|
-
if (params.instant && !
|
|
1014
|
+
if (params.instant && !lodash_1.default.isBoolean(params.instant)) {
|
|
950
1015
|
throw new Error('invalid argument for instant - boolean expected');
|
|
951
1016
|
}
|
|
952
1017
|
let bitgoFee;
|
|
@@ -965,7 +1030,7 @@ Wallet.prototype.sendMany = function (params, callback) {
|
|
|
965
1030
|
'noSplitChange',
|
|
966
1031
|
'comment',
|
|
967
1032
|
];
|
|
968
|
-
const preservedBuildParams =
|
|
1033
|
+
const preservedBuildParams = lodash_1.default.pick(params, acceptedBuildParams);
|
|
969
1034
|
// Get the user keychain
|
|
970
1035
|
const retPromise = this.createAndSignTransaction(params)
|
|
971
1036
|
.then(function (transaction) {
|
|
@@ -986,8 +1051,8 @@ Wallet.prototype.sendMany = function (params, callback) {
|
|
|
986
1051
|
})
|
|
987
1052
|
.then(function (result) {
|
|
988
1053
|
const tx = utxolib.bitgo.createTransactionFromHex(result.tx, utxolib.networks.bitcoin);
|
|
989
|
-
const inputsSum =
|
|
990
|
-
const outputsSum =
|
|
1054
|
+
const inputsSum = lodash_1.default.sumBy(unspentsUsed, 'value');
|
|
1055
|
+
const outputsSum = lodash_1.default.sumBy(tx.outs, 'value');
|
|
991
1056
|
const feeUsed = inputsSum - outputsSum;
|
|
992
1057
|
if (isNaN(feeUsed)) {
|
|
993
1058
|
throw new Error('invalid feeUsed');
|
|
@@ -1024,7 +1089,7 @@ Wallet.prototype.sendMany = function (params, callback) {
|
|
|
1024
1089
|
.then(function () {
|
|
1025
1090
|
return finalResult;
|
|
1026
1091
|
});
|
|
1027
|
-
return
|
|
1092
|
+
return Promise.resolve(retPromise).then(callback).catch(callback);
|
|
1028
1093
|
};
|
|
1029
1094
|
/**
|
|
1030
1095
|
* Accelerate a stuck transaction using Child-Pays-For-Parent (CPFP).
|
|
@@ -1077,11 +1142,11 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1077
1142
|
const estimateChildFee = ({ inputs, parentFee, parentVSize, feeRate }) => {
|
|
1078
1143
|
// calculate how much more we *should* have paid in parent fees,
|
|
1079
1144
|
// had the parent been originally sent with the new fee rate
|
|
1080
|
-
const additionalParentFee =
|
|
1145
|
+
const additionalParentFee = lodash_1.default.ceil((parentVSize * feeRate) / 1000) - parentFee;
|
|
1081
1146
|
// calculate how much we would pay in fees for the child,
|
|
1082
1147
|
// if it were only paying for itself at the new fee rate
|
|
1083
1148
|
const childFee = (estimateTxVSize(inputs) * feeRate) / 1000;
|
|
1084
|
-
return
|
|
1149
|
+
return lodash_1.default.ceil(childFee + additionalParentFee);
|
|
1085
1150
|
};
|
|
1086
1151
|
/**
|
|
1087
1152
|
* Helper function to find additional unspents to use to pay the child tx fees.
|
|
@@ -1097,7 +1162,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1097
1162
|
* the child tx, and the updated inputs for the child tx.
|
|
1098
1163
|
*/
|
|
1099
1164
|
const findAdditionalUnspents = ({ inputs, parentOutputValue, parentFee, parentVSize, maxUnspents }) => {
|
|
1100
|
-
return
|
|
1165
|
+
return async function coFindAdditionalUnspents() {
|
|
1101
1166
|
const additionalUnspents = [];
|
|
1102
1167
|
// ask the server for enough unspents to cover the child fee, assuming
|
|
1103
1168
|
// that it can be done without additional unspents (which is not possible,
|
|
@@ -1108,7 +1173,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1108
1173
|
while (uncoveredChildFee > 0 && additionalUnspents.length < maxUnspents) {
|
|
1109
1174
|
// try to get enough unspents to cover the rest of the child fee
|
|
1110
1175
|
// @ts-expect-error - no implicit this
|
|
1111
|
-
const unspents = (
|
|
1176
|
+
const unspents = (await this.unspents({
|
|
1112
1177
|
minConfirms: 1,
|
|
1113
1178
|
target: uncoveredChildFee,
|
|
1114
1179
|
limit: maxUnspents - additionalUnspents.length,
|
|
@@ -1123,7 +1188,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1123
1188
|
// return enough unspent value to ensure that the minimum change amount
|
|
1124
1189
|
// is achieved for the child tx, and we can't leave out those unspents
|
|
1125
1190
|
// or else the minimum change amount constraint could be violated
|
|
1126
|
-
|
|
1191
|
+
lodash_1.default.forEach(unspents, (unspent) => {
|
|
1127
1192
|
// update the child tx inputs
|
|
1128
1193
|
const unspentChain = getChain(unspent);
|
|
1129
1194
|
if (isChainCode(unspentChain) && scriptTypeForChain(unspentChain) === 'p2shP2wsh') {
|
|
@@ -1148,7 +1213,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1148
1213
|
newChildFee: currentChildFeeEstimate,
|
|
1149
1214
|
newInputs: inputs,
|
|
1150
1215
|
};
|
|
1151
|
-
}
|
|
1216
|
+
}.call(this);
|
|
1152
1217
|
};
|
|
1153
1218
|
/**
|
|
1154
1219
|
* Helper function to get a full copy (including witness data) of an arbitrary tx using only the tx id.
|
|
@@ -1164,7 +1229,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1164
1229
|
const explorerBaseUrl = sdk_core_1.common.Environments[self.bitgo.getEnv()].btcExplorerBaseUrl;
|
|
1165
1230
|
const result = await request.get(`${explorerBaseUrl}/tx/${parentTxId}/hex`);
|
|
1166
1231
|
if (!result.text || !/([a-f0-9]{2})+/.test(result.text)) {
|
|
1167
|
-
throw new Error(`Did not successfully receive parent tx hex. Received '${
|
|
1232
|
+
throw new Error(`Did not successfully receive parent tx hex. Received '${lodash_1.default.truncate(result.text, { length: 100 })}' instead.`);
|
|
1168
1233
|
}
|
|
1169
1234
|
return result.text;
|
|
1170
1235
|
}
|
|
@@ -1179,7 +1244,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1179
1244
|
return outputOrUnspent.chain;
|
|
1180
1245
|
}
|
|
1181
1246
|
if (outputOrUnspent.chainPath !== undefined) {
|
|
1182
|
-
return
|
|
1247
|
+
return lodash_1.default.toNumber(outputOrUnspent.chainPath.split('/')[1]);
|
|
1183
1248
|
}
|
|
1184
1249
|
// no way to tell the chain, let's just blow up now instead
|
|
1185
1250
|
// of blowing up later when the undefined return value is used.
|
|
@@ -1219,14 +1284,14 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1219
1284
|
* (and, if necessary, additional wallet unspents) as inputs
|
|
1220
1285
|
* 7) Broadcast the new child transaction
|
|
1221
1286
|
*/
|
|
1222
|
-
return
|
|
1287
|
+
return async function coAccelerateTransaction() {
|
|
1223
1288
|
params = params || {};
|
|
1224
1289
|
sdk_core_1.common.validateParams(params, ['transactionID'], [], callback);
|
|
1225
1290
|
// validate fee rate
|
|
1226
1291
|
if (params.feeRate === undefined) {
|
|
1227
1292
|
throw new Error('Missing parameter: feeRate');
|
|
1228
1293
|
}
|
|
1229
|
-
if (!
|
|
1294
|
+
if (!lodash_1.default.isFinite(params.feeRate) || params.feeRate <= 0) {
|
|
1230
1295
|
throw new Error('Expecting positive finite number for parameter: feeRate');
|
|
1231
1296
|
}
|
|
1232
1297
|
// validate maxUnspents
|
|
@@ -1234,16 +1299,16 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1234
1299
|
// by default, use at most 100 additional unspents (not including the unspent output from the parent tx)
|
|
1235
1300
|
params.maxAdditionalUnspents = 100;
|
|
1236
1301
|
}
|
|
1237
|
-
if (!
|
|
1302
|
+
if (!lodash_1.default.isInteger(params.maxAdditionalUnspents) || params.maxAdditionalUnspents <= 0) {
|
|
1238
1303
|
throw Error('Expecting positive integer for parameter: maxAdditionalUnspents');
|
|
1239
1304
|
}
|
|
1240
1305
|
// @ts-expect-error - no implicit this
|
|
1241
|
-
const parentTx =
|
|
1306
|
+
const parentTx = await this.getTransaction({ id: params.transactionID });
|
|
1242
1307
|
if (parentTx.confirmations > 0) {
|
|
1243
1308
|
throw new Error(`Transaction ${params.transactionID} is already confirmed and cannot be accelerated`);
|
|
1244
1309
|
}
|
|
1245
1310
|
// get the outputs from the parent tx which are to our wallet
|
|
1246
|
-
const walletOutputs =
|
|
1311
|
+
const walletOutputs = lodash_1.default.filter(parentTx.outputs, (output) => output.isMine);
|
|
1247
1312
|
if (walletOutputs.length === 0) {
|
|
1248
1313
|
throw new Error(`Transaction ${params.transactionID} contains no outputs to this wallet, and thus cannot be accelerated`);
|
|
1249
1314
|
}
|
|
@@ -1252,7 +1317,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1252
1317
|
// An output could be spent already if the output was used in a
|
|
1253
1318
|
// child tx which itself has become stuck due to low fees and is
|
|
1254
1319
|
// also unconfirmed.
|
|
1255
|
-
const sortedOutputs =
|
|
1320
|
+
const sortedOutputs = lodash_1.default.sortBy(walletOutputs, effectiveValue);
|
|
1256
1321
|
let parentUnspentToUse;
|
|
1257
1322
|
let outputToUse;
|
|
1258
1323
|
while (sortedOutputs.length > 0 && parentUnspentToUse === undefined) {
|
|
@@ -1261,11 +1326,11 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1261
1326
|
// TODO: is there a better way to get this unspent?
|
|
1262
1327
|
// TODO: The best we can do here is set minSize = maxSize = outputToUse.value
|
|
1263
1328
|
// @ts-expect-error - no implicit this
|
|
1264
|
-
const unspentsResult =
|
|
1329
|
+
const unspentsResult = await this.unspents({
|
|
1265
1330
|
minSize: outputToUse.value,
|
|
1266
1331
|
maxSize: outputToUse.value,
|
|
1267
1332
|
});
|
|
1268
|
-
parentUnspentToUse =
|
|
1333
|
+
parentUnspentToUse = lodash_1.default.find(unspentsResult, (unspent) => {
|
|
1269
1334
|
// make sure unspent belongs to the given txid
|
|
1270
1335
|
if (unspent.tx_hash !== params.transactionID) {
|
|
1271
1336
|
return false;
|
|
@@ -1278,7 +1343,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1278
1343
|
throw new Error(`Could not find unspent output from parent tx to use as child input`);
|
|
1279
1344
|
}
|
|
1280
1345
|
// get the full hex for the parent tx and decode it to get its vsize
|
|
1281
|
-
const parentTxHex =
|
|
1346
|
+
const parentTxHex = await getParentTxHex({ parentTxId: params.transactionID });
|
|
1282
1347
|
const decodedParent = utxolib.bitgo.createTransactionFromHex(parentTxHex, utxolib.networks.bitcoin);
|
|
1283
1348
|
const parentVSize = decodedParent.virtualSize();
|
|
1284
1349
|
// make sure id from decoded tx and given tx id match
|
|
@@ -1313,7 +1378,7 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1313
1378
|
if (outputToUse.value < childFee + minChangeSize) {
|
|
1314
1379
|
// parent output cannot cover child fee plus the minimum change,
|
|
1315
1380
|
// must find additional unspents to cover the difference
|
|
1316
|
-
const { additional, newChildFee, newInputs } =
|
|
1381
|
+
const { additional, newChildFee, newInputs } = await findAdditionalUnspents({
|
|
1317
1382
|
inputs: childInputs,
|
|
1318
1383
|
parentOutputValue: outputToUse.value,
|
|
1319
1384
|
parentFee: parentTx.fee,
|
|
@@ -1341,14 +1406,14 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1341
1406
|
// the tx builder will reject transactions which have no recipients,
|
|
1342
1407
|
// and such zero-output transactions are forbidden by the Bitcoin protocol,
|
|
1343
1408
|
// so we need at least a single recipient for the change which won't be pruned.
|
|
1344
|
-
const changeAmount =
|
|
1409
|
+
const changeAmount = lodash_1.default.sumBy(unspentsToUse, (unspent) => unspent.value) - childFee;
|
|
1345
1410
|
// @ts-expect-error - no implicit this
|
|
1346
1411
|
const changeChain = this.getChangeChain({});
|
|
1347
1412
|
// @ts-expect-error - no implicit this
|
|
1348
|
-
const changeAddress =
|
|
1413
|
+
const changeAddress = await this.createAddress({ chain: changeChain });
|
|
1349
1414
|
// create the child tx and broadcast
|
|
1350
1415
|
// @ts-expect-error - no implicit this
|
|
1351
|
-
const tx =
|
|
1416
|
+
const tx = await this.createAndSignTransaction({
|
|
1352
1417
|
unspents: unspentsToUse,
|
|
1353
1418
|
recipients: [
|
|
1354
1419
|
{
|
|
@@ -1373,9 +1438,10 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1373
1438
|
}
|
|
1374
1439
|
// @ts-expect-error - no implicit this
|
|
1375
1440
|
return this.sendTransaction(tx);
|
|
1376
|
-
}
|
|
1441
|
+
}
|
|
1377
1442
|
.call(this)
|
|
1378
|
-
.
|
|
1443
|
+
.then(callback)
|
|
1444
|
+
.catch(callback);
|
|
1379
1445
|
};
|
|
1380
1446
|
//
|
|
1381
1447
|
// createAndSignTransaction
|
|
@@ -1388,26 +1454,26 @@ Wallet.prototype.accelerateTransaction = function accelerateTransaction(params,
|
|
|
1388
1454
|
// Returns:
|
|
1389
1455
|
//
|
|
1390
1456
|
Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
1391
|
-
return
|
|
1457
|
+
return async function () {
|
|
1392
1458
|
params = params || {};
|
|
1393
1459
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
1394
|
-
if (!
|
|
1460
|
+
if (!lodash_1.default.isObject(params.recipients)) {
|
|
1395
1461
|
throw new Error('expecting recipients object');
|
|
1396
1462
|
}
|
|
1397
|
-
if (params.fee && !
|
|
1463
|
+
if (params.fee && !lodash_1.default.isNumber(params.fee)) {
|
|
1398
1464
|
throw new Error('invalid argument for fee - number expected');
|
|
1399
1465
|
}
|
|
1400
|
-
if (params.feeRate && !
|
|
1466
|
+
if (params.feeRate && !lodash_1.default.isNumber(params.feeRate)) {
|
|
1401
1467
|
throw new Error('invalid argument for feeRate - number expected');
|
|
1402
1468
|
}
|
|
1403
|
-
if (params.dynamicFeeConfirmTarget && !
|
|
1469
|
+
if (params.dynamicFeeConfirmTarget && !lodash_1.default.isNumber(params.dynamicFeeConfirmTarget)) {
|
|
1404
1470
|
throw new Error('invalid argument for confirmTarget - number expected');
|
|
1405
1471
|
}
|
|
1406
|
-
if (params.instant && !
|
|
1472
|
+
if (params.instant && !lodash_1.default.isBoolean(params.instant)) {
|
|
1407
1473
|
throw new Error('invalid argument for instant - boolean expected');
|
|
1408
1474
|
}
|
|
1409
1475
|
// @ts-expect-error - no implicit this
|
|
1410
|
-
const transaction = (
|
|
1476
|
+
const transaction = (await this.createTransaction(params));
|
|
1411
1477
|
const fee = transaction.fee;
|
|
1412
1478
|
const feeRate = transaction.feeRate;
|
|
1413
1479
|
const estimatedSize = transaction.estimatedSize;
|
|
@@ -1417,7 +1483,7 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1417
1483
|
// Sign the transaction
|
|
1418
1484
|
try {
|
|
1419
1485
|
// @ts-expect-error - no implicit this
|
|
1420
|
-
const keychain =
|
|
1486
|
+
const keychain = await this.getAndPrepareSigningKeychain(params);
|
|
1421
1487
|
transaction.keychain = keychain;
|
|
1422
1488
|
}
|
|
1423
1489
|
catch (e) {
|
|
@@ -1426,10 +1492,10 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1426
1492
|
}
|
|
1427
1493
|
// this might be a safe wallet, so let's retrieve the private key info
|
|
1428
1494
|
// @ts-expect-error - no implicit this
|
|
1429
|
-
|
|
1495
|
+
await this.refresh({ gpk: true });
|
|
1430
1496
|
// @ts-expect-error - no implicit this
|
|
1431
|
-
const safeUserKey =
|
|
1432
|
-
if (
|
|
1497
|
+
const safeUserKey = lodash_1.default.get(this.wallet, 'private.userPrivKey');
|
|
1498
|
+
if (lodash_1.default.isString(safeUserKey) && lodash_1.default.isString(params.walletPassphrase)) {
|
|
1433
1499
|
// @ts-expect-error - no implicit this
|
|
1434
1500
|
transaction.signingKey = this.bitgo.decrypt({ password: params.walletPassphrase, input: safeUserKey });
|
|
1435
1501
|
}
|
|
@@ -1439,8 +1505,8 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1439
1505
|
}
|
|
1440
1506
|
transaction.feeSingleKeyWIF = params.feeSingleKeyWIF;
|
|
1441
1507
|
// @ts-expect-error - no implicit this
|
|
1442
|
-
const result =
|
|
1443
|
-
return
|
|
1508
|
+
const result = await this.signTransaction(transaction);
|
|
1509
|
+
return lodash_1.default.extend(result, {
|
|
1444
1510
|
fee,
|
|
1445
1511
|
feeRate,
|
|
1446
1512
|
instant: params.instant,
|
|
@@ -1449,9 +1515,10 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1449
1515
|
estimatedSize,
|
|
1450
1516
|
unspents,
|
|
1451
1517
|
});
|
|
1452
|
-
}
|
|
1518
|
+
}
|
|
1453
1519
|
.call(this)
|
|
1454
|
-
.
|
|
1520
|
+
.then(callback)
|
|
1521
|
+
.catch(callback);
|
|
1455
1522
|
};
|
|
1456
1523
|
//
|
|
1457
1524
|
// getAndPrepareSigningKeychain
|
|
@@ -1471,8 +1538,8 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1471
1538
|
Wallet.prototype.getAndPrepareSigningKeychain = function (params, callback) {
|
|
1472
1539
|
params = params || {};
|
|
1473
1540
|
// If keychain with xprv is already provided, use it
|
|
1474
|
-
if (
|
|
1475
|
-
return
|
|
1541
|
+
if (lodash_1.default.isObject(params.keychain) && params.keychain.xprv) {
|
|
1542
|
+
return Promise.resolve(params.keychain);
|
|
1476
1543
|
}
|
|
1477
1544
|
sdk_core_1.common.validateParams(params, [], ['walletPassphrase', 'xprv'], callback);
|
|
1478
1545
|
if ((params.walletPassphrase && params.xprv) || (!params.walletPassphrase && !params.xprv)) {
|
|
@@ -1489,6 +1556,9 @@ Wallet.prototype.getAndPrepareSigningKeychain = function (params, callback) {
|
|
|
1489
1556
|
catch (e) {
|
|
1490
1557
|
throw new Error('Unable to decrypt user keychain');
|
|
1491
1558
|
}
|
|
1559
|
+
if (keychain.xpub && utxo_lib_1.bip32.fromBase58(keychain.xprv).neutered().toBase58() !== keychain.xpub) {
|
|
1560
|
+
throw new Error('derived xpub does not match stored xpub');
|
|
1561
|
+
}
|
|
1492
1562
|
return keychain;
|
|
1493
1563
|
});
|
|
1494
1564
|
}
|
|
@@ -1503,8 +1573,8 @@ Wallet.prototype.getAndPrepareSigningKeychain = function (params, callback) {
|
|
|
1503
1573
|
if (xpub === params.xprv) {
|
|
1504
1574
|
throw new Error('xprv provided was not a private key (found xpub instead)');
|
|
1505
1575
|
}
|
|
1506
|
-
const walletXpubs =
|
|
1507
|
-
if (!
|
|
1576
|
+
const walletXpubs = lodash_1.default.map(self.keychains, 'xpub');
|
|
1577
|
+
if (!lodash_1.default.includes(walletXpubs, xpub)) {
|
|
1508
1578
|
throw new Error('xprv provided was not a keychain on this wallet!');
|
|
1509
1579
|
}
|
|
1510
1580
|
// get the keychain object from bitgo to find the path and (potential) wallet structure
|
|
@@ -1528,7 +1598,7 @@ Wallet.prototype.getAndPrepareSigningKeychain = function (params, callback) {
|
|
|
1528
1598
|
*/
|
|
1529
1599
|
Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
1530
1600
|
const self = this;
|
|
1531
|
-
return
|
|
1601
|
+
return (async function () {
|
|
1532
1602
|
// maximum number of inputs for fanout transaction
|
|
1533
1603
|
// (when fanning out, we take all the unspents and make a bigger number of outputs)
|
|
1534
1604
|
const MAX_FANOUT_INPUT_COUNT = 80;
|
|
@@ -1539,7 +1609,7 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1539
1609
|
const validate = params.validate === undefined ? true : params.validate;
|
|
1540
1610
|
const target = params.target;
|
|
1541
1611
|
// the target must be defined, be a number, be at least two, and be a natural number
|
|
1542
|
-
if (!
|
|
1612
|
+
if (!lodash_1.default.isNumber(target) || target < 2 || target % 1 !== 0) {
|
|
1543
1613
|
throw new Error('Target needs to be a positive integer');
|
|
1544
1614
|
}
|
|
1545
1615
|
if (target > MAX_FANOUT_OUTPUT_COUNT) {
|
|
@@ -1549,7 +1619,7 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1549
1619
|
if (minConfirms === undefined) {
|
|
1550
1620
|
minConfirms = 1;
|
|
1551
1621
|
}
|
|
1552
|
-
if (!
|
|
1622
|
+
if (!lodash_1.default.isNumber(minConfirms) || minConfirms < 0) {
|
|
1553
1623
|
throw new Error('minConfirms needs to be an integer >= 0');
|
|
1554
1624
|
}
|
|
1555
1625
|
/**
|
|
@@ -1567,18 +1637,18 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1567
1637
|
// initialize placeholder array
|
|
1568
1638
|
const almostEqualParts = new Array(partCount);
|
|
1569
1639
|
// fill the first remainder parts with the value partSize+1
|
|
1570
|
-
|
|
1640
|
+
lodash_1.default.fill(almostEqualParts, partSize + 1, 0, remainder);
|
|
1571
1641
|
// fill the remaining parts with the value partSize
|
|
1572
|
-
|
|
1642
|
+
lodash_1.default.fill(almostEqualParts, partSize, remainder);
|
|
1573
1643
|
// assert the correctness of the almost equal parts
|
|
1574
1644
|
// TODO: add check for the biggest deviation between any two parts and make sure it's <= 1
|
|
1575
|
-
if (
|
|
1645
|
+
if ((0, lodash_1.default)(almostEqualParts).sum() !== total || (0, lodash_1.default)(almostEqualParts).size() !== partCount) {
|
|
1576
1646
|
throw new Error('part sum or part count mismatch');
|
|
1577
1647
|
}
|
|
1578
1648
|
return almostEqualParts;
|
|
1579
1649
|
};
|
|
1580
1650
|
// first, let's take all the wallet's unspents (with min confirms if necessary)
|
|
1581
|
-
const allUnspents = (
|
|
1651
|
+
const allUnspents = (await self.unspents({ minConfirms: minConfirms }));
|
|
1582
1652
|
if (allUnspents.length < 1) {
|
|
1583
1653
|
throw new Error('No unspents to branch out');
|
|
1584
1654
|
}
|
|
@@ -1592,22 +1662,22 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1592
1662
|
throw new Error('Too many unspents');
|
|
1593
1663
|
}
|
|
1594
1664
|
// this is all the money that is currently in the wallet
|
|
1595
|
-
const grossAmount =
|
|
1665
|
+
const grossAmount = (0, lodash_1.default)(allUnspents).map('value').sum();
|
|
1596
1666
|
// in order to not modify the params object, we create a copy
|
|
1597
|
-
const txParams =
|
|
1667
|
+
const txParams = lodash_1.default.extend({}, params);
|
|
1598
1668
|
txParams.unspents = allUnspents;
|
|
1599
1669
|
txParams.recipients = {};
|
|
1600
1670
|
// create target amount of new addresses for this wallet
|
|
1601
|
-
const newAddressPromises =
|
|
1602
|
-
const newAddresses =
|
|
1671
|
+
const newAddressPromises = lodash_1.default.range(target).map(() => self.createAddress({ chain: self.getChangeChain(params), validate: validate }));
|
|
1672
|
+
const newAddresses = await Promise.all(newAddressPromises);
|
|
1603
1673
|
// let's find a nice, equal distribution of our Satoshis among the new addresses
|
|
1604
1674
|
const splitAmounts = splitNumberIntoCloseNaturalNumbers(grossAmount, target);
|
|
1605
1675
|
// map the newly created addresses to the almost components amounts we just calculated
|
|
1606
|
-
txParams.recipients =
|
|
1676
|
+
txParams.recipients = lodash_1.default.zipObject(lodash_1.default.map(newAddresses, 'address'), splitAmounts);
|
|
1607
1677
|
txParams.noSplitChange = true;
|
|
1608
1678
|
// attempt to create a transaction. As it is a wallet-sweeping transaction with no fee, we expect it to fail
|
|
1609
1679
|
try {
|
|
1610
|
-
|
|
1680
|
+
await self.sendMany(txParams);
|
|
1611
1681
|
}
|
|
1612
1682
|
catch (error) {
|
|
1613
1683
|
// as expected, the transaction creation did indeed fail due to insufficient fees
|
|
@@ -1615,7 +1685,7 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1615
1685
|
// however, let's make sure it wasn't something else
|
|
1616
1686
|
if (!error.fee && (!error.result || !error.result.fee)) {
|
|
1617
1687
|
// if the error does not contain a fee property, it is something else that has gone awry, and we throw it
|
|
1618
|
-
const debugParams =
|
|
1688
|
+
const debugParams = lodash_1.default.omit(txParams, ['walletPassphrase', 'xprv']);
|
|
1619
1689
|
error.message += `\n\nTX PARAMS:\n ${JSON.stringify(debugParams, null, 4)}`;
|
|
1620
1690
|
throw error;
|
|
1621
1691
|
}
|
|
@@ -1637,20 +1707,22 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1637
1707
|
// that means that the distribution has to be recalculated
|
|
1638
1708
|
const remainingSplitAmounts = splitNumberIntoCloseNaturalNumbers(netAmount, target);
|
|
1639
1709
|
// and the distribution again mapped to the new addresses
|
|
1640
|
-
txParams.recipients =
|
|
1710
|
+
txParams.recipients = lodash_1.default.zipObject(lodash_1.default.map(newAddresses, 'address'), remainingSplitAmounts);
|
|
1641
1711
|
}
|
|
1642
1712
|
// this time, the transaction creation should work
|
|
1643
1713
|
let fanoutTx;
|
|
1644
1714
|
try {
|
|
1645
|
-
fanoutTx =
|
|
1715
|
+
fanoutTx = await self.sendMany(txParams);
|
|
1646
1716
|
}
|
|
1647
1717
|
catch (e) {
|
|
1648
|
-
const debugParams =
|
|
1718
|
+
const debugParams = lodash_1.default.omit(txParams, ['walletPassphrase', 'xprv']);
|
|
1649
1719
|
e.message += `\n\nTX PARAMS:\n ${JSON.stringify(debugParams, null, 4)}`;
|
|
1650
1720
|
throw e;
|
|
1651
1721
|
}
|
|
1652
|
-
return
|
|
1653
|
-
})()
|
|
1722
|
+
return Promise.resolve(fanoutTx).then(callback).catch(callback);
|
|
1723
|
+
})()
|
|
1724
|
+
.then(callback)
|
|
1725
|
+
.catch(callback);
|
|
1654
1726
|
};
|
|
1655
1727
|
/**
|
|
1656
1728
|
* Determine whether to fan out or coalesce a wallet's unspents
|
|
@@ -1661,7 +1733,7 @@ Wallet.prototype.fanOutUnspents = function (params, callback) {
|
|
|
1661
1733
|
Wallet.prototype.regroupUnspents = function (params, callback) {
|
|
1662
1734
|
params = params || {};
|
|
1663
1735
|
const target = params.target;
|
|
1664
|
-
if (!
|
|
1736
|
+
if (!lodash_1.default.isNumber(target) || target < 1 || target % 1 !== 0) {
|
|
1665
1737
|
// the target must be defined, be a number, be at least one, and be a natural number
|
|
1666
1738
|
throw new Error('Target needs to be a positive integer');
|
|
1667
1739
|
}
|
|
@@ -1669,7 +1741,7 @@ Wallet.prototype.regroupUnspents = function (params, callback) {
|
|
|
1669
1741
|
if (minConfirms === undefined) {
|
|
1670
1742
|
minConfirms = 1;
|
|
1671
1743
|
}
|
|
1672
|
-
if (!
|
|
1744
|
+
if (!lodash_1.default.isNumber(minConfirms) || minConfirms < 0) {
|
|
1673
1745
|
throw new Error('minConfirms needs to be an integer equal to or bigger than 0');
|
|
1674
1746
|
}
|
|
1675
1747
|
const self = this;
|
|
@@ -1705,14 +1777,14 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1705
1777
|
if (target === undefined) {
|
|
1706
1778
|
target = 1;
|
|
1707
1779
|
}
|
|
1708
|
-
else if (!
|
|
1780
|
+
else if (!lodash_1.default.isNumber(target) || target < 1 || target % 1 !== 0) {
|
|
1709
1781
|
// the target must be defined, be a number, be at least one, and be a natural number
|
|
1710
1782
|
throw new Error('Target needs to be a positive integer');
|
|
1711
1783
|
}
|
|
1712
|
-
if (params.maxSize && !
|
|
1784
|
+
if (params.maxSize && !lodash_1.default.isNumber(params.maxSize)) {
|
|
1713
1785
|
throw new Error('maxSize should be a number');
|
|
1714
1786
|
}
|
|
1715
|
-
if (params.minSize && !
|
|
1787
|
+
if (params.minSize && !lodash_1.default.isNumber(params.minSize)) {
|
|
1716
1788
|
throw new Error('minSize should be a number');
|
|
1717
1789
|
}
|
|
1718
1790
|
// maximum number of inputs per transaction for consolidation
|
|
@@ -1729,7 +1801,7 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1729
1801
|
throw new Error('Maximum consolidation input count cannot be bigger than ' + MAX_INPUT_COUNT);
|
|
1730
1802
|
}
|
|
1731
1803
|
const maxIterationCount = params.maxIterationCount || -1;
|
|
1732
|
-
if ((params.maxIterationCount && (!
|
|
1804
|
+
if ((params.maxIterationCount && (!lodash_1.default.isNumber(maxIterationCount) || maxIterationCount < 1)) ||
|
|
1733
1805
|
maxIterationCount % 1 !== 0) {
|
|
1734
1806
|
throw new Error('Maximum iteration count needs to be an integer equal to or bigger than 1');
|
|
1735
1807
|
}
|
|
@@ -1737,7 +1809,7 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1737
1809
|
if (minConfirms === undefined) {
|
|
1738
1810
|
minConfirms = 1;
|
|
1739
1811
|
}
|
|
1740
|
-
if (!
|
|
1812
|
+
if (!lodash_1.default.isNumber(minConfirms) || minConfirms < 0) {
|
|
1741
1813
|
throw new Error('minConfirms needs to be an integer equal to or bigger than 0');
|
|
1742
1814
|
}
|
|
1743
1815
|
let minSize = params.minSize || 0;
|
|
@@ -1762,7 +1834,7 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1762
1834
|
* Consolidate one batch of up to MAX_INPUT_COUNT unspents.
|
|
1763
1835
|
* @returns {*}
|
|
1764
1836
|
*/
|
|
1765
|
-
|
|
1837
|
+
async function runNextConsolidation() {
|
|
1766
1838
|
const consolidationTransactions = [];
|
|
1767
1839
|
let isFinalConsolidation = false;
|
|
1768
1840
|
iterationCount++;
|
|
@@ -1785,7 +1857,7 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1785
1857
|
if (params.maxSize) {
|
|
1786
1858
|
queryParams.maxSize = params.maxSize;
|
|
1787
1859
|
}
|
|
1788
|
-
const allUnspents = (
|
|
1860
|
+
const allUnspents = (await self.unspents(queryParams));
|
|
1789
1861
|
// this consolidation is essentially just a waste of money
|
|
1790
1862
|
if (allUnspents.length <= target) {
|
|
1791
1863
|
if (iterationCount <= 1) {
|
|
@@ -1809,11 +1881,11 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1809
1881
|
isFinalConsolidation = inputCount === targetInputCount || iterationCount === maxIterationCount;
|
|
1810
1882
|
const currentChunk = allUnspents.splice(0, inputCount);
|
|
1811
1883
|
const changeChain = self.getChangeChain(params);
|
|
1812
|
-
const newAddress = (
|
|
1813
|
-
const txParams =
|
|
1884
|
+
const newAddress = (await self.createAddress({ chain: changeChain, validate: validate }));
|
|
1885
|
+
const txParams = lodash_1.default.extend({}, params);
|
|
1814
1886
|
const currentAddress = newAddress;
|
|
1815
1887
|
// the total amount that we are consolidating within this batch
|
|
1816
|
-
const grossAmount =
|
|
1888
|
+
const grossAmount = (0, lodash_1.default)(currentChunk).map('value').sum(); // before fees
|
|
1817
1889
|
txParams.unspents = currentChunk;
|
|
1818
1890
|
txParams.recipients = {};
|
|
1819
1891
|
txParams.recipients[newAddress.address] = grossAmount;
|
|
@@ -1823,14 +1895,14 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1823
1895
|
}
|
|
1824
1896
|
// let's attempt to create this transaction. We expect it to fail because no fee is set.
|
|
1825
1897
|
try {
|
|
1826
|
-
|
|
1898
|
+
await self.sendMany(txParams);
|
|
1827
1899
|
}
|
|
1828
1900
|
catch (error) {
|
|
1829
1901
|
// this error should occur due to insufficient funds
|
|
1830
1902
|
// however, let's make sure it wasn't something else
|
|
1831
1903
|
if (!error.fee && (!error.result || !error.result.fee)) {
|
|
1832
1904
|
// if the error does not contain a fee property, it is something else that has gone awry, and we throw it
|
|
1833
|
-
const debugParams =
|
|
1905
|
+
const debugParams = lodash_1.default.omit(txParams, ['walletPassphrase', 'xprv']);
|
|
1834
1906
|
error.message += `\n\nTX PARAMS:\n ${JSON.stringify(debugParams, null, 4)}`;
|
|
1835
1907
|
throw error;
|
|
1836
1908
|
}
|
|
@@ -1856,15 +1928,15 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1856
1928
|
// this transaction, on the other hand, should be created with no issues, because an appropriate fee is set
|
|
1857
1929
|
let sentTx;
|
|
1858
1930
|
try {
|
|
1859
|
-
sentTx =
|
|
1931
|
+
sentTx = await self.sendMany(txParams);
|
|
1860
1932
|
}
|
|
1861
1933
|
catch (e) {
|
|
1862
|
-
const debugParams =
|
|
1934
|
+
const debugParams = lodash_1.default.omit(txParams, ['walletPassphrase', 'xprv']);
|
|
1863
1935
|
e.message += `\n\nTX PARAMS:\n ${JSON.stringify(debugParams, null, 4)}`;
|
|
1864
1936
|
throw e;
|
|
1865
1937
|
}
|
|
1866
1938
|
consolidationTransactions.push(sentTx);
|
|
1867
|
-
if (
|
|
1939
|
+
if (lodash_1.default.isFunction(params.progressCallback)) {
|
|
1868
1940
|
params.progressCallback({
|
|
1869
1941
|
txid: sentTx.hash,
|
|
1870
1942
|
destination: currentAddress,
|
|
@@ -1879,32 +1951,33 @@ Wallet.prototype.consolidateUnspents = function (params, callback) {
|
|
|
1879
1951
|
// this last consolidation has not yet brought the unspents count down to the target unspent count
|
|
1880
1952
|
// therefore, we proceed by consolidating yet another batch
|
|
1881
1953
|
// before we do that, we wait 1 second so that the newly created unspent will be fetched in the next batch
|
|
1882
|
-
|
|
1883
|
-
consolidationTransactions.push(...(
|
|
1954
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1955
|
+
consolidationTransactions.push(...(await runNextConsolidation()));
|
|
1884
1956
|
}
|
|
1885
1957
|
// this is the final consolidation transaction. We return all the ones we've had so far
|
|
1886
1958
|
return consolidationTransactions;
|
|
1887
|
-
}
|
|
1888
|
-
return runNextConsolidation(
|
|
1959
|
+
}
|
|
1960
|
+
return runNextConsolidation()
|
|
1889
1961
|
.catch(function (err) {
|
|
1890
1962
|
if (err.message === 'Done') {
|
|
1891
1963
|
return;
|
|
1892
1964
|
}
|
|
1893
1965
|
throw err;
|
|
1894
1966
|
})
|
|
1895
|
-
.
|
|
1967
|
+
.then(callback)
|
|
1968
|
+
.catch(callback);
|
|
1896
1969
|
};
|
|
1897
1970
|
Wallet.prototype.shareWallet = function (params, callback) {
|
|
1898
1971
|
params = params || {};
|
|
1899
1972
|
sdk_core_1.common.validateParams(params, ['email', 'permissions'], ['walletPassphrase', 'message'], callback);
|
|
1900
|
-
if (params.reshare !== undefined && !
|
|
1973
|
+
if (params.reshare !== undefined && !lodash_1.default.isBoolean(params.reshare)) {
|
|
1901
1974
|
throw new Error('Expected reshare to be a boolean.');
|
|
1902
1975
|
}
|
|
1903
|
-
if (params.skipKeychain !== undefined && !
|
|
1976
|
+
if (params.skipKeychain !== undefined && !lodash_1.default.isBoolean(params.skipKeychain)) {
|
|
1904
1977
|
throw new Error('Expected skipKeychain to be a boolean. ');
|
|
1905
1978
|
}
|
|
1906
1979
|
const needsKeychain = !params.skipKeychain && params.permissions.indexOf('spend') !== -1;
|
|
1907
|
-
if (params.disableEmail !== undefined && !
|
|
1980
|
+
if (params.disableEmail !== undefined && !lodash_1.default.isBoolean(params.disableEmail)) {
|
|
1908
1981
|
throw new Error('Expected disableEmail to be a boolean.');
|
|
1909
1982
|
}
|
|
1910
1983
|
const self = this;
|
|
@@ -1927,8 +2000,8 @@ Wallet.prototype.shareWallet = function (params, callback) {
|
|
|
1927
2000
|
catch (e) {
|
|
1928
2001
|
throw new Error('Unable to decrypt user keychain');
|
|
1929
2002
|
}
|
|
1930
|
-
const eckey = sdk_core_1.makeRandomKey();
|
|
1931
|
-
const secret = sdk_core_1.getSharedSecret(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
|
|
2003
|
+
const eckey = (0, sdk_core_1.makeRandomKey)();
|
|
2004
|
+
const secret = (0, sdk_core_1.getSharedSecret)(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
|
|
1932
2005
|
const newEncryptedXprv = self.bitgo.encrypt({ password: secret, input: keychain.xprv });
|
|
1933
2006
|
sharedKeychain = {
|
|
1934
2007
|
xpub: keychain.xpub,
|
|
@@ -1957,46 +2030,59 @@ Wallet.prototype.shareWallet = function (params, callback) {
|
|
|
1957
2030
|
}
|
|
1958
2031
|
return self.createShare(options);
|
|
1959
2032
|
})
|
|
1960
|
-
.
|
|
2033
|
+
.then(callback)
|
|
2034
|
+
.catch(callback);
|
|
1961
2035
|
};
|
|
1962
2036
|
Wallet.prototype.removeUser = function (params, callback) {
|
|
1963
2037
|
params = params || {};
|
|
1964
2038
|
sdk_core_1.common.validateParams(params, ['user'], [], callback);
|
|
1965
|
-
return
|
|
2039
|
+
return Promise.resolve(this.bitgo
|
|
1966
2040
|
.del(this.url('/user/' + params.user))
|
|
1967
2041
|
.send()
|
|
1968
|
-
.result())
|
|
2042
|
+
.result())
|
|
2043
|
+
.then(callback)
|
|
2044
|
+
.catch(callback);
|
|
1969
2045
|
};
|
|
1970
2046
|
Wallet.prototype.getPolicy = function (params, callback) {
|
|
1971
2047
|
params = params || {};
|
|
1972
2048
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
1973
|
-
return
|
|
2049
|
+
return Promise.resolve(this.bitgo.get(this.url('/policy')).send().result())
|
|
2050
|
+
.then(callback)
|
|
2051
|
+
.catch(callback);
|
|
1974
2052
|
};
|
|
1975
2053
|
Wallet.prototype.getPolicyStatus = function (params, callback) {
|
|
1976
2054
|
params = params || {};
|
|
1977
2055
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
1978
|
-
return
|
|
2056
|
+
return Promise.resolve(this.bitgo.get(this.url('/policy/status')).send().result())
|
|
2057
|
+
.then(callback)
|
|
2058
|
+
.catch(callback);
|
|
1979
2059
|
};
|
|
1980
2060
|
Wallet.prototype.setPolicyRule = function (params, callback) {
|
|
1981
2061
|
params = params || {};
|
|
1982
2062
|
sdk_core_1.common.validateParams(params, ['id', 'type'], ['message'], callback);
|
|
1983
|
-
if (!
|
|
2063
|
+
if (!lodash_1.default.isObject(params.condition)) {
|
|
1984
2064
|
throw new Error('missing parameter: conditions object');
|
|
1985
2065
|
}
|
|
1986
|
-
if (!
|
|
2066
|
+
if (!lodash_1.default.isObject(params.action)) {
|
|
1987
2067
|
throw new Error('missing parameter: action object');
|
|
1988
2068
|
}
|
|
1989
|
-
return
|
|
2069
|
+
return Promise.resolve(this.bitgo.put(this.url('/policy/rule')).send(params).result())
|
|
2070
|
+
.then(callback)
|
|
2071
|
+
.catch(callback);
|
|
1990
2072
|
};
|
|
1991
2073
|
Wallet.prototype.removePolicyRule = function (params, callback) {
|
|
1992
2074
|
params = params || {};
|
|
1993
2075
|
sdk_core_1.common.validateParams(params, ['id'], ['message'], callback);
|
|
1994
|
-
return
|
|
2076
|
+
return Promise.resolve(this.bitgo.del(this.url('/policy/rule')).send(params).result())
|
|
2077
|
+
.then(callback)
|
|
2078
|
+
.catch(callback);
|
|
1995
2079
|
};
|
|
1996
2080
|
Wallet.prototype.listWebhooks = function (params, callback) {
|
|
1997
2081
|
params = params || {};
|
|
1998
2082
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
1999
|
-
return
|
|
2083
|
+
return Promise.resolve(this.bitgo.get(this.url('/webhooks')).send().result())
|
|
2084
|
+
.then(callback)
|
|
2085
|
+
.catch(callback);
|
|
2000
2086
|
};
|
|
2001
2087
|
/**
|
|
2002
2088
|
* Simulate wallet webhook, currently for webhooks of type transaction and pending approval
|
|
@@ -2018,43 +2104,49 @@ Wallet.prototype.simulateWebhook = function (params, callback) {
|
|
|
2018
2104
|
// depending on the coin type of the wallet, the txHash has to adhere to its respective format
|
|
2019
2105
|
// but the server takes care of that
|
|
2020
2106
|
// only take the txHash and pendingApprovalId properties
|
|
2021
|
-
const filteredParams =
|
|
2107
|
+
const filteredParams = lodash_1.default.pick(params, ['txHash', 'pendingApprovalId']);
|
|
2022
2108
|
const webhookId = params.webhookId;
|
|
2023
|
-
return
|
|
2109
|
+
return Promise.resolve(this.bitgo
|
|
2024
2110
|
.post(this.url('/webhooks/' + webhookId + '/simulate'))
|
|
2025
2111
|
.send(filteredParams)
|
|
2026
|
-
.result())
|
|
2112
|
+
.result())
|
|
2113
|
+
.then(callback)
|
|
2114
|
+
.catch(callback);
|
|
2027
2115
|
};
|
|
2028
2116
|
Wallet.prototype.addWebhook = function (params, callback) {
|
|
2029
2117
|
params = params || {};
|
|
2030
2118
|
sdk_core_1.common.validateParams(params, ['url', 'type'], [], callback);
|
|
2031
|
-
return
|
|
2119
|
+
return Promise.resolve(this.bitgo.post(this.url('/webhooks')).send(params).result())
|
|
2120
|
+
.then(callback)
|
|
2121
|
+
.catch(callback);
|
|
2032
2122
|
};
|
|
2033
2123
|
Wallet.prototype.removeWebhook = function (params, callback) {
|
|
2034
2124
|
params = params || {};
|
|
2035
2125
|
sdk_core_1.common.validateParams(params, ['url', 'type'], [], callback);
|
|
2036
|
-
return
|
|
2126
|
+
return Promise.resolve(this.bitgo.del(this.url('/webhooks')).send(params).result())
|
|
2127
|
+
.then(callback)
|
|
2128
|
+
.catch(callback);
|
|
2037
2129
|
};
|
|
2038
2130
|
Wallet.prototype.estimateFee = function (params, callback) {
|
|
2039
2131
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
2040
2132
|
if (params.amount && params.recipients) {
|
|
2041
2133
|
throw new Error('cannot specify both amount as well as recipients');
|
|
2042
2134
|
}
|
|
2043
|
-
if (params.recipients && !
|
|
2135
|
+
if (params.recipients && !lodash_1.default.isObject(params.recipients)) {
|
|
2044
2136
|
throw new Error('recipients must be array of { address: abc, amount: 100000 } objects');
|
|
2045
2137
|
}
|
|
2046
|
-
if (params.amount && !
|
|
2138
|
+
if (params.amount && !lodash_1.default.isNumber(params.amount)) {
|
|
2047
2139
|
throw new Error('invalid amount argument, expecting number');
|
|
2048
2140
|
}
|
|
2049
2141
|
const recipients = params.recipients || [];
|
|
2050
2142
|
if (params.amount) {
|
|
2051
2143
|
// only the amount was passed in, so we need to make a false recipient to run createTransaction with
|
|
2052
2144
|
recipients.push({
|
|
2053
|
-
address: sdk_core_1.common.Environments[this.bitgo.env].signingAddress,
|
|
2145
|
+
address: sdk_core_1.common.Environments[this.bitgo.env].signingAddress, // any address will do
|
|
2054
2146
|
amount: params.amount,
|
|
2055
2147
|
});
|
|
2056
2148
|
}
|
|
2057
|
-
const transactionParams =
|
|
2149
|
+
const transactionParams = lodash_1.default.extend({}, params);
|
|
2058
2150
|
transactionParams.amount = undefined;
|
|
2059
2151
|
transactionParams.recipients = recipients;
|
|
2060
2152
|
return this.createTransaction(transactionParams).then(function (tx) {
|
|
@@ -2069,12 +2161,16 @@ Wallet.prototype.estimateFee = function (params, callback) {
|
|
|
2069
2161
|
Wallet.prototype.updatePolicyRule = function (params, callback) {
|
|
2070
2162
|
params = params || {};
|
|
2071
2163
|
sdk_core_1.common.validateParams(params, ['id', 'type'], [], callback);
|
|
2072
|
-
return
|
|
2164
|
+
return Promise.resolve(this.bitgo.put(this.url('/policy/rule')).send(params).result())
|
|
2165
|
+
.then(callback)
|
|
2166
|
+
.catch(callback);
|
|
2073
2167
|
};
|
|
2074
2168
|
Wallet.prototype.deletePolicyRule = function (params, callback) {
|
|
2075
2169
|
params = params || {};
|
|
2076
2170
|
sdk_core_1.common.validateParams(params, ['id'], [], callback);
|
|
2077
|
-
return
|
|
2171
|
+
return Promise.resolve(this.bitgo.del(this.url('/policy/rule')).send(params).result())
|
|
2172
|
+
.then(callback)
|
|
2173
|
+
.catch(callback);
|
|
2078
2174
|
};
|
|
2079
2175
|
//
|
|
2080
2176
|
// getBitGoFee
|
|
@@ -2083,13 +2179,121 @@ Wallet.prototype.deletePolicyRule = function (params, callback) {
|
|
|
2083
2179
|
Wallet.prototype.getBitGoFee = function (params, callback) {
|
|
2084
2180
|
params = params || {};
|
|
2085
2181
|
sdk_core_1.common.validateParams(params, [], [], callback);
|
|
2086
|
-
if (!
|
|
2182
|
+
if (!lodash_1.default.isNumber(params.amount)) {
|
|
2087
2183
|
throw new Error('invalid amount argument');
|
|
2088
2184
|
}
|
|
2089
|
-
if (params.instant && !
|
|
2185
|
+
if (params.instant && !lodash_1.default.isBoolean(params.instant)) {
|
|
2090
2186
|
throw new Error('invalid instant argument');
|
|
2091
2187
|
}
|
|
2092
|
-
return
|
|
2188
|
+
return Promise.resolve(this.bitgo.get(this.url('/billing/fee')).query(params).result())
|
|
2189
|
+
.then(callback)
|
|
2190
|
+
.catch(callback);
|
|
2191
|
+
};
|
|
2192
|
+
/*
|
|
2193
|
+
* @params
|
|
2194
|
+
* walletPassphrase: passphrase of wallet used to decrypt the encrypted keys
|
|
2195
|
+
* unspents: array of unspents to recover
|
|
2196
|
+
* recoveryDestination: destination address to recover funds to
|
|
2197
|
+
* feeRate: fee rate to use for the recovery transaction
|
|
2198
|
+
* userKey: encrypted user key
|
|
2199
|
+
* backupKey: encrypted backup key
|
|
2200
|
+
* */
|
|
2201
|
+
Wallet.prototype.recover = async function (params) {
|
|
2202
|
+
if (lodash_1.default.isUndefined(params.walletPassphrase)) {
|
|
2203
|
+
throw new Error('missing walletPassphrase');
|
|
2204
|
+
}
|
|
2205
|
+
if (lodash_1.default.isUndefined(params.unspents)) {
|
|
2206
|
+
throw new Error('missing unspents');
|
|
2207
|
+
}
|
|
2208
|
+
if (lodash_1.default.isUndefined(params.recoveryDestination)) {
|
|
2209
|
+
throw new Error('invalid recoveryDestination');
|
|
2210
|
+
}
|
|
2211
|
+
if (lodash_1.default.isUndefined(params.feeRate)) {
|
|
2212
|
+
throw new Error('invalid feeRate');
|
|
2213
|
+
}
|
|
2214
|
+
if (lodash_1.default.isUndefined(params.userKey)) {
|
|
2215
|
+
throw new Error('invalid userKey');
|
|
2216
|
+
}
|
|
2217
|
+
if (lodash_1.default.isUndefined(params.backupKey)) {
|
|
2218
|
+
throw new Error('invalid backupKey');
|
|
2219
|
+
}
|
|
2220
|
+
const totalInputAmount = BigInt(utxolib.bitgo.unspentSum(params.unspents));
|
|
2221
|
+
if (totalInputAmount <= BigInt(0)) {
|
|
2222
|
+
throw new sdk_core_1.ErrorNoInputToRecover();
|
|
2223
|
+
}
|
|
2224
|
+
const outputSize = unspents_1.VirtualSizes.txP2wshOutputSize;
|
|
2225
|
+
const approximateSize = unspents_1.VirtualSizes.txSegOverheadVSize + outputSize + unspents_1.VirtualSizes.txP2shInputSize * params.unspents.length;
|
|
2226
|
+
const approximateTxFee = BigInt(approximateSize * params.feeRate);
|
|
2227
|
+
const recoveryAmount = totalInputAmount - approximateTxFee;
|
|
2228
|
+
const recipients = [{ address: params.recoveryDestination, amount: Number(recoveryAmount) }];
|
|
2229
|
+
const unsignedTx = await this.createTransaction({
|
|
2230
|
+
unspents: params.unspents,
|
|
2231
|
+
recipients,
|
|
2232
|
+
fee: Number(approximateTxFee),
|
|
2233
|
+
});
|
|
2234
|
+
const parsedUnsignedTx = utxolib.bitgo.createTransactionFromHex(unsignedTx.transactionHex, utxolib.networks.bitcoin);
|
|
2235
|
+
(0, assert_1.default)(parsedUnsignedTx.ins.length === params.unspents.length);
|
|
2236
|
+
(0, assert_1.default)(parsedUnsignedTx.outs.length === 1);
|
|
2237
|
+
(0, assert_1.default)(lodash_1.default.sumBy(params.unspents, 'value') - lodash_1.default.sumBy(parsedUnsignedTx.outs, 'value') === Number(approximateTxFee));
|
|
2238
|
+
const plainUserKey = this.bitgo.decrypt({ password: params.walletPassphrase, input: params.userKey });
|
|
2239
|
+
const halfSignedTx = await this.signTransaction({ ...unsignedTx, signingKey: plainUserKey });
|
|
2240
|
+
const plainBackupKey = this.bitgo.decrypt({ password: params.walletPassphrase, input: params.backupKey });
|
|
2241
|
+
const fullSignedTx = await this.signTransaction({
|
|
2242
|
+
...unsignedTx,
|
|
2243
|
+
transactionHex: halfSignedTx.tx,
|
|
2244
|
+
signingKey: plainBackupKey,
|
|
2245
|
+
});
|
|
2246
|
+
return fullSignedTx.tx;
|
|
2247
|
+
};
|
|
2248
|
+
/*
|
|
2249
|
+
* @params
|
|
2250
|
+
* walletPassphrase: passphrase of wallet used to decrypt the encrypted keys
|
|
2251
|
+
* unspents: array of unspents to recover
|
|
2252
|
+
* recoveryDestination: destination address to recover funds to
|
|
2253
|
+
* feeRate: fee rate to use for the recovery transaction
|
|
2254
|
+
* userKey: encrypted user key
|
|
2255
|
+
* */
|
|
2256
|
+
Wallet.prototype.sweep = async function (params) {
|
|
2257
|
+
if (lodash_1.default.isUndefined(params.walletPassphrase)) {
|
|
2258
|
+
throw new Error('missing walletPassphrase');
|
|
2259
|
+
}
|
|
2260
|
+
if (lodash_1.default.isUndefined(params.unspents)) {
|
|
2261
|
+
throw new Error('missing unspents');
|
|
2262
|
+
}
|
|
2263
|
+
if (lodash_1.default.isUndefined(params.recoveryDestination)) {
|
|
2264
|
+
throw new Error('invalid recoveryDestination');
|
|
2265
|
+
}
|
|
2266
|
+
if (lodash_1.default.isUndefined(params.feeRate)) {
|
|
2267
|
+
throw new Error('invalid feeRate');
|
|
2268
|
+
}
|
|
2269
|
+
if (lodash_1.default.isUndefined(params.userKey)) {
|
|
2270
|
+
throw new Error('invalid userKey');
|
|
2271
|
+
}
|
|
2272
|
+
const totalInputAmount = BigInt(utxolib.bitgo.unspentSum(params.unspents));
|
|
2273
|
+
if (totalInputAmount <= BigInt(0)) {
|
|
2274
|
+
throw new sdk_core_1.ErrorNoInputToRecover();
|
|
2275
|
+
}
|
|
2276
|
+
const outputSize = unspents_1.VirtualSizes.txP2wshOutputSize;
|
|
2277
|
+
const approximateSize = unspents_1.VirtualSizes.txSegOverheadVSize + outputSize + unspents_1.VirtualSizes.txP2shInputSize * params.unspents.length;
|
|
2278
|
+
const approximateTxFee = BigInt(approximateSize * params.feeRate);
|
|
2279
|
+
const recoveryAmount = totalInputAmount - approximateTxFee;
|
|
2280
|
+
const recipients = [{ address: params.recoveryDestination, amount: Number(recoveryAmount) }];
|
|
2281
|
+
const unsignedTx = await this.createTransaction({
|
|
2282
|
+
unspents: params.unspents,
|
|
2283
|
+
recipients,
|
|
2284
|
+
fee: Number(approximateTxFee),
|
|
2285
|
+
});
|
|
2286
|
+
const parsedUnsignedTx = utxolib.bitgo.createTransactionFromHex(unsignedTx.transactionHex, utxolib.networks.bitcoin);
|
|
2287
|
+
(0, assert_1.default)(parsedUnsignedTx.ins.length === params.unspents.length);
|
|
2288
|
+
(0, assert_1.default)(parsedUnsignedTx.outs.length === 1);
|
|
2289
|
+
(0, assert_1.default)(lodash_1.default.sumBy(params.unspents, 'value') - lodash_1.default.sumBy(parsedUnsignedTx.outs, 'value') === Number(approximateTxFee));
|
|
2290
|
+
const plainUserKey = this.bitgo.decrypt({ password: params.walletPassphrase, input: params.userKey });
|
|
2291
|
+
const halfSignedTx = await this.signTransaction({ ...unsignedTx, signingKey: plainUserKey });
|
|
2292
|
+
return await this.sendTransaction({
|
|
2293
|
+
tx: halfSignedTx.tx,
|
|
2294
|
+
suppressBroadcast: true,
|
|
2295
|
+
otp: params.otp,
|
|
2296
|
+
});
|
|
2093
2297
|
};
|
|
2094
2298
|
module.exports = Wallet;
|
|
2095
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsbURBQW9EO0FBRXBELG1EQUE2QztBQUM3QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELGdEQUFnRDtBQUNoRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVyRCxtREFBOEc7QUFDOUcscUNBQXFDO0FBQ3JDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDOUIsNEJBQTRCO0FBQzVCLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3RHLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV0QyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxNQUFNO0lBQ3BDLHNDQUFzQztJQUNyQyxJQUFJLENBQUMsS0FBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixzQ0FBc0M7SUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDckIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNsQixzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUMzQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0s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RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3RyxDQUFDLENBQUM7QUFFRixpQkFBUyxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuLy9cbi8vIFdhbGxldCBPYmplY3Rcbi8vIEJpdEdvIGFjY2Vzc29yIGZvciBhIHNwZWNpZmljIHdhbGxldFxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcblxuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5jb25zdCBQZW5kaW5nQXBwcm92YWwgPSByZXF1aXJlKCcuL3BlbmRpbmdhcHByb3ZhbCcpO1xuXG5pbXBvcnQgeyBjb21tb24sIGdldE5ldHdvcmssIGdldFNoYXJlZFNlY3JldCwgbWFrZVJhbmRvbUtleSwgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgQmx1ZWJpcmQgZnJvbSAnYmx1ZWJpcmQnO1xuY29uc3QgY28gPSBCbHVlYmlyZC5jb3JvdXRpbmU7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBnZXRJbnRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gdXR4b2xpYi5iaXRnbztcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFdhbGxldCA9IGZ1bmN0aW9uIChiaXRnbywgd2FsbGV0KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICh0aGlzLmJpdGdvIGFzIGFueSkgPSBiaXRnbztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMua2V5Y2hhaW5zID0gW107XG5cbiAgaWYgKHdhbGxldC5wcml2YXRlKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLmtleWNoYWlucyA9IHdhbGxldC5wcml2YXRlLmtleWNoYWlucztcbiAgfVxufTtcblxuV2FsbGV0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldDtcbn07XG5cbi8vXG4vLyBpZFxuLy8gR2V0IHRoZSBpZCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuaWQ7XG59O1xuXG4vL1xuLy8gbGFiZWxcbi8vIEdldCB0aGUgbGFiZWwgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmxhYmVsO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5iYWxhbmNlO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHVuY29uZmlybWVkIGFuZCBleHRlcm5hbFxuLy9cbldhbGxldC5wcm90b3R5cGUuc3BlbmRhYmxlQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY29uZmlybWVkQmFsYW5jZVxuLy8gR2V0IHRoZSBjb25maXJtZWRCYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybWVkQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY2FuU2VuZEluc3RhbnRcbi8vIFJldHVybnMgaWYgdGhlIHdhbGxldCBjYW4gc2VuZCBpbnN0YW50IHRyYW5zYWN0aW9uc1xuLy8gVGhpcyBpcyBpbXBhY3RlZCBieSB0aGUgY2hvaWNlIG9mIGJhY2t1cCBrZXkgcHJvdmlkZXJcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNhblNlbmRJbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQgJiYgdGhpcy53YWxsZXQuY2FuU2VuZEluc3RhbnQ7XG59O1xuXG4vL1xuLy8gaW5zdGFudCBiYWxhbmNlXG4vLyBHZXQgdGhlIGluc3RhbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyB0aGF0IG1heSBiZSBzcGVudCBpbnN0YW50bHkuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pbnN0YW50QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhblNlbmRJbnN0YW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhbiBpbnN0YW50IHdhbGxldCcpO1xuICB9XG4gIHJldHVybiB0aGlzLndhbGxldC5pbnN0YW50QmFsYW5jZTtcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFNlbmRzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRTZW5kcyBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkU2VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFNlbmRzO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkUmVjZWl2ZXNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFJlY2VpdmVzIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFJlY2VpdmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRSZWNlaXZlcztcbn07XG5cbi8vXG4vLyB0eXBlXG4vLyBHZXQgdGhlIHR5cGUgb2YgdGhpcyB3YWxsZXQsIGUuZy4gJ3NhZmVoZCdcbi8vXG5XYWxsZXQucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC50eXBlO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAoZXh0cmEpIHtcbiAgZXh0cmEgPSBleHRyYSB8fCAnJztcbiAgcmV0dXJuIHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG59O1xuXG4vL1xuLy8gcGVuZGluZ0FwcHJvdmFsc1xuLy8gcmV0dXJucyB0aGUgcGVuZGluZyBhcHByb3ZhbHMgbGlzdCBmb3IgdGhpcyB3YWxsZXQgYXMgcGVuZGluZyBhcHByb3ZhbCBvYmplY3RzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5wZW5kaW5nQXBwcm92YWxzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwoc2VsZi5iaXRnbywgcCwgc2VsZik7XG4gIH0pO1xufTtcblxuLy9cbi8vIGFwcHJvdmFsc1JlcXVpcmVkXG4vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIHRvIGFwcHJvdmUgcGVuZGluZyBhcHByb3ZhbHMgaW52b2x2aW5nIHRoaXMgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkIHx8IDE7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBSZWZldGNoZXMgdGhpcyB3YWxsZXQgYW5kIHJldHVybnMgaXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogQmx1ZWJpcmQ8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgpKVxuICAgICAgLnJlc3VsdCgpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHNlbGYud2FsbGV0ID0gcmVzO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH0pXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdXBkYXRlQXBwcm92YWxzUmVxdWlyZWRcbi8vIFVwZGF0ZXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgb24gYSBwZW5kaW5nIGFwcHJvdmFsIGludm9sdmluZyB0aGlzIHdhbGxldC5cbi8vIFRoZSBhcHByb3ZhbHMgcmVxdWlyZWQgaXMgYnkgZGVmYXVsdCAxLCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGVcbi8vIG51bWJlciBzdWNoIHRoYXQgMSA8PSBhcHByb3ZhbHNSZXF1aXJlZCA8PSB3YWxsZXRBZG1pbnMubGVuZ3RoIC0gMVxuLy9cbldhbGxldC5wcm90b3R5cGUudXBkYXRlQXBwcm92YWxzUmVxdWlyZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjayk6IEJsdWViaXJkPGFueT4ge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoXG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkID09PSB1bmRlZmluZWQgfHxcbiAgICAhXy5pc0ludGVnZXIocGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB8fFxuICAgIHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCA8IDFcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFwcHJvdmFsc1JlcXVpcmVkOiBtdXN0IGJlIGEgbm9uemVybyBwb3NpdGl2ZSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPSB0aGlzLmFwcHJvdmFsc1JlcXVpcmVkKCk7XG4gIGlmIChjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPT09IHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCkge1xuICAgIC8vIG5vLW9wLCBqdXN0IHJldHVybiB0aGUgY3VycmVudCB3YWxsZXRcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLndhbGxldDtcbiAgICB9KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvcnJlY3QgY2hhaW4gZm9yIGNoYW5nZSwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBzZWd3aXRcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRDaGFuZ2VDaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IHVzZVNlZ3dpdENoYW5nZSA9ICEhdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdENoYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2Vnd2l0Q2hhbmdlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgc2Vnd2l0IGlzIGRpc2FibGVkIHRocm91Z2ggdGhlIGNvbnN0YW50cywgc2Vnd2l0IGNoYW5nZSBzaG91bGQgc3RpbGwgbm90IGJlIGNyZWF0ZWRcbiAgICB1c2VTZWd3aXRDaGFuZ2UgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdCAmJiBwYXJhbXMuc2Vnd2l0Q2hhbmdlO1xuICB9XG4gIHJldHVybiB1c2VTZWd3aXRDaGFuZ2UgPyBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFkZHJlc3Ncbi8vIENyZWF0ZXMgYSBuZXcgYWRkcmVzcyBmb3IgdXNlIHdpdGggdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmICh0aGlzLnR5cGUoKSA9PT0gJ3NhZmUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHVzaW5nIGEgbGVnYWN5IHdhbGxldCB0aGF0IGNhbm5vdCBjcmVhdGUgYSBuZXcgYWRkcmVzcycpO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBjbGllbnQtc2lkZSBhZGRyZXNzIHZhbGlkYXRpb24gb24sIGZvciBzYWZldHkuIFVzZSB2YWxpZGF0ZT1mYWxzZSB0byBkaXNhYmxlLlxuICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuXG4gIGNvbnN0IGFsbG93RXhpc3RpbmcgPSBwYXJhbXMuYWxsb3dFeGlzdGluZztcbiAgaWYgKHR5cGVvZiBhbGxvd0V4aXN0aW5nICE9PSAnYm9vbGVhbicpIHtcbiAgICBwYXJhbXMuYWxsb3dFeGlzdGluZyA9IGFsbG93RXhpc3RpbmcgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGlzU2Vnd2l0ID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGNvbnN0IGRlZmF1bHRDaGFpbiA9IGlzU2Vnd2l0ID8gZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2hQMndzaCcpIDogZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcblxuICBsZXQgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiA9PT0gbnVsbCB8fCBjaGFpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2hhaW4gPSBkZWZhdWx0Q2hhaW47XG4gIH1cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy9hZGRyZXNzLycgKyBjaGFpbikpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChhZGRyKSB7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgIHNlbGYudmFsaWRhdGVBZGRyZXNzKGFkZHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgfSlcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYWRkcmVzcyBsb2NhbGx5IHdpdGhvdXQgY2FsbGluZyBzZXJ2ZXJcbiAqIEBwYXJhbSBwYXJhbXNcbiAqXG4gKi9cbldhbGxldC5wcm90b3R5cGUuZ2VuZXJhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHsgc2Vnd2l0LCBwYXRoLCBrZXljaGFpbnMsIHRocmVzaG9sZCB9KSB7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFzZWd3aXQ7XG4gIGxldCBzaWduYXR1cmVUaHJlc2hvbGQgPSAyO1xuICBpZiAoXy5pc0ludGVnZXIodGhyZXNob2xkKSkge1xuICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhyZXNob2xkIGhhcyB0byBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhdGhSZWdleCA9IC9eXFwvMT9bMDFdXFwvXFxkKyQvO1xuICBpZiAoIXBhdGgubWF0Y2gocGF0aFJlZ2V4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgcGF0aDogJyArIHBhdGgpO1xuICB9XG5cbiAgbGV0IHJvb3RLZXlzID0gdGhpcy5rZXljaGFpbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGtleWNoYWlucykpIHtcbiAgICByb290S2V5cyA9IGtleWNoYWlucztcbiAgfVxuXG4gIGNvbnN0IG5ldHdvcmsgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5ldHdvcms7XG5cbiAgY29uc3QgZGVyaXZlZEtleXMgPSByb290S2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICBjb25zdCBoZG5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGsueHB1Yik7XG4gICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBrLnBhdGggKyAoay53YWxsZXRTdWJQYXRoIHx8ICcnKSArIHBhdGg7XG4gICAgcmV0dXJuIGhkbm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChkZXJpdmF0aW9uUGF0aCkpLnB1YmxpY0tleTtcbiAgfSk7XG5cbiAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoQ29tcG9uZW50cyA9IF8ubWFwKHBhdGhDb21wb25lbnRzLCAoY29tcG9uZW50KSA9PiB7XG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbXBvbmVudCwgMTApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHBhdGhEZXRhaWxzID0gXy5maWx0ZXIobm9ybWFsaXplZFBhdGhDb21wb25lbnRzLCBfLmlzSW50ZWdlcik7XG5cbiAgY29uc3QgYWRkcmVzc0RldGFpbHM6IGFueSA9IHtcbiAgICBjaGFpblBhdGg6IHBhdGgsXG4gICAgcGF0aDogcGF0aCxcbiAgICBjaGFpbjogcGF0aERldGFpbHNbMF0sXG4gICAgaW5kZXg6IHBhdGhEZXRhaWxzWzFdLFxuICAgIHdhbGxldDogdGhpcy5pZCgpLFxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICByZWRlZW1TY3JpcHQsXG4gICAgd2l0bmVzc1NjcmlwdCxcbiAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRLZXlzLCBpc1NlZ3dpdCA/ICdwMnNoUDJ3c2gnIDogJ3Ayc2gnKTtcblxuICBhZGRyZXNzRGV0YWlscy53aXRuZXNzU2NyaXB0ID0gd2l0bmVzc1NjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5yZWRlZW1TY3JpcHQgPSByZWRlZW1TY3JpcHQ/LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMub3V0cHV0U2NyaXB0ID0gb3V0cHV0U2NyaXB0LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgZ2V0TmV0d29yayhuZXR3b3JrKSk7XG5cbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzO1xufTtcblxuLy9cbi8vIHZhbGlkYXRlQWRkcmVzc1xuLy8gVmFsaWRhdGVzIGFuIGFkZHJlc3MgYW5kIHBhdGggYnkgY2FsY3VsYXRpbmcgaXQgbG9jYWxseSBmcm9tIHRoZSBrZXljaGFpbiB4cHVic1xuLy9cbldhbGxldC5wcm90b3R5cGUudmFsaWRhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnLCAncGF0aCddLCBbXSk7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFwYXJhbXMud2l0bmVzc1NjcmlwdCAmJiBwYXJhbXMud2l0bmVzc1NjcmlwdC5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGdlbmVyYXRlZEFkZHJlc3MgPSB0aGlzLmdlbmVyYXRlQWRkcmVzcyh7IHBhdGg6IHBhcmFtcy5wYXRoLCBzZWd3aXQ6IGlzU2Vnd2l0IH0pO1xuICBpZiAoZ2VuZXJhdGVkQWRkcmVzcy5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICcgKyBwYXJhbXMuYWRkcmVzcyArICcgdnMuICcgKyBnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MpO1xuICB9XG59O1xuXG4vL1xuLy8gYWRkcmVzc2VzXG4vLyBHZXRzIHRoZSBhZGRyZXNzZXMgb2YgYSBIRCB3YWxsZXQuXG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgbGltaXQ6IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzIHRvIGdldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYWRkcmVzc2VzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gIGlmIChwYXJhbXMuZGV0YWlscykge1xuICAgIHF1ZXJ5LmRldGFpbHMgPSAxO1xuICB9XG5cbiAgY29uc3QgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiAhPT0gbnVsbCAmJiBjaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhaW4pKSB7XG4gICAgICBxdWVyeS5jaGFpbiA9IF8udW5pcShfLmZpbHRlcihjaGFpbiwgXy5pc0ludGVnZXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoYWluICE9PSAwICYmIGNoYWluICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaGFpbiBhcmd1bWVudCwgZXhwZWN0aW5nIDAgb3IgMScpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG4gIH1cbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5za2lwID0gcGFyYW1zLnNraXA7XG4gIH1cbiAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzZXMnKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zdGF0cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9zdGF0cycgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7V2FsbGV0fVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICAvLyB3aGVuIHNldCB0byB0cnVlLCBncGsgcmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHNhZmUgd2FsbGV0c1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5leHRlbmQoe30sIF8ucGljayhwYXJhbXMsIFsnZ3BrJ10pKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMud2FsbGV0ID0gcmVzO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkcmVzc1xuLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBhZGRyZXNzIG9uIGEgSEQgd2FsbGV0LlxuLy8gSW5mb3JtYXRpb24gaW5jbHVkZXMgaW5kZXgsIHBhdGgsIHJlZGVlbVNjcmlwdCwgc2VudCwgcmVjZWl2ZWQsIHR4Q291bnQgYW5kIGJhbGFuY2Vcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBhZGRyZXNzOiB0aGUgYWRkcmVzcyBvbiB0aGlzIHdhbGxldCB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZyZWV6ZSB0aGUgd2FsbGV0IGZvciBhIGR1cmF0aW9uIG9mIGNob2ljZSwgc3RvcHBpbmcgQml0R28gZnJvbSBzaWduaW5nIGFueSB0cmFuc2FjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIGR1cmF0aW9uIHRvIGZyZWV6ZSB0aGUgd2FsbGV0IGZvciBpbiBzZWNvbmRzLCBkZWZhdWx0cyB0byAzNjAwLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmZyZWV6ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb24gLSBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVcbi8vIERlbGV0ZXMgdGhlIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGFiZWxzXG4vLyBMaXN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhZGRyZXNzZXMgaW4gYSBnaXZlbiB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVscyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoJ2xhYmVscycpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVuYW1lIGEgd2FsbGV0XG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgLSBsYWJlbDogdGhlIHdhbGxldCdzIGludGVuZGVkIG5ldyBuYW1lXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNldFdhbGxldE5hbWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodXJsKS5zZW5kKHsgbGFiZWw6IHBhcmFtcy5sYWJlbCB9KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2V0TGFiZWxcbi8vIFNldHMgYSBsYWJlbCBvbiB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVMYWJlbFxuLy8gRGVsZXRlcyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHVybCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVuc3BlbnRzXG4vLyBMaXN0IEFMTCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHBhZ2VkIGxpc3Qgb2YgYWxsIHVuc3BlbnRzXG4vL1xuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBsaW1pdDogIHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuLy8gICBtaW5Db25mOiBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbi8vICAgdGFyZ2V0OiB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4vLyAgIGluc3RhbnQ6IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuLy9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFsbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjb25zdCBnZXRVbnNwZW50c0JhdGNoID0gZnVuY3Rpb24gKHNraXAsIGxpbWl0Pykge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcbiAgICBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LnNraXAgPSBza2lwO1xuICAgIH1cbiAgICBpZiAobGltaXQgJiYgbGltaXQgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnVuc3BlbnRzUGFnZWQocXVlcnlPYmplY3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gVGhlIEFQSSBoYXMgaXRzIG93biBsaW1pdCBoYW5kbGluZy4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdHMgYmlnZ2VyIHRoYW4gNTAwLiBJZiB0aGUgbGltaXRcbiAgICAgIC8vIHNwZWNpZmllZCBoZXJlIGlzIGJpZ2dlciB0aGFuIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBkbyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIG5lY2Vzc2FyeSBsaW1pdCBhZGp1c3RtZW50LlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudW5zcGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlc3VsdC51bnNwZW50c1tpXTtcbiAgICAgICAgYWxsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3VyIGxpbWl0IGFkanVzdG1lbnQgbWFrZXMgc3VyZSB0aGF0IHdlIG5ldmVyIGZldGNoIG1vcmUgdW5zcGVudHMgdGhhbiB3ZSBuZWVkLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGl0IHRoZVxuICAgICAgLy8gbGltaXQsIHdlIGhpdCBpdCBwcmVjaXNlbHlcbiAgICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gcGFyYW1zLmxpbWl0KSB7XG4gICAgICAgIHJldHVybiBhbGxVbnNwZW50czsgLy8gd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYW55IGZ1cnRoZXIgdW5zcGVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG90YWxVbnNwZW50Q291bnQgPSByZXN1bHQudG90YWw7XG4gICAgICAvLyBpZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgU0RLIGluZGljYXRlcyB0aGF0IHRoZXJlIGhhcyBiZWVuIGEgbGltaXQsIHdlIG5lZWQgdG8gZmV0Y2ggYW5vdGhlciBiYXRjaFxuICAgICAgaWYgKCFwYXJhbXMudGFyZ2V0ICYmIHRvdGFsVW5zcGVudENvdW50ICYmIHRvdGFsVW5zcGVudENvdW50ID4gYWxsVW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgLy8gbGV0J3MganVzdCBvZmZzZXQgdGhlIGN1cnJlbnQgc2tpcCBieSB0aGUgY291bnRcbiAgICAgICAgY29uc3QgbmV3U2tpcCA9IHNraXAgKyByZXN1bHQuY291bnQ7XG4gICAgICAgIGxldCBuZXdMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobGltaXQgPiAwKSB7XG4gICAgICAgICAgLy8gd2Ugc2V0IHRoZSBuZXcgbGltaXQgdG8gYmUgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgbWlzc2luZyB1bnNwZW50cyB0byBoaXQgb3VyIG93biBsaW1pdFxuICAgICAgICAgIG5ld0xpbWl0ID0gbGltaXQgLSBhbGxVbnNwZW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2gobmV3U2tpcCwgbmV3TGltaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsVW5zcGVudHM7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2goMCwgcGFyYW1zLmxpbWl0KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogTGlzdCB0aGUgdW5zcGVudHMgKHBhZ2VkKSBmb3IgYSBnaXZlbiB3YWxsZXQsIHJldHVybmluZyB0aGUgcmVzdWx0IGFzIGFuIG9iamVjdCBvZiB1bnNwZW50cywgY291bnQsIHNraXAgYW5kIHRvdGFsXG4gKiBUaGlzIG1ldGhvZCBtYXkgbm90IHJldHVybiBhbGwgdGhlIHVuc3BlbnRzIGFzIHRoZSBsaXN0IGlzIHBhZ2VkIGJ5IHRoZSBBUElcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMubGltaXQgdGhlIG9wdGlvbmFsIGxpbWl0IG9mIHVuc3BlbnRzIHRvIGNvbGxlY3QgaW4gQlRDXG4gKiBAcGFyYW0gcGFyYW1zLnNraXAgaW5kZXggaW4gbGlzdCBvZiB1bnNwZW50cyB0byBzdGFydCBwYWdpbmcgZnJvbVxuICogQHBhcmFtIHBhcmFtcy5taW5Db25maXJtcyBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0IHRoZSBhbW91bnQgb2YgYnRjIHRvIGZpbmQgdG8gc3BlbmRcbiAqIEBwYXJhbSBwYXJhbXMuaW5zdGFudCBvbmx5IGZpbmQgaW5zdGFudCB0cmFuc2FjdGlvbnMgKG11c3Qgc3BlY2lmeSBhIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgZGVzaXJlZCBudW1iZXIgb2YgdW5zcGVudHMgdG8gaGF2ZSBpbiB0aGUgd2FsbGV0IGFmdGVyIHRoZSB0eCBnb2VzIHRocm91Z2ggKHJlcXVpcmVzIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMubWluU2l6ZSBtaW5pbXVtIHVuc3BlbnQgc2l6ZSBpbiBzYXRvc2hpc1xuICogQHBhcmFtIHBhcmFtcy5zZWd3aXQgcmVxdWVzdCBzZWd3aXQgdW5zcGVudHMgKGRlZmF1bHRzIHRvIHRydWUgaWYgdW5kZWZpbmVkKVxuICogQHBhcmFtIHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCBhbGxvdyBzZWd3aXQgdW5zcGVudHMgZm9yIGxlZGdlciBkZXZpY2VzIChkZWZhdWx0cyB0byBmYWxzZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnVuc3BlbnRzUGFnZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2tpcCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSAmJiAhXy5pc051bWJlcihwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RhbnQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFyZ2V0V2FsbGV0VW5zcGVudHMgZmxhZyAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pblNpemUpICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5TaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogbWluU2l6ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdvbmx5IG9uZSBvZiBpbnN0YW50IGFuZCBtaW5Db25maXJtcyBtYXkgYmUgZGVmaW5lZCcpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldFdhbGxldFVuc3BlbnRzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgdGFyZ2V0Jyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQ6IGFsbG93TGVkZ2VyU2Vnd2l0IG11c3QgYmUgYSBib29sZWFuJyk7XG4gIH1cblxuICBjb25zdCBxdWVyeU9iamVjdCA9IF8uY2xvbmVEZWVwKHBhcmFtcyk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgLy8gc2tpcCBhbmQgbGltaXQgYXJlIHVuYXZhaWxhYmxlIHdoZW4gYSB0YXJnZXQgaXMgc3BlY2lmaWVkXG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LnNraXA7XG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LmxpbWl0O1xuICB9XG5cbiAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gdHJ1ZTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gcGFyYW1zLnNlZ3dpdDtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3QuYWxsb3dMZWRnZXJTZWd3aXQgPSBwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQ7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25zXG4vLyBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgICAgVE9ETzogIEFkZCBpdGVyYXRvcnMgZm9yIHN0YXJ0L2NvdW50L2V0Y1xuV2FsbGV0LnByb3RvdHlwZS50cmFuc2FjdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ3NraXA9JyArIHBhcmFtcy5za2lwKTtcbiAgfVxuICBpZiAocGFyYW1zLm1pbkhlaWdodCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkhlaWdodCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5IZWlnaHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtaW5IZWlnaHQ9JyArIHBhcmFtcy5taW5IZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWF4SGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4SGVpZ2h0KSB8fCBwYXJhbXMubWF4SGVpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heEhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtYXhIZWlnaHQ9JyArIHBhcmFtcy5tYXhIZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWluQ29uZmlybXMpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykgfHwgcGFyYW1zLm1pbkNvbmZpcm1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkNvbmZpcm1zPScgKyBwYXJhbXMubWluQ29uZmlybXMpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY29tcGFjdCkpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jb21wYWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvbXBhY3QgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnY29tcGFjdD0nICsgcGFyYW1zLmNvbXBhY3QpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eCcgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25cbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IElEIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvJyArIHBhcmFtcy5pZCk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcG9sbEZvclRyYW5zYWN0aW9uXG4vLyBQb2xsIGEgdHJhbnNhY3Rpb24gdW50aWwgc3VjY2Vzc2Z1bCBvciB0aW1lcyBvdXRcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGlkOiB0aGUgdHhpZFxuLy8gICBkZWxheTogZGVsYXkgYmV0d2VlbiBwb2xscyBpbiBtcyAoZGVmYXVsdDogMTAwMClcbi8vICAgdGltZW91dDogdGltZW91dCBpbiBtcyAoZGVmYXVsdDogMTAwMDApXG5XYWxsZXQucHJvdG90eXBlLnBvbGxGb3JUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHBhcmFtcy5kZWxheSAmJiAhXy5pc051bWJlcihwYXJhbXMuZGVsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRlbGF5IHBhcmFtZXRlcicpO1xuICB9XG4gIGlmIChwYXJhbXMudGltZW91dCAmJiAhXy5pc051bWJlcihwYXJhbXMudGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGltZW91dCBwYXJhbWV0ZXInKTtcbiAgfVxuICBwYXJhbXMuZGVsYXkgPSBwYXJhbXMuZGVsYXkgfHwgMTAwMDtcbiAgcGFyYW1zLnRpbWVvdXQgPSBwYXJhbXMudGltZW91dCB8fCAxMDAwMDtcblxuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgZG9OZXh0UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZlxuICAgICAgLmdldFRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0IHx8IG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnQudmFsdWVPZigpID4gcGFyYW1zLnRpbWVvdXQpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsdWViaXJkLmRlbGF5KHBhcmFtcy5kZWxheSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRvTmV4dFBvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZG9OZXh0UG9sbCgpO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0V2FsbGV0VHJhbnNhY3Rpb25CeVNlcXVlbmNlSWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvc2VxdWVuY2UvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBLZXkgY2hhaW5zXG4vLyBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbi8vIFRoZSB1c2VyIGtleSBjaGFpbiBpcyB0eXBpY2FsbHkgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIGhhcyB0aGUgZW5jcnlwdGVkIHhwcml2IHN0b3JlZCBvbiBCaXRHby5cbi8vIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuV2FsbGV0LnByb3RvdHlwZS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHRyeUtleUNoYWluID0gY28oZnVuY3Rpb24qIChpbmRleCkge1xuICAgICAgaWYgKCFzZWxmLmtleWNoYWlucyB8fCBpbmRleCA+PSBzZWxmLmtleWNoYWlucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgeHB1Yjogc2VsZi5rZXljaGFpbnNbaW5kZXhdLnhwdWIgfTtcblxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSB5aWVsZCBzZWxmLmJpdGdvLmtleWNoYWlucygpLmdldChwYXJhbXMpO1xuICAgICAgLy8gSWYgd2UgZmluZCB0aGUgeHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoID0gc2VsZi5rZXljaGFpbnNbaW5kZXhdLnBhdGg7XG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVUcmFuc2FjdGlvblxuLy8gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gKHVuc2lnbmVkKS4gVG8gc2lnbiBpdCwgZG8gc2lnblRyYW5zYWN0aW9uXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gb2JqZWN0IG9mIHJlY2lwaWVudCBhZGRyZXNzZXMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4ge2FkZHJlc3M6MTUwMCwgYWRkcmVzczI6MTUwMH1cbi8vICAgZmVlICAgICAgLSB0aGUgYmxvY2tjaGFpbiBmZWUgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIGZlZVJhdGUgIC0gdGhlIGZlZSBwZXIga2IgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIG1pbkNvbmZpcm1zIC0gbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdG8gdXNlIHdoZW4gZ2F0aGVyaW5nIHVuc3BlbnRzXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQgLSBmb3JjZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSBsYXN0IG91dHB1dCAob3B0aW9uYWwpXG4vLyAgIG5vU3BsaXRDaGFuZ2UgLSBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbi8vICAgY2hhbmdlQWRkcmVzcyAtIG92ZXJyaWRlIHRoZSBjaGFuZ2UgYWRkcmVzcyAob3B0aW9uYWwpXG4vLyAgIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIGNoYW5nZSBhZGRyZXNzZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB7IHRyYW5zYWN0aW9uSGV4OiBzdHJpbmcsIHVuc3BlbnRzOiBbaW5wdXRzXSwgZmVlOiBzYXRvc2hpcyB9KVxuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoXG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpKSB8fFxuICAgICghXy5pc1N0cmluZyhwYXJhbXMuY2hhbmdlQWRkcmVzcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmNoYW5nZUFkZHJlc3MpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLnZhbGlkYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMudmFsaWRhdGUpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMud2FsbGV0ID0gdGhpcztcblxuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25IZXgnXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSB1bnNwZW50cyBhcnJheScpO1xuICB9XG5cbiAgaWYgKCghXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pIHx8ICFwYXJhbXMua2V5Y2hhaW4ueHBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgLy8gYWxsb3cgcGFzc2luZyBpbiBhIFdJRiBwcml2YXRlIGtleSBmb3IgbGVnYWN5IHNhZmUgd2FsbGV0IHN1cHBvcnRcbiAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3Rpbmcga2V5Y2hhaW4gb2JqZWN0IHdpdGggeHBydiBvciBzaWduaW5nS2V5IFdJRicpO1xuICAgIGVycm9yLmNvZGUgPSAnbWlzc2luZ19rZXljaGFpbl9vcl9zaWduaW5nS2V5JztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMuYml0Z28gPSB0aGlzLmJpdGdvO1xuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHg6IHJlc3VsdC50cmFuc2FjdGlvbkhleCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZFxuLy8gU2VuZCBhIHRyYW5zYWN0aW9uIHRvIHRoZSBCaXRjb2luIG5ldHdvcmsgdmlhIEJpdEdvLlxuLy8gT25lIG9mIHRoZSBrZXlzIGlzIHR5cGljYWxseSBzaWduZWQsIGFuZCBCaXRHbyB3aWxsIHNpZ24gdGhlIG90aGVyIChpZiBhcHByb3ZlZCkgYW5kIHJlbGF5IGl0IHRvIHRoZSBQMlAgbmV0d29yay5cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHR4ICAtIHRoZSBoZXggZW5jb2RlZCwgc2lnbmVkIHRyYW5zYWN0aW9uIHRvIHNlbmRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHgnXSwgWydtZXNzYWdlJywgJ290cCddLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvdHgvc2VuZCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHtcbiAgICAgIGlmIChib2R5LnBlbmRpbmdBcHByb3ZhbCkge1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoYm9keSwgeyBzdGF0dXM6ICdwZW5kaW5nQXBwcm92YWwnIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5vdHApIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAnb3RwJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnYWNjZXB0ZWQnLFxuICAgICAgICB0eDogYm9keS50cmFuc2FjdGlvbixcbiAgICAgICAgaGFzaDogYm9keS50cmFuc2FjdGlvbkhhc2gsXG4gICAgICAgIGluc3RhbnQ6IGJvZHkuaW5zdGFudCxcbiAgICAgICAgaW5zdGFudElkOiBib2R5Lmluc3RhbnRJZCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNoYXJlIHRoZSB3YWxsZXQgd2l0aCBhbiBleGlzdGluZyBCaXRHbyB1c2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgVGhlIHJlY2lwaWVudCdzIHVzZXIgaWQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgdXNlciByZWNvcmQgaW4gb3VyIGRhdGFiYXNlLlxuICogQHBhcmFtIHtrZXljaGFpbn0ga2V5Y2hhaW4gVGhlIGtleWNoYWluIHRvIGJlIHNoYXJlZCB3aXRoIHRoZSByZWNpcGllbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbnMgQSBjb21tYS1zZXBhcmF0ZWQgdmFsdWUgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSByZWNpcGllbnQncyBwZXJtaXNzaW9ucyBpZiB0aGUgc2hhcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSB1c2VkIGZvciB0aGlzIHNoYXJlLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZVNoYXJlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgIGlmIChcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4ueHB1YiB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4ucGF0aFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0geHB1YiwgZW5jcnlwdGVkWHBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUludml0ZVxuLy8gaW52aXRlIGEgbm9uIEJpdEdvIGN1c3RvbWVyIHRvIGpvaW4gYSB3YWxsZXRcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGVtYWlsIC0gdGhlIHJlY2lwaWVudCdzIGVtYWlsIGFkZHJlc3Ncbi8vICAgcGVybWlzc2lvbnMgLSB0aGUgcmVjaXBpZW50J3MgcGVybWlzc2lvbnMgaWYgdGhlIHNoYXJlIGlzIGFjY2VwdGVkXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlSW52aXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xuICAgIHRvRW1haWw6IHBhcmFtcy5lbWFpbCxcbiAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICB9O1xuXG4gIGlmIChwYXJhbXMubWVzc2FnZSkge1xuICAgIG9wdGlvbnMubWVzc2FnZSA9IHBhcmFtcy5tZXNzYWdlO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvaW52aXRlJykpLnNlbmQob3B0aW9ucykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNvbmZpcm1JbnZpdGVBbmRTaGFyZVdhbGxldFxuLy8gY29uZmlybSBteSBpbnZpdGUgb24gdGhpcyB3YWxsZXQgdG8gYSByZWNpcGllbnQgd2hvIGhhc1xuLy8gc3Vic2VxdWVudGx5IHNpZ25lZCB1cCBieSBjcmVhdGluZyB0aGUgYWN0dWFsIHdhbGxldCBzaGFyZVxuLy8gUGFyYW1ldGVyczpcbi8vICAgd2FsbGV0SW52aXRlSWQgLSB0aGUgd2FsbGV0IGludml0ZSBpZFxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gcmVxdWlyZWQgaWYgdGhlIHdhbGxldCBzaGFyZSBzdWNjZXNzIGlzIGV4cGVjdGVkXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybUludml0ZUFuZFNoYXJlV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldEludml0ZUlkJ10sIFsnd2FsbGV0UGFzc3BocmFzZSddLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLmJpdGdvXG4gICAgLndhbGxldHMoKVxuICAgIC5saXN0SW52aXRlcygpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGludml0ZXMpIHtcbiAgICAgIGNvbnN0IG91dGdvaW5nID0gaW52aXRlcy5vdXRnb2luZztcbiAgICAgIGNvbnN0IGludml0ZSA9IF8uZmluZChvdXRnb2luZywgZnVuY3Rpb24gKG91dCkge1xuICAgICAgICByZXR1cm4gb3V0LmlkID09PSBwYXJhbXMud2FsbGV0SW52aXRlSWQ7XG4gICAgICB9KTtcbiAgICAgIGlmICghaW52aXRlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0IGludml0ZSBub3QgZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZW1haWw6IGludml0ZS50b0VtYWlsLFxuICAgICAgICBwZXJtaXNzaW9uczogaW52aXRlLnBlcm1pc3Npb25zLFxuICAgICAgICBtZXNzYWdlOiBpbnZpdGUubWVzc2FnZSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc2VsZi5zaGFyZVdhbGxldChvcHRpb25zKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5wdXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRpbnZpdGUvJyArIHBhcmFtcy53YWxsZXRJbnZpdGVJZCkpO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRDb2luc1xuLy8gU2VuZCBjb2lucyB0byBhIGRlc3RpbmF0aW9uIGFkZHJlc3MgZnJvbSB0aGlzIHdhbGxldCB1c2luZyB0aGUgdXNlciBrZXkuXG4vLyAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHByaXZcbi8vIDIuIERlY3J5cHRzIHVzZXIga2V5XG4vLyAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4vLyA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuLy8gMy4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4vLyAgIGFtb3VudCAtIHRoZSBhbW91bnQgaW4gc2F0b3NoaXMgdG8gYmUgc2VudFxuLy8gICBtZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZENvaW5zID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgcGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgcGFyYW1zLnJlY2lwaWVudHNbcGFyYW1zLmFkZHJlc3NdID0gcGFyYW1zLmFtb3VudDtcblxuICByZXR1cm4gdGhpcy5zZW5kTWFueShwYXJhbXMpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRNYW55XG4vLyBTZW5kIGNvaW5zIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyLCB0cmF2ZWxJbmZvOiBvYmplY3QgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRNYW55ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydtZXNzYWdlJywgJ290cCddLCBjYWxsYmFjayk7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gIH1cblxuICBsZXQgYml0Z29GZWU7XG4gIGxldCB0cmF2ZWxJbmZvcztcbiAgbGV0IGZpbmFsUmVzdWx0O1xuICBsZXQgdW5zcGVudHNVc2VkO1xuXG4gIGNvbnN0IGFjY2VwdGVkQnVpbGRQYXJhbXMgPSBbXG4gICAgJ251bUJsb2NrcycsXG4gICAgJ2ZlZVJhdGUnLFxuICAgICdtaW5Db25maXJtcycsXG4gICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgJ3RhcmdldFdhbGxldFVuc3BlbnRzJyxcbiAgICAnbWVzc2FnZScsXG4gICAgJ21pblZhbHVlJyxcbiAgICAnbWF4VmFsdWUnLFxuICAgICdub1NwbGl0Q2hhbmdlJyxcbiAgICAnY29tbWVudCcsXG4gIF07XG4gIGNvbnN0IHByZXNlcnZlZEJ1aWxkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgYWNjZXB0ZWRCdWlsZFBhcmFtcyk7XG5cbiAgLy8gR2V0IHRoZSB1c2VyIGtleWNoYWluXG4gIGNvbnN0IHJldFByb21pc2UgPSB0aGlzLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBTZW5kIHRoZSB0cmFuc2FjdGlvblxuICAgICAgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICAgIHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgICB1bnNwZW50c1VzZWQgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcbiAgICAgIHJldHVybiBzZWxmLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4OiB0cmFuc2FjdGlvbi50eCxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgICAgb3RwOiBwYXJhbXMub3RwLFxuICAgICAgICAvLyBUaGUgYmVsb3cgcGFyYW1zIGFyZSBmb3IgbG9nZ2luZyBvbmx5LCBhbmQgZG8gbm90IGltcGFjdCB0aGUgQVBJIGNhbGxcbiAgICAgICAgZXN0aW1hdGVkU2l6ZTogdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZSxcbiAgICAgICAgYnVpbGRQYXJhbXM6IHByZXNlcnZlZEJ1aWxkUGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjb25zdCB0eCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHJlc3VsdC50eCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICAgIGNvbnN0IGlucHV0c1N1bSA9IF8uc3VtQnkodW5zcGVudHNVc2VkLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IG91dHB1dHNTdW0gPSBfLnN1bUJ5KHR4Lm91dHMsICd2YWx1ZScpO1xuICAgICAgY29uc3QgZmVlVXNlZCA9IGlucHV0c1N1bSAtIG91dHB1dHNTdW07XG4gICAgICBpZiAoaXNOYU4oZmVlVXNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVVzZWQnKTtcbiAgICAgIH1cbiAgICAgIChyZXN1bHQuZmVlID0gZmVlVXNlZCksIChyZXN1bHQuZmVlUmF0ZSA9IChmZWVVc2VkICogMTAwMCkgLyB0eC52aXJ0dWFsU2l6ZSgpKTtcbiAgICAgIHJlc3VsdC50cmF2ZWxJbmZvcyA9IHRyYXZlbEluZm9zO1xuICAgICAgaWYgKGJpdGdvRmVlKSB7XG4gICAgICAgIHJlc3VsdC5iaXRnb0ZlZSA9IGJpdGdvRmVlO1xuICAgICAgfVxuICAgICAgZmluYWxSZXN1bHQgPSByZXN1bHQ7XG5cbiAgICAgIC8vIEhhbmRsZSBzZW5kaW5nIHRyYXZlbCBpbmZvcyBpZiB0aGV5IGV4aXN0LCBidXQgbWFrZSBzdXJlIHdlIG5ldmVyIGZhaWwgaGVyZS5cbiAgICAgIC8vIEVycm9yIG9yIHJlc3VsdCAod2l0aCBwb3NzaWJsZSBzdWItZXJyb3JzKSB3aWxsIGJlIHByb3ZpZGVkIGluIHRyYXZlbFJlc3VsdFxuICAgICAgaWYgKHRyYXZlbEluZm9zICYmIHRyYXZlbEluZm9zLmxlbmd0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBzZWxmXG4gICAgICAgICAgICAucG9sbEZvclRyYW5zYWN0aW9uKHsgaWQ6IHJlc3VsdC5oYXNoIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLmJpdGdvLnRyYXZlbFJ1bGUoKS5zZW5kTWFueShyZXN1bHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIGNhdGNoIGFzeW5jIGVycm9yc1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGNhdGNoIHN5bmNocm9ub3VzIGVycm9yc1xuICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHsgZXJyb3I6IGVyci5tZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmaW5hbFJlc3VsdDtcbiAgICB9KTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUocmV0UHJvbWlzZSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEFjY2VsZXJhdGUgYSBzdHVjayB0cmFuc2FjdGlvbiB1c2luZyBDaGlsZC1QYXlzLUZvci1QYXJlbnQgKENQRlApLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc3R1Y2sgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gdW5jb25maXJtZWQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBJbnB1dCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRyYW5zYWN0aW9uSUQgLSBJRCBvZiB0cmFuc2FjdGlvbiB0byBhY2NlbGVyYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBOZXcgZWZmZWN0aXZlIGZlZSByYXRlIGZvciBzdHVjayB0cmFuc2FjdGlvbiAoc2F0IHBlciAxMDAwIGJ5dGVzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgLSBNYXhpbXVtIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIGZyb20gdGhlIHdhbGxldCB0byBjb3ZlciBhbnkgY2hpbGQgZmVlcyB0aGF0IHRoZSBwYXJlbnQgdW5zcGVudCBvdXRwdXQgY2Fubm90IGNvdmVyLiBEZWZhdWx0cyB0byAxMDAuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB3YWxsZXQgcHJpdmF0ZSBrZXkuIE9uZSBvZiBlaXRoZXIgd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gVGhlIHByaXZhdGUga2V5IGZvciB0aGUgd2FsbGV0LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyBSZXN1bHQgb2Ygc2VuZFRyYW5zYWN0aW9uKCkgb24gdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gKi9cbldhbGxldC5wcm90b3R5cGUuYWNjZWxlcmF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXN0aW1hdGUgYSB0cmFuc2FjdGlvbnMgc2l6ZSBpbiB2aXJ0dWFsIGJ5dGVzLlxuICAgKiBBY3R1YWwgdHJhbnNhY3Rpb25zIG1heSBiZSBzbGlnaHRseSBmZXdlciB2aXJ0dWFsIGJ5dGVzLCBkdWUgdG9cbiAgICogdGhlIGZhY3QgdGhhdCB2YWxpZCBFQ1NEQSBzaWduYXR1cmVzIGhhdmUgYSB2YXJpYWJsZSBsZW5ndGhcbiAgICogYmV0d2VlbiA4IGFuZCA3MyB2aXJ0dWFsIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzLnNlZ3dpdCBUaGUgbnVtYmVyIG9mIHNlZ3dpdCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpbnB1dHMuUDJTSCBUaGUgbnVtYmVyIG9mIFAyU0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyUEtIIFRoZSBudW1iZXIgb2YgUDJQS0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVUeFZTaXplID0gKGlucHV0cykgPT4ge1xuICAgIGNvbnN0IHNlZ3dpdCA9IGlucHV0cy5zZWd3aXQgfHwgMDtcbiAgICBjb25zdCBQMlNIID0gaW5wdXRzLlAyU0ggfHwgMDtcbiAgICBjb25zdCBQMlBLSCA9IGlucHV0cy5QMlBLSCB8fCAwO1xuXG4gICAgY29uc3QgY2hpbGRGZWVJbmZvID0gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyh7XG4gICAgICBuUDJzaElucHV0czogUDJTSCxcbiAgICAgIG5QMnBraElucHV0czogUDJQS0gsXG4gICAgICBuUDJzaFAyd3NoSW5wdXRzOiBzZWd3aXQsXG4gICAgICBuT3V0cHV0czogMSxcbiAgICAgIGZlZVJhdGU6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hpbGRGZWVJbmZvLnNpemU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgc2hvdWxkIGJlIHBhaWQgaW4gZmVlcyBieSB0aGUgY2hpbGQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gZmVlUmF0ZSBUaGUgbmV3IGZlZSByYXRlIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjb21iaW5lZCBDUEZQIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIGNoaWxkIHR4IHNob3VsZCBwYXkgaW4gZmVlc1xuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVDaGlsZEZlZSA9ICh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZSB9KSA9PiB7XG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIG1vcmUgd2UgKnNob3VsZCogaGF2ZSBwYWlkIGluIHBhcmVudCBmZWVzLFxuICAgIC8vIGhhZCB0aGUgcGFyZW50IGJlZW4gb3JpZ2luYWxseSBzZW50IHdpdGggdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGFkZGl0aW9uYWxQYXJlbnRGZWUgPSBfLmNlaWwoKHBhcmVudFZTaXplICogZmVlUmF0ZSkgLyAxMDAwKSAtIHBhcmVudEZlZTtcblxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSB3b3VsZCBwYXkgaW4gZmVlcyBmb3IgdGhlIGNoaWxkLFxuICAgIC8vIGlmIGl0IHdlcmUgb25seSBwYXlpbmcgZm9yIGl0c2VsZiBhdCB0aGUgbmV3IGZlZSByYXRlXG4gICAgY29uc3QgY2hpbGRGZWUgPSAoZXN0aW1hdGVUeFZTaXplKGlucHV0cykgKiBmZWVSYXRlKSAvIDEwMDA7XG5cbiAgICByZXR1cm4gXy5jZWlsKGNoaWxkRmVlICsgYWRkaXRpb25hbFBhcmVudEZlZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIHRvIHBheSB0aGUgY2hpbGQgdHggZmVlcy5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdGhlIHBhcmVudCB0eCBvdXRwdXQgaXMgbm90IHN1ZmZpY2llbnQgdG9cbiAgICogY292ZXIgdGhlIHRvdGFsIGZlZXMgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnkgdGhlIGNoaWxkIHR4LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0cyB0byB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gd2hpY2ggYXJlIHBhc3NlZCB0byBlc3RpbWF0ZVR4VlNpemVcbiAgICogQHBhcmFtIHBhcmVudE91dHB1dFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eCB3aGljaCB3ZSBhcmUgdXNpbmcgYXMgYW4gaW5wdXQgdG8gdGhlIGNoaWxkIHR4XG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gbWF4VW5zcGVudHMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGl0aW9uYWwgdW5zcGVudHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVzXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSwgdGhlIHVwZGF0ZWQgbnVtYmVyIG9mIHNhdG9zaGlzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5XG4gICAqICAgICAgICAgIHRoZSBjaGlsZCB0eCwgYW5kIHRoZSB1cGRhdGVkIGlucHV0cyBmb3IgdGhlIGNoaWxkIHR4LlxuICAgKi9cbiAgY29uc3QgZmluZEFkZGl0aW9uYWxVbnNwZW50cyA9ICh7IGlucHV0cywgcGFyZW50T3V0cHV0VmFsdWUsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIG1heFVuc3BlbnRzIH0pID0+IHtcbiAgICByZXR1cm4gY28oZnVuY3Rpb24qIGNvRmluZEFkZGl0aW9uYWxVbnNwZW50cygpIHtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxVbnNwZW50czogYW55W10gPSBbXTtcblxuICAgICAgLy8gYXNrIHRoZSBzZXJ2ZXIgZm9yIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLCBhc3N1bWluZ1xuICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZG9uZSB3aXRob3V0IGFkZGl0aW9uYWwgdW5zcGVudHMgKHdoaWNoIGlzIG5vdCBwb3NzaWJsZSxcbiAgICAgIC8vIHNpbmNlIGlmIHRoYXQgd2VyZSB0aGUgY2FzZSwgZmluZEFkZGl0aW9uYWxVbnNwZW50cyB3b3VsZCBub3QgaGF2ZSBiZWVuXG4gICAgICAvLyBjYWxsZWQgaW4gdGhlIGZpcnN0IHBsYWNlLiBUaGlzIHdpbGwgYmUgY29ycmVjdGVkIGJlZm9yZSByZXR1cm5pbmcpXG4gICAgICBsZXQgY3VycmVudENoaWxkRmVlRXN0aW1hdGUgPSBlc3RpbWF0ZUNoaWxkRmVlKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlOiBwYXJhbXMuZmVlUmF0ZSB9KTtcbiAgICAgIGxldCB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWU7XG5cbiAgICAgIHdoaWxlICh1bmNvdmVyZWRDaGlsZEZlZSA+IDAgJiYgYWRkaXRpb25hbFVuc3BlbnRzLmxlbmd0aCA8IG1heFVuc3BlbnRzKSB7XG4gICAgICAgIC8vIHRyeSB0byBnZXQgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSByZXN0IG9mIHRoZSBjaGlsZCBmZWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgY29uc3QgdW5zcGVudHMgPSAoeWllbGQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgICAgbWluQ29uZmlybXM6IDEsXG4gICAgICAgICAgdGFyZ2V0OiB1bmNvdmVyZWRDaGlsZEZlZSxcbiAgICAgICAgICBsaW1pdDogbWF4VW5zcGVudHMgLSBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoLFxuICAgICAgICB9KSkgYXMgYW55O1xuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBubyBtb3JlIHVuc3BlbnRzIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhZGRpdGlvbmFsVW5zcGVudFZhbHVlID0gMDtcblxuICAgICAgICAvLyBjb25zdW1lIGFsbCB1bnNwZW50cyByZXR1cm5lZCBieSB0aGUgc2VydmVyLCBldmVuIGlmIHdlIGRvbid0IG5lZWRcbiAgICAgICAgLy8gYWxsIG9mIHRoZW0gdG8gY292ZXIgdGhlIGNoaWxkIGZlZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbFxuICAgICAgICAvLyByZXR1cm4gZW5vdWdoIHVuc3BlbnQgdmFsdWUgdG8gZW5zdXJlIHRoYXQgdGhlIG1pbmltdW0gY2hhbmdlIGFtb3VudFxuICAgICAgICAvLyBpcyBhY2hpZXZlZCBmb3IgdGhlIGNoaWxkIHR4LCBhbmQgd2UgY2FuJ3QgbGVhdmUgb3V0IHRob3NlIHVuc3BlbnRzXG4gICAgICAgIC8vIG9yIGVsc2UgdGhlIG1pbmltdW0gY2hhbmdlIGFtb3VudCBjb25zdHJhaW50IGNvdWxkIGJlIHZpb2xhdGVkXG4gICAgICAgIF8uZm9yRWFjaCh1bnNwZW50cywgKHVuc3BlbnQpID0+IHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNoaWxkIHR4IGlucHV0c1xuICAgICAgICAgIGNvbnN0IHVuc3BlbnRDaGFpbiA9IGdldENoYWluKHVuc3BlbnQpO1xuICAgICAgICAgIGlmIChpc0NoYWluQ29kZSh1bnNwZW50Q2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50Q2hhaW4pID09PSAncDJzaFAyd3NoJykge1xuICAgICAgICAgICAgaW5wdXRzLnNlZ3dpdCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMuUDJTSCsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZGl0aW9uYWxVbnNwZW50cy5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgIGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgKz0gdW5zcGVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3VycmVudENoaWxkRmVlRXN0aW1hdGUgPSBlc3RpbWF0ZUNoaWxkRmVlKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlOiBwYXJhbXMuZmVlUmF0ZSB9KTtcbiAgICAgICAgdW5jb3ZlcmVkQ2hpbGRGZWUgPSBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSAtIHBhcmVudE91dHB1dFZhbHVlIC0gYWRkaXRpb25hbFVuc3BlbnRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVuY292ZXJlZENoaWxkRmVlID4gMCkge1xuICAgICAgICAvLyBVbmFibGUgdG8gZmluZCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIGNoaWxkIGZlZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBjb25maXJtZWQgdW5zcGVudHMgYXZhaWxhYmxlIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWVgKTtcbiAgICAgIH1cblxuICAgICAgLy8gZm91bmQgZW5vdWdoIHVuc3BlbnRzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRpdGlvbmFsOiBhZGRpdGlvbmFsVW5zcGVudHMsXG4gICAgICAgIG5ld0NoaWxkRmVlOiBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSxcbiAgICAgICAgbmV3SW5wdXRzOiBpbnB1dHMsXG4gICAgICB9O1xuICAgIH0pLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYSBmdWxsIGNvcHkgKGluY2x1ZGluZyB3aXRuZXNzIGRhdGEpIG9mIGFuIGFyYml0cmFyeSB0eCB1c2luZyBvbmx5IHRoZSB0eCBpZC5cbiAgICpcbiAgICogV2UgaGF2ZSB0byB1c2UgYW4gZXh0ZXJuYWwgc2VydmljZSBmb3IgdGhpcyAoY3VycmVudGx5IGJsb2Nrc3RyZWFtLmluZm8pLCBzaW5jZVxuICAgKiB0aGUgdjEgaW5kZXhlciBzZXJ2aWNlIChiYXNlZCBvbiBiaXRjb2luaikgZG9lcyBub3QgaGF2ZSBzZWd3aXQgc3VwcG9ydCBhbmRcbiAgICogZG9lcyBub3QgcmV0dXJuIGFueSBzZWd3aXQgcmVsYXRlZCBmaWVsZHMgaW4gdGhlIHR4IGhleC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmVudFR4SWQgVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiB0byBnZXQgdGhlIGZ1bGwgaGV4IG9mXG4gICAqIEByZXR1cm5zIHtCbHVlYmlyZDxhbnk+fSBUaGUgZnVsbCBoZXggZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFBhcmVudFR4SGV4KHsgcGFyZW50VHhJZCB9OiB7IHBhcmVudFR4SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBleHBsb3JlckJhc2VVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW3NlbGYuYml0Z28uZ2V0RW52KCldLmJ0Y0V4cGxvcmVyQmFzZVVybDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LmdldChgJHtleHBsb3JlckJhc2VVcmx9L3R4LyR7cGFyZW50VHhJZH0vaGV4YCk7XG5cbiAgICBpZiAoIXJlc3VsdC50ZXh0IHx8ICEvKFthLWYwLTldezJ9KSsvLnRlc3QocmVzdWx0LnRleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IHN1Y2Nlc3NmdWxseSByZWNlaXZlIHBhcmVudCB0eCBoZXguIFJlY2VpdmVkICcke18udHJ1bmNhdGUocmVzdWx0LnRleHQsIHsgbGVuZ3RoOiAxMDAgfSl9JyBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGNoYWluIGZyb20gYW4gdW5zcGVudCBvciB0eCBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBvdXRwdXRPclVuc3BlbnQgVGhlIG91dHB1dCBvciB1bnNwZW50IHdob3NlIGNoYWluIHNob3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjaGFpbiBmb3IgdGhlIGdpdmVuIG91dHB1dCBvciB1bnNwZW50XG4gICAqL1xuICBjb25zdCBnZXRDaGFpbiA9IChvdXRwdXRPclVuc3BlbnQpID0+IHtcbiAgICBpZiAob3V0cHV0T3JVbnNwZW50LmNoYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQuY2hhaW47XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dE9yVW5zcGVudC5jaGFpblBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF8udG9OdW1iZXIob3V0cHV0T3JVbnNwZW50LmNoYWluUGF0aC5zcGxpdCgnLycpWzFdKTtcbiAgICB9XG5cbiAgICAvLyBubyB3YXkgdG8gdGVsbCB0aGUgY2hhaW4sIGxldCdzIGp1c3QgYmxvdyB1cCBub3cgaW5zdGVhZFxuICAgIC8vIG9mIGJsb3dpbmcgdXAgbGF0ZXIgd2hlbiB0aGUgdW5kZWZpbmVkIHJldHVybiB2YWx1ZSBpcyB1c2VkLlxuICAgIC8vIE5vdGU6IGZvciB1bnNwZW50cyB0aGUgZmllbGQgdG8gdXNlIGlzICdhZGRyZXNzJywgYnV0IGZvciBvdXRwdXRzXG4gICAgLy8gdGhlIGZpZWxkIHRvIHVzZSBpcyAnYWNjb3VudCdcbiAgICB0aHJvdyBFcnJvcihgQ291bGQgbm90IGdldCBjaGFpbiBmb3Igb3V0cHV0IG9uIGFjY291bnQgJHtvdXRwdXRPclVuc3BlbnQuYWNjb3VudCB8fCBvdXRwdXRPclVuc3BlbnQuYWRkcmVzc31gKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIHZhbHVlIGNvbnRyaWJ1dGlvbiBhbiBvdXRwdXQgb3IgdW5zcGVudCB3aWxsXG4gICAqIGNvbnRyaWJ1dGUgdG8gYSB0cmFuc2FjdGlvbiwgd2VyZSBpdCB0byBiZSB1c2VkLiBFYWNoIHR5cGUgb2Ygb3V0cHV0IG9yIHVuc3BlbnRcbiAgICogd2lsbCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGNvbnRyaWJ1dGlvbiBzaW5jZSBlYWNoIHR5cGUgaGFzIGEgZGlmZmVyZW50IG51bWJlclxuICAgKiBvZiB2aXJ0dWFsIGJ5dGVzLCBhbmQgdGh1cyB3aWxsIGNhdXNlIGEgZGlmZmVyZW50IGZlZSB0byBiZSBwYWlkLlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0T3JVbnNwZW50IE91dHB1dCBvciB1bnNwZW50IHdob3NlIGVmZmVjdGl2ZSB2YWx1ZSBzaG91bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgYWN0dWFsIG51bWJlciBvZiBzYXRvc2hpcyB0aGF0IHRoaXMgdW5zcGVudCBvciBvdXRwdXRcbiAgICogICAgICAgICAgICAgICAgICAgd291bGQgY29udHJpYnV0ZSB0byBhIHRyYW5zYWN0aW9uLCB3ZXJlIGl0IHRvIGJlIHVzZWQuXG4gICAqL1xuICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IChvdXRwdXRPclVuc3BlbnQpID0+IHtcbiAgICBjb25zdCBjaGFpbiA9IGdldENoYWluKG91dHB1dE9yVW5zcGVudCk7XG4gICAgaWYgKGlzQ2hhaW5Db2RlKGNoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pID09PSAncDJzaFAyd3NoJykge1xuICAgICAgLy8gVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoSW5wdXRTaXplIGlzIGluIGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga0JcbiAgICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQudmFsdWUgLSAoVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoSW5wdXRTaXplICogcGFyYW1zLmZlZVJhdGUpIC8gMTAwMDtcbiAgICB9XG4gICAgLy8gVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSBpcyBpbiBieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGtCXG4gICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC52YWx1ZSAtIChWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICogcGFyYW1zLmZlZVJhdGUpIC8gMTAwMDtcbiAgfTtcblxuICAvKipcbiAgICogQ29yb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGltcGxlbWVudHMgdGhlIGFjY2VsZXJhdGVUcmFuc2FjdGlvbiBhbGdvcml0aG1cbiAgICpcbiAgICogRGVzY3JpYmVkIGF0IGEgaGlnaCBsZXZlbCwgdGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOlxuICAgKiAxKSBGaW5kIGFwcHJvcHJpYXRlIG91dHB1dCBmcm9tIHBhcmVudCB0cmFuc2FjdGlvbiB0byB1c2UgYXMgY2hpbGQgdHJhbnNhY3Rpb24gaW5wdXRcbiAgICogMikgRmluZCB1bnNwZW50IGNvcnJlc3BvbmRpbmcgdG8gcGFyZW50IHRyYW5zYWN0aW9uIG91dHB1dC4gSWYgbm90IGZvdW5kLCByZXR1cm4gdG8gc3RlcCAxLlxuICAgKiAzKSBEZXRlcm1pbmUgaWYgcGFyZW50IHRyYW5zYWN0aW9uIHVuc3BlbnQgY2FuIGNvdmVyIGVudGlyZSBjaGlsZCBmZWUsIHBsdXMgbWluaW11bSBjaGFuZ2VcbiAgICogNCkgSWYgeWVzLCBnbyB0byBzdGVwIDZcbiAgICogNSkgT3RoZXJ3aXNlLCBmaW5kIGFkZGl0aW9uYWwgdW5zcGVudHMgZnJvbSB0aGUgd2FsbGV0IHRvIHVzZSB0byBjb3ZlciB0aGUgcmVtYWluaW5nIGNoaWxkIGZlZVxuICAgKiA2KSBDcmVhdGUgYW5kIHNpZ24gdGhlIGNoaWxkIHRyYW5zYWN0aW9uLCB1c2luZyB0aGUgcGFyZW50IHRyYW5zYWN0aW9uIG91dHB1dFxuICAgKiAgICAoYW5kLCBpZiBuZWNlc3NhcnksIGFkZGl0aW9uYWwgd2FsbGV0IHVuc3BlbnRzKSBhcyBpbnB1dHNcbiAgICogNykgQnJvYWRjYXN0IHRoZSBuZXcgY2hpbGQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHJldHVybiBjbyhmdW5jdGlvbiogY29BY2NlbGVyYXRlVHJhbnNhY3Rpb24oKTogYW55IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0cmFuc2FjdGlvbklEJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICAvLyB2YWxpZGF0ZSBmZWUgcmF0ZVxuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBmZWVSYXRlJyk7XG4gICAgfVxuICAgIGlmICghXy5pc0Zpbml0ZShwYXJhbXMuZmVlUmF0ZSkgfHwgcGFyYW1zLmZlZVJhdGUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgcG9zaXRpdmUgZmluaXRlIG51bWJlciBmb3IgcGFyYW1ldGVyOiBmZWVSYXRlJyk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgbWF4VW5zcGVudHNcbiAgICBpZiAocGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBieSBkZWZhdWx0LCB1c2UgYXQgbW9zdCAxMDAgYWRkaXRpb25hbCB1bnNwZW50cyAobm90IGluY2x1ZGluZyB0aGUgdW5zcGVudCBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHR4KVxuICAgICAgcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyA9IDEwMDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMpIHx8IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPD0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyIGZvciBwYXJhbWV0ZXI6IG1heEFkZGl0aW9uYWxVbnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgcGFyZW50VHggPSB5aWVsZCB0aGlzLmdldFRyYW5zYWN0aW9uKHsgaWQ6IHBhcmFtcy50cmFuc2FjdGlvbklEIH0pO1xuICAgIGlmIChwYXJlbnRUeC5jb25maXJtYXRpb25zID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiAke3BhcmFtcy50cmFuc2FjdGlvbklEfSBpcyBhbHJlYWR5IGNvbmZpcm1lZCBhbmQgY2Fubm90IGJlIGFjY2VsZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBvdXRwdXRzIGZyb20gdGhlIHBhcmVudCB0eCB3aGljaCBhcmUgdG8gb3VyIHdhbGxldFxuICAgIGNvbnN0IHdhbGxldE91dHB1dHMgPSBfLmZpbHRlcihwYXJlbnRUeC5vdXRwdXRzLCAob3V0cHV0KSA9PiBvdXRwdXQuaXNNaW5lKTtcblxuICAgIGlmICh3YWxsZXRPdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gJHtwYXJhbXMudHJhbnNhY3Rpb25JRH0gY29udGFpbnMgbm8gb3V0cHV0cyB0byB0aGlzIHdhbGxldCwgYW5kIHRodXMgY2Fubm90IGJlIGFjY2VsZXJhdGVkYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB1c2UgYW4gb3V0cHV0IGZyb20gdGhlIHBhcmVudCB3aXRoIGxhcmdlc3QgZWZmZWN0aXZlIHZhbHVlLFxuICAgIC8vIGJ1dCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIG91dHB1dCBpcyBhY3R1YWxseSB1bnNwZW50LlxuICAgIC8vIEFuIG91dHB1dCBjb3VsZCBiZSBzcGVudCBhbHJlYWR5IGlmIHRoZSBvdXRwdXQgd2FzIHVzZWQgaW4gYVxuICAgIC8vIGNoaWxkIHR4IHdoaWNoIGl0c2VsZiBoYXMgYmVjb21lIHN0dWNrIGR1ZSB0byBsb3cgZmVlcyBhbmQgaXNcbiAgICAvLyBhbHNvIHVuY29uZmlybWVkLlxuICAgIGNvbnN0IHNvcnRlZE91dHB1dHMgPSBfLnNvcnRCeSh3YWxsZXRPdXRwdXRzLCBlZmZlY3RpdmVWYWx1ZSk7XG4gICAgbGV0IHBhcmVudFVuc3BlbnRUb1VzZTtcbiAgICBsZXQgb3V0cHV0VG9Vc2U7XG5cbiAgICB3aGlsZSAoc29ydGVkT3V0cHV0cy5sZW5ndGggPiAwICYmIHBhcmVudFVuc3BlbnRUb1VzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXRwdXRUb1VzZSA9IHNvcnRlZE91dHB1dHMucG9wKCk7XG5cbiAgICAgIC8vIGZpbmQgdGhlIHVuc3BlbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHBhcnRpY3VsYXIgb3V0cHV0XG4gICAgICAvLyBUT0RPOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoaXMgdW5zcGVudD9cbiAgICAgIC8vIFRPRE86IFRoZSBiZXN0IHdlIGNhbiBkbyBoZXJlIGlzIHNldCBtaW5TaXplID0gbWF4U2l6ZSA9IG91dHB1dFRvVXNlLnZhbHVlXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3QgdW5zcGVudHNSZXN1bHQgPSB5aWVsZCB0aGlzLnVuc3BlbnRzKHtcbiAgICAgICAgbWluU2l6ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICAgIG1heFNpemU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgfSk7XG5cbiAgICAgIHBhcmVudFVuc3BlbnRUb1VzZSA9IF8uZmluZCh1bnNwZW50c1Jlc3VsdCwgKHVuc3BlbnQpID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHVuc3BlbnQgYmVsb25ncyB0byB0aGUgZ2l2ZW4gdHhpZFxuICAgICAgICBpZiAodW5zcGVudC50eF9oYXNoICE9PSBwYXJhbXMudHJhbnNhY3Rpb25JRCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYWtlIHN1cmUgdW5zcGVudCBoYXMgY29ycmVjdCB2X291dCBpbmRleFxuICAgICAgICByZXR1cm4gdW5zcGVudC50eF9vdXRwdXRfbiA9PT0gb3V0cHV0VG9Vc2Uudm91dDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnRVbnNwZW50VG9Vc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB1bnNwZW50IG91dHB1dCBmcm9tIHBhcmVudCB0eCB0byB1c2UgYXMgY2hpbGQgaW5wdXRgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIGZ1bGwgaGV4IGZvciB0aGUgcGFyZW50IHR4IGFuZCBkZWNvZGUgaXQgdG8gZ2V0IGl0cyB2c2l6ZVxuICAgIGNvbnN0IHBhcmVudFR4SGV4ID0geWllbGQgZ2V0UGFyZW50VHhIZXgoeyBwYXJlbnRUeElkOiBwYXJhbXMudHJhbnNhY3Rpb25JRCB9KTtcbiAgICBjb25zdCBkZWNvZGVkUGFyZW50ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgocGFyZW50VHhIZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgY29uc3QgcGFyZW50VlNpemUgPSBkZWNvZGVkUGFyZW50LnZpcnR1YWxTaXplKCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgaWQgZnJvbSBkZWNvZGVkIHR4IGFuZCBnaXZlbiB0eCBpZCBtYXRjaFxuICAgIC8vIHRoaXMgc2hvdWxkIGNhdGNoIHByb2JsZW1zIGVtYW5hdGluZyBmcm9tIHRoZSB1c2Ugb2YgYW4gZXh0ZXJuYWwgc2VydmljZVxuICAgIC8vIGZvciBnZXR0aW5nIHRoZSBjb21wbGV0ZSBwYXJlbnQgdHggaGV4XG4gICAgaWYgKGRlY29kZWRQYXJlbnQuZ2V0SWQoKSAhPT0gcGFyYW1zLnRyYW5zYWN0aW9uSUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERlY29kZWQgdHJhbnNhY3Rpb24gaWQgaXMgJHtkZWNvZGVkUGFyZW50LmdldElkKCl9LCB3aGljaCBkb2VzIG5vdCBtYXRjaCBnaXZlbiB0eGlkICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgbmV3IGZlZSByYXRlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFyZW50J3MgY3VycmVudCBmZWUgcmF0ZVxuICAgIC8vIHZpcnR1YWxTaXplIGlzIHJldHVybmVkIGluIHZieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGt2QlxuICAgIGNvbnN0IHBhcmVudFJhdGUgPSAoMTAwMCAqIHBhcmVudFR4LmZlZSkgLyBwYXJlbnRWU2l6ZTtcbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgPD0gcGFyZW50UmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGxvd2VyIGZlZSByYXRlISAoUGFyZW50IHR4IGZlZSByYXRlIGlzICR7cGFyZW50UmF0ZX0gc2F0L2tCLCBhbmQgcmVxdWVzdGVkIGZlZSByYXRlIHdhcyAke3BhcmFtcy5mZWVSYXRlfSBzYXQva0IpYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgcGFyZW50IG91dHB1dCBjYW4gY292ZXIgY2hpbGQgZmVlXG4gICAgY29uc3QgaXNQYXJlbnRPdXRwdXRTZWd3aXQgPVxuICAgICAgaXNDaGFpbkNvZGUob3V0cHV0VG9Vc2UuY2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbihvdXRwdXRUb1VzZS5jaGFpbikgPT09ICdwMnNoUDJ3c2gnO1xuXG4gICAgbGV0IGNoaWxkSW5wdXRzID0ge1xuICAgICAgc2Vnd2l0OiBpc1BhcmVudE91dHB1dFNlZ3dpdCA/IDEgOiAwLFxuICAgICAgUDJTSDogaXNQYXJlbnRPdXRwdXRTZWd3aXQgPyAwIDogMSxcbiAgICB9O1xuXG4gICAgbGV0IGNoaWxkRmVlID0gZXN0aW1hdGVDaGlsZEZlZSh7XG4gICAgICBpbnB1dHM6IGNoaWxkSW5wdXRzLFxuICAgICAgcGFyZW50RmVlOiBwYXJlbnRUeC5mZWUsXG4gICAgICBmZWVSYXRlOiBwYXJhbXMuZmVlUmF0ZSxcbiAgICAgIHBhcmVudFZTaXplLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdW5zcGVudHNUb1VzZSA9IFtwYXJlbnRVbnNwZW50VG9Vc2VdO1xuXG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgbWluIGNoYW5nZSBzaXplIGZyb20gdGhlIHNlcnZlciwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMC4xIEJUQ1xuICAgIC8vIFRPRE86IG1pbkNoYW5nZVNpemUgaXMgbm90IGN1cnJlbnRseSBhIGNvbnN0YW50IGRlZmluZWQgb24gdGhlIGNsaWVudCBhbmQgc2hvdWxkIGJlIGFkZGVkXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBtaW5DaGFuZ2VTaXplID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5taW5DaGFuZ2VTaXplIHx8IDFlNztcblxuICAgIGlmIChvdXRwdXRUb1VzZS52YWx1ZSA8IGNoaWxkRmVlICsgbWluQ2hhbmdlU2l6ZSkge1xuICAgICAgLy8gcGFyZW50IG91dHB1dCBjYW5ub3QgY292ZXIgY2hpbGQgZmVlIHBsdXMgdGhlIG1pbmltdW0gY2hhbmdlLFxuICAgICAgLy8gbXVzdCBmaW5kIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gY292ZXIgdGhlIGRpZmZlcmVuY2VcbiAgICAgIGNvbnN0IHsgYWRkaXRpb25hbCwgbmV3Q2hpbGRGZWUsIG5ld0lucHV0cyB9ID0geWllbGQgZmluZEFkZGl0aW9uYWxVbnNwZW50cyh7XG4gICAgICAgIGlucHV0czogY2hpbGRJbnB1dHMsXG4gICAgICAgIHBhcmVudE91dHB1dFZhbHVlOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgICAgcGFyZW50RmVlOiBwYXJlbnRUeC5mZWUsXG4gICAgICAgIG1heFVuc3BlbnRzOiBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzLFxuICAgICAgICBwYXJlbnRWU2l6ZSxcbiAgICAgIH0pO1xuICAgICAgY2hpbGRGZWUgPSBuZXdDaGlsZEZlZTtcbiAgICAgIGNoaWxkSW5wdXRzID0gbmV3SW5wdXRzO1xuICAgICAgdW5zcGVudHNUb1VzZS5wdXNoKC4uLmFkZGl0aW9uYWwpO1xuICAgIH1cblxuICAgIC8vIHNhbml0eSBjaGVjayB0aGUgZmVlIHJhdGUgd2UncmUgcGF5aW5nIGZvciB0aGUgY29tYmluZWQgdHhcbiAgICAvLyB0byBtYWtlIHN1cmUgaXQncyB1bmRlciB0aGUgbWF4IGZlZSByYXRlLiBPbmx5IHRoZSBjaGlsZCB0eFxuICAgIC8vIGNhbiBicmVhayB0aGlzIGxpbWl0LCBidXQgdGhlIGNvbWJpbmVkIHR4IHNoYWxsIG5vdFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgbWF4RmVlUmF0ZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWF4RmVlUmF0ZTtcbiAgICBjb25zdCBjaGlsZFZTaXplID0gZXN0aW1hdGVUeFZTaXplKGNoaWxkSW5wdXRzKTtcbiAgICBjb25zdCBjb21iaW5lZFZTaXplID0gY2hpbGRWU2l6ZSArIHBhcmVudFZTaXplO1xuICAgIGNvbnN0IGNvbWJpbmVkRmVlID0gcGFyZW50VHguZmVlICsgY2hpbGRGZWU7XG4gICAgLy8gY29tYmluZWQgZmVlIHJhdGUgbXVzdCBiZSBpbiBzYXQva0IsIHNvIHdlIG5lZWQgdG8gY29udmVydFxuICAgIGNvbnN0IGNvbWJpbmVkRmVlUmF0ZSA9ICgxMDAwICogY29tYmluZWRGZWUpIC8gY29tYmluZWRWU2l6ZTtcblxuICAgIGlmIChjb21iaW5lZEZlZVJhdGUgPiBtYXhGZWVSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiBjYW5ub3QgYmUgYWNjZWxlcmF0ZWQuIENvbWJpbmVkIGZlZSByYXRlIG9mICR7Y29tYmluZWRGZWVSYXRlfSBzYXQva0IgZXhjZWVkcyBtYXhpbXVtIGZlZSByYXRlIG9mICR7bWF4RmVlUmF0ZX0gc2F0L2tCYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgYSBuZXcgY2hhbmdlIGFkZHJlc3MgYW5kIGRldGVybWluZSBjaGFuZ2UgYW1vdW50LlxuICAgIC8vIHRoZSB0eCBidWlsZGVyIHdpbGwgcmVqZWN0IHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIG5vIHJlY2lwaWVudHMsXG4gICAgLy8gYW5kIHN1Y2ggemVyby1vdXRwdXQgdHJhbnNhY3Rpb25zIGFyZSBmb3JiaWRkZW4gYnkgdGhlIEJpdGNvaW4gcHJvdG9jb2wsXG4gICAgLy8gc28gd2UgbmVlZCBhdCBsZWFzdCBhIHNpbmdsZSByZWNpcGllbnQgZm9yIHRoZSBjaGFuZ2Ugd2hpY2ggd29uJ3QgYmUgcHJ1bmVkLlxuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IF8uc3VtQnkodW5zcGVudHNUb1VzZSwgKHVuc3BlbnQpID0+IHVuc3BlbnQudmFsdWUpIC0gY2hpbGRGZWU7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBjaGFuZ2VDaGFpbiA9IHRoaXMuZ2V0Q2hhbmdlQ2hhaW4oe30pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgY2hhbmdlQWRkcmVzcyA9IHlpZWxkIHRoaXMuY3JlYXRlQWRkcmVzcyh7IGNoYWluOiBjaGFuZ2VDaGFpbiB9KTtcblxuICAgIC8vIGNyZWF0ZSB0aGUgY2hpbGQgdHggYW5kIGJyb2FkY2FzdFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgdHggPSB5aWVsZCB0aGlzLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB1bnNwZW50czogdW5zcGVudHNUb1VzZSxcbiAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGNoYW5nZUFkZHJlc3MuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IGNoYW5nZUFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmZWU6IGNoaWxkRmVlLFxuICAgICAgYml0Z29GZWU6IHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBhZGRyZXNzOiAnJyxcbiAgICAgIH0sXG4gICAgICB4cHJ2OiBwYXJhbXMueHBydixcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgLy8gY2hpbGQgZmVlIHJhdGUgbXVzdCBiZSBpbiBzYXQva0IsIHNvIHdlIG5lZWQgdG8gY29udmVydFxuICAgIGNvbnN0IGNoaWxkRmVlUmF0ZSA9ICgxMDAwICogY2hpbGRGZWUpIC8gY2hpbGRWU2l6ZTtcbiAgICBpZiAoY2hpbGRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgLy8gY29tYmluZWQgdHggaXMgd2l0aGluIG1heCBmZWUgcmF0ZSBsaW1pdHMsIGJ1dCB0aGUgY2hpbGQgdHggaXMgbm90LlxuICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgaWdub3JlTWF4RmVlUmF0ZSBmbGFnIHRvIGdldCB0aGUgY2hpbGQgdHggdG8gYmUgYWNjZXB0ZWRcbiAgICAgIHR4Lmlnbm9yZU1heEZlZVJhdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHR4KTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVBbmRTaWduVHJhbnNhY3Rpb25cbi8vIElOVEVSTkFMIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgc2lnbiBhIHRyYW5zYWN0aW9uXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzcywgYW1vdW50IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogKCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWVSYXRlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5keW5hbWljRmVlQ29uZmlybVRhcmdldCAmJiAhXy5pc051bWJlcihwYXJhbXMuZHluYW1pY0ZlZUNvbmZpcm1UYXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNvbmZpcm1UYXJnZXQgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpbnN0YW50IC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSAoeWllbGQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBhbnk7XG4gICAgY29uc3QgZmVlID0gdHJhbnNhY3Rpb24uZmVlO1xuICAgIGNvbnN0IGZlZVJhdGUgPSB0cmFuc2FjdGlvbi5mZWVSYXRlO1xuICAgIGNvbnN0IGVzdGltYXRlZFNpemUgPSB0cmFuc2FjdGlvbi5lc3RpbWF0ZWRTaXplO1xuICAgIGNvbnN0IGJpdGdvRmVlID0gdHJhbnNhY3Rpb24uYml0Z29GZWU7XG4gICAgY29uc3QgdHJhdmVsSW5mb3MgPSB0cmFuc2FjdGlvbi50cmF2ZWxJbmZvcztcbiAgICBjb25zdCB1bnNwZW50cyA9IHRyYW5zYWN0aW9uLnVuc3BlbnRzO1xuXG4gICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICB0cnkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IGtleWNoYWluID0geWllbGQgdGhpcy5nZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluKHBhcmFtcyk7XG4gICAgICB0cmFuc2FjdGlvbi5rZXljaGFpbiA9IGtleWNoYWluO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgIT09ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0Jykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgLy8gdGhpcyBtaWdodCBiZSBhIHNhZmUgd2FsbGV0LCBzbyBsZXQncyByZXRyaWV2ZSB0aGUgcHJpdmF0ZSBrZXkgaW5mb1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIHlpZWxkIHRoaXMucmVmcmVzaCh7IGdwazogdHJ1ZSB9KTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCBzYWZlVXNlcktleSA9IF8uZ2V0KHRoaXMud2FsbGV0LCAncHJpdmF0ZS51c2VyUHJpdktleScpO1xuICAgICAgaWYgKF8uaXNTdHJpbmcoc2FmZVVzZXJLZXkpICYmIF8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICAgIHRyYW5zYWN0aW9uLnNpZ25pbmdLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBzYWZlVXNlcktleSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb24uZmVlU2luZ2xlS2V5V0lGID0gcGFyYW1zLmZlZVNpbmdsZUtleVdJRjtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gXy5leHRlbmQocmVzdWx0LCB7XG4gICAgICBmZWUsXG4gICAgICBmZWVSYXRlLFxuICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICBiaXRnb0ZlZSxcbiAgICAgIHRyYXZlbEluZm9zLFxuICAgICAgZXN0aW1hdGVkU2l6ZSxcbiAgICAgIHVuc3BlbnRzLFxuICAgIH0pO1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW5cbi8vIElOVEVSTkFMIGZ1bmN0aW9uIHRvIGdldCB0aGUgdXNlciBrZXljaGFpbiBmb3Igc2lnbmluZy5cbi8vIENhbGxlciBtdXN0IHByb3ZpZGVyIGVpdGhlciBhIGtleWNoYWluLCBvciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgYXMgYSBzdHJpbmdcbi8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGtleWNoYWluIHdpdGggeHBydiwgaXQgaXMgc2ltcGx5IHJldHVybmVkLlxuLy8gSWYgdGhlIGNhbGxlciBwcm92aWRlcyB0aGUgZW5jcnlwdGVkIHhwcnYgKHdhbGxldFBhc3NwaHJhc2UpLCB0aGVuIGZldGNoIHRoZSBrZXljaGFpbiBvYmplY3QgYW5kIGRlY3J5cHRcbi8vIE90aGVyd2lzZSBpZiB0aGUgeHBydiBpcyBwcm92aWRlZCwgZmV0Y2ggdGhlIGtleWNoYWluIG9iamVjdCBhbmQgYXVnbWVudCBpdCB3aXRoIHRoZSB4cHJ2LlxuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGtleWNoYWluIC0ga2V5Y2hhaW4gd2l0aCB4cHJ2XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm1cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vIFJldHVybnM6XG4vLyAgIEtleWNoYWluIG9iamVjdCBjb250YWluaW5nIHhwcnYsIHhwdWIgYW5kIHBhdGhzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gIC8vIElmIGtleWNoYWluIHdpdGggeHBydiBpcyBhbHJlYWR5IHByb3ZpZGVkLCB1c2UgaXRcbiAgaWYgKF8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSAmJiBwYXJhbXMua2V5Y2hhaW4ueHBydikge1xuICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHBhcmFtcy5rZXljaGFpbik7XG4gIH1cblxuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuXG4gIGlmICgocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgcGFyYW1zLnhwcnYpIHx8ICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgIXBhcmFtcy54cHJ2KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIHhwcnYgb3Igd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGEgd2FsbGV0IHBhc3NwaHJhc2VcbiAgaWYgKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICB0cnkge1xuICAgICAgICBrZXljaGFpbi54cHJ2ID0gc2VsZi5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG4gIH1cblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYW4geHBydiAtIHZhbGlkYXRlIGFuZCBjb25zdHJ1Y3Qga2V5Y2hhaW4gb2JqZWN0XG4gIGxldCB4cHViO1xuICB0cnkge1xuICAgIHhwdWIgPSBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSB0aGUgeHBydicpO1xuICB9XG5cbiAgaWYgKHhwdWIgPT09IHBhcmFtcy54cHJ2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBwcml2YXRlIGtleSAoZm91bmQgeHB1YiBpbnN0ZWFkKScpO1xuICB9XG5cbiAgY29uc3Qgd2FsbGV0WHB1YnMgPSBfLm1hcChzZWxmLmtleWNoYWlucywgJ3hwdWInKTtcbiAgaWYgKCFfLmluY2x1ZGVzKHdhbGxldFhwdWJzLCB4cHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigneHBydiBwcm92aWRlZCB3YXMgbm90IGEga2V5Y2hhaW4gb24gdGhpcyB3YWxsZXQhJyk7XG4gIH1cblxuICAvLyBnZXQgdGhlIGtleWNoYWluIG9iamVjdCBmcm9tIGJpdGdvIHRvIGZpbmQgdGhlIHBhdGggYW5kIChwb3RlbnRpYWwpIHdhbGxldCBzdHJ1Y3R1cmVcbiAgcmV0dXJuIHNlbGYuYml0Z29cbiAgICAua2V5Y2hhaW5zKClcbiAgICAuZ2V0KHsgeHB1YjogeHB1YiB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAga2V5Y2hhaW4ueHBydiA9IHBhcmFtcy54cHJ2O1xuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBUYWtlcyBhIHdhbGxldCdzIHVuc3BlbnRzIGFuZCBmYW5zIHRoZW0gb3V0IGludG8gYSBsYXJnZXIgbnVtYmVyIG9mIGVxdWFsbHkgc2l6ZWQgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtaW5Db25maXJtczogbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdGhlIHVuc3BlbnRzIG11c3QgaGF2ZVxuICogIHhwcnY6IHByaXZhdGUga2V5IHRvIHNpZ24gdHJhbnNhY3Rpb25cbiAqICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXQgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSB3YWxsZXQncyBwcml2YXRlIGtleVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5mYW5PdXRVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gQmx1ZWJpcmQuY29yb3V0aW5lKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICAvLyAod2hlbiBmYW5uaW5nIG91dCwgd2UgdGFrZSBhbGwgdGhlIHVuc3BlbnRzIGFuZCBtYWtlIGEgYmlnZ2VyIG51bWJlciBvZiBvdXRwdXRzKVxuICAgIGNvbnN0IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQgPSA4MDtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCA9IDMwMDtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCB0d28sIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMiB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA+IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IHRvbyBoaWdoJyk7XG4gICAgfVxuXG4gICAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICAgIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW5Db25maXJtcyA9IDE7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgPj0gMCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0IGEgbmF0dXJhbCBudW1iZXIgTiBpbnRvIG4gYWxtb3N0IGVxdWFsbHkgc2l6ZWQgKMKxMSkgbmF0dXJhbCBudW1iZXJzLlxuICAgICAqIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdGhlIHBhcnRzLCB3ZSBjYWxjdWxhdGUgZmxvb3IoTi9uKSwgYW5kIHRodXMgaGF2ZSB0aGUgYmFzZSBzaXplIG9mIGFsbCBwYXJ0cy5cbiAgICAgKiBJZiBOICUgbiAhPT0gMCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCBhIHJlbWFpbmRlciByIHdoZXJlIHIgPCBuLiBXZSBkaXN0cmlidXRlIHIgZXF1YWxseSBhbW9uZyB0aGUgbiBwYXJ0cyBieVxuICAgICAqIGFkZGluZyAxIHRvIHRoZSBmaXJzdCByIHBhcnRzLlxuICAgICAqIEBwYXJhbSB0b3RhbFxuICAgICAqIEBwYXJhbSBwYXJ0Q291bnRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3Qgc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyA9IGZ1bmN0aW9uICh0b3RhbCwgcGFydENvdW50KSB7XG4gICAgICBjb25zdCBwYXJ0U2l6ZSA9IE1hdGguZmxvb3IodG90YWwgLyBwYXJ0Q291bnQpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgLSBwYXJ0U2l6ZSAqIHBhcnRDb3VudDtcbiAgICAgIC8vIGluaXRpYWxpemUgcGxhY2Vob2xkZXIgYXJyYXlcbiAgICAgIGNvbnN0IGFsbW9zdEVxdWFsUGFydHMgPSBuZXcgQXJyYXkocGFydENvdW50KTtcbiAgICAgIC8vIGZpbGwgdGhlIGZpcnN0IHJlbWFpbmRlciBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZSsxXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUgKyAxLCAwLCByZW1haW5kZXIpO1xuICAgICAgLy8gZmlsbCB0aGUgcmVtYWluaW5nIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUsIHJlbWFpbmRlcik7XG4gICAgICAvLyBhc3NlcnQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbG1vc3QgZXF1YWwgcGFydHNcbiAgICAgIC8vIFRPRE86IGFkZCBjaGVjayBmb3IgdGhlIGJpZ2dlc3QgZGV2aWF0aW9uIGJldHdlZW4gYW55IHR3byBwYXJ0cyBhbmQgbWFrZSBzdXJlIGl0J3MgPD0gMVxuICAgICAgaWYgKF8oYWxtb3N0RXF1YWxQYXJ0cykuc3VtKCkgIT09IHRvdGFsIHx8IF8oYWxtb3N0RXF1YWxQYXJ0cykuc2l6ZSgpICE9PSBwYXJ0Q291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0IHN1bSBvciBwYXJ0IGNvdW50IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxtb3N0RXF1YWxQYXJ0cztcbiAgICB9O1xuXG4gICAgLy8gZmlyc3QsIGxldCdzIHRha2UgYWxsIHRoZSB3YWxsZXQncyB1bnNwZW50cyAod2l0aCBtaW4gY29uZmlybXMgaWYgbmVjZXNzYXJ5KVxuICAgIGNvbnN0IGFsbFVuc3BlbnRzID0gKHlpZWxkIHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkpIGFzIGFueTtcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyB0byBicmFuY2ggb3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25zb2xpZGF0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgYSB3YXN0ZSBvZiBtb25leVxuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IGhhcyB0byBiZSBiaWdnZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYXQgdGhlIHZlcnkgbWluaW11bSA4MSBpbnB1dHMsIGFuZCA4MSBvdXRwdXRzLiBUaGF0IHRyYW5zYWN0aW9uIHdpbGwgYmUgYmlnXG4gICAgLy8gaW4gdGhlIG1lZGl1bSBydW4sIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHJld29ya2VkIHRvIG9ubHkgd29yayB3aXRoIGEgc3Vic2V0IG9mIHRoZSB0cmFuc2FjdGlvbnNcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID4gTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYWxsIHRoZSBtb25leSB0aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd2FsbGV0XG4gICAgY29uc3QgZ3Jvc3NBbW91bnQgPSBfKGFsbFVuc3BlbnRzKS5tYXAoJ3ZhbHVlJykuc3VtKCk7XG5cbiAgICAvLyBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBwYXJhbXMgb2JqZWN0LCB3ZSBjcmVhdGUgYSBjb3B5XG4gICAgY29uc3QgdHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGFsbFVuc3BlbnRzO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcblxuICAgIC8vIGNyZWF0ZSB0YXJnZXQgYW1vdW50IG9mIG5ldyBhZGRyZXNzZXMgZm9yIHRoaXMgd2FsbGV0XG4gICAgY29uc3QgbmV3QWRkcmVzc1Byb21pc2VzID0gXy5yYW5nZSh0YXJnZXQpLm1hcCgoKSA9PlxuICAgICAgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IHNlbGYuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKSwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pXG4gICAgKTtcbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSB5aWVsZCBCbHVlYmlyZC5hbGwobmV3QWRkcmVzc1Byb21pc2VzKTtcbiAgICAvLyBsZXQncyBmaW5kIGEgbmljZSwgZXF1YWwgZGlzdHJpYnV0aW9uIG9mIG91ciBTYXRvc2hpcyBhbW9uZyB0aGUgbmV3IGFkZHJlc3Nlc1xuICAgIGNvbnN0IHNwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMoZ3Jvc3NBbW91bnQsIHRhcmdldCk7XG4gICAgLy8gbWFwIHRoZSBuZXdseSBjcmVhdGVkIGFkZHJlc3NlcyB0byB0aGUgYWxtb3N0IGNvbXBvbmVudHMgYW1vdW50cyB3ZSBqdXN0IGNhbGN1bGF0ZWRcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCBzcGxpdEFtb3VudHMpO1xuICAgIHR4UGFyYW1zLm5vU3BsaXRDaGFuZ2UgPSB0cnVlO1xuICAgIC8vIGF0dGVtcHQgdG8gY3JlYXRlIGEgdHJhbnNhY3Rpb24uIEFzIGl0IGlzIGEgd2FsbGV0LXN3ZWVwaW5nIHRyYW5zYWN0aW9uIHdpdGggbm8gZmVlLCB3ZSBleHBlY3QgaXQgdG8gZmFpbFxuICAgIHRyeSB7XG4gICAgICB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gYXMgZXhwZWN0ZWQsIHRoZSB0cmFuc2FjdGlvbiBjcmVhdGlvbiBkaWQgaW5kZWVkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmZWVzXG4gICAgICAvLyB0aGUgZXJyb3Igc3VnZ2VzdHMgYSBmZWUgdmFsdWUgd2hpY2ggd2UgdGhlbiB1c2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgdG90YWxGZWUgPSBiYXNlRmVlO1xuICAgICAgaWYgKGVycm9yLnJlc3VsdC5iaXRnb0ZlZSAmJiBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50KSB7XG4gICAgICAgIHRvdGFsRmVlICs9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHR4UGFyYW1zLmJpdGdvRmVlID0gZXJyb3IucmVzdWx0LmJpdGdvRmVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG4gICAgICB0eFBhcmFtcy5mZWUgPSBiYXNlRmVlO1xuICAgICAgLy8gaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGVxdWFsIGRpc3RyaWJ1dGlvbiwgd2UgbmVlZCB0byBzdWJ0cmFjdCB0aGUgZmVlIGZyb20gdGhlIGN1bXVsYXRpdmUgZnVuZHNcbiAgICAgIC8vIGluIGNhc2Ugc29tZSB1bnNwZW50cyBnb3QgcHJ1bmVkLCB3ZSBuZWVkIHRvIHVzZSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWU7IC8vIGFmdGVyIGZlZXNcbiAgICAgIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBiZSByZWNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1NwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMobmV0QW1vdW50LCB0YXJnZXQpO1xuICAgICAgLy8gYW5kIHRoZSBkaXN0cmlidXRpb24gYWdhaW4gbWFwcGVkIHRvIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCByZW1haW5pbmdTcGxpdEFtb3VudHMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdGltZSwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIHNob3VsZCB3b3JrXG4gICAgbGV0IGZhbm91dFR4O1xuICAgIHRyeSB7XG4gICAgICBmYW5vdXRUeCA9IHlpZWxkIHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgIGUubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShmYW5vdXRUeCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG4gIH0pKCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRvIGZhbiBvdXQgb3IgY29hbGVzY2UgYSB3YWxsZXQncyB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UmVxdWVzdHxQcm9taXNlLjxUPnwqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZ3JvdXBVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KS50aGVuKGZ1bmN0aW9uICh1bnNwZW50cykge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHVuc3BlbnRzO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoID4gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5jb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoIDwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mYW5PdXRVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25zb2xpZGF0ZSBhIHdhbGxldCdzIHVuc3BlbnRzIGludG8gZmV3ZXIgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjogc2V0IGhvdyBtYW55IG1heGltdW0gaW5wdXRzIGFyZSB0byBiZSBwZXJtaXR0ZWQgcGVyIGNvbnNvbGlkYXRpb24gYmF0Y2hcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqICBtYXhJdGVyYXRpb25Db3VudDogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdW50aWwgZnVuY3Rpb24gc3RvcHNcbiAqICBwcm9ncmVzc0NhbGxiYWNrOiBtZXRob2QgdG8gYmUgY2FsbGVkIHdpdGggb2JqZWN0IG91dGxpbmluZyBjdXJyZW50IHByb2dyZXNzIGRldGFpbHNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuY29uc29saWRhdGVVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgbGV0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRhcmdldCA9IDE7XG4gIH0gZWxzZSBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWF4U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1pblNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5TaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHBlciB0cmFuc2FjdGlvbiBmb3IgY29uc29saWRhdGlvblxuICBjb25zdCBNQVhfSU5QVVRfQ09VTlQgPSAyMDA7XG4gIGxldCBtYXhJbnB1dENvdW50ID0gcGFyYW1zLm1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uO1xuICBpZiAobWF4SW5wdXRDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbnVsbCBvciB1bmlkZW50aWZpZWQsIGJlY2F1c2UgZXF1YWxpdHkgdG8gemVybyByZXR1cm5zIHRydWUgaW4gaWYoISBjbGF1c2VcbiAgICBtYXhJbnB1dENvdW50ID0gTUFYX0lOUFVUX0NPVU5UO1xuICB9XG4gIGlmICh0eXBlb2YgbWF4SW5wdXRDb3VudCAhPT0gJ251bWJlcicgfHwgbWF4SW5wdXRDb3VudCA8IDIgfHwgbWF4SW5wdXRDb3VudCAlIDEgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDInKTtcbiAgfSBlbHNlIGlmIChtYXhJbnB1dENvdW50ID4gTUFYX0lOUFVUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgY2Fubm90IGJlIGJpZ2dlciB0aGFuICcgKyBNQVhfSU5QVVRfQ09VTlQpO1xuICB9XG5cbiAgY29uc3QgbWF4SXRlcmF0aW9uQ291bnQgPSBwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgfHwgLTE7XG4gIGlmIChcbiAgICAocGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50ICYmICghXy5pc051bWJlcihtYXhJdGVyYXRpb25Db3VudCkgfHwgbWF4SXRlcmF0aW9uQ291bnQgPCAxKSkgfHxcbiAgICBtYXhJdGVyYXRpb25Db3VudCAlIDEgIT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGl0ZXJhdGlvbiBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDEnKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgbGV0IG1pblNpemUgPSBwYXJhbXMubWluU2l6ZSB8fCAwO1xuICBpZiAocGFyYW1zLmZlZVJhdGUpIHtcbiAgICAvLyBmZWUgcmF0ZSBpcyBpbiBzYXRvc2hpcyBwZXIga0IsIGlucHV0IHNpemUgaW4gYnl0ZXNcbiAgICBjb25zdCBmZWVCYXNlZE1pblNpemUgPSBNYXRoLmNlaWwoKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwKTtcbiAgICBpZiAocGFyYW1zLm1pblNpemUgJiYgbWluU2l6ZSA8IGZlZUJhc2VkTWluU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlZCBtaW5TaXplIHRvbyBsb3cgZHVlIHRvIHRvbyBoaWdoIGZlZSByYXRlJyk7XG4gICAgfVxuICAgIG1pblNpemUgPSBNYXRoLm1heChmZWVCYXNlZE1pblNpemUsIG1pblNpemUpO1xuXG4gICAgaWYgKCFwYXJhbXMubWluU2l6ZSkge1xuICAgICAgLy8gZmVlIHJhdGUtYmFzZWQgbWluIHNpemUgbmVlZHMgbm8gbG9nZ2luZyBpZiBpdCB3YXMgc2V0IGV4cGxpY2l0bHlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnT25seSBjb25zb2xpZGF0aW5nIHVuc3BlbnRzIGxhcmdlciB0aGFuICcgK1xuICAgICAgICAgIG1pblNpemUgK1xuICAgICAgICAgICcgc2F0b3NoaXMgdG8gYXZvaWQgd2FzdGluZyBtb25leSBvbiBmZWVzLiBUbyBjb25zb2xpZGF0ZSBzbWFsbGVyIHVuc3BlbnRzLCB1c2UgYSBsb3dlciBmZWUgcmF0ZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpdGVyYXRpb25Db3VudCA9IDA7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBjb25zb2xpZGF0aW9uSW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvbmUgYmF0Y2ggb2YgdXAgdG8gTUFYX0lOUFVUX0NPVU5UIHVuc3BlbnRzLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNvbnN0IHJ1bk5leHRDb25zb2xpZGF0aW9uID0gY28oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGZhbHNlO1xuICAgIGl0ZXJhdGlvbkNvdW50Kys7XG4gICAgLypcbiAgICAgV2UgdGFrZSBhIG1heGltdW0gb2YgdW5zcGVudEJ1bGtTaXplTGltaXQgdW5zcGVudHMgZnJvbSB0aGUgd2FsbGV0LiBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN3aXBlIHRoZSB3YWxsZXRcbiAgICAgY2xlYW4gb2YgYWxsIGV4Y2Vzc2l2ZSB1bnNwZW50cywgc28gd2UgYWRkIDEgdG8gdGhlIHRhcmdldCB1bnNwZW50IGNvdW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZy5cbiAgICAgSW4gY2FzZSB0aGVyZSBhcmUgZXZlbiBtb3JlIHVuc3BlbnRzIHRoYW4gdGhhdCwgdG8gbWFrZSB0aGUgY29uc29saWRhdGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBleHBhbmQgb3VyXG4gICAgIHNlbGVjdGlvbiB0byBpbmNsdWRlIGFzIG1hbnkgYXMgdGhlIG1heGltdW0gcGVybWlzc2libGUgbnVtYmVyIG9mIGlucHV0cyBwZXIgY29uc29saWRhdGlvbiBiYXRjaC5cbiAgICAgU2hvdWxkIHRoZSB0YXJnZXQgbnVtYmVyIG9mIHVuc3BlbnRzIGJlIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBpZiBpbnB1dHMgcGVyIGNvbnNvbGlkYXRpb24sXG4gICAgIHdlIHN0aWxsIHdhbnQgdG8gZmV0Y2ggdGhlbSBhbGwgc2ltcGx5IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgY29uc29saWRhdGlvbiBjYW4gYmUgcGVyZm9ybWVkXG4gICAgIGF0IGFsbCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgYWxsIHVuc3BlbnRzIGJlaW5nIGhpZ2hlciB0aGFuIHRoZSB0YXJnZXQuXG4gICAgIEluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHVuc3BlbnRzIHZlcnNpb24gU0RLLCB3ZSB3aWxsIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiB1bnNwZW50cyB3aXRob3V0IGhhdmluZyB0byBmZXRjaFxuICAgICB0aGVtLCBhbmQgdGhlcmVmb3JlIHdpbGwgYmUgYWJsZSB0byBzaW1wbGlmeSB0aGlzIG1ldGhvZC5cbiAgICAgKi9cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7XG4gICAgICBsaW1pdDogdGFyZ2V0ICsgbWF4SW5wdXRDb3VudCxcbiAgICAgIG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyxcbiAgICAgIG1pblNpemU6IG1pblNpemUsXG4gICAgfTtcbiAgICBpZiAocGFyYW1zLm1heFNpemUpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLm1heFNpemUgPSBwYXJhbXMubWF4U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoeWllbGQgc2VsZi51bnNwZW50cyhxdWVyeVBhcmFtcykpIGFzIGFueTtcbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA8PSB0YXJnZXQpIHtcbiAgICAgIGlmIChpdGVyYXRpb25Db3VudCA8PSAxKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgc28gdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXdlciB1bnNwZW50cyB0aGFuIGNvbnNvbGlkYXRpb24gdGFyZ2V0LiBVc2UgZmFuT3V0VW5zcGVudHMgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGl0J3MgYSBsYXRlciBpdGVyYXRpb24sIHNvIHRoZSB0YXJnZXQgbWF5IGhhdmUgYmVlbiBzdXJwYXNzZWQgKGR1ZSB0byBjb25maXJtYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvbmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxVbnNwZW50c0NvdW50ID0gYWxsVW5zcGVudHMubGVuZ3RoO1xuXG4gICAgLy8gaG93IG1hbnkgb2YgdGhlIHVuc3BlbnRzIGRvIHdlIHdhbnQgdG8gY29uc29saWRhdGU/XG4gICAgLy8gdGhlICsxIGlzIGJlY2F1c2UgdGhlIGNvbnNvbGlkYXRlZCBibG9jayBiZWNvbWVzIGEgbmV3IHVuc3BlbnQgbGF0ZXJcbiAgICBsZXQgdGFyZ2V0SW5wdXRDb3VudCA9IGFsbFVuc3BlbnRzQ291bnQgLSB0YXJnZXQgKyAxO1xuICAgIHRhcmdldElucHV0Q291bnQgPSBNYXRoLm1pbih0YXJnZXRJbnB1dENvdW50LCBhbGxVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgLy8gaWYgdGhlIHRhcmdldElucHV0Q291bnQgcmVxdWlyZXMgbW9yZSBpbnB1dHMgdGhhbiB3ZSBhbGxvdyBwZXIgYmF0Y2gsIHdlIHJlZHVjZSB0aGUgbnVtYmVyXG4gICAgY29uc3QgaW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIG1heElucHV0Q291bnQpO1xuXG4gICAgLy8gaWYgZWl0aGVyIHRoZSBudW1iZXIgb2YgaW5wdXRzIGxlZnQgdG8gY29hbGVzY2UgZXF1YWxzIHRoZSBudW1iZXIgd2Ugd2lsbCBjb2FsZXNjZSBpbiB0aGlzIGl0ZXJhdGlvblxuICAgIC8vIG9yIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBtYXRjaGVzIHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXJcbiAgICBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGlucHV0Q291bnQgPT09IHRhcmdldElucHV0Q291bnQgfHwgaXRlcmF0aW9uQ291bnQgPT09IG1heEl0ZXJhdGlvbkNvdW50O1xuXG4gICAgY29uc3QgY3VycmVudENodW5rID0gYWxsVW5zcGVudHMuc3BsaWNlKDAsIGlucHV0Q291bnQpO1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpO1xuICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoeWllbGQgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkpIGFzIGFueTtcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gbmV3QWRkcmVzcztcbiAgICAvLyB0aGUgdG90YWwgYW1vdW50IHRoYXQgd2UgYXJlIGNvbnNvbGlkYXRpbmcgd2l0aGluIHRoaXMgYmF0Y2hcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oY3VycmVudENodW5rKS5tYXAoJ3ZhbHVlJykuc3VtKCk7IC8vIGJlZm9yZSBmZWVzXG5cbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGN1cnJlbnRDaHVuaztcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gICAgdHhQYXJhbXMucmVjaXBpZW50c1tuZXdBZGRyZXNzLmFkZHJlc3NdID0gZ3Jvc3NBbW91bnQ7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG5cbiAgICBpZiAodHhQYXJhbXMudW5zcGVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIGF0dGVtcHQgdG8gY3JlYXRlIHRoaXMgdHJhbnNhY3Rpb24uIFdlIGV4cGVjdCBpdCB0byBmYWlsIGJlY2F1c2Ugbm8gZmVlIGlzIHNldC5cbiAgICB0cnkge1xuICAgICAgeWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIHRoaXMgZXJyb3Igc2hvdWxkIG9jY3VyIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHNcbiAgICAgIC8vIGhvd2V2ZXIsIGxldCdzIG1ha2Ugc3VyZSBpdCB3YXNuJ3Qgc29tZXRoaW5nIGVsc2VcbiAgICAgIGlmICghZXJyb3IuZmVlICYmICghZXJyb3IucmVzdWx0IHx8ICFlcnJvci5yZXN1bHQuZmVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgZXJyb3IgZG9lcyBub3QgY29udGFpbiBhIGZlZSBwcm9wZXJ0eSwgaXQgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBoYXMgZ29uZSBhd3J5LCBhbmQgd2UgdGhyb3cgaXRcbiAgICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZUZlZSA9IGVycm9yLmZlZSB8fCBlcnJvci5yZXN1bHQuZmVlO1xuICAgICAgbGV0IGJpdGdvRmVlID0gMDtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50O1xuICAgICAgICB0b3RhbEZlZSArPSBiaXRnb0ZlZTtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBuZXQgYW1vdW50IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbWluaW11bSBvdXRwdXQgc2l6ZVxuICAgICAgY29uc3QgbmV0QW1vdW50ID0gTWF0aC5tYXgoZXJyb3IucmVzdWx0LmF2YWlsYWJsZSAtIHRvdGFsRmVlLCBzZWxmLmJpdGdvLmdldENvbnN0YW50cygpLm1pbk91dHB1dFNpemUpO1xuICAgICAgLy8gTmVlZCB0byBjbGVhciB0aGVzZSBvdXQgc2luY2Ugb25seSAxIG1heSBiZSBzZXRcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWU7XG4gICAgICB0eFBhcmFtcy5vcmlnaW5hbEZlZVJhdGUgPSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0O1xuXG4gICAgICAvLyB3ZSBzZXQgdGhlIGZlZSBleHBsaWNpdGx5XG4gICAgICB0eFBhcmFtcy5mZWUgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gbmV0QW1vdW50IC0gYml0Z29GZWU7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBuZXRBbW91bnQ7XG4gICAgfVxuICAgIC8vIHRoaXMgdHJhbnNhY3Rpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG5vIGlzc3VlcywgYmVjYXVzZSBhbiBhcHByb3ByaWF0ZSBmZWUgaXMgc2V0XG4gICAgbGV0IHNlbnRUeDtcbiAgICB0cnkge1xuICAgICAgc2VudFR4ID0geWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goc2VudFR4KTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5wcm9ncmVzc0NhbGxiYWNrKSkge1xuICAgICAgcGFyYW1zLnByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICB0eGlkOiBzZW50VHguaGFzaCxcbiAgICAgICAgZGVzdGluYXRpb246IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGdyb3NzQW1vdW50LFxuICAgICAgICBmZWU6IHNlbnRUeC5mZWUsXG4gICAgICAgIGlucHV0Q291bnQ6IGlucHV0Q291bnQsXG4gICAgICAgIGluZGV4OiBjb25zb2xpZGF0aW9uSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc29saWRhdGlvbkluZGV4Kys7XG4gICAgaWYgKCFpc0ZpbmFsQ29uc29saWRhdGlvbikge1xuICAgICAgLy8gdGhpcyBsYXN0IGNvbnNvbGlkYXRpb24gaGFzIG5vdCB5ZXQgYnJvdWdodCB0aGUgdW5zcGVudHMgY291bnQgZG93biB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnRcbiAgICAgIC8vIHRoZXJlZm9yZSwgd2UgcHJvY2VlZCBieSBjb25zb2xpZGF0aW5nIHlldCBhbm90aGVyIGJhdGNoXG4gICAgICAvLyBiZWZvcmUgd2UgZG8gdGhhdCwgd2Ugd2FpdCAxIHNlY29uZCBzbyB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIHVuc3BlbnQgd2lsbCBiZSBmZXRjaGVkIGluIHRoZSBuZXh0IGJhdGNoXG4gICAgICB5aWVsZCBCbHVlYmlyZC5kZWxheSgxMDAwKTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCguLi4oKHlpZWxkIHJ1bk5leHRDb25zb2xpZGF0aW9uKCkpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHRoZSBmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLiBXZSByZXR1cm4gYWxsIHRoZSBvbmVzIHdlJ3ZlIGhhZCBzbyBmYXJcbiAgICByZXR1cm4gY29uc29saWRhdGlvblRyYW5zYWN0aW9ucztcbiAgfSk7XG5cbiAgcmV0dXJuIHJ1bk5leHRDb25zb2xpZGF0aW9uKHRoaXMsIHRhcmdldClcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnRG9uZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gIH1cbiAgY29uc3QgbmVlZHNLZXljaGFpbiA9ICFwYXJhbXMuc2tpcEtleWNoYWluICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgc2hhcmluZztcbiAgbGV0IHNoYXJlZEtleWNoYWluO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC5nZXRTaGFyaW5nS2V5KHsgZW1haWw6IHBhcmFtcy5lbWFpbC50b0xvd2VyQ2FzZSgpIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgc2hhcmluZyA9IHJlc3VsdDtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWNrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFhwcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ueHBydiB9KTtcblxuICAgICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICAgIHhwdWI6IGtleWNoYWluLnhwdWIsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFhwcnY6IG5ld0VuY3J5cHRlZFhwcnYsXG4gICAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgICAgcGF0aDogc2hhcmluZy5wYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgICAgICB1c2VyOiBhbnk7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIHJlc2hhcmU6IGJvb2xlYW47XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgZGlzYWJsZUVtYWlsOiBhbnk7XG4gICAgICAgIGtleWNoYWluPzogYW55O1xuICAgICAgICBza2lwS2V5Y2hhaW4/OiBib29sZWFuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgICAgICB1c2VyOiBzaGFyaW5nLnVzZXJJZCxcbiAgICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICB9O1xuICAgICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSBzaGFyZWRLZXljaGFpbjtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMudXJsKCcvdXNlci8nICsgcGFyYW1zLnVzZXIpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wb2xpY3knKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5U3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeS9zdGF0dXMnKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc2V0UG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUubGlzdFdlYmhvb2tzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQoKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNhY3Rpb24gYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gd2ViaG9va0lkIChyZXF1aXJlZCk6IGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICogLSB0eEhhc2ggKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gd2ViaG9va3MpIGhhc2ggb2YgdGhlIHNpbXVsYXRlZCB0cmFuc2FjdGlvblxuICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2ltdWxhdGVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgaGFzVHhIYXNoID0gISFwYXJhbXMudHhIYXNoO1xuICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuXG4gIGlmICgoaGFzVHhIYXNoICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB8fCAoIWhhc1R4SGFzaCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIYXNoIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQsIHRoZSB0eEhhc2ggaGFzIHRvIGFkaGVyZSB0byBpdHMgcmVzcGVjdGl2ZSBmb3JtYXRcbiAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgLy8gb25seSB0YWtlIHRoZSB0eEhhc2ggYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICApLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5hZGRXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZXN0aW1hdGVGZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmFtb3VudCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBhbW91bnQgYXMgd2VsbCBhcyByZWNpcGllbnRzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLmFtb3VudCAmJiAhXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcblxuICBpZiAocGFyYW1zLmFtb3VudCkge1xuICAgIC8vIG9ubHkgdGhlIGFtb3VudCB3YXMgcGFzc2VkIGluLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBmYWxzZSByZWNpcGllbnQgdG8gcnVuIGNyZWF0ZVRyYW5zYWN0aW9uIHdpdGhcbiAgICByZWNpcGllbnRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmVudl0uc2lnbmluZ0FkZHJlc3MsIC8vIGFueSBhZGRyZXNzIHdpbGwgZG9cbiAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLmFtb3VudCA9IHVuZGVmaW5lZDtcbiAgdHJhbnNhY3Rpb25QYXJhbXMucmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG5cbiAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHR4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVzdGltYXRlZFNpemU6IHR4LmVzdGltYXRlZFNpemUsXG4gICAgICBmZWU6IHR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHR4LmZlZVJhdGUsXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vLyBOb3QgZnVsbHkgaW1wbGVtZW50ZWQgLyByZWxlYXNlZCBvbiBTREsuIFRlc3RpbmcgZm9yIG5vdy5cbldhbGxldC5wcm90b3R5cGUudXBkYXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEJpdEdvRmVlXG4vLyBHZXQgdGhlIHJlcXVpcmVkIG9uLXRyYW5zYWN0aW9uIEJpdEdvIGZlZVxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvYmlsbGluZy9mZWUnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5leHBvcnQgPSBXYWxsZXQ7XG4iXX0=
|
|
2299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsbURBQW9EO0FBQ3BELG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFDaEQsbURBQTZDO0FBQzdDLG1EQU84QjtBQUM5QixvREFBdUI7QUFDdkIseUNBQTZDO0FBQzdDLGtDQUFxQztBQUVyQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3RHLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV0QyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxNQUFNO0lBQ3BDLHNDQUFzQztJQUNyQyxJQUFJLENBQUMsS0FBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixzQ0FBc0M7SUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDckIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQzVDLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRztJQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLEtBQUs7QUFDTCw2QkFBNkI7QUFDN0IsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFFBQVE7QUFDUixnQ0FBZ0M7QUFDaEMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFVBQVU7QUFDVixrQ0FBa0M7QUFDbEMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFVBQVU7QUFDViw0Q0FBNEM7QUFDNUMsbUZBQW1GO0FBQ25GLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsbUJBQW1CO0FBQ25CLDJDQUEyQztBQUMzQyxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRztJQUNsQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixzREFBc0Q7QUFDdEQsd0RBQXdEO0FBQ3hELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRztJQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGtCQUFrQjtBQUNsQiwwQ0FBMEM7QUFDMUMsaUVBQWlFO0FBQ2pFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixtQkFBbUI7QUFDbkIsc0RBQXNEO0FBQ3RELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0Ysc0JBQXNCO0FBQ3RCLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRztJQUNyQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE9BQU87QUFDUCw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHO0lBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxLQUFLO0lBQ3BDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsbUJBQW1CO0FBQ25CLGlGQUFpRjtBQUNqRixFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRztJQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDakQsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsOEZBQThGO0FBQzlGLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHO0lBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE1BQU07QUFDTix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDL0MsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRWxCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FDcEIsSUFBSSxDQUFDLEtBQUs7U0FDUCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2YsTUFBTSxFQUFFO1NBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUNMO1NBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsMEJBQTBCO0FBQzFCLHdGQUF3RjtBQUN4RixxRkFBcUY7QUFDckYscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLHVCQUF1QixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbkUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsSUFDRSxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUztRQUN0QyxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN0QyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUM1QixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxRCxJQUFJLHdCQUF3QixLQUFLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFELHdDQUF3QztRQUN4QyxPQUFPLElBQUEsaUJBQVUsRUFBQztZQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQyxDQUFDO2FBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUcsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLE1BQU07SUFDaEQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQy9ELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCx5RkFBeUY7UUFDekYsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUYsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQixrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWxHLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDM0MsSUFBSSxPQUFPLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsS0FBSyxNQUFNLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ3hELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpHLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDekIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQ3BCLElBQUksQ0FBQyxLQUFLO1NBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ25DLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDWixNQUFNLEVBQUU7U0FDUixJQUFJLENBQUMsVUFBVSxJQUFJO1FBQ2xCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FDTDtTQUNFLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7SUFDakYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLGdCQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0Isa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksa0JBQWtCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFFakUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsZ0JBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBQSw2QkFBa0IsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSx3QkFBd0IsR0FBRyxnQkFBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNuRSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sY0FBYyxHQUFRO1FBQzFCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNyQixLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBRUYsTUFBTSxFQUNKLFlBQVksRUFBRSxZQUFZLEVBQzFCLFlBQVksRUFDWixhQUFhLEdBQ2QsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXJHLGNBQWMsQ0FBQyxhQUFhLEdBQUcsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RCxjQUFjLENBQUMsWUFBWSxHQUFHLFlBQVksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsY0FBYyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNELGNBQWMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBQSxxQkFBVSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFN0YsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGtCQUFrQjtBQUNsQixrRkFBa0Y7QUFDbEYsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFVBQVUsTUFBTTtJQUNqRCxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTNFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsWUFBWTtBQUNaLHFDQUFxQztBQUNyQyxtQkFBbUI7QUFDbkIseUNBQXlDO0FBQ3pDLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3JELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUN0QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxLQUFLLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGdCQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ25HLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDakQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUV2QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ25ELE9BQU8sS0FBSztRQUNWLGlFQUFpRTtRQUNqRSxNQUFNLEtBQUssR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELHNDQUFzQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsc0NBQXNDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztTQUNFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixVQUFVO0FBQ1YsMERBQTBEO0FBQzFELHNGQUFzRjtBQUN0RixtQkFBbUI7QUFDbkIsOENBQThDO0FBQzlDLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ25ELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV6RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2xELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixTQUFTO0FBQ1QscUJBQXFCO0FBQ3JCLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2xELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0YsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFNBQVM7QUFDVCxzREFBc0Q7QUFDdEQsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlGLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXZELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQy9FLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFdBQVc7QUFDWCx1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDcEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVsRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFFbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQy9FLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGNBQWM7QUFDZCx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDdkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXpELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUVsQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEYsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFdBQVc7QUFDWCwyQ0FBMkM7QUFDM0MsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRixzQkFBc0I7QUFDdEIsNkRBQTZEO0FBQzdELG9FQUFvRTtBQUNwRSwrQ0FBK0M7QUFDL0Msb0VBQW9FO0FBQ3BFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3BELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFFbEIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLElBQUksRUFBRSxLQUFNO1FBQzdDLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2IsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU07WUFDMUQsaUhBQWlIO1lBQ2pILDRHQUE0RztZQUM1RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBRUQsNkdBQTZHO1lBQzdHLDZCQUE2QjtZQUM3QixJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QyxPQUFPLFdBQVcsQ0FBQyxDQUFDLCtDQUErQztZQUNyRSxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLDhHQUE4RztZQUM5RyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xGLGtDQUFrQztnQkFDbEMsa0RBQWtEO2dCQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxRQUE0QixDQUFDO2dCQUNqQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDZCwyRkFBMkY7b0JBQzNGLFFBQVEsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsQ0FBQztnQkFDRCxPQUFPLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixPQUFPLGdCQUFnQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDN0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xDLDREQUE0RDtRQUM1RCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDeEIsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEMsV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUM3QyxXQUFXLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN0RixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixlQUFlO0FBQ2YsMkNBQTJDO0FBQzNDLG1CQUFtQjtBQUNuQiwrQ0FBK0M7QUFDL0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN4RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFFcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsY0FBYztBQUNkLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzFELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YscUJBQXFCO0FBQ3JCLG1EQUFtRDtBQUNuRCxjQUFjO0FBQ2QsaUJBQWlCO0FBQ2pCLHFEQUFxRDtBQUNyRCw0Q0FBNEM7QUFDNUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDcEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUV6QyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRXpCLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLE9BQU8sSUFBSTthQUNSLGNBQWMsQ0FBQyxNQUFNLENBQUM7YUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNqQixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxVQUFVLEdBQUc7WUFDbEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xGLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN0RSxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixPQUFPLFVBQVUsRUFBRSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0NBQWdDLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM1RSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTFELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEYsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGFBQWE7QUFDYiwwQ0FBMEM7QUFDMUMsZ0hBQWdIO0FBQ2hILHlHQUF5RztBQUN6RyxNQUFNLENBQUMsU0FBUyxDQUFDLHdCQUF3QixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDcEUsT0FBTyxLQUFLO1FBQ1YsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsc0NBQXNDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixLQUFLLFVBQVUsV0FBVyxDQUFDLEtBQUs7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RELE1BQU0sS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssQ0FBQyxJQUFJLEdBQUcsaUNBQWlDLENBQUM7Z0JBQy9DLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxpRkFBaUY7WUFDakYsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztTQUNFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsa0VBQWtFO0FBQ2xFLGNBQWM7QUFDZCxpSEFBaUg7QUFDakgscURBQXFEO0FBQ3JELGlEQUFpRDtBQUNqRCw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLDBGQUEwRjtBQUMxRiwyREFBMkQ7QUFDM0QsMEhBQTBIO0FBQzFILFdBQVc7QUFDWCxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzdELE1BQU0sR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsSUFDRSxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNoRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBRXJCLE9BQU8sa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyRixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0Ysa0JBQWtCO0FBQ2xCLHdEQUF3RDtBQUN4RCxjQUFjO0FBQ2QsNkRBQTZEO0FBQzdELDZFQUE2RTtBQUM3RSx1RUFBdUU7QUFDdkUsNEJBQTRCO0FBQzVCLHdEQUF3RDtBQUN4RCxnRUFBZ0U7QUFDaEUsa0hBQWtIO0FBQ2xILFdBQVc7QUFDWCwrQkFBK0I7QUFDL0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTlCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBQSxpQkFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsMEJBQWUsRUFBQyxNQUFNLENBQUMsQ0FBQzthQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5RixvRUFBb0U7UUFDcEUsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUN0RixLQUFLLENBQUMsSUFBSSxHQUFHLGdDQUFnQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0YsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLE9BQU8sa0JBQWtCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztTQUM5QyxJQUFJLENBQUMsVUFBVSxNQUFNO1FBQ3BCLE9BQU87WUFDTCxFQUFFLEVBQUUsTUFBTSxDQUFDLGNBQWM7U0FDMUIsQ0FBQztJQUNKLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE9BQU87QUFDUCx1REFBdUQ7QUFDdkQsb0hBQW9IO0FBQ3BILGNBQWM7QUFDZCxzREFBc0Q7QUFDdEQsV0FBVztBQUNYLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzNELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN0RixJQUFJLENBQUMsVUFBVSxJQUFJO1FBQ2xCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sZ0JBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFVBQVU7WUFDbEIsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7SUFDSixDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDdkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVyRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxJQUNFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ3JCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhO1lBQzlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQzNCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQ3pCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ3JCLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDcEcsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM5RSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixlQUFlO0FBQ2YsK0NBQStDO0FBQy9DLGNBQWM7QUFDZCwwQ0FBMEM7QUFDMUMsdUVBQXVFO0FBQ3ZFLFdBQVc7QUFDWCxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN4RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUUvRSxNQUFNLE9BQU8sR0FBUTtRQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO0tBQ2hDLENBQUM7SUFFRixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLDhCQUE4QjtBQUM5QiwwREFBMEQ7QUFDMUQsNkRBQTZEO0FBQzdELGNBQWM7QUFDZCwwQ0FBMEM7QUFDMUMsd0VBQXdFO0FBQ3hFLFdBQVc7QUFDWCxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3ZFLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLO1NBQ2QsT0FBTyxFQUFFO1NBQ1QsV0FBVyxFQUFFO1NBQ2IsSUFBSSxDQUFDLFVBQVUsT0FBTztRQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUc7WUFDM0MsT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHO1lBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtTQUMxQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQztRQUNKLHNDQUFzQztRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFlBQVk7QUFDWiwyRUFBMkU7QUFDM0UsMEZBQTBGO0FBQzFGLHVCQUF1QjtBQUN2Qiw4Q0FBOEM7QUFDOUMsK0NBQStDO0FBQy9DLG9DQUFvQztBQUNwQyxFQUFFO0FBQ0YsY0FBYztBQUNkLHNDQUFzQztBQUN0QywrQ0FBK0M7QUFDL0Msd0RBQXdEO0FBQ3hELHdGQUF3RjtBQUN4RixnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLFdBQVc7QUFDWCxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNyRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxFLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFFbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFdBQVc7QUFDWCxvRkFBb0Y7QUFDcEYsMEZBQTBGO0FBQzFGLHVCQUF1QjtBQUN2Qiw4Q0FBOEM7QUFDOUMsK0NBQStDO0FBQy9DLG9DQUFvQztBQUNwQyxFQUFFO0FBQ0YsY0FBYztBQUNkLDZGQUE2RjtBQUM3Rix3RkFBd0Y7QUFDeEYsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxXQUFXO0FBQ1gsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDcEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFFbEIsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFlBQVksQ0FBQztJQUVqQixNQUFNLG1CQUFtQixHQUFHO1FBQzFCLFdBQVc7UUFDWCxTQUFTO1FBQ1QsYUFBYTtRQUNiLDZCQUE2QjtRQUM3QixzQkFBc0I7UUFDdEIsU0FBUztRQUNULFVBQVU7UUFDVixVQUFVO1FBQ1YsZUFBZTtRQUNmLFNBQVM7S0FDVixDQUFDO0lBQ0YsTUFBTSxvQkFBb0IsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVqRSx3QkFBd0I7SUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztTQUNyRCxJQUFJLENBQUMsVUFBVSxXQUFXO1FBQ3pCLHVCQUF1QjtRQUN2QixRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNoQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN0QyxZQUFZLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDMUIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUNmLHdFQUF3RTtZQUN4RSxhQUFhLEVBQUUsV0FBVyxDQUFDLGFBQWE7WUFDeEMsV0FBVyxFQUFFLG9CQUFvQjtTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsVUFBVSxNQUFNO1FBQ3BCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sU0FBUyxHQUFHLGdCQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxVQUFVLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UsTUFBTSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDakMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzdCLENBQUM7UUFDRCxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRXJCLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQztnQkFDSCxPQUFPLElBQUk7cUJBQ1Isa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO3FCQUN2QyxJQUFJLENBQUM7b0JBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxVQUFVLEdBQUc7b0JBQ2pCLFdBQVcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUNqQyxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLFVBQVUsR0FBRztvQkFDbEIscUJBQXFCO29CQUNyQixXQUFXLENBQUMsWUFBWSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYiwyQkFBMkI7Z0JBQzNCLFdBQVcsQ0FBQyxZQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDO1FBQ0osT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxRQUFRO0lBQ3RGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQjs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRWhDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDO1lBQzVELFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFlBQVksRUFBRSxLQUFLO1lBQ25CLGdCQUFnQixFQUFFLE1BQU07WUFDeEIsUUFBUSxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztTQUNYLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDdkUsZ0VBQWdFO1FBQ2hFLDREQUE0RDtRQUM1RCxNQUFNLG1CQUFtQixHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUUvRSx5REFBeUQ7UUFDekQsd0RBQXdEO1FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUU1RCxPQUFPLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7UUFDcEcsT0FBTyxLQUFLLFVBQVUsd0JBQXdCO1lBQzVDLE1BQU0sa0JBQWtCLEdBQVUsRUFBRSxDQUFDO1lBRXJDLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSxJQUFJLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzVHLElBQUksaUJBQWlCLEdBQUcsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7WUFFcEUsT0FBTyxpQkFBaUIsR0FBRyxDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO2dCQUN4RSxnRUFBZ0U7Z0JBQ2hFLHNDQUFzQztnQkFDdEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ3BDLFdBQVcsRUFBRSxDQUFDO29CQUNkLE1BQU0sRUFBRSxpQkFBaUI7b0JBQ3pCLEtBQUssRUFBRSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTTtpQkFDL0MsQ0FBQyxDQUFRLENBQUM7Z0JBRVgsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMxQixpQ0FBaUM7b0JBQ2pDLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLHNCQUFzQixHQUFHLENBQUMsQ0FBQztnQkFFL0IscUVBQXFFO2dCQUNyRSxzRUFBc0U7Z0JBQ3RFLHVFQUF1RTtnQkFDdkUsc0VBQXNFO2dCQUN0RSxpRUFBaUU7Z0JBQ2pFLGdCQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUM5Qiw2QkFBNkI7b0JBQzdCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksa0JBQWtCLENBQUMsWUFBWSxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7d0JBQ2xGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDaEIsQ0FBQztvQkFFRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pDLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUVILHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RyxpQkFBaUIsR0FBRyx1QkFBdUIsR0FBRyxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQztZQUMzRixDQUFDO1lBRUQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsd0RBQXdEO2dCQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUVELHdCQUF3QjtZQUN4QixPQUFPO2dCQUNMLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLFdBQVcsRUFBRSx1QkFBdUI7Z0JBQ3BDLFNBQVMsRUFBRSxNQUFNO2FBQ2xCLENBQUM7UUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxVQUFVLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBMEI7UUFDbEUsTUFBTSxlQUFlLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1FBQ3BGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsT0FBTyxVQUFVLE1BQU0sQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM5RyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQWUsRUFBRSxFQUFFO1FBQ25DLElBQUksZUFBZSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxPQUFPLGdCQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELDJEQUEyRDtRQUMzRCwrREFBK0Q7UUFDL0Qsb0VBQW9FO1FBQ3BFLGdDQUFnQztRQUNoQyxNQUFNLEtBQUssQ0FBQyw2Q0FBNkMsZUFBZSxDQUFDLE9BQU8sSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqSCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLGVBQWUsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwRSw2RUFBNkU7WUFDN0UsT0FBTyxlQUFlLENBQUMsS0FBSyxHQUFHLENBQUMsdUJBQVksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzdGLENBQUM7UUFDRCx3RUFBd0U7UUFDeEUsT0FBTyxlQUFlLENBQUMsS0FBSyxHQUFHLENBQUMsdUJBQVksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN4RixDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxPQUFPLEtBQUssVUFBVSx1QkFBdUI7UUFDM0MsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRS9ELG9CQUFvQjtRQUNwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxNQUFNLENBQUMscUJBQXFCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0Msd0dBQXdHO1lBQ3hHLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEYsTUFBTSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLE1BQU0sQ0FBQyxhQUFhLGlEQUFpRCxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLGFBQWEsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQ2IsZUFBZSxNQUFNLENBQUMsYUFBYSxxRUFBcUUsQ0FDekcsQ0FBQztRQUNKLENBQUM7UUFFRCw4REFBOEQ7UUFDOUQseURBQXlEO1FBQ3pELCtEQUErRDtRQUMvRCxnRUFBZ0U7UUFDaEUsb0JBQW9CO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM5RCxJQUFJLGtCQUFrQixDQUFDO1FBQ3ZCLElBQUksV0FBVyxDQUFDO1FBRWhCLE9BQU8sYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEUsV0FBVyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVsQywyREFBMkQ7WUFDM0QsbURBQW1EO1lBQ25ELDZFQUE2RTtZQUM3RSxzQ0FBc0M7WUFDdEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUN6QyxPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSzthQUMzQixDQUFDLENBQUM7WUFFSCxrQkFBa0IsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDdEQsOENBQThDO2dCQUM5QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUM3QyxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELDRDQUE0QztnQkFDNUMsT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMvRSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoRCxxREFBcUQ7UUFDckQsMkVBQTJFO1FBQzNFLHlDQUF5QztRQUN6QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FDYiw2QkFBNkIsYUFBYSxDQUFDLEtBQUssRUFBRSxxQ0FBcUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUM5RyxDQUFDO1FBQ0osQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYixpREFBaUQsVUFBVSx1Q0FBdUMsTUFBTSxDQUFDLE9BQU8sVUFBVSxDQUMzSCxDQUFDO1FBQ0osQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLG9CQUFvQixHQUN4QixXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLENBQUM7UUFFMUYsSUFBSSxXQUFXLEdBQUc7WUFDaEIsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkMsQ0FBQztRQUVGLElBQUksUUFBUSxHQUFHLGdCQUFnQixDQUFDO1lBQzlCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRztZQUN2QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsV0FBVztTQUNaLENBQUMsQ0FBQztRQUVILE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUUzQywrRUFBK0U7UUFDL0UsNEZBQTRGO1FBQzVGLHNDQUFzQztRQUN0QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUM7UUFFckUsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUNqRCxnRUFBZ0U7WUFDaEUsd0RBQXdEO1lBQ3hELE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sc0JBQXNCLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixpQkFBaUIsRUFBRSxXQUFXLENBQUMsS0FBSztnQkFDcEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHO2dCQUN2QixXQUFXLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtnQkFDekMsV0FBVzthQUNaLENBQUMsQ0FBQztZQUNILFFBQVEsR0FBRyxXQUFXLENBQUM7WUFDdkIsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCw4REFBOEQ7UUFDOUQsc0RBQXNEO1FBQ3RELHNDQUFzQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUN4RCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUM1Qyw2REFBNkQ7UUFDN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsYUFBYSxDQUFDO1FBRTdELElBQUksZUFBZSxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkRBQTJELGVBQWUsdUNBQXVDLFVBQVUsU0FBUyxDQUNySSxDQUFDO1FBQ0osQ0FBQztRQUVELDJEQUEyRDtRQUMzRCxvRUFBb0U7UUFDcEUsMkVBQTJFO1FBQzNFLCtFQUErRTtRQUMvRSxNQUFNLFlBQVksR0FBRyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkYsc0NBQXNDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXZFLG9DQUFvQztRQUNwQyxzQ0FBc0M7UUFDdEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDN0MsUUFBUSxFQUFFLGFBQWE7WUFDdkIsVUFBVSxFQUFFO2dCQUNWO29CQUNFLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztvQkFDOUIsTUFBTSxFQUFFLFlBQVk7aUJBQ3JCO2FBQ0Y7WUFDRCxHQUFHLEVBQUUsUUFBUTtZQUNiLFFBQVEsRUFBRTtnQkFDUixNQUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPLEVBQUUsRUFBRTthQUNaO1lBQ0QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNwRCxJQUFJLFlBQVksR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUM5QixzRUFBc0U7WUFDdEUsNEZBQTRGO1lBQzVGLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztTQUNFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRiwyQkFBMkI7QUFDM0IscURBQXFEO0FBQ3JELEVBQUU7QUFDRixjQUFjO0FBQ2QseURBQXlEO0FBQ3pELHdGQUF3RjtBQUN4Riw0RUFBNEU7QUFDNUUsV0FBVztBQUNYLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLHdCQUF3QixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDcEUsT0FBTyxLQUFLO1FBQ1YsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLHVCQUF1QixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUNsRixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQVEsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUV0Qyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsc0NBQXNDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLFdBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGlDQUFpQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELHNFQUFzRTtZQUN0RSxzQ0FBc0M7WUFDdEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsc0NBQXNDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUM5RCxJQUFJLGdCQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLHNDQUFzQztnQkFDdEMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDekcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFFRCxXQUFXLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDckQsc0NBQXNDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUN0QixHQUFHO1lBQ0gsT0FBTztZQUNQLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixRQUFRO1lBQ1IsV0FBVztZQUNYLGFBQWE7WUFDYixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUNFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRiwrQkFBK0I7QUFDL0IsMERBQTBEO0FBQzFELGtGQUFrRjtBQUNsRix3RUFBd0U7QUFDeEUsMkdBQTJHO0FBQzNHLDZGQUE2RjtBQUM3RixFQUFFO0FBQ0YsY0FBYztBQUNkLGtDQUFrQztBQUNsQywwQ0FBMEM7QUFDMUMsd0ZBQXdGO0FBQ3hGLFdBQVc7QUFDWCxvREFBb0Q7QUFDcEQsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN4RSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUV0QixvREFBb0Q7SUFDcEQsSUFBSSxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRWxCLHNDQUFzQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUTtZQUM1RCx5Q0FBeUM7WUFDekMsSUFBSSxDQUFDO2dCQUNILFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUMzRyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxJQUFJLElBQUksQ0FBQztJQUNULElBQUksQ0FBQztRQUNILElBQUksR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLE9BQU8sSUFBSSxDQUFDLEtBQUs7U0FDZCxTQUFTLEVBQUU7U0FDWCxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDbkIsSUFBSSxDQUFDLFVBQVUsUUFBUTtRQUN0QixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLENBQUMsS0FBSztRQUNYLGtEQUFrRDtRQUNsRCxtRkFBbUY7UUFDbkYsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDbEMsbURBQW1EO1FBQ25ELE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDN0Isb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQ7Ozs7Ozs7O1dBUUc7UUFDSCxNQUFNLGtDQUFrQyxHQUFHLFVBQVUsS0FBSyxFQUFFLFNBQVM7WUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDL0MsK0JBQStCO1lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsMkRBQTJEO1lBQzNELGdCQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELG1EQUFtRDtZQUNuRCxnQkFBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUMsbURBQW1EO1lBQ25ELDBGQUEwRjtZQUMxRixJQUFJLElBQUEsZ0JBQUMsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEtBQUssSUFBSSxJQUFBLGdCQUFDLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUVGLCtFQUErRTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFRLENBQUM7UUFDL0UsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsMERBQTBEO1FBQzFELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixxR0FBcUc7UUFDckcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLHNCQUFzQixFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQkFBQyxFQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV0RCw2REFBNkQ7UUFDN0QsTUFBTSxRQUFRLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXpCLHdEQUF3RDtRQUN4RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUMvRSxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsZ0ZBQWdGO1FBQ2hGLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3RSxzRkFBc0Y7UUFDdEYsUUFBUSxDQUFDLFVBQVUsR0FBRyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDaEYsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDOUIsNEdBQTRHO1FBQzVHLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGlGQUFpRjtZQUNqRix1RUFBdUU7WUFDdkUsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RCx5R0FBeUc7Z0JBQ3pHLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxPQUFPLElBQUksb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQzlDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxRCxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN6QyxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzVDLENBQUM7WUFFRCxrREFBa0Q7WUFDbEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDeEIsT0FBTyxRQUFRLENBQUMsa0JBQWtCLENBQUM7WUFDbkMsUUFBUSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7WUFDdkIscUdBQXFHO1lBQ3JHLDBFQUEwRTtZQUMxRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxhQUFhO1lBQ2xFLDBEQUEwRDtZQUMxRCxNQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRix5REFBeUQ7WUFDekQsUUFBUSxDQUFDLFVBQVUsR0FBRyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLEVBQUU7U0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUQsb0ZBQW9GO1FBQ3BGLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLFFBQVE7UUFDeEUsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMvRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUV4RSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO1NBQU0sSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxvRkFBb0Y7UUFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUM1QixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUM7SUFDekQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsNkVBQTZFO1FBQzdFLGFBQWEsR0FBRyxlQUFlLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7SUFDeEcsQ0FBQztTQUFNLElBQUksYUFBYSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQ0UsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkYsaUJBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDM0IsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDbEMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsc0RBQXNEO1FBQ3RELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBWSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUYsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE9BQU8sR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLG9FQUFvRTtZQUNwRSxPQUFPLENBQUMsR0FBRyxDQUNULDBDQUEwQztnQkFDeEMsT0FBTztnQkFDUCxrR0FBa0csQ0FDckcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBRXZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUUzQjs7O09BR0c7SUFDSCxLQUFLLFVBQVUsb0JBQW9CO1FBQ2pDLE1BQU0seUJBQXlCLEdBQVUsRUFBRSxDQUFDO1FBQzVDLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLGNBQWMsRUFBRSxDQUFDO1FBQ2pCOzs7Ozs7Ozs7O1dBVUc7UUFFSCxNQUFNLFdBQVcsR0FBUTtZQUN2QixLQUFLLEVBQUUsTUFBTSxHQUFHLGFBQWE7WUFDN0IsV0FBVyxFQUFFLFdBQVc7WUFDeEIsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQVEsQ0FBQztRQUM5RCwwREFBMEQ7UUFDMUQsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksY0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QiwwREFBMEQ7Z0JBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztZQUMzRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04seUdBQXlHO2dCQUN6RyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRTVDLHNEQUFzRDtRQUN0RCx1RUFBdUU7UUFDdkUsSUFBSSxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLDZGQUE2RjtRQUM3RixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTdELHVHQUF1RztRQUN2RyxzRUFBc0U7UUFDdEUsb0JBQW9CLEdBQUcsVUFBVSxLQUFLLGdCQUFnQixJQUFJLGNBQWMsS0FBSyxpQkFBaUIsQ0FBQztRQUUvRixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBUSxDQUFDO1FBQ2pHLE1BQU0sUUFBUSxHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7UUFDbEMsK0RBQStEO1FBQy9ELE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQUMsRUFBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxjQUFjO1FBRXRFLFFBQVEsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUN0RCxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELHdGQUF3RjtRQUN4RixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixvREFBb0Q7WUFDcEQsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RCx5R0FBeUc7Z0JBQ3pHLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxPQUFPLElBQUksb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQzlDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUQsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsUUFBUSxJQUFJLFFBQVEsQ0FBQztnQkFDckIsUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUM1QyxDQUFDO1lBRUQsb0ZBQW9GO1lBQ3BGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkcsa0RBQWtEO1lBQ2xELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDNUMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3hCLE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDO1lBRW5DLDRCQUE0QjtZQUM1QixRQUFRLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDN0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ3RELENBQUM7UUFDRCwyR0FBMkc7UUFDM0csSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxXQUFXLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDLENBQUMsT0FBTyxJQUFJLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RSxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxnQkFBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixXQUFXLEVBQUUsY0FBYztnQkFDM0IsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixVQUFVLEVBQUUsVUFBVTtnQkFDdEIsS0FBSyxFQUFFLGtCQUFrQjthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0Qsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMxQixrR0FBa0c7WUFDbEcsMkRBQTJEO1lBQzNELDBHQUEwRztZQUMxRyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUksQ0FBQyxNQUFNLG9CQUFvQixFQUFFLENBQVMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCx1RkFBdUY7UUFDdkYsT0FBTyx5QkFBeUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxvQkFBb0IsRUFBRTtTQUMxQixLQUFLLENBQUMsVUFBVSxHQUFHO1FBQ2xCLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3ZELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRW5HLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV6RixJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLGNBQWMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLO1NBQ2QsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztTQUNwRCxJQUFJLENBQUMsVUFBVSxNQUFNO1FBQ3BCLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxRQUFRO2dCQUM5RCx5Q0FBeUM7Z0JBQ3pDLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztvQkFDdkQsQ0FBQztvQkFDRCxJQUFJLENBQUM7d0JBQ0gsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUMzRyxDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO29CQUNyRCxDQUFDO29CQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQWEsR0FBRSxDQUFDO29CQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFlLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUV4RixjQUFjLEdBQUc7d0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO3dCQUNuQixhQUFhLEVBQUUsZ0JBQWdCO3dCQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUMzQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07d0JBQ3hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtxQkFDbkIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDO1FBV0osTUFBTSxPQUFPLEdBQVk7WUFDdkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtTQUNsQyxDQUFDO1FBQ0YsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDdEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXRELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FDcEIsSUFBSSxDQUFDLEtBQUs7U0FDUCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDLElBQUksRUFBRTtTQUNOLE1BQU0sRUFBRSxDQUNaO1NBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3JELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzNELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFckUsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDNUQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU3RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNuRixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDeEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUMxRSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXhGLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUV4RCxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUNqRixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixvQ0FBb0M7SUFFcEMsd0RBQXdEO0lBQ3hELE1BQU0sY0FBYyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFdkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQ3BCLElBQUksQ0FBQyxLQUFLO1NBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQztTQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ3BCLE1BQU0sRUFBRSxDQUNaO1NBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3RELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFN0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFN0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3ZELGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7SUFFM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsb0dBQW9HO1FBQ3BHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxPQUFPLEVBQUUsaUJBQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCO1lBQ25GLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsaUJBQWlCLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUNyQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBRTFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNoRSxPQUFPO1lBQ0wsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhO1lBQy9CLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRztZQUNYLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTztTQUNwQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRiw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzVELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNkLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDNUQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25GLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGNBQWM7QUFDZCw0Q0FBNEM7QUFDNUMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDdkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztLQVFLO0FBQ0wsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxXQUFXLE1BQU07SUFDL0MsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNFLElBQUksZ0JBQWdCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLGdDQUFxQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLHVCQUFZLENBQUMsaUJBQWlCLENBQUM7SUFDbEQsTUFBTSxlQUFlLEdBQ25CLHVCQUFZLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxHQUFHLHVCQUFZLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ3ZHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFN0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDOUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLFVBQVU7UUFDVixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0tBQzlCLENBQUMsQ0FBQztJQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckgsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxJQUFBLGdCQUFNLEVBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFBLGdCQUFNLEVBQUMsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVqSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRTdGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUcsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlDLEdBQUcsVUFBVTtRQUNiLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUMvQixVQUFVLEVBQUUsY0FBYztLQUMzQixDQUFDLENBQUM7SUFDSCxPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7S0FPSztBQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssV0FBVyxNQUFNO0lBQzdDLElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNFLElBQUksZ0JBQWdCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLGdDQUFxQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLHVCQUFZLENBQUMsaUJBQWlCLENBQUM7SUFDbEQsTUFBTSxlQUFlLEdBQ25CLHVCQUFZLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxHQUFHLHVCQUFZLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ3ZHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFN0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDOUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLFVBQVU7UUFDVixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0tBQzlCLENBQUMsQ0FBQztJQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckgsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxJQUFBLGdCQUFNLEVBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFBLGdCQUFNLEVBQUMsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVqSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRTdGLE9BQU8sTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2hDLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUNuQixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixpQkFBUyxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuLy9cbi8vIFdhbGxldCBPYmplY3Rcbi8vIEJpdEdvIGFjY2Vzc29yIGZvciBhIHNwZWNpZmljIHdhbGxldFxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIGNvbW1vbixcbiAgRXJyb3JOb0lucHV0VG9SZWNvdmVyLFxuICBnZXROZXR3b3JrLFxuICBnZXRTaGFyZWRTZWNyZXQsXG4gIG1ha2VSYW5kb21LZXksXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNpZ25Qc2J0UmVxdWVzdCB9IGZyb20gJy4vc2lnblBzYnQnO1xuaW1wb3J0IHsgdHJ5UHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuXG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuY29uc3QgUGVuZGluZ0FwcHJvdmFsID0gcmVxdWlyZSgnLi9wZW5kaW5nYXBwcm92YWwnKTtcblxuY29uc3QgeyBnZXRFeHRlcm5hbENoYWluQ29kZSwgZ2V0SW50ZXJuYWxDaGFpbkNvZGUsIGlzQ2hhaW5Db2RlLCBzY3JpcHRUeXBlRm9yQ2hhaW4gfSA9IHV0eG9saWIuYml0Z287XG5jb25zdCByZXF1ZXN0ID0gcmVxdWlyZSgnc3VwZXJhZ2VudCcpO1xuXG4vL1xuLy8gQ29uc3RydWN0b3Jcbi8vXG5jb25zdCBXYWxsZXQgPSBmdW5jdGlvbiAoYml0Z28sIHdhbGxldCkge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAodGhpcy5iaXRnbyBhcyBhbnkpID0gYml0Z287XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMud2FsbGV0ID0gd2FsbGV0O1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLmtleWNoYWlucyA9IFtdO1xuXG4gIGlmICh3YWxsZXQucHJpdmF0ZSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgdGhpcy5rZXljaGFpbnMgPSB3YWxsZXQucHJpdmF0ZS5rZXljaGFpbnM7XG4gIH1cbn07XG5cbldhbGxldC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQ7XG59O1xuXG4vL1xuLy8gaWRcbi8vIEdldCB0aGUgaWQgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmlkO1xufTtcblxuLy9cbi8vIGxhYmVsXG4vLyBHZXQgdGhlIGxhYmVsIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5sYWJlbDtcbn07XG5cbi8vXG4vLyBiYWxhbmNlXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5iYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuYmFsYW5jZTtcbn07XG5cbi8vXG4vLyBiYWxhbmNlXG4vLyBHZXQgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy8gVGhpcyBpcyB0aGUgdG90YWwgb2YgYWxsIHVuc3BlbnRzIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSB1bmNvbmZpcm1lZCBhbmQgZXh0ZXJuYWxcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNwZW5kYWJsZUJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5zcGVuZGFibGVCYWxhbmNlO1xufTtcblxuLy9cbi8vIGNvbmZpcm1lZEJhbGFuY2Vcbi8vIEdldCB0aGUgY29uZmlybWVkQmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmNvbmZpcm1lZEJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5jb25maXJtZWRCYWxhbmNlO1xufTtcblxuLy9cbi8vIGNhblNlbmRJbnN0YW50XG4vLyBSZXR1cm5zIGlmIHRoZSB3YWxsZXQgY2FuIHNlbmQgaW5zdGFudCB0cmFuc2FjdGlvbnNcbi8vIFRoaXMgaXMgaW1wYWN0ZWQgYnkgdGhlIGNob2ljZSBvZiBiYWNrdXAga2V5IHByb3ZpZGVyXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jYW5TZW5kSW5zdGFudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0ICYmIHRoaXMud2FsbGV0LmNhblNlbmRJbnN0YW50O1xufTtcblxuLy9cbi8vIGluc3RhbnQgYmFsYW5jZVxuLy8gR2V0IHRoZSBpbnN0YW50IGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgdGhhdCBtYXkgYmUgc3BlbnQgaW5zdGFudGx5LlxuLy9cbldhbGxldC5wcm90b3R5cGUuaW5zdGFudEJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jYW5TZW5kSW5zdGFudCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYW4gaW5zdGFudCB3YWxsZXQnKTtcbiAgfVxuICByZXR1cm4gdGhpcy53YWxsZXQuaW5zdGFudEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gdW5jb25maXJtZWRTZW5kc1xuLy8gR2V0IHRoZSBiYWxhbmNlIG9mIHVuY29uZmlybWVkU2VuZHMgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFNlbmRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRTZW5kcztcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFJlY2VpdmVzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRSZWNlaXZlcyBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUudW5jb25maXJtZWRSZWNlaXZlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnVuY29uZmlybWVkUmVjZWl2ZXM7XG59O1xuXG4vL1xuLy8gdHlwZVxuLy8gR2V0IHRoZSB0eXBlIG9mIHRoaXMgd2FsbGV0LCBlLmcuICdzYWZlaGQnXG4vL1xuV2FsbGV0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudHlwZTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUudXJsID0gZnVuY3Rpb24gKGV4dHJhKSB7XG4gIGV4dHJhID0gZXh0cmEgfHwgJyc7XG4gIHJldHVybiB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgZXh0cmEpO1xufTtcblxuLy9cbi8vIHBlbmRpbmdBcHByb3ZhbHNcbi8vIHJldHVybnMgdGhlIHBlbmRpbmcgYXBwcm92YWxzIGxpc3QgZm9yIHRoaXMgd2FsbGV0IGFzIHBlbmRpbmcgYXBwcm92YWwgb2JqZWN0c1xuLy9cbldhbGxldC5wcm90b3R5cGUucGVuZGluZ0FwcHJvdmFscyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLndhbGxldC5wZW5kaW5nQXBwcm92YWxzLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBuZXcgUGVuZGluZ0FwcHJvdmFsKHNlbGYuYml0Z28sIHAsIHNlbGYpO1xuICB9KTtcbn07XG5cbi8vXG4vLyBhcHByb3ZhbHNSZXF1aXJlZFxuLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCB0byBhcHByb3ZlIHBlbmRpbmcgYXBwcm92YWxzIGludm9sdmluZyB0aGlzIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYXBwcm92YWxzUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5hcHByb3ZhbHNSZXF1aXJlZCB8fCAxO1xufTtcblxuLy9cbi8vIGdldFxuLy8gUmVmZXRjaGVzIHRoaXMgd2FsbGV0IGFuZCByZXR1cm5zIGl0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjayk6IFByb21pc2U8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMudXJsKCkpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgc2VsZi53YWxsZXQgPSByZXM7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfSlcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdXBkYXRlQXBwcm92YWxzUmVxdWlyZWRcbi8vIFVwZGF0ZXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgb24gYSBwZW5kaW5nIGFwcHJvdmFsIGludm9sdmluZyB0aGlzIHdhbGxldC5cbi8vIFRoZSBhcHByb3ZhbHMgcmVxdWlyZWQgaXMgYnkgZGVmYXVsdCAxLCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGVcbi8vIG51bWJlciBzdWNoIHRoYXQgMSA8PSBhcHByb3ZhbHNSZXF1aXJlZCA8PSB3YWxsZXRBZG1pbnMubGVuZ3RoIC0gMVxuLy9cbldhbGxldC5wcm90b3R5cGUudXBkYXRlQXBwcm92YWxzUmVxdWlyZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjayk6IFByb21pc2U8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmIChcbiAgICBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICFfLmlzSW50ZWdlcihwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQpIHx8XG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkIDwgMVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXBwcm92YWxzUmVxdWlyZWQ6IG11c3QgYmUgYSBub256ZXJvIHBvc2l0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGNvbnN0IGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9IHRoaXMuYXBwcm92YWxzUmVxdWlyZWQoKTtcbiAgaWYgKGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9PT0gcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB7XG4gICAgLy8gbm8tb3AsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHdhbGxldFxuICAgIHJldHVybiB0cnlQcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLndhbGxldDtcbiAgICB9KVxuICAgICAgLnRoZW4oY2FsbGJhY2spXG4gICAgICAuY2F0Y2goY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29ycmVjdCBjaGFpbiBmb3IgY2hhbmdlLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIHNlZ3dpdFxuICovXG5XYWxsZXQucHJvdG90eXBlLmdldENoYW5nZUNoYWluID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBsZXQgdXNlU2Vnd2l0Q2hhbmdlID0gISF0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXRDaGFuZ2UpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWd3aXRDaGFuZ2UgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG5cbiAgICAvLyBpZiBzZWd3aXQgaXMgZGlzYWJsZWQgdGhyb3VnaCB0aGUgY29uc3RhbnRzLCBzZWd3aXQgY2hhbmdlIHNob3VsZCBzdGlsbCBub3QgYmUgY3JlYXRlZFxuICAgIHVzZVNlZ3dpdENoYW5nZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0ICYmIHBhcmFtcy5zZWd3aXRDaGFuZ2U7XG4gIH1cbiAgcmV0dXJuIHVzZVNlZ3dpdENoYW5nZSA/IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoUDJ3c2gnKSA6IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQWRkcmVzc1xuLy8gQ3JlYXRlcyBhIG5ldyBhZGRyZXNzIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHRoaXMudHlwZSgpID09PSAnc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgdXNpbmcgYSBsZWdhY3kgd2FsbGV0IHRoYXQgY2Fubm90IGNyZWF0ZSBhIG5ldyBhZGRyZXNzJyk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGNsaWVudC1zaWRlIGFkZHJlc3MgdmFsaWRhdGlvbiBvbiwgZm9yIHNhZmV0eS4gVXNlIHZhbGlkYXRlPWZhbHNlIHRvIGRpc2FibGUuXG4gIGNvbnN0IHNob3VsZFZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG5cbiAgY29uc3QgYWxsb3dFeGlzdGluZyA9IHBhcmFtcy5hbGxvd0V4aXN0aW5nO1xuICBpZiAodHlwZW9mIGFsbG93RXhpc3RpbmcgIT09ICdib29sZWFuJykge1xuICAgIHBhcmFtcy5hbGxvd0V4aXN0aW5nID0gYWxsb3dFeGlzdGluZyA9PT0gJ3RydWUnO1xuICB9XG5cbiAgY29uc3QgaXNTZWd3aXQgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgY29uc3QgZGVmYXVsdENoYWluID0gaXNTZWd3aXQgPyBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuXG4gIGxldCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluID09PSBudWxsIHx8IGNoYWluID09PSB1bmRlZmluZWQpIHtcbiAgICBjaGFpbiA9IGRlZmF1bHRDaGFpbjtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvYWRkcmVzcy8nICsgY2hhaW4pKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gICAgICAudGhlbihmdW5jdGlvbiAoYWRkcikge1xuICAgICAgICBpZiAoc2hvdWxkVmFsaWRhdGUpIHtcbiAgICAgICAgICBzZWxmLnZhbGlkYXRlQWRkcmVzcyhhZGRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkcjtcbiAgICAgIH0pXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhZGRyZXNzIGxvY2FsbHkgd2l0aG91dCBjYWxsaW5nIHNlcnZlclxuICogQHBhcmFtIHBhcmFtc1xuICpcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZW5lcmF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAoeyBzZWd3aXQsIHBhdGgsIGtleWNoYWlucywgdGhyZXNob2xkIH0pIHtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXNlZ3dpdDtcbiAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gIGlmIChfLmlzSW50ZWdlcih0aHJlc2hvbGQpKSB7XG4gICAgc2lnbmF0dXJlVGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAgIGlmIChzaWduYXR1cmVUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGF0aFJlZ2V4ID0gL15cXC8xP1swMV1cXC9cXGQrJC87XG4gIGlmICghcGF0aC5tYXRjaChwYXRoUmVnZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBwYXRoOiAnICsgcGF0aCk7XG4gIH1cblxuICBsZXQgcm9vdEtleXMgPSB0aGlzLmtleWNoYWlucztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Y2hhaW5zKSkge1xuICAgIHJvb3RLZXlzID0ga2V5Y2hhaW5zO1xuICB9XG5cbiAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ubmV0d29yaztcblxuICBjb25zdCBkZXJpdmVkS2V5cyA9IHJvb3RLZXlzLm1hcChmdW5jdGlvbiAoaykge1xuICAgIGNvbnN0IGhkbm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoay54cHViKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGsucGF0aCArIChrLndhbGxldFN1YlBhdGggfHwgJycpICsgcGF0aDtcbiAgICByZXR1cm4gaGRub2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKGRlcml2YXRpb25QYXRoKSkucHVibGljS2V5O1xuICB9KTtcblxuICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGhDb21wb25lbnRzID0gXy5tYXAocGF0aENvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHtcbiAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY29tcG9uZW50LCAxMCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcGF0aERldGFpbHMgPSBfLmZpbHRlcihub3JtYWxpemVkUGF0aENvbXBvbmVudHMsIF8uaXNJbnRlZ2VyKTtcblxuICBjb25zdCBhZGRyZXNzRGV0YWlsczogYW55ID0ge1xuICAgIGNoYWluUGF0aDogcGF0aCxcbiAgICBwYXRoOiBwYXRoLFxuICAgIGNoYWluOiBwYXRoRGV0YWlsc1swXSxcbiAgICBpbmRleDogcGF0aERldGFpbHNbMV0sXG4gICAgd2FsbGV0OiB0aGlzLmlkKCksXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgIHJlZGVlbVNjcmlwdCxcbiAgICB3aXRuZXNzU2NyaXB0LFxuICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMsIGlzU2Vnd2l0ID8gJ3Ayc2hQMndzaCcgOiAncDJzaCcpO1xuXG4gIGFkZHJlc3NEZXRhaWxzLndpdG5lc3NTY3JpcHQgPSB3aXRuZXNzU2NyaXB0Py50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLnJlZGVlbVNjcmlwdCA9IHJlZGVlbVNjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5vdXRwdXRTY3JpcHQgPSBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCBnZXROZXR3b3JrKG5ldHdvcmspKTtcblxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59O1xuXG4vL1xuLy8gdmFsaWRhdGVBZGRyZXNzXG4vLyBWYWxpZGF0ZXMgYW4gYWRkcmVzcyBhbmQgcGF0aCBieSBjYWxjdWxhdGluZyBpdCBsb2NhbGx5IGZyb20gdGhlIGtleWNoYWluIHhwdWJzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS52YWxpZGF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdwYXRoJ10sIFtdKTtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXBhcmFtcy53aXRuZXNzU2NyaXB0ICYmIHBhcmFtcy53aXRuZXNzU2NyaXB0Lmxlbmd0aCA+IDA7XG5cbiAgY29uc3QgZ2VuZXJhdGVkQWRkcmVzcyA9IHRoaXMuZ2VuZXJhdGVBZGRyZXNzKHsgcGF0aDogcGFyYW1zLnBhdGgsIHNlZ3dpdDogaXNTZWd3aXQgfSk7XG4gIGlmIChnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MgIT09IHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogJyArIHBhcmFtcy5hZGRyZXNzICsgJyB2cy4gJyArIGdlbmVyYXRlZEFkZHJlc3MuYWRkcmVzcyk7XG4gIH1cbn07XG5cbi8vXG4vLyBhZGRyZXNzZXNcbi8vIEdldHMgdGhlIGFkZHJlc3NlcyBvZiBhIEhEIHdhbGxldC5cbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBsaW1pdDogdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgdG8gZ2V0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hZGRyZXNzZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7fTtcbiAgaWYgKHBhcmFtcy5kZXRhaWxzKSB7XG4gICAgcXVlcnkuZGV0YWlscyA9IDE7XG4gIH1cblxuICBjb25zdCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluICE9PSBudWxsICYmIGNoYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFpbikpIHtcbiAgICAgIHF1ZXJ5LmNoYWluID0gXy51bmlxKF8uZmlsdGVyKGNoYWluLCBfLmlzSW50ZWdlcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhaW4gIT09IDAgJiYgY2hhaW4gIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWluIGFyZ3VtZW50LCBleHBlY3RpbmcgMCBvciAxJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5jaGFpbiA9IGNoYWluO1xuICAgIH1cbiAgfVxuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LnNraXAgPSBwYXJhbXMuc2tpcDtcbiAgfVxuICBpZiAocGFyYW1zLnNvcnQpIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2FkZHJlc3NlcycpO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkocXVlcnkpLnJlc3VsdCgpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnN0YXRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3N0YXRzJyArIHF1ZXJ5KTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVmcmVzaCB0aGUgd2FsbGV0IG9iamVjdCBieSBzeW5jaW5nIHdpdGggdGhlIGJhY2stZW5kXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtXYWxsZXR9XG4gKi9cbldhbGxldC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gd2hlbiBzZXQgdG8gdHJ1ZSwgZ3BrIHJldHVybnMgdGhlIHByaXZhdGUgZGF0YSBvZiBzYWZlIHdhbGxldHNcbiAgICBjb25zdCBxdWVyeSA9IF8uZXh0ZW5kKHt9LCBfLnBpY2socGFyYW1zLCBbJ2dwayddKSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLndhbGxldCA9IHJlcztcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gICAgLmNhbGwodGhpcylcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGFkZHJlc3Ncbi8vIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgYWRkcmVzcyBvbiBhIEhEIHdhbGxldC5cbi8vIEluZm9ybWF0aW9uIGluY2x1ZGVzIGluZGV4LCBwYXRoLCByZWRlZW1TY3JpcHQsIHNlbnQsIHJlY2VpdmVkLCB0eENvdW50IGFuZCBiYWxhbmNlXG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgYWRkcmVzczogdGhlIGFkZHJlc3Mgb24gdGhpcyB3YWxsZXQgdG8gZ2V0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2FkZHJlc3Nlcy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBGcmVlemUgdGhlIHdhbGxldCBmb3IgYSBkdXJhdGlvbiBvZiBjaG9pY2UsIHN0b3BwaW5nIEJpdEdvIGZyb20gc2lnbmluZyBhbnkgdHJhbnNhY3Rpb25zLlxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSBkdXJhdGlvbiB0byBmcmVlemUgdGhlIHdhbGxldCBmb3IgaW4gc2Vjb25kcywgZGVmYXVsdHMgdG8gMzYwMC5cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5mcmVlemUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMuZHVyYXRpb24pIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uIC0gc2hvdWxkIGJlIG51bWJlciBvZiBzZWNvbmRzJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZGVsZXRlXG4vLyBEZWxldGVzIHRoZSB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGxhYmVsc1xuLy8gTGlzdCB0aGUgbGFiZWxzIGZvciB0aGUgYWRkcmVzc2VzIGluIGEgZ2l2ZW4gd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvbGFiZWxzLycgKyB0aGlzLmlkKCkpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoJ2xhYmVscycpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlbmFtZSBhIHdhbGxldFxuICogQHBhcmFtIHBhcmFtc1xuICogIC0gbGFiZWw6IHRoZSB3YWxsZXQncyBpbnRlbmRlZCBuZXcgbmFtZVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5zZXRXYWxsZXROYW1lID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wdXQodXJsKS5zZW5kKHsgbGFiZWw6IHBhcmFtcy5sYWJlbCB9KS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNldExhYmVsXG4vLyBTZXRzIGEgbGFiZWwgb24gdGhlIHByb3ZpZGVkIGFkZHJlc3Ncbi8vXG5XYWxsZXQucHJvdG90eXBlLnNldExhYmVsID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnLCAnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIXNlbGYuYml0Z28udmVyaWZ5QWRkcmVzcyh7IGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIH0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5hZGRyZXNzKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvbGFiZWxzLycgKyB0aGlzLmlkKCkgKyAnLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZGVsZXRlTGFiZWxcbi8vIERlbGV0ZXMgdGhlIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlTGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHVybCkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1bnNwZW50c1xuLy8gTGlzdCBBTEwgdGhlIHVuc3BlbnRzIGZvciBhIGdpdmVuIHdhbGxldFxuLy8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBwYWdlZCBsaXN0IG9mIGFsbCB1bnNwZW50c1xuLy9cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgbGltaXQ6ICB0aGUgb3B0aW9uYWwgbGltaXQgb2YgdW5zcGVudHMgdG8gY29sbGVjdCBpbiBCVENcbi8vICAgbWluQ29uZjogb25seSBpbmNsdWRlIHJlc3VsdHMgd2l0aCB0aGlzIG51bWJlciBvZiBjb25maXJtYXRpb25zXG4vLyAgIHRhcmdldDogdGhlIGFtb3VudCBvZiBidGMgdG8gZmluZCB0byBzcGVuZFxuLy8gICBpbnN0YW50OiBvbmx5IGZpbmQgaW5zdGFudCB0cmFuc2FjdGlvbnMgKG11c3Qgc3BlY2lmeSBhIHRhcmdldClcbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBhbGxVbnNwZW50czogYW55W10gPSBbXTtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgY29uc3QgZ2V0VW5zcGVudHNCYXRjaCA9IGZ1bmN0aW9uIChza2lwLCBsaW1pdD8pIHtcbiAgICBjb25zdCBxdWVyeU9iamVjdCA9IF8uY2xvbmVEZWVwKHBhcmFtcyk7XG4gICAgaWYgKHNraXAgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5za2lwID0gc2tpcDtcbiAgICB9XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0ID4gMCkge1xuICAgICAgcXVlcnlPYmplY3QubGltaXQgPSBsaW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZi51bnNwZW50c1BhZ2VkKHF1ZXJ5T2JqZWN0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIC8vIFRoZSBBUEkgaGFzIGl0cyBvd24gbGltaXQgaGFuZGxpbmcuIEZvciBleGFtcGxlLCB0aGUgQVBJIGRvZXMgbm90IHN1cHBvcnQgbGltaXRzIGJpZ2dlciB0aGFuIDUwMC4gSWYgdGhlIGxpbWl0XG4gICAgICAvLyBzcGVjaWZpZWQgaGVyZSBpcyBiaWdnZXIgdGhhbiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gZG8gbXVsdGlwbGUgcmVxdWVzdHMgd2l0aCBuZWNlc3NhcnkgbGltaXQgYWRqdXN0bWVudC5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0LnVuc3BlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSByZXN1bHQudW5zcGVudHNbaV07XG4gICAgICAgIGFsbFVuc3BlbnRzLnB1c2godW5zcGVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE91ciBsaW1pdCBhZGp1c3RtZW50IG1ha2VzIHN1cmUgdGhhdCB3ZSBuZXZlciBmZXRjaCBtb3JlIHVuc3BlbnRzIHRoYW4gd2UgbmVlZCwgbWVhbmluZyB0aGF0IGlmIHdlIGhpdCB0aGVcbiAgICAgIC8vIGxpbWl0LCB3ZSBoaXQgaXQgcHJlY2lzZWx5XG4gICAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID49IHBhcmFtcy5saW1pdCkge1xuICAgICAgICByZXR1cm4gYWxsVW5zcGVudHM7IC8vIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIGFueSBmdXJ0aGVyIHVuc3BlbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvdGFsVW5zcGVudENvdW50ID0gcmVzdWx0LnRvdGFsO1xuICAgICAgLy8gaWYgbm8gdGFyZ2V0IGlzIHNwZWNpZmllZCBhbmQgdGhlIFNESyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBoYXMgYmVlbiBhIGxpbWl0LCB3ZSBuZWVkIHRvIGZldGNoIGFub3RoZXIgYmF0Y2hcbiAgICAgIGlmICghcGFyYW1zLnRhcmdldCAmJiB0b3RhbFVuc3BlbnRDb3VudCAmJiB0b3RhbFVuc3BlbnRDb3VudCA+IGFsbFVuc3BlbnRzLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIGZldGNoIHRoZSBuZXh0IGJhdGNoXG4gICAgICAgIC8vIGxldCdzIGp1c3Qgb2Zmc2V0IHRoZSBjdXJyZW50IHNraXAgYnkgdGhlIGNvdW50XG4gICAgICAgIGNvbnN0IG5ld1NraXAgPSBza2lwICsgcmVzdWx0LmNvdW50O1xuICAgICAgICBsZXQgbmV3TGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGxpbWl0ID4gMCkge1xuICAgICAgICAgIC8vIHdlIHNldCB0aGUgbmV3IGxpbWl0IHRvIGJlIHByZWNpc2VseSB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgdW5zcGVudHMgdG8gaGl0IG91ciBvd24gbGltaXRcbiAgICAgICAgICBuZXdMaW1pdCA9IGxpbWl0IC0gYWxsVW5zcGVudHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRVbnNwZW50c0JhdGNoKG5ld1NraXAsIG5ld0xpbWl0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsbFVuc3BlbnRzO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBnZXRVbnNwZW50c0JhdGNoKDAsIHBhcmFtcy5saW1pdCkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSB1bnNwZW50cyAocGFnZWQpIGZvciBhIGdpdmVuIHdhbGxldCwgcmV0dXJuaW5nIHRoZSByZXN1bHQgYXMgYW4gb2JqZWN0IG9mIHVuc3BlbnRzLCBjb3VudCwgc2tpcCBhbmQgdG90YWxcbiAqIFRoaXMgbWV0aG9kIG1heSBub3QgcmV0dXJuIGFsbCB0aGUgdW5zcGVudHMgYXMgdGhlIGxpc3QgaXMgcGFnZWQgYnkgdGhlIEFQSVxuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIHBhcmFtcy5saW1pdCB0aGUgb3B0aW9uYWwgbGltaXQgb2YgdW5zcGVudHMgdG8gY29sbGVjdCBpbiBCVENcbiAqIEBwYXJhbSBwYXJhbXMuc2tpcCBpbmRleCBpbiBsaXN0IG9mIHVuc3BlbnRzIHRvIHN0YXJ0IHBhZ2luZyBmcm9tXG4gKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIG9ubHkgaW5jbHVkZSByZXN1bHRzIHdpdGggdGhpcyBudW1iZXIgb2YgY29uZmlybWF0aW9uc1xuICogQHBhcmFtIHBhcmFtcy50YXJnZXQgdGhlIGFtb3VudCBvZiBidGMgdG8gZmluZCB0byBzcGVuZFxuICogQHBhcmFtIHBhcmFtcy5pbnN0YW50IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyBkZXNpcmVkIG51bWJlciBvZiB1bnNwZW50cyB0byBoYXZlIGluIHRoZSB3YWxsZXQgYWZ0ZXIgdGhlIHR4IGdvZXMgdGhyb3VnaCAocmVxdWlyZXMgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy5taW5TaXplIG1pbmltdW0gdW5zcGVudCBzaXplIGluIHNhdG9zaGlzXG4gKiBAcGFyYW0gcGFyYW1zLnNlZ3dpdCByZXF1ZXN0IHNlZ3dpdCB1bnNwZW50cyAoZGVmYXVsdHMgdG8gdHJ1ZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gcGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0IGFsbG93IHNlZ3dpdCB1bnNwZW50cyBmb3IgbGVkZ2VyIGRldmljZXMgKGRlZmF1bHRzIHRvIGZhbHNlIGlmIHVuZGVmaW5lZClcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHNQYWdlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5saW1pdCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5za2lwKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpICYmICFfLmlzTnVtYmVyKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcmdldCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXRXYWxsZXRVbnNwZW50cyBmbGFnIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluU2l6ZSkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50OiBtaW5TaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgb25lIG9mIGluc3RhbnQgYW5kIG1pbkNvbmZpcm1zIG1heSBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0V2FsbGV0VW5zcGVudHMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIGNvbmp1bmN0aW9uIHdpdGggYSB0YXJnZXQnKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogYWxsb3dMZWRnZXJTZWd3aXQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICAvLyBza2lwIGFuZCBsaW1pdCBhcmUgdW5hdmFpbGFibGUgd2hlbiBhIHRhcmdldCBpcyBzcGVjaWZpZWRcbiAgICBkZWxldGUgcXVlcnlPYmplY3Quc2tpcDtcbiAgICBkZWxldGUgcXVlcnlPYmplY3QubGltaXQ7XG4gIH1cblxuICBxdWVyeU9iamVjdC5zZWd3aXQgPSB0cnVlO1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5hbGxvd0xlZGdlclNlZ3dpdCA9IHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdDtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy91bnNwZW50cycpKS5xdWVyeShxdWVyeU9iamVjdCkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvbnNcbi8vIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICAgICBUT0RPOiAgQWRkIGl0ZXJhdG9ycyBmb3Igc3RhcnQvY291bnQvZXRjXG5XYWxsZXQucHJvdG90eXBlLnRyYW5zYWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnc2tpcD0nICsgcGFyYW1zLnNraXApO1xuICB9XG4gIGlmIChwYXJhbXMubWluSGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWluSGVpZ2h0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkhlaWdodD0nICsgcGFyYW1zLm1pbkhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5tYXhIZWlnaHQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhIZWlnaHQpIHx8IHBhcmFtcy5tYXhIZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4SGVpZ2h0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21heEhlaWdodD0nICsgcGFyYW1zLm1heEhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5taW5Db25maXJtcykge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkNvbmZpcm1zKSB8fCBwYXJhbXMubWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWluQ29uZmlybXM9JyArIHBhcmFtcy5taW5Db25maXJtcyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jb21wYWN0KSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmNvbXBhY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29tcGFjdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdjb21wYWN0PScgKyBwYXJhbXMuY29tcGFjdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3R4JyArIHF1ZXJ5KTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvblxuLy8gR2V0IGEgdHJhbnNhY3Rpb24gYnkgSUQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG5XYWxsZXQucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC8nICsgcGFyYW1zLmlkKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBwb2xsRm9yVHJhbnNhY3Rpb25cbi8vIFBvbGwgYSB0cmFuc2FjdGlvbiB1bnRpbCBzdWNjZXNzZnVsIG9yIHRpbWVzIG91dFxuLy8gUGFyYW1ldGVyczpcbi8vICAgaWQ6IHRoZSB0eGlkXG4vLyAgIGRlbGF5OiBkZWxheSBiZXR3ZWVuIHBvbGxzIGluIG1zIChkZWZhdWx0OiAxMDAwKVxuLy8gICB0aW1lb3V0OiB0aW1lb3V0IGluIG1zIChkZWZhdWx0OiAxMDAwMClcbldhbGxldC5wcm90b3R5cGUucG9sbEZvclRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuICBpZiAocGFyYW1zLmRlbGF5ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5kZWxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGVsYXkgcGFyYW1ldGVyJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy50aW1lb3V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy50aW1lb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0aW1lb3V0IHBhcmFtZXRlcicpO1xuICB9XG4gIHBhcmFtcy5kZWxheSA9IHBhcmFtcy5kZWxheSB8fCAxMDAwO1xuICBwYXJhbXMudGltZW91dCA9IHBhcmFtcy50aW1lb3V0IHx8IDEwMDAwO1xuXG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTtcblxuICBjb25zdCBkb05leHRQb2xsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZWxmXG4gICAgICAuZ2V0VHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQgfHwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydC52YWx1ZU9mKCkgPiBwYXJhbXMudGltZW91dCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcGFyYW1zLmRlbGF5KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRvTmV4dFBvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZG9OZXh0UG9sbCgpO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0V2FsbGV0VHJhbnNhY3Rpb25CeVNlcXVlbmNlSWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvc2VxdWVuY2UvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBLZXkgY2hhaW5zXG4vLyBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbi8vIFRoZSB1c2VyIGtleSBjaGFpbiBpcyB0eXBpY2FsbHkgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIGhhcyB0aGUgZW5jcnlwdGVkIHhwcml2IHN0b3JlZCBvbiBCaXRHby5cbi8vIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuV2FsbGV0LnByb3RvdHlwZS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gdHJ5S2V5Q2hhaW4oaW5kZXgpIHtcbiAgICAgIGlmICghc2VsZi5rZXljaGFpbnMgfHwgaW5kZXggPj0gc2VsZi5rZXljaGFpbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbm9fZW5jcnlwdGVkX2tleWNoYWluX29uX3dhbGxldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7IHhwdWI6IHNlbGYua2V5Y2hhaW5zW2luZGV4XS54cHViIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgc2VsZi5iaXRnby5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHhwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAga2V5Y2hhaW4ud2FsbGV0U3ViUGF0aCA9IHNlbGYua2V5Y2hhaW5zW2luZGV4XS5wYXRoO1xuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG4gICAgLmNhbGwodGhpcylcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZVRyYW5zYWN0aW9uXG4vLyBDcmVhdGUgYSB0cmFuc2FjdGlvbiAodW5zaWduZWQpLiBUbyBzaWduIGl0LCBkbyBzaWduVHJhbnNhY3Rpb25cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBvYmplY3Qgb2YgcmVjaXBpZW50IGFkZHJlc3NlcyBhbmQgdGhlIGFtb3VudCB0byBzZW5kIHRvIGVhY2ggZS5nLiB7YWRkcmVzczoxNTAwLCBhZGRyZXNzMjoxNTAwfVxuLy8gICBmZWUgICAgICAtIHRoZSBibG9ja2NoYWluIGZlZSB0byBzZW5kIChvcHRpb25hbClcbi8vICAgZmVlUmF0ZSAgLSB0aGUgZmVlIHBlciBrYiB0byBzZW5kIChvcHRpb25hbClcbi8vICAgbWluQ29uZmlybXMgLSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0byB1c2Ugd2hlbiBnYXRoZXJpbmcgdW5zcGVudHNcbi8vICAgZm9yY2VDaGFuZ2VBdEVuZCAtIGZvcmNlIGNoYW5nZSBhZGRyZXNzIHRvIGJlIGxhc3Qgb3V0cHV0IChvcHRpb25hbClcbi8vICAgbm9TcGxpdENoYW5nZSAtIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICBjaGFuZ2VBZGRyZXNzIC0gb3ZlcnJpZGUgdGhlIGNoYW5nZSBhZGRyZXNzIChvcHRpb25hbClcbi8vICAgdmFsaWRhdGUgLSBleHRyYSB2ZXJpZmljYXRpb24gb2YgY2hhbmdlIGFkZHJlc3NlcyAod2hpY2ggYXJlIGFsd2F5cyB2ZXJpZmllZCBzZXJ2ZXItc2lkZSkgKGRlZmF1bHRzIHRvIGdsb2JhbCBjb25maWcpXG4vLyBSZXR1cm5zOlxuLy8gICBjYWxsYmFjayhlcnIsIHsgdHJhbnNhY3Rpb25IZXg6IHN0cmluZywgdW5zcGVudHM6IFtpbnB1dHNdLCBmZWU6IHNhdG9zaGlzIH0pXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKCFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhbmdlQWRkcmVzcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMudmFsaWRhdGUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy52YWxpZGF0ZSkpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgcGFyYW1zLnZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG4gIHBhcmFtcy53YWxsZXQgPSB0aGlzO1xuXG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgaWYgKHBhcmFtcy5wc2J0KSB7XG4gICAgcmV0dXJuIHRyeVByb21pc2UoKCkgPT4gc2lnblBzYnRSZXF1ZXN0KHBhcmFtcykpXG4gICAgICAudGhlbihjYWxsYmFjaylcbiAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gIH1cblxuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSGV4J10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuXG4gIGlmICgoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhcGFyYW1zLmtleWNoYWluLnhwcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5zaWduaW5nS2V5KSkge1xuICAgIC8vIGFsbG93IHBhc3NpbmcgaW4gYSBXSUYgcHJpdmF0ZSBrZXkgZm9yIGxlZ2FjeSBzYWZlIHdhbGxldCBzdXBwb3J0XG4gICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGtleWNoYWluIG9iamVjdCB3aXRoIHhwcnYgb3Igc2lnbmluZ0tleSBXSUYnKTtcbiAgICBlcnJvci5jb2RlID0gJ21pc3Npbmdfa2V5Y2hhaW5fb3Jfc2lnbmluZ0tleSc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwYXJhbXMudmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcbiAgcGFyYW1zLmJpdGdvID0gdGhpcy5iaXRnbztcbiAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4OiByZXN1bHQudHJhbnNhY3Rpb25IZXgsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kXG4vLyBTZW5kIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEJpdGNvaW4gbmV0d29yayB2aWEgQml0R28uXG4vLyBPbmUgb2YgdGhlIGtleXMgaXMgdHlwaWNhbGx5IHNpZ25lZCwgYW5kIEJpdEdvIHdpbGwgc2lnbiB0aGUgb3RoZXIgKGlmIGFwcHJvdmVkKSBhbmQgcmVsYXkgaXQgdG8gdGhlIFAyUCBuZXR3b3JrLlxuLy8gUGFyYW1ldGVyczpcbi8vICAgdHggIC0gdGhlIGhleCBlbmNvZGVkLCBzaWduZWQgdHJhbnNhY3Rpb24gdG8gc2VuZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eCddLCBbJ21lc3NhZ2UnLCAnb3RwJ10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3R4L3NlbmQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICBpZiAoYm9keS5wZW5kaW5nQXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAncGVuZGluZ0FwcHJvdmFsJyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkub3RwKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZChib2R5LCB7IHN0YXR1czogJ290cCcgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2FjY2VwdGVkJyxcbiAgICAgICAgdHg6IGJvZHkudHJhbnNhY3Rpb24sXG4gICAgICAgIGhhc2g6IGJvZHkudHJhbnNhY3Rpb25IYXNoLFxuICAgICAgICBpbnN0YW50OiBib2R5Lmluc3RhbnQsXG4gICAgICAgIGluc3RhbnRJZDogYm9keS5pbnN0YW50SWQsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2hhcmUgdGhlIHdhbGxldCB3aXRoIGFuIGV4aXN0aW5nIEJpdEdvIHVzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgcmVjaXBpZW50J3MgdXNlciBpZCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyB1c2VyIHJlY29yZCBpbiBvdXIgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge2tleWNoYWlufSBrZXljaGFpbiBUaGUga2V5Y2hhaW4gdG8gYmUgc2hhcmVkIHdpdGggdGhlIHJlY2lwaWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9ucyBBIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIHRoaXMgc2hhcmUuXG4gKi9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgaWYgKFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi54cHViIHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFhwcnYgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSB4cHViLCBlbmNyeXB0ZWRYcHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlSW52aXRlXG4vLyBpbnZpdGUgYSBub24gQml0R28gY3VzdG9tZXIgdG8gam9pbiBhIHdhbGxldFxuLy8gUGFyYW1ldGVyczpcbi8vICAgZW1haWwgLSB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzc1xuLy8gICBwZXJtaXNzaW9ucyAtIHRoZSByZWNpcGllbnQncyBwZXJtaXNzaW9ucyBpZiB0aGUgc2hhcmUgaXMgYWNjZXB0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVJbnZpdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgdG9FbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgIHBlcm1pc3Npb25zOiBwYXJhbXMucGVybWlzc2lvbnMsXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5tZXNzYWdlKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ludml0ZScpKS5zZW5kKG9wdGlvbnMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY29uZmlybUludml0ZUFuZFNoYXJlV2FsbGV0XG4vLyBjb25maXJtIG15IGludml0ZSBvbiB0aGlzIHdhbGxldCB0byBhIHJlY2lwaWVudCB3aG8gaGFzXG4vLyBzdWJzZXF1ZW50bHkgc2lnbmVkIHVwIGJ5IGNyZWF0aW5nIHRoZSBhY3R1YWwgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB3YWxsZXRJbnZpdGVJZCAtIHRoZSB3YWxsZXQgaW52aXRlIGlkXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSByZXF1aXJlZCBpZiB0aGUgd2FsbGV0IHNoYXJlIHN1Y2Nlc3MgaXMgZXhwZWN0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0SW52aXRlSWQnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAud2FsbGV0cygpXG4gICAgLmxpc3RJbnZpdGVzKClcbiAgICAudGhlbihmdW5jdGlvbiAoaW52aXRlcykge1xuICAgICAgY29uc3Qgb3V0Z29pbmcgPSBpbnZpdGVzLm91dGdvaW5nO1xuICAgICAgY29uc3QgaW52aXRlID0gXy5maW5kKG91dGdvaW5nLCBmdW5jdGlvbiAob3V0KSB7XG4gICAgICAgIHJldHVybiBvdXQuaWQgPT09IHBhcmFtcy53YWxsZXRJbnZpdGVJZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpbnZpdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQgaW52aXRlIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlbWFpbDogaW52aXRlLnRvRW1haWwsXG4gICAgICAgIHBlcm1pc3Npb25zOiBpbnZpdGUucGVybWlzc2lvbnMsXG4gICAgICAgIG1lc3NhZ2U6IGludml0ZS5tZXNzYWdlLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZWxmLnNoYXJlV2FsbGV0KG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZS8nICsgcGFyYW1zLndhbGxldEludml0ZUlkKSk7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRDb2luc1xuLy8gU2VuZCBjb2lucyB0byBhIGRlc3RpbmF0aW9uIGFkZHJlc3MgZnJvbSB0aGlzIHdhbGxldCB1c2luZyB0aGUgdXNlciBrZXkuXG4vLyAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHByaXZcbi8vIDIuIERlY3J5cHRzIHVzZXIga2V5XG4vLyAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4vLyA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuLy8gMy4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4vLyAgIGFtb3VudCAtIHRoZSBhbW91bnQgaW4gc2F0b3NoaXMgdG8gYmUgc2VudFxuLy8gICBtZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZENvaW5zID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgcGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgcGFyYW1zLnJlY2lwaWVudHNbcGFyYW1zLmFkZHJlc3NdID0gcGFyYW1zLmFtb3VudDtcblxuICByZXR1cm4gdGhpcy5zZW5kTWFueShwYXJhbXMpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kTWFueVxuLy8gU2VuZCBjb2lucyB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgZnJvbSB0aGlzIHdhbGxldCB1c2luZyB0aGUgdXNlciBrZXkuXG4vLyAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHByaXZcbi8vIDIuIERlY3J5cHRzIHVzZXIga2V5XG4vLyAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4vLyA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuLy8gMy4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgdHJhdmVsSW5mbzogb2JqZWN0IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kTWFueSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpbnN0YW50IC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICB9XG5cbiAgbGV0IGJpdGdvRmVlO1xuICBsZXQgdHJhdmVsSW5mb3M7XG4gIGxldCBmaW5hbFJlc3VsdDtcbiAgbGV0IHVuc3BlbnRzVXNlZDtcblxuICBjb25zdCBhY2NlcHRlZEJ1aWxkUGFyYW1zID0gW1xuICAgICdudW1CbG9ja3MnLFxuICAgICdmZWVSYXRlJyxcbiAgICAnbWluQ29uZmlybXMnLFxuICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICd0YXJnZXRXYWxsZXRVbnNwZW50cycsXG4gICAgJ21lc3NhZ2UnLFxuICAgICdtaW5WYWx1ZScsXG4gICAgJ21heFZhbHVlJyxcbiAgICAnbm9TcGxpdENoYW5nZScsXG4gICAgJ2NvbW1lbnQnLFxuICBdO1xuICBjb25zdCBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIGFjY2VwdGVkQnVpbGRQYXJhbXMpO1xuXG4gIC8vIEdldCB0aGUgdXNlciBrZXljaGFpblxuICBjb25zdCByZXRQcm9taXNlID0gdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgICAgLy8gU2VuZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIGJpdGdvRmVlID0gdHJhbnNhY3Rpb24uYml0Z29GZWU7XG4gICAgICB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgICAgdW5zcGVudHNVc2VkID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG4gICAgICByZXR1cm4gc2VsZi5zZW5kVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eDogdHJhbnNhY3Rpb24udHgsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICAgIG90cDogcGFyYW1zLm90cCxcbiAgICAgICAgLy8gVGhlIGJlbG93IHBhcmFtcyBhcmUgZm9yIGxvZ2dpbmcgb25seSwgYW5kIGRvIG5vdCBpbXBhY3QgdGhlIEFQSSBjYWxsXG4gICAgICAgIGVzdGltYXRlZFNpemU6IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemUsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChyZXN1bHQudHgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICBjb25zdCBpbnB1dHNTdW0gPSBfLnN1bUJ5KHVuc3BlbnRzVXNlZCwgJ3ZhbHVlJyk7XG4gICAgICBjb25zdCBvdXRwdXRzU3VtID0gXy5zdW1CeSh0eC5vdXRzLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IGZlZVVzZWQgPSBpbnB1dHNTdW0gLSBvdXRwdXRzU3VtO1xuICAgICAgaWYgKGlzTmFOKGZlZVVzZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVVc2VkJyk7XG4gICAgICB9XG4gICAgICAocmVzdWx0LmZlZSA9IGZlZVVzZWQpLCAocmVzdWx0LmZlZVJhdGUgPSAoZmVlVXNlZCAqIDEwMDApIC8gdHgudmlydHVhbFNpemUoKSk7XG4gICAgICByZXN1bHQudHJhdmVsSW5mb3MgPSB0cmF2ZWxJbmZvcztcbiAgICAgIGlmIChiaXRnb0ZlZSkge1xuICAgICAgICByZXN1bHQuYml0Z29GZWUgPSBiaXRnb0ZlZTtcbiAgICAgIH1cbiAgICAgIGZpbmFsUmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAvLyBIYW5kbGUgc2VuZGluZyB0cmF2ZWwgaW5mb3MgaWYgdGhleSBleGlzdCwgYnV0IG1ha2Ugc3VyZSB3ZSBuZXZlciBmYWlsIGhlcmUuXG4gICAgICAvLyBFcnJvciBvciByZXN1bHQgKHdpdGggcG9zc2libGUgc3ViLWVycm9ycykgd2lsbCBiZSBwcm92aWRlZCBpbiB0cmF2ZWxSZXN1bHRcbiAgICAgIGlmICh0cmF2ZWxJbmZvcyAmJiB0cmF2ZWxJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gc2VsZlxuICAgICAgICAgICAgLnBvbGxGb3JUcmFuc2FjdGlvbih7IGlkOiByZXN1bHQuaGFzaCB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5iaXRnby50cmF2ZWxSdWxlKCkuc2VuZE1hbnkocmVzdWx0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHJlcztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAvLyBjYXRjaCBhc3luYyBlcnJvcnNcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0geyBlcnJvcjogZXJyLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBjYXRjaCBzeW5jaHJvbm91cyBlcnJvcnNcbiAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluYWxSZXN1bHQ7XG4gICAgfSk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0UHJvbWlzZSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBBY2NlbGVyYXRlIGEgc3R1Y2sgdHJhbnNhY3Rpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKS5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHN0dWNrIHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIG5vIHVuY29uZmlybWVkIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gSW5wdXQgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50cmFuc2FjdGlvbklEIC0gSUQgb2YgdHJhbnNhY3Rpb24gdG8gYWNjZWxlcmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gTmV3IGVmZmVjdGl2ZSBmZWUgcmF0ZSBmb3Igc3R1Y2sgdHJhbnNhY3Rpb24gKHNhdCBwZXIgMTAwMCBieXRlcylcbiAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIC0gTWF4aW11bSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSBmcm9tIHRoZSB3YWxsZXQgdG8gY292ZXIgYW55IGNoaWxkIGZlZXMgdGhhdCB0aGUgcGFyZW50IHVuc3BlbnQgb3V0cHV0IGNhbm5vdCBjb3Zlci4gRGVmYXVsdHMgdG8gMTAwLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2Ugd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgd2FsbGV0IHByaXZhdGUga2V5LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIFRoZSBwcml2YXRlIGtleSBmb3IgdGhlIHdhbGxldC4gT25lIG9mIGVpdGhlciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgaXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMgUmVzdWx0IG9mIHNlbmRUcmFuc2FjdGlvbigpIG9uIHRoZSBjaGlsZCB0cmFuc2FjdGlvblxuICovXG5XYWxsZXQucHJvdG90eXBlLmFjY2VsZXJhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIGFjY2VsZXJhdGVUcmFuc2FjdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVzdGltYXRlIGEgdHJhbnNhY3Rpb25zIHNpemUgaW4gdmlydHVhbCBieXRlcy5cbiAgICogQWN0dWFsIHRyYW5zYWN0aW9ucyBtYXkgYmUgc2xpZ2h0bHkgZmV3ZXIgdmlydHVhbCBieXRlcywgZHVlIHRvXG4gICAqIHRoZSBmYWN0IHRoYXQgdmFsaWQgRUNTREEgc2lnbmF0dXJlcyBoYXZlIGEgdmFyaWFibGUgbGVuZ3RoXG4gICAqIGJldHdlZW4gOCBhbmQgNzMgdmlydHVhbCBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cy5zZWd3aXQgVGhlIG51bWJlciBvZiBzZWd3aXQgaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyU0ggVGhlIG51bWJlciBvZiBQMlNIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cy5QMlBLSCBUaGUgbnVtYmVyIG9mIFAyUEtIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNvbnN0IGVzdGltYXRlVHhWU2l6ZSA9IChpbnB1dHMpID0+IHtcbiAgICBjb25zdCBzZWd3aXQgPSBpbnB1dHMuc2Vnd2l0IHx8IDA7XG4gICAgY29uc3QgUDJTSCA9IGlucHV0cy5QMlNIIHx8IDA7XG4gICAgY29uc3QgUDJQS0ggPSBpbnB1dHMuUDJQS0ggfHwgMDtcblxuICAgIGNvbnN0IGNoaWxkRmVlSW5mbyA9IFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8oe1xuICAgICAgblAyc2hJbnB1dHM6IFAyU0gsXG4gICAgICBuUDJwa2hJbnB1dHM6IFAyUEtILFxuICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0LFxuICAgICAgbk91dHB1dHM6IDEsXG4gICAgICBmZWVSYXRlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoaWxkRmVlSW5mby5zaXplO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGF0IHNob3VsZCBiZSBwYWlkIGluIGZlZXMgYnkgdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXRzIHRvIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiB3aGljaCBhcmUgcGFzc2VkIHRvIGVzdGltYXRlVHhWU2l6ZVxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIGZlZVJhdGUgVGhlIG5ldyBmZWUgcmF0ZSB3aGljaCBzaG91bGQgYmUgcGFpZCBieSB0aGUgY29tYmluZWQgQ1BGUCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBjaGlsZCB0eCBzaG91bGQgcGF5IGluIGZlZXNcbiAgICovXG4gIGNvbnN0IGVzdGltYXRlQ2hpbGRGZWUgPSAoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGUgfSkgPT4ge1xuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBtb3JlIHdlICpzaG91bGQqIGhhdmUgcGFpZCBpbiBwYXJlbnQgZmVlcyxcbiAgICAvLyBoYWQgdGhlIHBhcmVudCBiZWVuIG9yaWdpbmFsbHkgc2VudCB3aXRoIHRoZSBuZXcgZmVlIHJhdGVcbiAgICBjb25zdCBhZGRpdGlvbmFsUGFyZW50RmVlID0gXy5jZWlsKChwYXJlbnRWU2l6ZSAqIGZlZVJhdGUpIC8gMTAwMCkgLSBwYXJlbnRGZWU7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggd2Ugd291bGQgcGF5IGluIGZlZXMgZm9yIHRoZSBjaGlsZCxcbiAgICAvLyBpZiBpdCB3ZXJlIG9ubHkgcGF5aW5nIGZvciBpdHNlbGYgYXQgdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGNoaWxkRmVlID0gKGVzdGltYXRlVHhWU2l6ZShpbnB1dHMpICogZmVlUmF0ZSkgLyAxMDAwO1xuXG4gICAgcmV0dXJuIF8uY2VpbChjaGlsZEZlZSArIGFkZGl0aW9uYWxQYXJlbnRGZWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSB0byBwYXkgdGhlIGNoaWxkIHR4IGZlZXMuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRoZSBwYXJlbnQgdHggb3V0cHV0IGlzIG5vdCBzdWZmaWNpZW50IHRvXG4gICAqIGNvdmVyIHRoZSB0b3RhbCBmZWVzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjaGlsZCB0eC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRPdXRwdXRWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggd2UgYXJlIHVzaW5nIGFzIGFuIGlucHV0IHRvIHRoZSBjaGlsZCB0eFxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIG1heFVuc3BlbnRzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRpdGlvbmFsIHVuc3BlbnRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlc1xuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UsIHRoZSB1cGRhdGVkIG51bWJlciBvZiBzYXRvc2hpcyB3aGljaCBzaG91bGQgYmUgcGFpZCBieVxuICAgKiAgICAgICAgICB0aGUgY2hpbGQgdHgsIGFuZCB0aGUgdXBkYXRlZCBpbnB1dHMgZm9yIHRoZSBjaGlsZCB0eC5cbiAgICovXG4gIGNvbnN0IGZpbmRBZGRpdGlvbmFsVW5zcGVudHMgPSAoeyBpbnB1dHMsIHBhcmVudE91dHB1dFZhbHVlLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBtYXhVbnNwZW50cyB9KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvRmluZEFkZGl0aW9uYWxVbnNwZW50cygpIHtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxVbnNwZW50czogYW55W10gPSBbXTtcblxuICAgICAgLy8gYXNrIHRoZSBzZXJ2ZXIgZm9yIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLCBhc3N1bWluZ1xuICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZG9uZSB3aXRob3V0IGFkZGl0aW9uYWwgdW5zcGVudHMgKHdoaWNoIGlzIG5vdCBwb3NzaWJsZSxcbiAgICAgIC8vIHNpbmNlIGlmIHRoYXQgd2VyZSB0aGUgY2FzZSwgZmluZEFkZGl0aW9uYWxVbnNwZW50cyB3b3VsZCBub3QgaGF2ZSBiZWVuXG4gICAgICAvLyBjYWxsZWQgaW4gdGhlIGZpcnN0IHBsYWNlLiBUaGlzIHdpbGwgYmUgY29ycmVjdGVkIGJlZm9yZSByZXR1cm5pbmcpXG4gICAgICBsZXQgY3VycmVudENoaWxkRmVlRXN0aW1hdGUgPSBlc3RpbWF0ZUNoaWxkRmVlKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlOiBwYXJhbXMuZmVlUmF0ZSB9KTtcbiAgICAgIGxldCB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWU7XG5cbiAgICAgIHdoaWxlICh1bmNvdmVyZWRDaGlsZEZlZSA+IDAgJiYgYWRkaXRpb25hbFVuc3BlbnRzLmxlbmd0aCA8IG1heFVuc3BlbnRzKSB7XG4gICAgICAgIC8vIHRyeSB0byBnZXQgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSByZXN0IG9mIHRoZSBjaGlsZCBmZWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgY29uc3QgdW5zcGVudHMgPSAoYXdhaXQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgICAgbWluQ29uZmlybXM6IDEsXG4gICAgICAgICAgdGFyZ2V0OiB1bmNvdmVyZWRDaGlsZEZlZSxcbiAgICAgICAgICBsaW1pdDogbWF4VW5zcGVudHMgLSBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoLFxuICAgICAgICB9KSkgYXMgYW55O1xuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBubyBtb3JlIHVuc3BlbnRzIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhZGRpdGlvbmFsVW5zcGVudFZhbHVlID0gMDtcblxuICAgICAgICAvLyBjb25zdW1lIGFsbCB1bnNwZW50cyByZXR1cm5lZCBieSB0aGUgc2VydmVyLCBldmVuIGlmIHdlIGRvbid0IG5lZWRcbiAgICAgICAgLy8gYWxsIG9mIHRoZW0gdG8gY292ZXIgdGhlIGNoaWxkIGZlZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbFxuICAgICAgICAvLyByZXR1cm4gZW5vdWdoIHVuc3BlbnQgdmFsdWUgdG8gZW5zdXJlIHRoYXQgdGhlIG1pbmltdW0gY2hhbmdlIGFtb3VudFxuICAgICAgICAvLyBpcyBhY2hpZXZlZCBmb3IgdGhlIGNoaWxkIHR4LCBhbmQgd2UgY2FuJ3QgbGVhdmUgb3V0IHRob3NlIHVuc3BlbnRzXG4gICAgICAgIC8vIG9yIGVsc2UgdGhlIG1pbmltdW0gY2hhbmdlIGFtb3VudCBjb25zdHJhaW50IGNvdWxkIGJlIHZpb2xhdGVkXG4gICAgICAgIF8uZm9yRWFjaCh1bnNwZW50cywgKHVuc3BlbnQpID0+IHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNoaWxkIHR4IGlucHV0c1xuICAgICAgICAgIGNvbnN0IHVuc3BlbnRDaGFpbiA9IGdldENoYWluKHVuc3BlbnQpO1xuICAgICAgICAgIGlmIChpc0NoYWluQ29kZSh1bnNwZW50Q2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50Q2hhaW4pID09PSAncDJzaFAyd3NoJykge1xuICAgICAgICAgICAgaW5wdXRzLnNlZ3dpdCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMuUDJTSCsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZGl0aW9uYWxVbnNwZW50cy5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgIGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgKz0gdW5zcGVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3VycmVudENoaWxkRmVlRXN0aW1hdGUgPSBlc3RpbWF0ZUNoaWxkRmVlKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlOiBwYXJhbXMuZmVlUmF0ZSB9KTtcbiAgICAgICAgdW5jb3ZlcmVkQ2hpbGRGZWUgPSBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSAtIHBhcmVudE91dHB1dFZhbHVlIC0gYWRkaXRpb25hbFVuc3BlbnRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVuY292ZXJlZENoaWxkRmVlID4gMCkge1xuICAgICAgICAvLyBVbmFibGUgdG8gZmluZCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIGNoaWxkIGZlZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBjb25maXJtZWQgdW5zcGVudHMgYXZhaWxhYmxlIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWVgKTtcbiAgICAgIH1cblxuICAgICAgLy8gZm91bmQgZW5vdWdoIHVuc3BlbnRzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRpdGlvbmFsOiBhZGRpdGlvbmFsVW5zcGVudHMsXG4gICAgICAgIG5ld0NoaWxkRmVlOiBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSxcbiAgICAgICAgbmV3SW5wdXRzOiBpbnB1dHMsXG4gICAgICB9O1xuICAgIH0uY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bGwgY29weSAoaW5jbHVkaW5nIHdpdG5lc3MgZGF0YSkgb2YgYW4gYXJiaXRyYXJ5IHR4IHVzaW5nIG9ubHkgdGhlIHR4IGlkLlxuICAgKlxuICAgKiBXZSBoYXZlIHRvIHVzZSBhbiBleHRlcm5hbCBzZXJ2aWNlIGZvciB0aGlzIChjdXJyZW50bHkgYmxvY2tzdHJlYW0uaW5mbyksIHNpbmNlXG4gICAqIHRoZSB2MSBpbmRleGVyIHNlcnZpY2UgKGJhc2VkIG9uIGJpdGNvaW5qKSBkb2VzIG5vdCBoYXZlIHNlZ3dpdCBzdXBwb3J0IGFuZFxuICAgKiBkb2VzIG5vdCByZXR1cm4gYW55IHNlZ3dpdCByZWxhdGVkIGZpZWxkcyBpbiB0aGUgdHggaGV4LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50VHhJZCBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHRvIGdldCB0aGUgZnVsbCBoZXggb2ZcbiAgICogQHJldHVybnMge0JsdWViaXJkPGFueT59IFRoZSBmdWxsIGhleCBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UGFyZW50VHhIZXgoeyBwYXJlbnRUeElkIH06IHsgcGFyZW50VHhJZDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGV4cGxvcmVyQmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbc2VsZi5iaXRnby5nZXRFbnYoKV0uYnRjRXhwbG9yZXJCYXNlVXJsO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QuZ2V0KGAke2V4cGxvcmVyQmFzZVVybH0vdHgvJHtwYXJlbnRUeElkfS9oZXhgKTtcblxuICAgIGlmICghcmVzdWx0LnRleHQgfHwgIS8oW2EtZjAtOV17Mn0pKy8udGVzdChyZXN1bHQudGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qgc3VjY2Vzc2Z1bGx5IHJlY2VpdmUgcGFyZW50IHR4IGhleC4gUmVjZWl2ZWQgJyR7Xy50cnVuY2F0ZShyZXN1bHQudGV4dCwgeyBsZW5ndGg6IDEwMCB9KX0nIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgY2hhaW4gZnJvbSBhbiB1bnNwZW50IG9yIHR4IG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBUaGUgb3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGNoYWluIGZvciB0aGUgZ2l2ZW4gb3V0cHV0IG9yIHVuc3BlbnRcbiAgICovXG4gIGNvbnN0IGdldENoYWluID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC5jaGFpbjtcbiAgICB9XG5cbiAgICBpZiAob3V0cHV0T3JVbnNwZW50LmNoYWluUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXy50b051bWJlcihvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoLnNwbGl0KCcvJylbMV0pO1xuICAgIH1cblxuICAgIC8vIG5vIHdheSB0byB0ZWxsIHRoZSBjaGFpbiwgbGV0J3MganVzdCBibG93IHVwIG5vdyBpbnN0ZWFkXG4gICAgLy8gb2YgYmxvd2luZyB1cCBsYXRlciB3aGVuIHRoZSB1bmRlZmluZWQgcmV0dXJuIHZhbHVlIGlzIHVzZWQuXG4gICAgLy8gTm90ZTogZm9yIHVuc3BlbnRzIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FkZHJlc3MnLCBidXQgZm9yIG91dHB1dHNcbiAgICAvLyB0aGUgZmllbGQgdG8gdXNlIGlzICdhY2NvdW50J1xuICAgIHRocm93IEVycm9yKGBDb3VsZCBub3QgZ2V0IGNoYWluIGZvciBvdXRwdXQgb24gYWNjb3VudCAke291dHB1dE9yVW5zcGVudC5hY2NvdW50IHx8IG91dHB1dE9yVW5zcGVudC5hZGRyZXNzfWApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBhY3R1YWwgdmFsdWUgY29udHJpYnV0aW9uIGFuIG91dHB1dCBvciB1bnNwZW50IHdpbGxcbiAgICogY29udHJpYnV0ZSB0byBhIHRyYW5zYWN0aW9uLCB3ZXJlIGl0IHRvIGJlIHVzZWQuIEVhY2ggdHlwZSBvZiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgY29udHJpYnV0aW9uIHNpbmNlIGVhY2ggdHlwZSBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyXG4gICAqIG9mIHZpcnR1YWwgYnl0ZXMsIGFuZCB0aHVzIHdpbGwgY2F1c2UgYSBkaWZmZXJlbnQgZmVlIHRvIGJlIHBhaWQuXG4gICAqXG4gICAqIEBwYXJhbSBvdXRwdXRPclVuc3BlbnQgT3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgZWZmZWN0aXZlIHZhbHVlIHNob3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhY3R1YWwgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgdGhpcyB1bnNwZW50IG9yIG91dHB1dFxuICAgKiAgICAgICAgICAgICAgICAgICB3b3VsZCBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC5cbiAgICovXG4gIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IGNoYWluID0gZ2V0Q2hhaW4ob3V0cHV0T3JVbnNwZW50KTtcbiAgICBpZiAoaXNDaGFpbkNvZGUoY2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC52YWx1ZSAtIChWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICAgIH1cbiAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplIGlzIGluIGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga0JcbiAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb3JvdXRpbmUgd2hpY2ggYWN0dWFsbHkgaW1wbGVtZW50cyB0aGUgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uIGFsZ29yaXRobVxuICAgKlxuICAgKiBEZXNjcmliZWQgYXQgYSBoaWdoIGxldmVsLCB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gICAqIDEpIEZpbmQgYXBwcm9wcmlhdGUgb3V0cHV0IGZyb20gcGFyZW50IHRyYW5zYWN0aW9uIHRvIHVzZSBhcyBjaGlsZCB0cmFuc2FjdGlvbiBpbnB1dFxuICAgKiAyKSBGaW5kIHVuc3BlbnQgY29ycmVzcG9uZGluZyB0byBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0LiBJZiBub3QgZm91bmQsIHJldHVybiB0byBzdGVwIDEuXG4gICAqIDMpIERldGVybWluZSBpZiBwYXJlbnQgdHJhbnNhY3Rpb24gdW5zcGVudCBjYW4gY292ZXIgZW50aXJlIGNoaWxkIGZlZSwgcGx1cyBtaW5pbXVtIGNoYW5nZVxuICAgKiA0KSBJZiB5ZXMsIGdvIHRvIHN0ZXAgNlxuICAgKiA1KSBPdGhlcndpc2UsIGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQgdG8gdXNlIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlXG4gICAqIDYpIENyZWF0ZSBhbmQgc2lnbiB0aGUgY2hpbGQgdHJhbnNhY3Rpb24sIHVzaW5nIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqICAgIChhbmQsIGlmIG5lY2Vzc2FyeSwgYWRkaXRpb25hbCB3YWxsZXQgdW5zcGVudHMpIGFzIGlucHV0c1xuICAgKiA3KSBCcm9hZGNhc3QgdGhlIG5ldyBjaGlsZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvQWNjZWxlcmF0ZVRyYW5zYWN0aW9uKCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSUQnXSwgW10sIGNhbGxiYWNrKTtcblxuICAgIC8vIHZhbGlkYXRlIGZlZSByYXRlXG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRmluaXRlKHBhcmFtcy5mZWVSYXRlKSB8fCBwYXJhbXMuZmVlUmF0ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIGZvciBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBtYXhVbnNwZW50c1xuICAgIGlmIChwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGJ5IGRlZmF1bHQsIHVzZSBhdCBtb3N0IDEwMCBhZGRpdGlvbmFsIHVuc3BlbnRzIChub3QgaW5jbHVkaW5nIHRoZSB1bnNwZW50IG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHgpXG4gICAgICBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID0gMTAwO1xuICAgIH1cblxuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cykgfHwgcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyA8PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXIgZm9yIHBhcmFtZXRlcjogbWF4QWRkaXRpb25hbFVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBwYXJlbnRUeCA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb24oeyBpZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgaWYgKHBhcmVudFR4LmNvbmZpcm1hdGlvbnMgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGlzIGFscmVhZHkgY29uZmlybWVkIGFuZCBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIG91dHB1dHMgZnJvbSB0aGUgcGFyZW50IHR4IHdoaWNoIGFyZSB0byBvdXIgd2FsbGV0XG4gICAgY29uc3Qgd2FsbGV0T3V0cHV0cyA9IF8uZmlsdGVyKHBhcmVudFR4Lm91dHB1dHMsIChvdXRwdXQpID0+IG91dHB1dC5pc01pbmUpO1xuXG4gICAgaWYgKHdhbGxldE91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiAke3BhcmFtcy50cmFuc2FjdGlvbklEfSBjb250YWlucyBubyBvdXRwdXRzIHRvIHRoaXMgd2FsbGV0LCBhbmQgdGh1cyBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHVzZSBhbiBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHdpdGggbGFyZ2VzdCBlZmZlY3RpdmUgdmFsdWUsXG4gICAgLy8gYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5IHVuc3BlbnQuXG4gICAgLy8gQW4gb3V0cHV0IGNvdWxkIGJlIHNwZW50IGFscmVhZHkgaWYgdGhlIG91dHB1dCB3YXMgdXNlZCBpbiBhXG4gICAgLy8gY2hpbGQgdHggd2hpY2ggaXRzZWxmIGhhcyBiZWNvbWUgc3R1Y2sgZHVlIHRvIGxvdyBmZWVzIGFuZCBpc1xuICAgIC8vIGFsc28gdW5jb25maXJtZWQuXG4gICAgY29uc3Qgc29ydGVkT3V0cHV0cyA9IF8uc29ydEJ5KHdhbGxldE91dHB1dHMsIGVmZmVjdGl2ZVZhbHVlKTtcbiAgICBsZXQgcGFyZW50VW5zcGVudFRvVXNlO1xuICAgIGxldCBvdXRwdXRUb1VzZTtcblxuICAgIHdoaWxlIChzb3J0ZWRPdXRwdXRzLmxlbmd0aCA+IDAgJiYgcGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dHB1dFRvVXNlID0gc29ydGVkT3V0cHV0cy5wb3AoKTtcblxuICAgICAgLy8gZmluZCB0aGUgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFydGljdWxhciBvdXRwdXRcbiAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhpcyB1bnNwZW50P1xuICAgICAgLy8gVE9ETzogVGhlIGJlc3Qgd2UgY2FuIGRvIGhlcmUgaXMgc2V0IG1pblNpemUgPSBtYXhTaXplID0gb3V0cHV0VG9Vc2UudmFsdWVcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCB1bnNwZW50c1Jlc3VsdCA9IGF3YWl0IHRoaXMudW5zcGVudHMoe1xuICAgICAgICBtaW5TaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgICAgbWF4U2l6ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgcGFyZW50VW5zcGVudFRvVXNlID0gXy5maW5kKHVuc3BlbnRzUmVzdWx0LCAodW5zcGVudCkgPT4ge1xuICAgICAgICAvLyBtYWtlIHN1cmUgdW5zcGVudCBiZWxvbmdzIHRvIHRoZSBnaXZlbiB0eGlkXG4gICAgICAgIGlmICh1bnNwZW50LnR4X2hhc2ggIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGhhcyBjb3JyZWN0IHZfb3V0IGluZGV4XG4gICAgICAgIHJldHVybiB1bnNwZW50LnR4X291dHB1dF9uID09PSBvdXRwdXRUb1VzZS52b3V0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFVuc3BlbnRUb1VzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHVuc3BlbnQgb3V0cHV0IGZyb20gcGFyZW50IHR4IHRvIHVzZSBhcyBjaGlsZCBpbnB1dGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgZnVsbCBoZXggZm9yIHRoZSBwYXJlbnQgdHggYW5kIGRlY29kZSBpdCB0byBnZXQgaXRzIHZzaXplXG4gICAgY29uc3QgcGFyZW50VHhIZXggPSBhd2FpdCBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQ6IHBhcmFtcy50cmFuc2FjdGlvbklEIH0pO1xuICAgIGNvbnN0IGRlY29kZWRQYXJlbnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJlbnRUeEhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICBjb25zdCBwYXJlbnRWU2l6ZSA9IGRlY29kZWRQYXJlbnQudmlydHVhbFNpemUoKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBpZCBmcm9tIGRlY29kZWQgdHggYW5kIGdpdmVuIHR4IGlkIG1hdGNoXG4gICAgLy8gdGhpcyBzaG91bGQgY2F0Y2ggcHJvYmxlbXMgZW1hbmF0aW5nIGZyb20gdGhlIHVzZSBvZiBhbiBleHRlcm5hbCBzZXJ2aWNlXG4gICAgLy8gZm9yIGdldHRpbmcgdGhlIGNvbXBsZXRlIHBhcmVudCB0eCBoZXhcbiAgICBpZiAoZGVjb2RlZFBhcmVudC5nZXRJZCgpICE9PSBwYXJhbXMudHJhbnNhY3Rpb25JRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVjb2RlZCB0cmFuc2FjdGlvbiBpZCBpcyAke2RlY29kZWRQYXJlbnQuZ2V0SWQoKX0sIHdoaWNoIGRvZXMgbm90IG1hdGNoIGdpdmVuIHR4aWQgJHtwYXJhbXMudHJhbnNhY3Rpb25JRH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBuZXcgZmVlIHJhdGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYXJlbnQncyBjdXJyZW50IGZlZSByYXRlXG4gICAgLy8gdmlydHVhbFNpemUgaXMgcmV0dXJuZWQgaW4gdmJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga3ZCXG4gICAgY29uc3QgcGFyZW50UmF0ZSA9ICgxMDAwICogcGFyZW50VHguZmVlKSAvIHBhcmVudFZTaXplO1xuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSA8PSBwYXJlbnRSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbG93ZXIgZmVlIHJhdGUhIChQYXJlbnQgdHggZmVlIHJhdGUgaXMgJHtwYXJlbnRSYXRlfSBzYXQva0IsIGFuZCByZXF1ZXN0ZWQgZmVlIHJhdGUgd2FzICR7cGFyYW1zLmZlZVJhdGV9IHNhdC9rQilgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGRldGVybWluZSBpZiBwYXJlbnQgb3V0cHV0IGNhbiBjb3ZlciBjaGlsZCBmZWVcbiAgICBjb25zdCBpc1BhcmVudE91dHB1dFNlZ3dpdCA9XG4gICAgICBpc0NoYWluQ29kZShvdXRwdXRUb1VzZS5jaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKG91dHB1dFRvVXNlLmNoYWluKSA9PT0gJ3Ayc2hQMndzaCc7XG5cbiAgICBsZXQgY2hpbGRJbnB1dHMgPSB7XG4gICAgICBzZWd3aXQ6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMSA6IDAsXG4gICAgICBQMlNIOiBpc1BhcmVudE91dHB1dFNlZ3dpdCA/IDAgOiAxLFxuICAgIH07XG5cbiAgICBsZXQgY2hpbGRGZWUgPSBlc3RpbWF0ZUNoaWxkRmVlKHtcbiAgICAgIGlucHV0czogY2hpbGRJbnB1dHMsXG4gICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlLFxuICAgICAgcGFyZW50VlNpemUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB1bnNwZW50c1RvVXNlID0gW3BhcmVudFVuc3BlbnRUb1VzZV07XG5cbiAgICAvLyB0cnkgdG8gZ2V0IHRoZSBtaW4gY2hhbmdlIHNpemUgZnJvbSB0aGUgc2VydmVyLCBvdGhlcndpc2UgZGVmYXVsdCB0byAwLjEgQlRDXG4gICAgLy8gVE9ETzogbWluQ2hhbmdlU2l6ZSBpcyBub3QgY3VycmVudGx5IGEgY29uc3RhbnQgZGVmaW5lZCBvbiB0aGUgY2xpZW50IGFuZCBzaG91bGQgYmUgYWRkZWRcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1pbkNoYW5nZVNpemUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1pbkNoYW5nZVNpemUgfHwgMWU3O1xuXG4gICAgaWYgKG91dHB1dFRvVXNlLnZhbHVlIDwgY2hpbGRGZWUgKyBtaW5DaGFuZ2VTaXplKSB7XG4gICAgICAvLyBwYXJlbnQgb3V0cHV0IGNhbm5vdCBjb3ZlciBjaGlsZCBmZWUgcGx1cyB0aGUgbWluaW11bSBjaGFuZ2UsXG4gICAgICAvLyBtdXN0IGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyB0byBjb3ZlciB0aGUgZGlmZmVyZW5jZVxuICAgICAgY29uc3QgeyBhZGRpdGlvbmFsLCBuZXdDaGlsZEZlZSwgbmV3SW5wdXRzIH0gPSBhd2FpdCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzKHtcbiAgICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgICAgcGFyZW50T3V0cHV0VmFsdWU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgICAgbWF4VW5zcGVudHM6IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMsXG4gICAgICAgIHBhcmVudFZTaXplLFxuICAgICAgfSk7XG4gICAgICBjaGlsZEZlZSA9IG5ld0NoaWxkRmVlO1xuICAgICAgY2hpbGRJbnB1dHMgPSBuZXdJbnB1dHM7XG4gICAgICB1bnNwZW50c1RvVXNlLnB1c2goLi4uYWRkaXRpb25hbCk7XG4gICAgfVxuXG4gICAgLy8gc2FuaXR5IGNoZWNrIHRoZSBmZWUgcmF0ZSB3ZSdyZSBwYXlpbmcgZm9yIHRoZSBjb21iaW5lZCB0eFxuICAgIC8vIHRvIG1ha2Ugc3VyZSBpdCdzIHVuZGVyIHRoZSBtYXggZmVlIHJhdGUuIE9ubHkgdGhlIGNoaWxkIHR4XG4gICAgLy8gY2FuIGJyZWFrIHRoaXMgbGltaXQsIGJ1dCB0aGUgY29tYmluZWQgdHggc2hhbGwgbm90XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBtYXhGZWVSYXRlID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5tYXhGZWVSYXRlO1xuICAgIGNvbnN0IGNoaWxkVlNpemUgPSBlc3RpbWF0ZVR4VlNpemUoY2hpbGRJbnB1dHMpO1xuICAgIGNvbnN0IGNvbWJpbmVkVlNpemUgPSBjaGlsZFZTaXplICsgcGFyZW50VlNpemU7XG4gICAgY29uc3QgY29tYmluZWRGZWUgPSBwYXJlbnRUeC5mZWUgKyBjaGlsZEZlZTtcbiAgICAvLyBjb21iaW5lZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY29tYmluZWRGZWVSYXRlID0gKDEwMDAgKiBjb21iaW5lZEZlZSkgLyBjb21iaW5lZFZTaXplO1xuXG4gICAgaWYgKGNvbWJpbmVkRmVlUmF0ZSA+IG1heEZlZVJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGNhbm5vdCBiZSBhY2NlbGVyYXRlZC4gQ29tYmluZWQgZmVlIHJhdGUgb2YgJHtjb21iaW5lZEZlZVJhdGV9IHNhdC9rQiBleGNlZWRzIG1heGltdW0gZmVlIHJhdGUgb2YgJHttYXhGZWVSYXRlfSBzYXQva0JgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhIG5ldyBjaGFuZ2UgYWRkcmVzcyBhbmQgZGV0ZXJtaW5lIGNoYW5nZSBhbW91bnQuXG4gICAgLy8gdGhlIHR4IGJ1aWxkZXIgd2lsbCByZWplY3QgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gcmVjaXBpZW50cyxcbiAgICAvLyBhbmQgc3VjaCB6ZXJvLW91dHB1dCB0cmFuc2FjdGlvbnMgYXJlIGZvcmJpZGRlbiBieSB0aGUgQml0Y29pbiBwcm90b2NvbCxcbiAgICAvLyBzbyB3ZSBuZWVkIGF0IGxlYXN0IGEgc2luZ2xlIHJlY2lwaWVudCBmb3IgdGhlIGNoYW5nZSB3aGljaCB3b24ndCBiZSBwcnVuZWQuXG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gXy5zdW1CeSh1bnNwZW50c1RvVXNlLCAodW5zcGVudCkgPT4gdW5zcGVudC52YWx1ZSkgLSBjaGlsZEZlZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gdGhpcy5nZXRDaGFuZ2VDaGFpbih7fSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gYXdhaXQgdGhpcy5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluIH0pO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBjaGlsZCB0eCBhbmQgYnJvYWRjYXN0XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHVuc3BlbnRzOiB1bnNwZW50c1RvVXNlLFxuICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcy5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZTogY2hpbGRGZWUsXG4gICAgICBiaXRnb0ZlZToge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgfSxcbiAgICAgIHhwcnY6IHBhcmFtcy54cHJ2LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICAvLyBjaGlsZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY2hpbGRGZWVSYXRlID0gKDEwMDAgKiBjaGlsZEZlZSkgLyBjaGlsZFZTaXplO1xuICAgIGlmIChjaGlsZEZlZVJhdGUgPiBtYXhGZWVSYXRlKSB7XG4gICAgICAvLyBjb21iaW5lZCB0eCBpcyB3aXRoaW4gbWF4IGZlZSByYXRlIGxpbWl0cywgYnV0IHRoZSBjaGlsZCB0eCBpcyBub3QuXG4gICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdXNlIHRoZSBpZ25vcmVNYXhGZWVSYXRlIGZsYWcgdG8gZ2V0IHRoZSBjaGlsZCB0eCB0byBiZSBhY2NlcHRlZFxuICAgICAgdHguaWdub3JlTWF4RmVlUmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24odHgpO1xuICB9XG4gICAgLmNhbGwodGhpcylcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzaWduIGEgdHJhbnNhY3Rpb25cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzLCBhbW91bnQgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZHluYW1pY0ZlZUNvbmZpcm1UYXJnZXQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBjb25maXJtVGFyZ2V0IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaW5zdGFudCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuICAgIGNvbnN0IGZlZSA9IHRyYW5zYWN0aW9uLmZlZTtcbiAgICBjb25zdCBmZWVSYXRlID0gdHJhbnNhY3Rpb24uZmVlUmF0ZTtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZTtcbiAgICBjb25zdCBiaXRnb0ZlZSA9IHRyYW5zYWN0aW9uLmJpdGdvRmVlO1xuICAgIGNvbnN0IHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgY29uc3QgdW5zcGVudHMgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcblxuICAgIC8vIFNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbihwYXJhbXMpO1xuICAgICAgdHJhbnNhY3Rpb24ua2V5Y2hhaW4gPSBrZXljaGFpbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSAnbm9fZW5jcnlwdGVkX2tleWNoYWluX29uX3dhbGxldCcpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBzYWZlIHdhbGxldCwgc28gbGV0J3MgcmV0cmlldmUgdGhlIHByaXZhdGUga2V5IGluZm9cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2goeyBncGs6IHRydWUgfSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qgc2FmZVVzZXJLZXkgPSBfLmdldCh0aGlzLndhbGxldCwgJ3ByaXZhdGUudXNlclByaXZLZXknKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHNhZmVVc2VyS2V5KSAmJiBfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICB0cmFuc2FjdGlvbi5zaWduaW5nS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogc2FmZVVzZXJLZXkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmZlZVNpbmdsZUtleVdJRiA9IHBhcmFtcy5mZWVTaW5nbGVLZXlXSUY7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHJlc3VsdCwge1xuICAgICAgZmVlLFxuICAgICAgZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWUsXG4gICAgICB0cmF2ZWxJbmZvcyxcbiAgICAgIGVzdGltYXRlZFNpemUsXG4gICAgICB1bnNwZW50cyxcbiAgICB9KTtcbiAgfVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluXG4vLyBJTlRFUk5BTCBmdW5jdGlvbiB0byBnZXQgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHNpZ25pbmcuXG4vLyBDYWxsZXIgbXVzdCBwcm92aWRlciBlaXRoZXIgYSBrZXljaGFpbiwgb3Igd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGFzIGEgc3RyaW5nXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBrZXljaGFpbiB3aXRoIHhwcnYsIGl0IGlzIHNpbXBseSByZXR1cm5lZC5cbi8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGVuY3J5cHRlZCB4cHJ2ICh3YWxsZXRQYXNzcGhyYXNlKSwgdGhlbiBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBkZWNyeXB0XG4vLyBPdGhlcndpc2UgaWYgdGhlIHhwcnYgaXMgcHJvdmlkZWQsIGZldGNoIHRoZSBrZXljaGFpbiBvYmplY3QgYW5kIGF1Z21lbnQgaXQgd2l0aCB0aGUgeHBydi5cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBrZXljaGFpbiAtIGtleWNoYWluIHdpdGggeHBydlxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyBSZXR1cm5zOlxuLy8gICBLZXljaGFpbiBvYmplY3QgY29udGFpbmluZyB4cHJ2LCB4cHViIGFuZCBwYXRoc1xuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAvLyBJZiBrZXljaGFpbiB3aXRoIHhwcnYgaXMgYWxyZWFkeSBwcm92aWRlZCwgdXNlIGl0XG4gIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgJiYgcGFyYW1zLmtleWNoYWluLnhwcnYpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhcmFtcy5rZXljaGFpbik7XG4gIH1cblxuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuICBpZiAoKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlICYmIHBhcmFtcy54cHJ2KSB8fCAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlICYmICFwYXJhbXMueHBydikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBleGFjdGx5IG9uZSBvZiB4cHJ2IG9yIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIC8vIENhbGxlciBwcm92aWRlZCBhIHdhbGxldCBwYXNzcGhyYXNlXG4gIGlmIChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgIHJldHVybiBzZWxmLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgdHJ5IHtcbiAgICAgICAga2V5Y2hhaW4ueHBydiA9IHNlbGYuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFhwcnYgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5Y2hhaW4ueHB1YiAmJiBiaXAzMi5mcm9tQmFzZTU4KGtleWNoYWluLnhwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKSAhPT0ga2V5Y2hhaW4ueHB1Yikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZWQgeHB1YiBkb2VzIG5vdCBtYXRjaCBzdG9yZWQgeHB1YicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGFuIHhwcnYgLSB2YWxpZGF0ZSBhbmQgY29uc3RydWN0IGtleWNoYWluIG9iamVjdFxuICBsZXQgeHB1YjtcbiAgdHJ5IHtcbiAgICB4cHViID0gYmlwMzIuZnJvbUJhc2U1OChwYXJhbXMueHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgdGhlIHhwcnYnKTtcbiAgfVxuXG4gIGlmICh4cHViID09PSBwYXJhbXMueHBydikge1xuICAgIHRocm93IG5ldyBFcnJvcigneHBydiBwcm92aWRlZCB3YXMgbm90IGEgcHJpdmF0ZSBrZXkgKGZvdW5kIHhwdWIgaW5zdGVhZCknKTtcbiAgfVxuXG4gIGNvbnN0IHdhbGxldFhwdWJzID0gXy5tYXAoc2VsZi5rZXljaGFpbnMsICd4cHViJyk7XG4gIGlmICghXy5pbmNsdWRlcyh3YWxsZXRYcHVicywgeHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwcnYgcHJvdmlkZWQgd2FzIG5vdCBhIGtleWNoYWluIG9uIHRoaXMgd2FsbGV0IScpO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbiBvYmplY3QgZnJvbSBiaXRnbyB0byBmaW5kIHRoZSBwYXRoIGFuZCAocG90ZW50aWFsKSB3YWxsZXQgc3RydWN0dXJlXG4gIHJldHVybiBzZWxmLmJpdGdvXG4gICAgLmtleWNoYWlucygpXG4gICAgLmdldCh7IHhwdWI6IHhwdWIgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGtleWNoYWluLnhwcnYgPSBwYXJhbXMueHBydjtcbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogVGFrZXMgYSB3YWxsZXQncyB1bnNwZW50cyBhbmQgZmFucyB0aGVtIG91dCBpbnRvIGEgbGFyZ2VyIG51bWJlciBvZiBlcXVhbGx5IHNpemVkIHVuc3BlbnRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgdGFyZ2V0OiBzZXQgaG93IG1hbnkgdW5zcGVudHMgeW91IHdhbnQgdG8gaGF2ZSBpbiB0aGUgZW5kXG4gKiAgbWluQ29uZmlybXM6IG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1zIHRoZSB1bnNwZW50cyBtdXN0IGhhdmVcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuZmFuT3V0VW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICAvLyAod2hlbiBmYW5uaW5nIG91dCwgd2UgdGFrZSBhbGwgdGhlIHVuc3BlbnRzIGFuZCBtYWtlIGEgYmlnZ2VyIG51bWJlciBvZiBvdXRwdXRzKVxuICAgIGNvbnN0IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQgPSA4MDtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCA9IDMwMDtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCB0d28sIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMiB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA+IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IHRvbyBoaWdoJyk7XG4gICAgfVxuXG4gICAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICAgIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW5Db25maXJtcyA9IDE7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgPj0gMCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0IGEgbmF0dXJhbCBudW1iZXIgTiBpbnRvIG4gYWxtb3N0IGVxdWFsbHkgc2l6ZWQgKMKxMSkgbmF0dXJhbCBudW1iZXJzLlxuICAgICAqIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdGhlIHBhcnRzLCB3ZSBjYWxjdWxhdGUgZmxvb3IoTi9uKSwgYW5kIHRodXMgaGF2ZSB0aGUgYmFzZSBzaXplIG9mIGFsbCBwYXJ0cy5cbiAgICAgKiBJZiBOICUgbiAhPT0gMCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCBhIHJlbWFpbmRlciByIHdoZXJlIHIgPCBuLiBXZSBkaXN0cmlidXRlIHIgZXF1YWxseSBhbW9uZyB0aGUgbiBwYXJ0cyBieVxuICAgICAqIGFkZGluZyAxIHRvIHRoZSBmaXJzdCByIHBhcnRzLlxuICAgICAqIEBwYXJhbSB0b3RhbFxuICAgICAqIEBwYXJhbSBwYXJ0Q291bnRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3Qgc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyA9IGZ1bmN0aW9uICh0b3RhbCwgcGFydENvdW50KSB7XG4gICAgICBjb25zdCBwYXJ0U2l6ZSA9IE1hdGguZmxvb3IodG90YWwgLyBwYXJ0Q291bnQpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgLSBwYXJ0U2l6ZSAqIHBhcnRDb3VudDtcbiAgICAgIC8vIGluaXRpYWxpemUgcGxhY2Vob2xkZXIgYXJyYXlcbiAgICAgIGNvbnN0IGFsbW9zdEVxdWFsUGFydHMgPSBuZXcgQXJyYXkocGFydENvdW50KTtcbiAgICAgIC8vIGZpbGwgdGhlIGZpcnN0IHJlbWFpbmRlciBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZSsxXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUgKyAxLCAwLCByZW1haW5kZXIpO1xuICAgICAgLy8gZmlsbCB0aGUgcmVtYWluaW5nIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUsIHJlbWFpbmRlcik7XG4gICAgICAvLyBhc3NlcnQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbG1vc3QgZXF1YWwgcGFydHNcbiAgICAgIC8vIFRPRE86IGFkZCBjaGVjayBmb3IgdGhlIGJpZ2dlc3QgZGV2aWF0aW9uIGJldHdlZW4gYW55IHR3byBwYXJ0cyBhbmQgbWFrZSBzdXJlIGl0J3MgPD0gMVxuICAgICAgaWYgKF8oYWxtb3N0RXF1YWxQYXJ0cykuc3VtKCkgIT09IHRvdGFsIHx8IF8oYWxtb3N0RXF1YWxQYXJ0cykuc2l6ZSgpICE9PSBwYXJ0Q291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0IHN1bSBvciBwYXJ0IGNvdW50IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxtb3N0RXF1YWxQYXJ0cztcbiAgICB9O1xuXG4gICAgLy8gZmlyc3QsIGxldCdzIHRha2UgYWxsIHRoZSB3YWxsZXQncyB1bnNwZW50cyAod2l0aCBtaW4gY29uZmlybXMgaWYgbmVjZXNzYXJ5KVxuICAgIGNvbnN0IGFsbFVuc3BlbnRzID0gKGF3YWl0IHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkpIGFzIGFueTtcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyB0byBicmFuY2ggb3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25zb2xpZGF0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgYSB3YXN0ZSBvZiBtb25leVxuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IGhhcyB0byBiZSBiaWdnZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYXQgdGhlIHZlcnkgbWluaW11bSA4MSBpbnB1dHMsIGFuZCA4MSBvdXRwdXRzLiBUaGF0IHRyYW5zYWN0aW9uIHdpbGwgYmUgYmlnXG4gICAgLy8gaW4gdGhlIG1lZGl1bSBydW4sIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHJld29ya2VkIHRvIG9ubHkgd29yayB3aXRoIGEgc3Vic2V0IG9mIHRoZSB0cmFuc2FjdGlvbnNcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID4gTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYWxsIHRoZSBtb25leSB0aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd2FsbGV0XG4gICAgY29uc3QgZ3Jvc3NBbW91bnQgPSBfKGFsbFVuc3BlbnRzKS5tYXAoJ3ZhbHVlJykuc3VtKCk7XG5cbiAgICAvLyBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBwYXJhbXMgb2JqZWN0LCB3ZSBjcmVhdGUgYSBjb3B5XG4gICAgY29uc3QgdHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGFsbFVuc3BlbnRzO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcblxuICAgIC8vIGNyZWF0ZSB0YXJnZXQgYW1vdW50IG9mIG5ldyBhZGRyZXNzZXMgZm9yIHRoaXMgd2FsbGV0XG4gICAgY29uc3QgbmV3QWRkcmVzc1Byb21pc2VzID0gXy5yYW5nZSh0YXJnZXQpLm1hcCgoKSA9PlxuICAgICAgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IHNlbGYuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKSwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pXG4gICAgKTtcbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzUHJvbWlzZXMpO1xuICAgIC8vIGxldCdzIGZpbmQgYSBuaWNlLCBlcXVhbCBkaXN0cmlidXRpb24gb2Ygb3VyIFNhdG9zaGlzIGFtb25nIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgY29uc3Qgc3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhncm9zc0Ftb3VudCwgdGFyZ2V0KTtcbiAgICAvLyBtYXAgdGhlIG5ld2x5IGNyZWF0ZWQgYWRkcmVzc2VzIHRvIHRoZSBhbG1vc3QgY29tcG9uZW50cyBhbW91bnRzIHdlIGp1c3QgY2FsY3VsYXRlZFxuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHNwbGl0QW1vdW50cyk7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG4gICAgLy8gYXR0ZW1wdCB0byBjcmVhdGUgYSB0cmFuc2FjdGlvbi4gQXMgaXQgaXMgYSB3YWxsZXQtc3dlZXBpbmcgdHJhbnNhY3Rpb24gd2l0aCBubyBmZWUsIHdlIGV4cGVjdCBpdCB0byBmYWlsXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBhcyBleHBlY3RlZCwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIGRpZCBpbmRlZWQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZlZXNcbiAgICAgIC8vIHRoZSBlcnJvciBzdWdnZXN0cyBhIGZlZSB2YWx1ZSB3aGljaCB3ZSB0aGVuIHVzZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBob3dldmVyLCBsZXQncyBtYWtlIHN1cmUgaXQgd2Fzbid0IHNvbWV0aGluZyBlbHNlXG4gICAgICBpZiAoIWVycm9yLmZlZSAmJiAoIWVycm9yLnJlc3VsdCB8fCAhZXJyb3IucmVzdWx0LmZlZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIGVycm9yIGRvZXMgbm90IGNvbnRhaW4gYSBmZWUgcHJvcGVydHksIGl0IGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgaGFzIGdvbmUgYXdyeSwgYW5kIHdlIHRocm93IGl0XG4gICAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2VGZWUgPSBlcnJvci5mZWUgfHwgZXJyb3IucmVzdWx0LmZlZTtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgdG90YWxGZWUgKz0gZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudDtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5lZWQgdG8gY2xlYXIgdGhlc2Ugb3V0IHNpbmNlIG9ubHkgMSBtYXkgYmUgc2V0XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlO1xuICAgICAgdHhQYXJhbXMub3JpZ2luYWxGZWVSYXRlID0gdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldDtcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGJhc2VGZWU7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgZXF1YWwgZGlzdHJpYnV0aW9uLCB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBmZWUgZnJvbSB0aGUgY3VtdWxhdGl2ZSBmdW5kc1xuICAgICAgLy8gaW4gY2FzZSBzb21lIHVuc3BlbnRzIGdvdCBwcnVuZWQsIHdlIG5lZWQgdG8gdXNlIGVycm9yLnJlc3VsdC5hdmFpbGFibGVcbiAgICAgIGNvbnN0IG5ldEFtb3VudCA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSB0b3RhbEZlZTsgLy8gYWZ0ZXIgZmVlc1xuICAgICAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgY29uc3QgcmVtYWluaW5nU3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhuZXRBbW91bnQsIHRhcmdldCk7XG4gICAgICAvLyBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBhZ2FpbiBtYXBwZWQgdG8gdGhlIG5ldyBhZGRyZXNzZXNcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHJlbWFpbmluZ1NwbGl0QW1vdW50cyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB0aW1lLCB0aGUgdHJhbnNhY3Rpb24gY3JlYXRpb24gc2hvdWxkIHdvcmtcbiAgICBsZXQgZmFub3V0VHg7XG4gICAgdHJ5IHtcbiAgICAgIGZhbm91dFR4ID0gYXdhaXQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFub3V0VHgpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSkoKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRvIGZhbiBvdXQgb3IgY29hbGVzY2UgYSB3YWxsZXQncyB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UmVxdWVzdHxQcm9taXNlLjxUPnwqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZ3JvdXBVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KS50aGVuKGZ1bmN0aW9uICh1bnNwZW50cykge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHVuc3BlbnRzO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoID4gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5jb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoIDwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mYW5PdXRVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25zb2xpZGF0ZSBhIHdhbGxldCdzIHVuc3BlbnRzIGludG8gZmV3ZXIgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjogc2V0IGhvdyBtYW55IG1heGltdW0gaW5wdXRzIGFyZSB0byBiZSBwZXJtaXR0ZWQgcGVyIGNvbnNvbGlkYXRpb24gYmF0Y2hcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqICBtYXhJdGVyYXRpb25Db3VudDogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdW50aWwgZnVuY3Rpb24gc3RvcHNcbiAqICBwcm9ncmVzc0NhbGxiYWNrOiBtZXRob2QgdG8gYmUgY2FsbGVkIHdpdGggb2JqZWN0IG91dGxpbmluZyBjdXJyZW50IHByb2dyZXNzIGRldGFpbHNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuY29uc29saWRhdGVVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgbGV0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRhcmdldCA9IDE7XG4gIH0gZWxzZSBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWF4U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1pblNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5TaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHBlciB0cmFuc2FjdGlvbiBmb3IgY29uc29saWRhdGlvblxuICBjb25zdCBNQVhfSU5QVVRfQ09VTlQgPSAyMDA7XG4gIGxldCBtYXhJbnB1dENvdW50ID0gcGFyYW1zLm1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uO1xuICBpZiAobWF4SW5wdXRDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbnVsbCBvciB1bmlkZW50aWZpZWQsIGJlY2F1c2UgZXF1YWxpdHkgdG8gemVybyByZXR1cm5zIHRydWUgaW4gaWYoISBjbGF1c2VcbiAgICBtYXhJbnB1dENvdW50ID0gTUFYX0lOUFVUX0NPVU5UO1xuICB9XG4gIGlmICh0eXBlb2YgbWF4SW5wdXRDb3VudCAhPT0gJ251bWJlcicgfHwgbWF4SW5wdXRDb3VudCA8IDIgfHwgbWF4SW5wdXRDb3VudCAlIDEgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDInKTtcbiAgfSBlbHNlIGlmIChtYXhJbnB1dENvdW50ID4gTUFYX0lOUFVUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgY2Fubm90IGJlIGJpZ2dlciB0aGFuICcgKyBNQVhfSU5QVVRfQ09VTlQpO1xuICB9XG5cbiAgY29uc3QgbWF4SXRlcmF0aW9uQ291bnQgPSBwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgfHwgLTE7XG4gIGlmIChcbiAgICAocGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50ICYmICghXy5pc051bWJlcihtYXhJdGVyYXRpb25Db3VudCkgfHwgbWF4SXRlcmF0aW9uQ291bnQgPCAxKSkgfHxcbiAgICBtYXhJdGVyYXRpb25Db3VudCAlIDEgIT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGl0ZXJhdGlvbiBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDEnKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgbGV0IG1pblNpemUgPSBwYXJhbXMubWluU2l6ZSB8fCAwO1xuICBpZiAocGFyYW1zLmZlZVJhdGUpIHtcbiAgICAvLyBmZWUgcmF0ZSBpcyBpbiBzYXRvc2hpcyBwZXIga0IsIGlucHV0IHNpemUgaW4gYnl0ZXNcbiAgICBjb25zdCBmZWVCYXNlZE1pblNpemUgPSBNYXRoLmNlaWwoKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwKTtcbiAgICBpZiAocGFyYW1zLm1pblNpemUgJiYgbWluU2l6ZSA8IGZlZUJhc2VkTWluU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlZCBtaW5TaXplIHRvbyBsb3cgZHVlIHRvIHRvbyBoaWdoIGZlZSByYXRlJyk7XG4gICAgfVxuICAgIG1pblNpemUgPSBNYXRoLm1heChmZWVCYXNlZE1pblNpemUsIG1pblNpemUpO1xuXG4gICAgaWYgKCFwYXJhbXMubWluU2l6ZSkge1xuICAgICAgLy8gZmVlIHJhdGUtYmFzZWQgbWluIHNpemUgbmVlZHMgbm8gbG9nZ2luZyBpZiBpdCB3YXMgc2V0IGV4cGxpY2l0bHlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnT25seSBjb25zb2xpZGF0aW5nIHVuc3BlbnRzIGxhcmdlciB0aGFuICcgK1xuICAgICAgICAgIG1pblNpemUgK1xuICAgICAgICAgICcgc2F0b3NoaXMgdG8gYXZvaWQgd2FzdGluZyBtb25leSBvbiBmZWVzLiBUbyBjb25zb2xpZGF0ZSBzbWFsbGVyIHVuc3BlbnRzLCB1c2UgYSBsb3dlciBmZWUgcmF0ZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpdGVyYXRpb25Db3VudCA9IDA7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBjb25zb2xpZGF0aW9uSW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvbmUgYmF0Y2ggb2YgdXAgdG8gTUFYX0lOUFVUX0NPVU5UIHVuc3BlbnRzLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bk5leHRDb25zb2xpZGF0aW9uKCkge1xuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM6IGFueVtdID0gW107XG4gICAgbGV0IGlzRmluYWxDb25zb2xpZGF0aW9uID0gZmFsc2U7XG4gICAgaXRlcmF0aW9uQ291bnQrKztcbiAgICAvKlxuICAgICBXZSB0YWtlIGEgbWF4aW11bSBvZiB1bnNwZW50QnVsa1NpemVMaW1pdCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3dpcGUgdGhlIHdhbGxldFxuICAgICBjbGVhbiBvZiBhbGwgZXhjZXNzaXZlIHVuc3BlbnRzLCBzbyB3ZSBhZGQgMSB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnQgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuICAgICBJbiBjYXNlIHRoZXJlIGFyZSBldmVuIG1vcmUgdW5zcGVudHMgdGhhbiB0aGF0LCB0byBtYWtlIHRoZSBjb25zb2xpZGF0aW9uIGFzIGZhc3QgYXMgcG9zc2libGUsIHdlIGV4cGFuZCBvdXJcbiAgICAgc2VsZWN0aW9uIHRvIGluY2x1ZGUgYXMgbWFueSBhcyB0aGUgbWF4aW11bSBwZXJtaXNzaWJsZSBudW1iZXIgb2YgaW5wdXRzIHBlciBjb25zb2xpZGF0aW9uIGJhdGNoLlxuICAgICBTaG91bGQgdGhlIHRhcmdldCBudW1iZXIgb2YgdW5zcGVudHMgYmUgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIGlmIGlucHV0cyBwZXIgY29uc29saWRhdGlvbixcbiAgICAgd2Ugc3RpbGwgd2FudCB0byBmZXRjaCB0aGVtIGFsbCBzaW1wbHkgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBjb25zb2xpZGF0aW9uIGNhbiBiZSBwZXJmb3JtZWRcbiAgICAgYXQgYWxsLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIG51bWJlciBvZiBhbGwgdW5zcGVudHMgYmVpbmcgaGlnaGVyIHRoYW4gdGhlIHRhcmdldC5cbiAgICAgSW4gdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgdW5zcGVudHMgdmVyc2lvbiBTREssIHdlIHdpbGwga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIGZldGNoXG4gICAgIHRoZW0sIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoaXMgbWV0aG9kLlxuICAgICAqL1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHtcbiAgICAgIGxpbWl0OiB0YXJnZXQgKyBtYXhJbnB1dENvdW50LFxuICAgICAgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zLFxuICAgICAgbWluU2l6ZTogbWluU2l6ZSxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMubWF4U2l6ZSkge1xuICAgICAgcXVlcnlQYXJhbXMubWF4U2l6ZSA9IHBhcmFtcy5tYXhTaXplO1xuICAgIH1cbiAgICBjb25zdCBhbGxVbnNwZW50cyA9IChhd2FpdCBzZWxmLnVuc3BlbnRzKHF1ZXJ5UGFyYW1zKSkgYXMgYW55O1xuICAgIC8vIHRoaXMgY29uc29saWRhdGlvbiBpcyBlc3NlbnRpYWxseSBqdXN0IGEgd2FzdGUgb2YgbW9uZXlcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDw9IHRhcmdldCkge1xuICAgICAgaWYgKGl0ZXJhdGlvbkNvdW50IDw9IDEpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uLCBzbyB0aGUgbWV0aG9kIGlzIGluY29ycmVjdFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zld2VyIHVuc3BlbnRzIHRoYW4gY29uc29saWRhdGlvbiB0YXJnZXQuIFVzZSBmYW5PdXRVbnNwZW50cyBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaXQncyBhIGxhdGVyIGl0ZXJhdGlvbiwgc28gdGhlIHRhcmdldCBtYXkgaGF2ZSBiZWVuIHN1cnBhc3NlZCAoZHVlIHRvIGNvbmZpcm1hdGlvbnMgaW4gdGhlIGJhY2tncm91bmQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbFVuc3BlbnRzQ291bnQgPSBhbGxVbnNwZW50cy5sZW5ndGg7XG5cbiAgICAvLyBob3cgbWFueSBvZiB0aGUgdW5zcGVudHMgZG8gd2Ugd2FudCB0byBjb25zb2xpZGF0ZT9cbiAgICAvLyB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgY29uc29saWRhdGVkIGJsb2NrIGJlY29tZXMgYSBuZXcgdW5zcGVudCBsYXRlclxuICAgIGxldCB0YXJnZXRJbnB1dENvdW50ID0gYWxsVW5zcGVudHNDb3VudCAtIHRhcmdldCArIDE7XG4gICAgdGFyZ2V0SW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIGFsbFVuc3BlbnRzLmxlbmd0aCk7XG5cbiAgICAvLyBpZiB0aGUgdGFyZ2V0SW5wdXRDb3VudCByZXF1aXJlcyBtb3JlIGlucHV0cyB0aGFuIHdlIGFsbG93IHBlciBiYXRjaCwgd2UgcmVkdWNlIHRoZSBudW1iZXJcbiAgICBjb25zdCBpbnB1dENvdW50ID0gTWF0aC5taW4odGFyZ2V0SW5wdXRDb3VudCwgbWF4SW5wdXRDb3VudCk7XG5cbiAgICAvLyBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiBpbnB1dHMgbGVmdCB0byBjb2FsZXNjZSBlcXVhbHMgdGhlIG51bWJlciB3ZSB3aWxsIGNvYWxlc2NlIGluIHRoaXMgaXRlcmF0aW9uXG4gICAgLy8gb3IgaWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG1hdGNoZXMgdGhlIG1heGltdW0gcGVybWl0dGVkIG51bWJlclxuICAgIGlzRmluYWxDb25zb2xpZGF0aW9uID0gaW5wdXRDb3VudCA9PT0gdGFyZ2V0SW5wdXRDb3VudCB8fCBpdGVyYXRpb25Db3VudCA9PT0gbWF4SXRlcmF0aW9uQ291bnQ7XG5cbiAgICBjb25zdCBjdXJyZW50Q2h1bmsgPSBhbGxVbnNwZW50cy5zcGxpY2UoMCwgaW5wdXRDb3VudCk7XG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBzZWxmLmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4sIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KSkgYXMgYW55O1xuICAgIGNvbnN0IHR4UGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBuZXdBZGRyZXNzO1xuICAgIC8vIHRoZSB0b3RhbCBhbW91bnQgdGhhdCB3ZSBhcmUgY29uc29saWRhdGluZyB3aXRoaW4gdGhpcyBiYXRjaFxuICAgIGNvbnN0IGdyb3NzQW1vdW50ID0gXyhjdXJyZW50Q2h1bmspLm1hcCgndmFsdWUnKS5zdW0oKTsgLy8gYmVmb3JlIGZlZXNcblxuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gY3VycmVudENodW5rO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBncm9zc0Ftb3VudDtcbiAgICB0eFBhcmFtcy5ub1NwbGl0Q2hhbmdlID0gdHJ1ZTtcblxuICAgIGlmICh0eFBhcmFtcy51bnNwZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb25lJyk7XG4gICAgfVxuXG4gICAgLy8gbGV0J3MgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyB0cmFuc2FjdGlvbi4gV2UgZXhwZWN0IGl0IHRvIGZhaWwgYmVjYXVzZSBubyBmZWUgaXMgc2V0LlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdGhpcyBlcnJvciBzaG91bGQgb2NjdXIgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kc1xuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgYml0Z29GZWUgPSAwO1xuICAgICAgbGV0IHRvdGFsRmVlID0gYmFzZUZlZTtcbiAgICAgIGlmIChlcnJvci5yZXN1bHQuYml0Z29GZWUgJiYgZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudCkge1xuICAgICAgICBiaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHRvdGFsRmVlICs9IGJpdGdvRmVlO1xuICAgICAgICB0eFBhcmFtcy5iaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIG5ldCBhbW91bnQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBtaW5pbXVtIG91dHB1dCBzaXplXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBNYXRoLm1heChlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWUsIHNlbGYuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluT3V0cHV0U2l6ZSk7XG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG5cbiAgICAgIC8vIHdlIHNldCB0aGUgZmVlIGV4cGxpY2l0bHlcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSBuZXRBbW91bnQgLSBiaXRnb0ZlZTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbbmV3QWRkcmVzcy5hZGRyZXNzXSA9IG5ldEFtb3VudDtcbiAgICB9XG4gICAgLy8gdGhpcyB0cmFuc2FjdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbm8gaXNzdWVzLCBiZWNhdXNlIGFuIGFwcHJvcHJpYXRlIGZlZSBpcyBzZXRcbiAgICBsZXQgc2VudFR4O1xuICAgIHRyeSB7XG4gICAgICBzZW50VHggPSBhd2FpdCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaChzZW50VHgpO1xuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnByb2dyZXNzQ2FsbGJhY2spKSB7XG4gICAgICBwYXJhbXMucHJvZ3Jlc3NDYWxsYmFjayh7XG4gICAgICAgIHR4aWQ6IHNlbnRUeC5oYXNoLFxuICAgICAgICBkZXN0aW5hdGlvbjogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogZ3Jvc3NBbW91bnQsXG4gICAgICAgIGZlZTogc2VudFR4LmZlZSxcbiAgICAgICAgaW5wdXRDb3VudDogaW5wdXRDb3VudCxcbiAgICAgICAgaW5kZXg6IGNvbnNvbGlkYXRpb25JbmRleCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uSW5kZXgrKztcbiAgICBpZiAoIWlzRmluYWxDb25zb2xpZGF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGxhc3QgY29uc29saWRhdGlvbiBoYXMgbm90IHlldCBicm91Z2h0IHRoZSB1bnNwZW50cyBjb3VudCBkb3duIHRvIHRoZSB0YXJnZXQgdW5zcGVudCBjb3VudFxuICAgICAgLy8gdGhlcmVmb3JlLCB3ZSBwcm9jZWVkIGJ5IGNvbnNvbGlkYXRpbmcgeWV0IGFub3RoZXIgYmF0Y2hcbiAgICAgIC8vIGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSB3YWl0IDEgc2Vjb25kIHNvIHRoYXQgdGhlIG5ld2x5IGNyZWF0ZWQgdW5zcGVudCB3aWxsIGJlIGZldGNoZWQgaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCguLi4oKGF3YWl0IHJ1bk5leHRDb25zb2xpZGF0aW9uKCkpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHRoZSBmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLiBXZSByZXR1cm4gYWxsIHRoZSBvbmVzIHdlJ3ZlIGhhZCBzbyBmYXJcbiAgICByZXR1cm4gY29uc29saWRhdGlvblRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBydW5OZXh0Q29uc29saWRhdGlvbigpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ0RvbmUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnNoYXJlV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBzaGFyaW5nO1xuICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gIHJldHVybiB0aGlzLmJpdGdvXG4gICAgLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBzaGFyaW5nID0gcmVzdWx0O1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAga2V5Y2hhaW4ueHBydiA9IHNlbGYuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFhwcnYgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3RW5jcnlwdGVkWHBydiA9IHNlbGYuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi54cHJ2IH0pO1xuXG4gICAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgICAgeHB1Yjoga2V5Y2hhaW4ueHB1YixcbiAgICAgICAgICAgICAgZW5jcnlwdGVkWHBydjogbmV3RW5jcnlwdGVkWHBydixcbiAgICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgICAgdG9QdWJLZXk6IHNoYXJpbmcucHVia2V5LFxuICAgICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgICAgIHVzZXI6IGFueTtcbiAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgcmVzaGFyZTogYm9vbGVhbjtcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICBkaXNhYmxlRW1haWw6IGFueTtcbiAgICAgICAga2V5Y2hhaW4/OiBhbnk7XG4gICAgICAgIHNraXBLZXljaGFpbj86IGJvb2xlYW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgICByZXNoYXJlOiBwYXJhbXMucmVzaGFyZSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIH07XG4gICAgICBpZiAoc2hhcmVkS2V5Y2hhaW4pIHtcbiAgICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy51cmwoJy91c2VyLycgKyBwYXJhbXMudXNlcikpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KClcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeScpKS5zZW5kKCkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5U3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcG9saWN5L3N0YXR1cycpKS5zZW5kKCkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc2V0UG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUubGlzdFdlYmhvb2tzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZCgpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNhY3Rpb24gYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gd2ViaG9va0lkIChyZXF1aXJlZCk6IGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICogLSB0eEhhc2ggKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gd2ViaG9va3MpIGhhc2ggb2YgdGhlIHNpbXVsYXRlZCB0cmFuc2FjdGlvblxuICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2ltdWxhdGVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgaGFzVHhIYXNoID0gISFwYXJhbXMudHhIYXNoO1xuICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuXG4gIGlmICgoaGFzVHhIYXNoICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB8fCAoIWhhc1R4SGFzaCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIYXNoIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQsIHRoZSB0eEhhc2ggaGFzIHRvIGFkaGVyZSB0byBpdHMgcmVzcGVjdGl2ZSBmb3JtYXRcbiAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgLy8gb25seSB0YWtlIHRoZSB0eEhhc2ggYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5hZGRXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZXN0aW1hdGVGZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmFtb3VudCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBhbW91bnQgYXMgd2VsbCBhcyByZWNpcGllbnRzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLmFtb3VudCAmJiAhXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcblxuICBpZiAocGFyYW1zLmFtb3VudCkge1xuICAgIC8vIG9ubHkgdGhlIGFtb3VudCB3YXMgcGFzc2VkIGluLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBmYWxzZSByZWNpcGllbnQgdG8gcnVuIGNyZWF0ZVRyYW5zYWN0aW9uIHdpdGhcbiAgICByZWNpcGllbnRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmVudl0uc2lnbmluZ0FkZHJlc3MsIC8vIGFueSBhZGRyZXNzIHdpbGwgZG9cbiAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLmFtb3VudCA9IHVuZGVmaW5lZDtcbiAgdHJhbnNhY3Rpb25QYXJhbXMucmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG5cbiAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHR4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVzdGltYXRlZFNpemU6IHR4LmVzdGltYXRlZFNpemUsXG4gICAgICBmZWU6IHR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHR4LmZlZVJhdGUsXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vLyBOb3QgZnVsbHkgaW1wbGVtZW50ZWQgLyByZWxlYXNlZCBvbiBTREsuIFRlc3RpbmcgZm9yIG5vdy5cbldhbGxldC5wcm90b3R5cGUudXBkYXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEJpdEdvRmVlXG4vLyBHZXQgdGhlIHJlcXVpcmVkIG9uLXRyYW5zYWN0aW9uIEJpdEdvIGZlZVxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9iaWxsaW5nL2ZlZScpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAgYmFja3VwS2V5OiBlbmNyeXB0ZWQgYmFja3VwIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUucmVjb3ZlciA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIGNvbnN0IHBsYWluQmFja3VwS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLmJhY2t1cEtleSB9KTtcbiAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgIC4uLnVuc2lnbmVkVHgsXG4gICAgdHJhbnNhY3Rpb25IZXg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzaWduaW5nS2V5OiBwbGFpbkJhY2t1cEtleSxcbiAgfSk7XG4gIHJldHVybiBmdWxsU2lnbmVkVHgudHg7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAqL1xuV2FsbGV0LnByb3RvdHlwZS5zd2VlcCA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgdHg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzdXBwcmVzc0Jyb2FkY2FzdDogdHJ1ZSxcbiAgICBvdHA6IHBhcmFtcy5vdHAsXG4gIH0pO1xufTtcblxuZXhwb3J0ID0gV2FsbGV0O1xuIl19
|