@zcomb/programs-sdk 1.2.0 → 1.4.0
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/dist/amm/client.d.ts +1 -2
- package/dist/amm/client.js +6 -50
- package/dist/amm/types.d.ts +1 -0
- package/dist/amm/types.js +1 -1
- package/dist/futarchy/client.d.ts +51 -300
- package/dist/futarchy/client.js +209 -40
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/src/amm/client.ts +5 -61
- package/src/amm/types.ts +2 -1
- package/src/futarchy/client.ts +288 -57
- package/src/utils.ts +6 -0
package/dist/futarchy/client.js
CHANGED
|
@@ -195,6 +195,13 @@ class FutarchyClient {
|
|
|
195
195
|
// Slice arrays to numOptions (fixed-size arrays from Rust include empty slots)
|
|
196
196
|
const condBaseMints = vault.condBaseMints.slice(0, numOptions);
|
|
197
197
|
const condQuoteMints = vault.condQuoteMints.slice(0, numOptions);
|
|
198
|
+
// Pre-create conditional ATAs for 3+ options to avoid exceeding the
|
|
199
|
+
// 64 instruction trace limit. Each ATA creation via vault deposit adds
|
|
200
|
+
// 5 inner instructions; with 4 options that's 40 extra instructions.
|
|
201
|
+
const shouldEnsureATAs = options?.ensureATAs ?? (numOptions >= 3);
|
|
202
|
+
if (shouldEnsureATAs) {
|
|
203
|
+
await this._createConditionalATAs(creator, condBaseMints, condQuoteMints);
|
|
204
|
+
}
|
|
198
205
|
const pools = proposal.pools.slice(0, numOptions);
|
|
199
206
|
// Derive all user conditional token ATAs
|
|
200
207
|
const userCondBaseATAs = condBaseMints.map((m) => (0, spl_token_1.getAssociatedTokenAddressSync)(m, creator));
|
|
@@ -249,6 +256,44 @@ class FutarchyClient {
|
|
|
249
256
|
const builder = (0, instructions_1.launchProposal)(this.program, creator, proposalPda, proposal.vault, baseAmount, quoteAmount, remainingAccounts).preInstructions(this.maybeAddComputeBudget(options));
|
|
250
257
|
return { builder };
|
|
251
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Pre-creates all conditional token ATAs for a user before launching a proposal.
|
|
261
|
+
*
|
|
262
|
+
* This is REQUIRED for proposals with 3+ options to avoid exceeding Solana's
|
|
263
|
+
* max instruction trace length limit (64 instructions). The vault's deposit CPI
|
|
264
|
+
* creates ATAs on-the-fly, each requiring 5 inner instructions. For 4 options:
|
|
265
|
+
* 8 ATAs × 5 = 40 extra instructions, pushing the total over 64.
|
|
266
|
+
*
|
|
267
|
+
* Pre-creating ATAs eliminates this overhead, reducing the trace to ~32 instructions.
|
|
268
|
+
*
|
|
269
|
+
* @param creator - The user who will receive conditional tokens
|
|
270
|
+
* @param proposalPda - The proposal PDA (must be initialized but not launched)
|
|
271
|
+
* @returns Transaction signature
|
|
272
|
+
*/
|
|
273
|
+
async ensureConditionalATAs(creator, proposalPda) {
|
|
274
|
+
const proposal = await this.fetchProposal(proposalPda);
|
|
275
|
+
const vault = await this.vault.fetchVault(proposal.vault);
|
|
276
|
+
const condBaseMints = vault.condBaseMints.slice(0, proposal.numOptions);
|
|
277
|
+
const condQuoteMints = vault.condQuoteMints.slice(0, proposal.numOptions);
|
|
278
|
+
return this._createConditionalATAs(creator, condBaseMints, condQuoteMints);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Internal helper to create conditional ATAs given mint arrays.
|
|
282
|
+
* Used by both ensureConditionalATAs and launchProposal to avoid redundant fetches.
|
|
283
|
+
*/
|
|
284
|
+
async _createConditionalATAs(creator, condBaseMints, condQuoteMints) {
|
|
285
|
+
const provider = this.program.provider;
|
|
286
|
+
// Build ATA creation instructions (idempotent - won't fail if exists)
|
|
287
|
+
const instructions = [];
|
|
288
|
+
for (let i = 0; i < condBaseMints.length; i++) {
|
|
289
|
+
const userCondBaseAta = (0, spl_token_1.getAssociatedTokenAddressSync)(condBaseMints[i], creator);
|
|
290
|
+
const userCondQuoteAta = (0, spl_token_1.getAssociatedTokenAddressSync)(condQuoteMints[i], creator);
|
|
291
|
+
instructions.push((0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(creator, userCondBaseAta, creator, condBaseMints[i]), (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(creator, userCondQuoteAta, creator, condQuoteMints[i]));
|
|
292
|
+
}
|
|
293
|
+
// Send transaction
|
|
294
|
+
const tx = new web3_js_1.Transaction().add(...instructions);
|
|
295
|
+
return provider.sendAndConfirm(tx);
|
|
296
|
+
}
|
|
252
297
|
async finalizeProposal(signer, proposalPda, options) {
|
|
253
298
|
const proposal = await this.fetchProposal(proposalPda);
|
|
254
299
|
const vault = await this.vault.fetchVault(proposal.vault);
|
|
@@ -308,7 +353,163 @@ class FutarchyClient {
|
|
|
308
353
|
remainingAccounts.push({ pubkey: (0, spl_token_1.getAssociatedTokenAddressSync)(vault.condQuoteMints[i], creator), isSigner: false, isWritable: true });
|
|
309
354
|
}
|
|
310
355
|
const builder = (0, instructions_1.redeemLiquidity)(this.program, creator, proposalPda, proposal.vault, winningPool, remainingAccounts).preInstructions(this.maybeAddComputeBudget(options));
|
|
311
|
-
return { builder };
|
|
356
|
+
return { builder, numOptions };
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Creates an Address Lookup Table for redemption operations.
|
|
360
|
+
* Required for proposals with 3+ options to avoid exceeding transaction size limits.
|
|
361
|
+
*
|
|
362
|
+
* @param creator - The user redeeming (creator of proposal or liquidity provider)
|
|
363
|
+
* @param proposalPda - The proposal PDA
|
|
364
|
+
* @returns ALT address
|
|
365
|
+
*/
|
|
366
|
+
async createRedemptionALT(creator, proposalPda) {
|
|
367
|
+
const provider = this.program.provider;
|
|
368
|
+
const proposal = await this.fetchProposal(proposalPda);
|
|
369
|
+
const vault = await this.vault.fetchVault(proposal.vault);
|
|
370
|
+
const numOptions = proposal.numOptions;
|
|
371
|
+
const { winningIdx } = (0, utils_1.parseProposalState)(proposal.state);
|
|
372
|
+
if (winningIdx === null) {
|
|
373
|
+
throw new Error("Proposal not finalized");
|
|
374
|
+
}
|
|
375
|
+
const addresses = [
|
|
376
|
+
// Programs
|
|
377
|
+
this.programId,
|
|
378
|
+
this.vault.programId,
|
|
379
|
+
this.amm.programId,
|
|
380
|
+
web3_js_1.SystemProgram.programId,
|
|
381
|
+
spl_token_1.TOKEN_PROGRAM_ID,
|
|
382
|
+
spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
383
|
+
// Core accounts
|
|
384
|
+
proposalPda,
|
|
385
|
+
proposal.vault,
|
|
386
|
+
proposal.moderator,
|
|
387
|
+
vault.baseMint.address,
|
|
388
|
+
vault.quoteMint.address,
|
|
389
|
+
// Winning pool and reserves
|
|
390
|
+
proposal.pools[winningIdx],
|
|
391
|
+
// Vault token accounts
|
|
392
|
+
(0, spl_token_1.getAssociatedTokenAddressSync)(vault.baseMint.address, proposal.vault, true),
|
|
393
|
+
(0, spl_token_1.getAssociatedTokenAddressSync)(vault.quoteMint.address, proposal.vault, true),
|
|
394
|
+
// Creator's base/quote ATAs
|
|
395
|
+
(0, spl_token_1.getAssociatedTokenAddressSync)(vault.baseMint.address, creator),
|
|
396
|
+
(0, spl_token_1.getAssociatedTokenAddressSync)(vault.quoteMint.address, creator),
|
|
397
|
+
];
|
|
398
|
+
// Winning pool reserves
|
|
399
|
+
const [reserveA] = (0, amm_1.deriveReservePDA)(proposal.pools[winningIdx], vault.condQuoteMints[winningIdx], this.amm.programId);
|
|
400
|
+
const [reserveB] = (0, amm_1.deriveReservePDA)(proposal.pools[winningIdx], vault.condBaseMints[winningIdx], this.amm.programId);
|
|
401
|
+
addresses.push(reserveA, reserveB);
|
|
402
|
+
// Per-option accounts (conditional mints and user ATAs)
|
|
403
|
+
for (let i = 0; i < numOptions; i++) {
|
|
404
|
+
addresses.push(vault.condBaseMints[i], vault.condQuoteMints[i], (0, spl_token_1.getAssociatedTokenAddressSync)(vault.condBaseMints[i], creator), (0, spl_token_1.getAssociatedTokenAddressSync)(vault.condQuoteMints[i], creator));
|
|
405
|
+
}
|
|
406
|
+
// Get recent slot for ALT creation
|
|
407
|
+
const slot = await provider.connection.getSlot("finalized");
|
|
408
|
+
const [createIx, altAddress] = web3_js_1.AddressLookupTableProgram.createLookupTable({
|
|
409
|
+
authority: creator,
|
|
410
|
+
payer: creator,
|
|
411
|
+
recentSlot: slot,
|
|
412
|
+
});
|
|
413
|
+
// Create ALT
|
|
414
|
+
const createTx = new web3_js_1.Transaction().add(createIx);
|
|
415
|
+
createTx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
|
|
416
|
+
createTx.feePayer = creator;
|
|
417
|
+
const signedTx = await provider.wallet.signTransaction(createTx);
|
|
418
|
+
const sig = await provider.connection.sendRawTransaction(signedTx.serialize(), {
|
|
419
|
+
skipPreflight: true,
|
|
420
|
+
});
|
|
421
|
+
await provider.connection.confirmTransaction(sig, "confirmed");
|
|
422
|
+
// Extend ALT with addresses
|
|
423
|
+
const CHUNK_SIZE = 20;
|
|
424
|
+
for (let i = 0; i < addresses.length; i += CHUNK_SIZE) {
|
|
425
|
+
const chunk = addresses.slice(i, i + CHUNK_SIZE);
|
|
426
|
+
const extendIx = web3_js_1.AddressLookupTableProgram.extendLookupTable({
|
|
427
|
+
payer: creator,
|
|
428
|
+
authority: creator,
|
|
429
|
+
lookupTable: altAddress,
|
|
430
|
+
addresses: chunk,
|
|
431
|
+
});
|
|
432
|
+
const extendTx = new web3_js_1.Transaction().add(extendIx);
|
|
433
|
+
await provider.sendAndConfirm(extendTx);
|
|
434
|
+
}
|
|
435
|
+
return { altAddress };
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Builds a versioned transaction for redeeming liquidity with ALT.
|
|
439
|
+
* Required for proposals with 3+ options to avoid exceeding transaction size limits.
|
|
440
|
+
*
|
|
441
|
+
* @param creator - The user redeeming
|
|
442
|
+
* @param proposalPda - The proposal PDA
|
|
443
|
+
* @param altAddress - Optional ALT address (will be created if not provided for 3+ options)
|
|
444
|
+
* @returns Unsigned versioned transaction, ALT address, and number of options
|
|
445
|
+
*/
|
|
446
|
+
async redeemLiquidityVersioned(creator, proposalPda, altAddress) {
|
|
447
|
+
const provider = this.program.provider;
|
|
448
|
+
const { builder, numOptions } = await this.redeemLiquidity(creator, proposalPda);
|
|
449
|
+
// Create ALT if not provided and needed
|
|
450
|
+
let altPubkey = altAddress;
|
|
451
|
+
let verifiedALT = null;
|
|
452
|
+
if (!altPubkey && numOptions >= 3) {
|
|
453
|
+
console.log(` Creating redemption ALT for ${numOptions} options...`);
|
|
454
|
+
const result = await this.createRedemptionALT(creator, proposalPda);
|
|
455
|
+
altPubkey = result.altAddress;
|
|
456
|
+
console.log(` ✓ Redemption ALT created: ${altPubkey.toBase58()}`);
|
|
457
|
+
// Wait for ALT to be fully available with all addresses
|
|
458
|
+
// Use longer delays after extending to ensure propagation
|
|
459
|
+
console.log(` Waiting for ALT propagation...`);
|
|
460
|
+
const expectedAddresses = 18 + (numOptions * 4); // Base accounts + per-option accounts
|
|
461
|
+
let attempts = 0;
|
|
462
|
+
// Initial delay after extension
|
|
463
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
464
|
+
while (attempts < 30) {
|
|
465
|
+
const altAccount = await provider.connection.getAddressLookupTable(altPubkey, {
|
|
466
|
+
commitment: 'confirmed',
|
|
467
|
+
});
|
|
468
|
+
if (altAccount.value) {
|
|
469
|
+
const addressCount = altAccount.value.state.addresses.length;
|
|
470
|
+
console.log(` Attempt ${attempts + 1}: ALT has ${addressCount}/${expectedAddresses} addresses`);
|
|
471
|
+
if (addressCount >= expectedAddresses) {
|
|
472
|
+
verifiedALT = altAccount.value;
|
|
473
|
+
console.log(` ✓ ALT verified with ${addressCount} addresses`);
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
478
|
+
attempts++;
|
|
479
|
+
}
|
|
480
|
+
if (!verifiedALT) {
|
|
481
|
+
throw new Error(`ALT failed to populate with expected ${expectedAddresses} addresses after ${attempts} attempts`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (!altPubkey) {
|
|
485
|
+
throw new Error("ALT address required for multi-option redemption");
|
|
486
|
+
}
|
|
487
|
+
// Fetch ALT if we don't have it verified already
|
|
488
|
+
if (!verifiedALT) {
|
|
489
|
+
verifiedALT = await this.fetchALT(altPubkey);
|
|
490
|
+
}
|
|
491
|
+
// Build instruction
|
|
492
|
+
const instruction = await builder.instruction();
|
|
493
|
+
const computeBudgetIx = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 500000 });
|
|
494
|
+
// Get fresh blockhash
|
|
495
|
+
const { blockhash } = await provider.connection.getLatestBlockhash();
|
|
496
|
+
// Build versioned transaction using the verified ALT (no re-fetch)
|
|
497
|
+
const versionedTx = this.buildVersionedTxWithALT(creator, [computeBudgetIx, instruction], verifiedALT, blockhash);
|
|
498
|
+
// Return the versioned transaction for the caller to sign and send
|
|
499
|
+
// This allows the caller to use their own signing mechanism (e.g., keypair.sign)
|
|
500
|
+
return { versionedTx, altAddress: altPubkey, numOptions };
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Helper to send a signed versioned transaction.
|
|
504
|
+
*/
|
|
505
|
+
async sendVersionedTransaction(signedTx) {
|
|
506
|
+
const provider = this.program.provider;
|
|
507
|
+
const signature = await provider.connection.sendTransaction(signedTx, {
|
|
508
|
+
skipPreflight: false,
|
|
509
|
+
preflightCommitment: 'confirmed',
|
|
510
|
+
});
|
|
511
|
+
await provider.connection.confirmTransaction(signature, 'confirmed');
|
|
512
|
+
return signature;
|
|
312
513
|
}
|
|
313
514
|
/* Address Lookup Table */
|
|
314
515
|
async createProposalALT(creator, moderatorPda, numOptions = 2) {
|
|
@@ -391,11 +592,15 @@ class FutarchyClient {
|
|
|
391
592
|
return alt.value;
|
|
392
593
|
}
|
|
393
594
|
async buildVersionedTx(payer, instructions, altAddress) {
|
|
595
|
+
const provider = this.program.provider;
|
|
394
596
|
const alt = await this.fetchALT(altAddress);
|
|
395
|
-
const blockhash = await
|
|
597
|
+
const { blockhash } = await provider.connection.getLatestBlockhash();
|
|
598
|
+
return this.buildVersionedTxWithALT(payer, instructions, alt, blockhash);
|
|
599
|
+
}
|
|
600
|
+
buildVersionedTxWithALT(payer, instructions, alt, blockhash) {
|
|
396
601
|
const message = new web3_js_1.TransactionMessage({
|
|
397
602
|
payerKey: payer,
|
|
398
|
-
recentBlockhash: blockhash
|
|
603
|
+
recentBlockhash: blockhash,
|
|
399
604
|
instructions,
|
|
400
605
|
}).compileToV0Message([alt]);
|
|
401
606
|
return new web3_js_1.VersionedTransaction(message);
|
|
@@ -462,42 +667,6 @@ class FutarchyClient {
|
|
|
462
667
|
const builder = (0, instructions_1.upgradeDAO)(this.program, admin, parentAdmin, daoPda, parentDaoPda, moderatorPda, baseMint, quoteMint, pool, poolType).preInstructions(this.maybeAddComputeBudget(options));
|
|
463
668
|
return { builder, daoPda, moderatorPda };
|
|
464
669
|
}
|
|
465
|
-
/* High-Level Proposal Creator */
|
|
466
|
-
async createProposal(creator, moderatorPda, proposalParams, baseAmount, quoteAmount, numOptions = 2, metadata, options) {
|
|
467
|
-
if (numOptions < 2) {
|
|
468
|
-
throw new Error("Minimum 2 options required");
|
|
469
|
-
}
|
|
470
|
-
// 1. Create ALT (sends txs internally)
|
|
471
|
-
const { altAddress } = await this.createProposalALT(creator, moderatorPda, numOptions);
|
|
472
|
-
// 2. Build initializeProposal
|
|
473
|
-
const initResult = await this.initializeProposal(creator, moderatorPda, proposalParams, metadata, options);
|
|
474
|
-
// 3. Build addOption for each additional option (beyond initial 2)
|
|
475
|
-
const addOptionBuilders = [];
|
|
476
|
-
const additionalPools = [];
|
|
477
|
-
const additionalCondBaseMints = [];
|
|
478
|
-
const additionalCondQuoteMints = [];
|
|
479
|
-
for (let i = 2; i < numOptions; i++) {
|
|
480
|
-
const addResult = await this.addOption(creator, initResult.proposalPda, options);
|
|
481
|
-
addOptionBuilders.push(addResult.builder);
|
|
482
|
-
additionalPools.push(addResult.pool);
|
|
483
|
-
additionalCondBaseMints.push(addResult.condBaseMint);
|
|
484
|
-
additionalCondQuoteMints.push(addResult.condQuoteMint);
|
|
485
|
-
}
|
|
486
|
-
// 4. Build launchProposal
|
|
487
|
-
const launchResult = await this.launchProposal(creator, initResult.proposalPda, baseAmount, quoteAmount, options);
|
|
488
|
-
return {
|
|
489
|
-
altAddress,
|
|
490
|
-
proposalPda: initResult.proposalPda,
|
|
491
|
-
proposalId: initResult.proposalId,
|
|
492
|
-
vaultPda: initResult.vaultPda,
|
|
493
|
-
pools: [...initResult.pools, ...additionalPools],
|
|
494
|
-
condBaseMints: [...initResult.condBaseMints, ...additionalCondBaseMints],
|
|
495
|
-
condQuoteMints: [...initResult.condQuoteMints, ...additionalCondQuoteMints],
|
|
496
|
-
initializeBuilder: initResult.builder,
|
|
497
|
-
addOptionBuilders,
|
|
498
|
-
launchBuilder: launchResult.builder,
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
670
|
}
|
|
502
671
|
exports.FutarchyClient = FutarchyClient;
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1dGFyY2h5L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4Q0FBZ0U7QUFDaEUsNkNBVXlCO0FBQ3pCLGlEQUFpSDtBQUNqSCwyQ0FBNEQ7QUFTNUQsbUNBV2lCO0FBQ2pCLGlEQVd3QjtBQUd4QixvQ0FBeUY7QUFDekYsZ0NBQXNHO0FBRXRHLDRDQUFnRDtBQUNoRCx5REFBMkM7QUFFM0MsTUFBTSxxQkFBcUIsR0FBRyxNQUFPLENBQUM7QUFFdEMsTUFBYSxjQUFjO0lBT3pCLFlBQVksUUFBd0IsRUFBRSxTQUFxQixFQUFFLFlBQXFCO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLHNCQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsa0JBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLG1CQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsWUFBWSxDQUFDLElBQVk7UUFDdkIsT0FBTyxJQUFBLG9CQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixPQUFPLElBQUEsMEJBQWtCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxVQUFrQjtRQUN4RCxPQUFPLElBQUEseUJBQWlCLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGNBQWM7SUFFZCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWlCO1FBQzlCLE9BQU8sSUFBQSx1QkFBZSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBdUI7UUFDMUMsT0FBTyxJQUFBLDZCQUFxQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBc0I7UUFDeEMsT0FBTyxJQUFBLDRCQUFvQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELHNCQUFzQjtJQUV0QixpQkFBaUIsQ0FBQyxRQUF5QjtRQUN6QyxPQUFPLElBQUEseUJBQWlCLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQXlCO1FBQ3hDLE9BQU8sSUFBQSx3QkFBZ0IsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQW1CO1FBQ3pDLE9BQU8sT0FBTyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDM0QsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE9BQW1CO1FBQy9DLElBQUksT0FBTyxFQUFFLGVBQWUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLENBQUMsOEJBQW9CLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsMEJBQTBCO0lBRTFCLEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsS0FBZ0IsRUFDaEIsUUFBbUIsRUFDbkIsU0FBb0IsRUFDcEIsSUFBWSxFQUNaLE9BQW1CO1FBRW5CLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsTUFBTSxPQUFPLEdBQUcsSUFBQSxrQ0FBbUIsRUFDakMsSUFBSSxDQUFDLE9BQU8sRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxZQUFZLEVBQ1osSUFBSSxDQUNMLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLEtBQWdCLEVBQ2hCLFlBQXVCLEVBQ3ZCLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLE1BQWMsRUFDZCxTQUFzQixFQUN0QixPQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1FBQy9DLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZFLE1BQU0sT0FBTyxHQUFHLElBQUEsb0NBQXFCLEVBQ25DLElBQUksQ0FBQyxPQUFPLEVBQ1osS0FBSyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsVUFBVSxFQUNWLFVBQVUsRUFDVixNQUFNLEVBQ04sU0FBUyxDQUNWLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQ3RCLE9BQWtCLEVBQ2xCLFlBQXVCLEVBQ3ZCLGNBQThCLEVBQzlCLFFBQWlCLEVBQ2pCLE9BQW1CO1FBRW5CLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDL0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdkUsNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFBLHNCQUFjLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpGLGlEQUFpRDtRQUNqRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxRQUFRLEVBQUUsaUJBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsUUFBUSxFQUFFLGlCQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFBLDZCQUFxQixFQUFDLFFBQVEsRUFBRSxpQkFBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxRQUFRLEVBQUUsaUJBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbkcsOEZBQThGO1FBQzlGLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFBLG1CQUFhLEVBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBQSxtQkFBYSxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUYsaUNBQWlDO1FBQ2pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUEsdUJBQWlCLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBQSx1QkFBaUIsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRSx1QkFBdUI7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBQSx5Q0FBNkIsRUFBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RixNQUFNLGFBQWEsR0FBRyxJQUFBLHlDQUE2QixFQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXpGLDBFQUEwRTtRQUMxRSxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQU8sZUFBZTtZQUN4RixFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFNLGdCQUFnQjtZQUN6RixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWtCLFdBQVc7WUFDcEYsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFjLG9CQUFvQjtZQUM3RixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWEscUJBQXFCO1lBQzlGLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBYSxzQkFBc0I7WUFDL0YsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFhLHNCQUFzQjtZQUMvRixFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQVksdUJBQXVCO1lBQ2hHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBWSx1QkFBdUI7WUFDaEcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFxQixZQUFZO1lBQ3JGLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBaUIsa0JBQWtCO1lBQzNGLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBaUIsa0JBQWtCO1lBQzNGLEVBQUUsTUFBTSxFQUFFLG1CQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQVksb0JBQW9CO1lBQzdGLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBaUIsa0JBQWtCO1lBQzNGLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBcUIsYUFBYTtZQUN0RixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWlCLGtCQUFrQjtZQUMzRixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWlCLGtCQUFrQjtZQUMzRixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWlCLGtCQUFrQjtTQUM1RixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsSUFBQSxpQ0FBa0IsRUFDaEMsSUFBSSxDQUFDLE9BQU8sRUFDWixPQUFPLEVBQ1AsWUFBWSxFQUNaLFdBQVcsRUFDWCxjQUFjLEVBQ2QsUUFBUSxJQUFJLElBQUksRUFDaEIsaUJBQWlCLENBQ2xCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU87WUFDTCxPQUFPO1lBQ1AsV0FBVztZQUNYLFVBQVU7WUFDVixRQUFRO1lBQ1IsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDO1lBQzdDLGNBQWMsRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUM7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWtCLEVBQUUsV0FBc0IsRUFBRSxPQUFtQjtRQUM3RSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUV4QywrQkFBK0I7UUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxpQkFBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoSCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxRQUFRLENBQUMsS0FBSyxFQUFFLGlCQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxILGtCQUFrQjtRQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSxtQkFBYSxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBQSx1QkFBaUIsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUvRCwrQ0FBK0M7UUFDL0MsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFZLFdBQVc7WUFDcEYsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFjLG9CQUFvQjtZQUM3RixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWEscUJBQXFCO1lBQzlGLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBc0IsVUFBVTtZQUNuRixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQWtCLGVBQWU7WUFDeEYsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFrQixlQUFlO1lBQ3hGLEVBQUUsTUFBTSxFQUFFLG1CQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQVksbUJBQW1CO1lBQzVGLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBa0IsZUFBZTtTQUN6RixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsSUFBQSx3QkFBUyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQzthQUM3RSxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsT0FBa0IsRUFDbEIsV0FBc0IsRUFDdEIsVUFBdUIsRUFDdkIsV0FBd0IsRUFDeEIsT0FBbUI7UUFFbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFdkMsK0VBQStFO1FBQy9FLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWxELHlDQUF5QztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEseUNBQTZCLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLHlDQUE2QixFQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRS9GLHdDQUF3QztRQUN4QyxNQUFNLFNBQVMsR0FBZ0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFnQixFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEYsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsaUNBQWlDO1FBQ2pDLE1BQU0saUJBQWlCLEdBQW9FO1lBQ3pGLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUErQixlQUFlO1lBQ3BILEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUE4QixnQkFBZ0I7WUFDckgsRUFBRSxNQUFNLEVBQUUsSUFBQSx5Q0FBNkIsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFJLG9CQUFvQjtZQUNsSixFQUFFLE1BQU0sRUFBRSxJQUFBLHlDQUE2QixFQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUcscUJBQXFCO1lBQ25KLEVBQUUsTUFBTSxFQUFFLElBQUEseUNBQTZCLEVBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUcsbUJBQW1CO1lBQ25JLEVBQUUsTUFBTSxFQUFFLElBQUEseUNBQTZCLEVBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsb0JBQW9CO1NBQ3JJLENBQUM7UUFFRiwwQkFBMEI7UUFDMUIsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNqQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELDhCQUE4QjtRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0Qsa0NBQWtDO1FBQ2xDLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELG1DQUFtQztRQUNuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDcEMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELHlCQUF5QjtRQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QseUJBQXlCO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFjLEVBQzVCLElBQUksQ0FBQyxPQUFPLEVBQ1osT0FBTyxFQUNQLFdBQVcsRUFDWCxRQUFRLENBQUMsS0FBSyxFQUNkLFVBQVUsRUFDVixXQUFXLEVBQ1gsaUJBQWlCLENBQ2xCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQWlCLEVBQUUsV0FBc0IsRUFBRSxPQUFtQjtRQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUV2QyxvRUFBb0U7UUFDcEUsTUFBTSxpQkFBaUIsR0FBb0UsRUFBRSxDQUFDO1FBRTlGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV0RixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQkFBZ0IsRUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsaUJBQWlCLENBQ2xCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFrQixFQUFFLFdBQXNCLEVBQUUsT0FBbUI7UUFDbkYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFdkMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEsMEJBQWtCLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvQywrQkFBK0I7UUFDL0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBQSxzQkFBZ0IsRUFBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLHdDQUF3QztRQUN4QyxNQUFNLG1CQUFtQixHQUFHLElBQUEseUNBQTZCLEVBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRyxNQUFNLGtCQUFrQixHQUFHLElBQUEseUNBQTZCLEVBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVuRyxxREFBcUQ7UUFDckQsTUFBTSxpQkFBaUIsR0FBb0U7WUFDekYsa0NBQWtDO1lBQ2xDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDdkQsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtZQUN2RCxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDbEUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1lBRWpFLDRDQUE0QztZQUM1QyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDdEUsRUFBRSxNQUFNLEVBQUUsSUFBQSx5Q0FBNkIsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtZQUMxSCxFQUFFLE1BQU0sRUFBRSxJQUFBLHlDQUE2QixFQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtTQUM5RyxDQUFDO1FBRUYscUZBQXFGO1FBQ3JGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFBLHlDQUE2QixFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4SSxDQUFDO1FBRUQsdUNBQXVDO1FBQ3ZDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFBLHlDQUE2QixFQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwSixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBQSx5Q0FBNkIsRUFBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZJLDhFQUE4RTtRQUM5RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvRixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBQSx5Q0FBNkIsRUFBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekksQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUEsOEJBQWUsRUFDN0IsSUFBSSxDQUFDLE9BQU8sRUFDWixPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsV0FBVyxFQUNYLGlCQUFpQixDQUNsQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELDBCQUEwQjtJQUUxQixLQUFLLENBQUMsaUJBQWlCLENBQ3JCLE9BQWtCLEVBQ2xCLFlBQXVCLEVBQ3ZCLGFBQXFCLENBQUM7UUFFdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUEwQixDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDL0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUEsc0JBQWMsRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakYsTUFBTSxTQUFTLEdBQWdCO1lBQzdCLFdBQVc7WUFDWCxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDbEIsdUJBQWEsQ0FBQyxTQUFTO1lBQ3ZCLDRCQUFnQjtZQUNoQix1Q0FBMkI7WUFDM0IsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixXQUFXO1lBQ1gsUUFBUTtZQUNSLFNBQVMsQ0FBQyxRQUFRO1lBQ2xCLFNBQVMsQ0FBQyxTQUFTO1lBQ25CLG1CQUFhO1lBQ2IsdUJBQXVCO1lBQ3ZCLElBQUEseUNBQTZCLEVBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQ2pFLElBQUEseUNBQTZCLEVBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQ2xFLDRCQUE0QjtZQUM1QixJQUFBLHlDQUE2QixFQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1lBQzFELElBQUEseUNBQTZCLEVBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUM7U0FDNUQsQ0FBQztRQUVGLHNCQUFzQjtRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsUUFBUSxFQUFFLGlCQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFBLDZCQUFxQixFQUFDLFFBQVEsRUFBRSxpQkFBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSxtQkFBYSxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBQSx1QkFBaUIsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUvRCxTQUFTLENBQUMsSUFBSSxDQUNaLFlBQVksRUFDWixhQUFhLEVBQ2IsSUFBSSxFQUNKLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUTtZQUNSLG1DQUFtQztZQUNuQyxJQUFBLHlDQUE2QixFQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFDcEQsSUFBQSx5Q0FBNkIsRUFBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQ3RELENBQUM7UUFDSixDQUFDO1FBRUQsc0VBQXNFO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxtQ0FBeUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUN6RSxTQUFTLEVBQUUsT0FBTztZQUNsQixLQUFLLEVBQUUsT0FBTztZQUNkLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUVILGtGQUFrRjtRQUNsRixNQUFNLFFBQVEsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsUUFBUSxDQUFDLGVBQWUsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RGLFFBQVEsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM3RSxhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRS9ELCtEQUErRDtRQUMvRCx5RUFBeUU7UUFDekUsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN0RCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDakQsTUFBTSxRQUFRLEdBQUcsbUNBQXlCLENBQUMsaUJBQWlCLENBQUM7Z0JBQzNELEtBQUssRUFBRSxPQUFPO2dCQUNkLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsU0FBUyxFQUFFLEtBQUs7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXFCO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsS0FBZ0IsRUFDaEIsWUFBc0MsRUFDdEMsVUFBcUI7UUFFckIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFOUUsTUFBTSxPQUFPLEdBQUcsSUFBSSw0QkFBa0IsQ0FBQztZQUNyQyxRQUFRLEVBQUUsS0FBSztZQUNmLGVBQWUsRUFBRSxTQUFTLENBQUMsU0FBUztZQUNwQyxZQUFZO1NBQ2IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU3QixPQUFPLElBQUksOEJBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGlCQUFpQjtJQUVqQixzQkFBc0IsQ0FBQyxNQUFpQixFQUFFLElBQVk7UUFDcEQsT0FBTyxJQUFBLDhCQUFzQixFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCO1FBQ3BDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN0RCxTQUFTLEVBQUUsNkJBQWlCO1NBQzdCLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFDaEMsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixPQUFPO1lBQ0wsYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixxQkFBcUIsRUFBRSxhQUFhLENBQUMsUUFBUTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLFNBQW9CO1FBQzVDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQzVDLFNBQVM7WUFDVCxTQUFTLEVBQUUsNkJBQWlCO1NBQzdCLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLEtBQWdCLEVBQ2hCLFdBQXNCLEVBQ3RCLElBQVksRUFDWixRQUFtQixFQUNuQixTQUFvQixFQUNwQixnQkFBMkIsRUFDM0IsSUFBZSxFQUNmLFFBQWtCLEVBQ2xCLE9BQW1CO1FBRW5CLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRSwyQ0FBMkM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVqRSxNQUFNLE9BQU8sR0FBRyxJQUFBLGtDQUFtQixFQUNqQyxJQUFJLENBQUMsT0FBTyxFQUNaLEtBQUssRUFDTCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULFlBQVksQ0FBQyxhQUFhLEVBQzFCLFlBQVksQ0FBQyxxQkFBcUIsRUFDbEMsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsNkJBQWlCLEVBQ2pCLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsSUFBSSxFQUNKLFFBQVEsQ0FDVCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPO1lBQ0wsT0FBTztZQUNQLE1BQU07WUFDTixZQUFZO1lBQ1osZ0JBQWdCLEVBQUUsbUJBQW1CO1lBQ3JDLFlBQVksRUFBRSxlQUFlO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUN0QixLQUFnQixFQUNoQixXQUFzQixFQUN0QixhQUFxQixFQUNyQixJQUFZLEVBQ1osU0FBb0IsRUFDcEIsZ0JBQTJCLEVBQzNCLE9BQW1CO1FBRW5CLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFckUsMkNBQTJDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDM0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFakUsTUFBTSxPQUFPLEdBQUcsSUFBQSxpQ0FBa0IsRUFDaEMsSUFBSSxDQUFDLE9BQU8sRUFDWixLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksQ0FBQyxhQUFhLEVBQzFCLFlBQVksQ0FBQyxxQkFBcUIsRUFDbEMsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsNkJBQWlCLEVBQ2pCLElBQUksRUFDSixnQkFBZ0IsQ0FDakIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTztZQUNMLE9BQU87WUFDUCxNQUFNO1lBQ04sWUFBWTtZQUNaLGdCQUFnQixFQUFFLG1CQUFtQjtZQUNyQyxZQUFZLEVBQUUsZUFBZTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQ2QsS0FBZ0IsRUFDaEIsV0FBc0IsRUFDdEIsT0FBZSxFQUNmLGFBQXFCLEVBQ3JCLFFBQW1CLEVBQ25CLFNBQW9CLEVBQ3BCLElBQWUsRUFDZixRQUFrQixFQUNsQixPQUFtQjtRQUVuQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhELE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQVUsRUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFDWixLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBQ1osWUFBWSxFQUNaLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFFBQVEsQ0FDVCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsaUNBQWlDO0lBRWpDLEtBQUssQ0FBQyxjQUFjLENBQ2xCLE9BQWtCLEVBQ2xCLFlBQXVCLEVBQ3ZCLGNBQThCLEVBQzlCLFVBQXVCLEVBQ3ZCLFdBQXdCLEVBQ3hCLGFBQXFCLENBQUMsRUFDdEIsUUFBaUIsRUFDakIsT0FBbUI7UUFFbkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdkYsOEJBQThCO1FBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRyxtRUFBbUU7UUFDbkUsTUFBTSxpQkFBaUIsR0FBNEQsRUFBRSxDQUFDO1FBQ3RGLE1BQU0sZUFBZSxHQUFnQixFQUFFLENBQUM7UUFDeEMsTUFBTSx1QkFBdUIsR0FBZ0IsRUFBRSxDQUFDO1FBQ2hELE1BQU0sd0JBQXdCLEdBQWdCLEVBQUUsQ0FBQztRQUVqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbEgsT0FBTztZQUNMLFVBQVU7WUFDVixXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7WUFDbkMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQ2pDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixLQUFLLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUM7WUFDaEQsYUFBYSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLEdBQUcsdUJBQXVCLENBQUM7WUFDeEUsY0FBYyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsY0FBYyxFQUFFLEdBQUcsd0JBQXdCLENBQUM7WUFDM0UsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLE9BQU87WUFDckMsaUJBQWlCO1lBQ2pCLGFBQWEsRUFBRSxZQUFZLENBQUMsT0FBTztTQUNwQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbnRCRCx3Q0FtdEJDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhpZ2gtbGV2ZWwgY2xpZW50IGZvciB0aGUgRnV0YXJjaHkgcHJvZ3JhbS5cbiAqIEhhbmRsZXMgYWNjb3VudCBkZXJpdmF0aW9uLCBpbnN0cnVjdGlvbiBidWlsZGluZywgYW5kIHRyYW5zYWN0aW9uIGNvbXBvc2l0aW9uLlxuICovXG5cbmltcG9ydCB7IFByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBCTiB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uTWVzc2FnZSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jLCBUT0tFTl9QUk9HUkFNX0lELCBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQgfSBmcm9tIFwiQHNvbGFuYS9zcGwtdG9rZW5cIjtcbmltcG9ydCB7IFBST0dSQU1fSUQsIFNRVUFEU19QUk9HUkFNX0lEIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBGdXRhcmNoeSxcbiAgREFPQWNjb3VudCxcbiAgTW9kZXJhdG9yQWNjb3VudCxcbiAgUHJvcG9zYWxBY2NvdW50LFxuICBQcm9wb3NhbFBhcmFtcyxcbiAgUG9vbFR5cGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBkZXJpdmVEQU9QREEsXG4gIGRlcml2ZU1vZGVyYXRvclBEQSxcbiAgZGVyaXZlUHJvcG9zYWxQREEsXG4gIGRlcml2ZU1pbnRDcmVhdGVLZXlQREEsXG4gIGZldGNoREFPQWNjb3VudCxcbiAgZmV0Y2hNb2RlcmF0b3JBY2NvdW50LFxuICBmZXRjaFByb3Bvc2FsQWNjb3VudCxcbiAgcGFyc2VQcm9wb3NhbFN0YXRlLFxuICBpc1Byb3Bvc2FsRXhwaXJlZCxcbiAgZ2V0VGltZVJlbWFpbmluZyxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIGluaXRpYWxpemVNb2RlcmF0b3IsXG4gIGluaXRpYWxpemVQcm9wb3NhbCxcbiAgYWRkT3B0aW9uLFxuICBsYXVuY2hQcm9wb3NhbCxcbiAgZmluYWxpemVQcm9wb3NhbCxcbiAgcmVkZWVtTGlxdWlkaXR5LFxuICBhZGRIaXN0b3JpY2FsUHJvcG9zYWwsXG4gIGluaXRpYWxpemVQYXJlbnREQU8sXG4gIGluaXRpYWxpemVDaGlsZERBTyxcbiAgdXBncmFkZURBTyxcbn0gZnJvbSBcIi4vaW5zdHJ1Y3Rpb25zXCI7XG5pbXBvcnQgeyBUeE9wdGlvbnMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgVmF1bHRDbGllbnQsIGRlcml2ZVZhdWx0UERBLCBkZXJpdmVDb25kaXRpb25hbE1pbnQsIFZhdWx0VHlwZSB9IGZyb20gXCIuLi92YXVsdFwiO1xuaW1wb3J0IHsgQU1NQ2xpZW50LCBkZXJpdmVQb29sUERBLCBkZXJpdmVSZXNlcnZlUERBLCBkZXJpdmVGZWVWYXVsdFBEQSwgRkVFX0FVVEhPUklUWSB9IGZyb20gXCIuLi9hbW1cIjtcblxuaW1wb3J0IHsgRnV0YXJjaHlJREwgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkL2lkbHNcIjtcbmltcG9ydCAqIGFzIG11bHRpc2lnIGZyb20gXCJAc3Fkcy9tdWx0aXNpZ1wiO1xuXG5jb25zdCBERUZBVUxUX0NPTVBVVEVfVU5JVFMgPSA1MDBfMDAwO1xuXG5leHBvcnQgY2xhc3MgRnV0YXJjaHlDbGllbnQge1xuICBwdWJsaWMgcHJvZ3JhbTogUHJvZ3JhbTxGdXRhcmNoeT47XG4gIHB1YmxpYyBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcbiAgcHVibGljIHZhdWx0OiBWYXVsdENsaWVudDtcbiAgcHVibGljIGFtbTogQU1NQ2xpZW50O1xuICBwcml2YXRlIGRlZmF1bHRDb21wdXRlVW5pdHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm92aWRlcjogQW5jaG9yUHJvdmlkZXIsIHByb2dyYW1JZD86IFB1YmxpY0tleSwgY29tcHV0ZVVuaXRzPzogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBwcm9ncmFtSWQgPz8gUFJPR1JBTV9JRDtcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgUHJvZ3JhbShGdXRhcmNoeUlETCBhcyBGdXRhcmNoeSwgcHJvdmlkZXIpO1xuICAgIHRoaXMudmF1bHQgPSBuZXcgVmF1bHRDbGllbnQocHJvdmlkZXIpO1xuICAgIHRoaXMuYW1tID0gbmV3IEFNTUNsaWVudChwcm92aWRlcik7XG4gICAgdGhpcy5kZWZhdWx0Q29tcHV0ZVVuaXRzID0gY29tcHV0ZVVuaXRzID8/IERFRkFVTFRfQ09NUFVURV9VTklUUztcbiAgfVxuXG4gIC8qIFBEQSBIZWxwZXJzICovXG5cbiAgZGVyaXZlREFPUERBKG5hbWU6IHN0cmluZyk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICAgIHJldHVybiBkZXJpdmVEQU9QREEobmFtZSwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgZGVyaXZlTW9kZXJhdG9yUERBKG5hbWU6IHN0cmluZyk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICAgIHJldHVybiBkZXJpdmVNb2RlcmF0b3JQREEobmFtZSwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgZGVyaXZlUHJvcG9zYWxQREEobW9kZXJhdG9yOiBQdWJsaWNLZXksIHByb3Bvc2FsSWQ6IG51bWJlcik6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICAgIHJldHVybiBkZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3IsIHByb3Bvc2FsSWQsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxuXG4gIC8qIEZldGNoZXJzICovXG5cbiAgYXN5bmMgZmV0Y2hEQU8oZGFvUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPERBT0FjY291bnQ+IHtcbiAgICByZXR1cm4gZmV0Y2hEQU9BY2NvdW50KHRoaXMucHJvZ3JhbSwgZGFvUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYTogUHVibGljS2V5KTogUHJvbWlzZTxNb2RlcmF0b3JBY2NvdW50PiB7XG4gICAgcmV0dXJuIGZldGNoTW9kZXJhdG9yQWNjb3VudCh0aGlzLnByb2dyYW0sIG1vZGVyYXRvclBkYSk7XG4gIH1cblxuICBhc3luYyBmZXRjaFByb3Bvc2FsKHByb3Bvc2FsUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPFByb3Bvc2FsQWNjb3VudD4ge1xuICAgIHJldHVybiBmZXRjaFByb3Bvc2FsQWNjb3VudCh0aGlzLnByb2dyYW0sIHByb3Bvc2FsUGRhKTtcbiAgfVxuXG4gIC8qIFByb3Bvc2FsIEhlbHBlcnMgKi9cblxuICBpc1Byb3Bvc2FsRXhwaXJlZChwcm9wb3NhbDogUHJvcG9zYWxBY2NvdW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJvcG9zYWxFeHBpcmVkKHByb3Bvc2FsKTtcbiAgfVxuXG4gIGdldFRpbWVSZW1haW5pbmcocHJvcG9zYWw6IFByb3Bvc2FsQWNjb3VudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRpbWVSZW1haW5pbmcocHJvcG9zYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb21wdXRlVW5pdHMob3B0aW9ucz86IFR4T3B0aW9ucyk6IG51bWJlciB7XG4gICAgcmV0dXJuIG9wdGlvbnM/LmNvbXB1dGVVbml0cyA/PyB0aGlzLmRlZmF1bHRDb21wdXRlVW5pdHM7XG4gIH1cblxuICBwcml2YXRlIG1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zPzogVHhPcHRpb25zKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZUN1QnVkZ2V0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW0NvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoeyB1bml0czogdGhpcy5nZXRDb21wdXRlVW5pdHMob3B0aW9ucykgfSldO1xuICB9XG5cbiAgLyogSW5zdHJ1Y3Rpb24gQnVpbGRlcnMgKi9cblxuICBhc3luYyBpbml0aWFsaXplTW9kZXJhdG9yKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgYmFzZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBxdW90ZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBbbW9kZXJhdG9yUGRhXSA9IHRoaXMuZGVyaXZlTW9kZXJhdG9yUERBKG5hbWUpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGluaXRpYWxpemVNb2RlcmF0b3IoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIGJhc2VNaW50LFxuICAgICAgcXVvdGVNaW50LFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgbmFtZVxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIG1vZGVyYXRvclBkYSwgbmFtZSB9O1xuICB9XG5cbiAgYXN5bmMgYWRkSGlzdG9yaWNhbFByb3Bvc2FsKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbW9kZXJhdG9yUGRhOiBQdWJsaWNLZXksXG4gICAgbnVtT3B0aW9uczogbnVtYmVyLFxuICAgIHdpbm5pbmdJZHg6IG51bWJlcixcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBjcmVhdGVkQXQ6IEJOIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZXJhdG9yID0gYXdhaXQgdGhpcy5mZXRjaE1vZGVyYXRvcihtb2RlcmF0b3JQZGEpO1xuICAgIGNvbnN0IHByb3Bvc2FsSWQgPSBtb2RlcmF0b3IucHJvcG9zYWxJZENvdW50ZXI7XG4gICAgY29uc3QgW3Byb3Bvc2FsUGRhXSA9IHRoaXMuZGVyaXZlUHJvcG9zYWxQREEobW9kZXJhdG9yUGRhLCBwcm9wb3NhbElkKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBhZGRIaXN0b3JpY2FsUHJvcG9zYWwoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgbnVtT3B0aW9ucyxcbiAgICAgIHdpbm5pbmdJZHgsXG4gICAgICBsZW5ndGgsXG4gICAgICBjcmVhdGVkQXRcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBwcm9wb3NhbFBkYSwgcHJvcG9zYWxJZCB9O1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZVByb3Bvc2FsKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBtb2RlcmF0b3JQZGE6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBhcmFtczogUHJvcG9zYWxQYXJhbXMsXG4gICAgbWV0YWRhdGE/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlcmF0b3IgPSBhd2FpdCB0aGlzLmZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYSk7XG4gICAgY29uc3QgcHJvcG9zYWxJZCA9IG1vZGVyYXRvci5wcm9wb3NhbElkQ291bnRlcjtcbiAgICBjb25zdCBbcHJvcG9zYWxQZGFdID0gdGhpcy5kZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3JQZGEsIHByb3Bvc2FsSWQpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQSAocHJvcG9zYWwgaXMgdGhlIG93bmVyLCBub25jZT1wcm9wb3NhbElkKVxuICAgIGNvbnN0IFt2YXVsdFBkYV0gPSBkZXJpdmVWYXVsdFBEQShwcm9wb3NhbFBkYSwgcHJvcG9zYWxJZCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIGNvbmRpdGlvbmFsIG1pbnRzIGZvciBpbml0aWFsIDIgb3B0aW9uc1xuICAgIGNvbnN0IFtjb25kQmFzZU1pbnQwXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLkJhc2UsIDAsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZEJhc2VNaW50MV0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQodmF1bHRQZGEsIFZhdWx0VHlwZS5CYXNlLCAxLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2NvbmRRdW90ZU1pbnQwXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLlF1b3RlLCAwLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2NvbmRRdW90ZU1pbnQxXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLlF1b3RlLCAxLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgcG9vbCBQREFzIGZvciBpbml0aWFsIDIgb3B0aW9ucyAocHJvcG9zYWwgaXMgYWRtaW4sIG1pbnRBPWNvbmRRdW90ZSwgbWludEI9Y29uZEJhc2UpXG4gICAgY29uc3QgW3Bvb2wwXSA9IGRlcml2ZVBvb2xQREEocHJvcG9zYWxQZGEsIGNvbmRRdW90ZU1pbnQwLCBjb25kQmFzZU1pbnQwLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtwb29sMV0gPSBkZXJpdmVQb29sUERBKHByb3Bvc2FsUGRhLCBjb25kUXVvdGVNaW50MSwgY29uZEJhc2VNaW50MSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSByZXNlcnZlcyBhbmQgZmVlIHZhdWx0c1xuICAgIGNvbnN0IFtyZXNlcnZlQTBdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sMCwgY29uZFF1b3RlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVCMF0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wwLCBjb25kQmFzZU1pbnQwLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtmZWVWYXVsdDBdID0gZGVyaXZlRmVlVmF1bHRQREEocG9vbDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVBMV0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wxLCBjb25kUXVvdGVNaW50MSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUIxXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDEsIGNvbmRCYXNlTWludDEsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0MV0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sMSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIFZhdWx0IHRva2VuIGFjY291bnRzXG4gICAgY29uc3QgYmFzZVRva2VuQWNjID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLmJhc2VNaW50LCB2YXVsdFBkYSwgdHJ1ZSk7XG4gICAgY29uc3QgcXVvdGVUb2tlbkFjYyA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1vZGVyYXRvci5xdW90ZU1pbnQsIHZhdWx0UGRhLCB0cnVlKTtcblxuICAgIC8vIEJ1aWxkIHJlbWFpbmluZyBhY2NvdW50cyBpbiBleHBlY3RlZCBvcmRlciAoc2VlIGluaXRpYWxpemVfcHJvcG9zYWwucnMpXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHMgPSBbXG4gICAgICB7IHB1YmtleTogbW9kZXJhdG9yLmJhc2VNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgLy8gMDogYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogbW9kZXJhdG9yLnF1b3RlTWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LCAgICAgLy8gMTogcXVvdGVfbWludFxuICAgICAgeyBwdWJrZXk6IHZhdWx0UGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDI6IHZhdWx0XG4gICAgICB7IHB1YmtleTogYmFzZVRva2VuQWNjLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgLy8gMzogYmFzZV90b2tlbl9hY2NcbiAgICAgIHsgcHVia2V5OiBxdW90ZVRva2VuQWNjLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyA0OiBxdW90ZV90b2tlbl9hY2NcbiAgICAgIHsgcHVia2V5OiBjb25kQmFzZU1pbnQwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyA1OiBjb25kX2Jhc2VfbWludF8wXG4gICAgICB7IHB1YmtleTogY29uZEJhc2VNaW50MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgLy8gNjogY29uZF9iYXNlX21pbnRfMVxuICAgICAgeyBwdWJrZXk6IGNvbmRRdW90ZU1pbnQwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgIC8vIDc6IGNvbmRfcXVvdGVfbWludF8wXG4gICAgICB7IHB1YmtleTogY29uZFF1b3RlTWludDEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgLy8gODogY29uZF9xdW90ZV9taW50XzFcbiAgICAgIHsgcHVia2V5OiBwb29sMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgICAgICAvLyA5OiBwb29sXzBcbiAgICAgIHsgcHVia2V5OiByZXNlcnZlQTAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAvLyAxMDogcmVzZXJ2ZV9hXzBcbiAgICAgIHsgcHVia2V5OiByZXNlcnZlQjAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAvLyAxMTogcmVzZXJ2ZV9iXzBcbiAgICAgIHsgcHVia2V5OiBGRUVfQVVUSE9SSVRZLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgICAgICAvLyAxMjogZmVlX2F1dGhvcml0eVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0MCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDEzOiBmZWVfdmF1bHRfMFxuICAgICAgeyBwdWJrZXk6IHBvb2wxLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgIC8vIDE0OiBwb29sXzFcbiAgICAgIHsgcHVia2V5OiByZXNlcnZlQTEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAvLyAxNTogcmVzZXJ2ZV9hXzFcbiAgICAgIHsgcHVia2V5OiByZXNlcnZlQjEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAvLyAxNjogcmVzZXJ2ZV9iXzFcbiAgICAgIHsgcHVia2V5OiBmZWVWYXVsdDEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAvLyAxNzogZmVlX3ZhdWx0XzFcbiAgICBdO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGluaXRpYWxpemVQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsUGFyYW1zLFxuICAgICAgbWV0YWRhdGEgPz8gbnVsbCxcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsSWQsXG4gICAgICB2YXVsdFBkYSxcbiAgICAgIHBvb2xzOiBbcG9vbDAsIHBvb2wxXSxcbiAgICAgIGNvbmRCYXNlTWludHM6IFtjb25kQmFzZU1pbnQwLCBjb25kQmFzZU1pbnQxXSxcbiAgICAgIGNvbmRRdW90ZU1pbnRzOiBbY29uZFF1b3RlTWludDAsIGNvbmRRdW90ZU1pbnQxXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYWRkT3B0aW9uKGNyZWF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSwgb3B0aW9ucz86IFR4T3B0aW9ucykge1xuICAgIGNvbnN0IHByb3Bvc2FsID0gYXdhaXQgdGhpcy5mZXRjaFByb3Bvc2FsKHByb3Bvc2FsUGRhKTtcbiAgICBjb25zdCBvcHRpb25JbmRleCA9IHByb3Bvc2FsLm51bU9wdGlvbnM7XG5cbiAgICAvLyBEZXJpdmUgbmV3IGNvbmRpdGlvbmFsIG1pbnRzXG4gICAgY29uc3QgW2NvbmRCYXNlTWludF0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQocHJvcG9zYWwudmF1bHQsIFZhdWx0VHlwZS5CYXNlLCBvcHRpb25JbmRleCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtjb25kUXVvdGVNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludChwcm9wb3NhbC52YXVsdCwgVmF1bHRUeXBlLlF1b3RlLCBvcHRpb25JbmRleCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIHBvb2wgUERBXG4gICAgY29uc3QgW3Bvb2xdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludCwgY29uZEJhc2VNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wsIGNvbmRRdW90ZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVCXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZEJhc2VNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtmZWVWYXVsdF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzIChzZWUgYWRkX29wdGlvbi5ycylcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IFtcbiAgICAgIHsgcHVia2V5OiBwcm9wb3NhbC52YXVsdCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAvLyAwOiB2YXVsdFxuICAgICAgeyBwdWJrZXk6IGNvbmRCYXNlTWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgIC8vIDE6IGNvbmRfYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogY29uZFF1b3RlTWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgLy8gMjogY29uZF9xdW90ZV9taW50XG4gICAgICB7IHB1YmtleTogcG9vbCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgICAgICAgLy8gMzogcG9vbFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDQ6IHJlc2VydmVfYVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDU6IHJlc2VydmVfYlxuICAgICAgeyBwdWJrZXk6IEZFRV9BVVRIT1JJVFksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgIC8vIDY6IGZlZV9hdXRob3JpdHlcbiAgICAgIHsgcHVia2V5OiBmZWVWYXVsdCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgICAvLyA3OiBmZWVfdmF1bHRcbiAgICBdO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGFkZE9wdGlvbih0aGlzLnByb2dyYW0sIGNyZWF0b3IsIHByb3Bvc2FsUGRhLCByZW1haW5pbmdBY2NvdW50cylcbiAgICAgIC5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciwgb3B0aW9uSW5kZXgsIHBvb2wsIGNvbmRCYXNlTWludCwgY29uZFF1b3RlTWludCB9O1xuICB9XG5cbiAgYXN5bmMgbGF1bmNoUHJvcG9zYWwoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksXG4gICAgYmFzZUFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgcXVvdGVBbW91bnQ6IEJOIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBhd2FpdCB0aGlzLmZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGEpO1xuICAgIGNvbnN0IHZhdWx0ID0gYXdhaXQgdGhpcy52YXVsdC5mZXRjaFZhdWx0KHByb3Bvc2FsLnZhdWx0KTtcbiAgICBjb25zdCBudW1PcHRpb25zID0gcHJvcG9zYWwubnVtT3B0aW9ucztcblxuICAgIC8vIFNsaWNlIGFycmF5cyB0byBudW1PcHRpb25zIChmaXhlZC1zaXplIGFycmF5cyBmcm9tIFJ1c3QgaW5jbHVkZSBlbXB0eSBzbG90cylcbiAgICBjb25zdCBjb25kQmFzZU1pbnRzID0gdmF1bHQuY29uZEJhc2VNaW50cy5zbGljZSgwLCBudW1PcHRpb25zKTtcbiAgICBjb25zdCBjb25kUXVvdGVNaW50cyA9IHZhdWx0LmNvbmRRdW90ZU1pbnRzLnNsaWNlKDAsIG51bU9wdGlvbnMpO1xuICAgIGNvbnN0IHBvb2xzID0gcHJvcG9zYWwucG9vbHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBEZXJpdmUgYWxsIHVzZXIgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IHVzZXJDb25kQmFzZUFUQXMgPSBjb25kQmFzZU1pbnRzLm1hcCgobSkgPT4gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobSwgY3JlYXRvcikpO1xuICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBVEFzID0gY29uZFF1b3RlTWludHMubWFwKChtKSA9PiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtLCBjcmVhdG9yKSk7XG5cbiAgICAvLyBEZXJpdmUgcmVzZXJ2ZSBhY2NvdW50cyBmb3IgZWFjaCBwb29sXG4gICAgY29uc3QgcmVzZXJ2ZXNBOiBQdWJsaWNLZXlbXSA9IFtdO1xuICAgIGNvbnN0IHJlc2VydmVzQjogUHVibGljS2V5W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW3Jlc0FdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sc1tpXSwgY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2xzW2ldLCBjb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgcmVzZXJ2ZXNBLnB1c2gocmVzQSk7XG4gICAgICByZXNlcnZlc0IucHVzaChyZXNCKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBsYXVuY2hfcHJvcG9zYWwucnMpXG4gICAgLy8gTGF5b3V0OiA2IGZpeGVkICsgNypOIHZhcmlhYmxlXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgICAgIHsgcHVia2V5OiB2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDogYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHF1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgIC8vIDI6IHZhdWx0X2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIHByb3Bvc2FsLnZhdWx0LCB0cnVlKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyAzOiB2YXVsdF9xdW90ZV9hdGFcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyA0OiB1c2VyX2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgLy8gNTogdXNlcl9xdW90ZV9hdGFcbiAgICBdO1xuXG4gICAgLy8gNi4uNitOOiBjb25kX2Jhc2VfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZEJhc2VNaW50cykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogbWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2K04uLjYrMk46IGNvbmRfcXVvdGVfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZFF1b3RlTWludHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNisyTi4uNiszTjogdXNlcl9jb25kX2Jhc2VfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kQmFzZUFUQXMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2KzNOLi42KzROOiB1c2VyX2NvbmRfcXVvdGVfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kUXVvdGVBVEFzKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBhdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis0Ti4uNis1TjogcG9vbHNcbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgcG9vbHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHBvb2wsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis1Ti4uNis2TjogcmVzZXJ2ZXNfYVxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc2VydmVzQSkge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcmVzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIDYrNk4uLjYrN046IHJlc2VydmVzX2JcbiAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNlcnZlc0IpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlcywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBsYXVuY2hQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgYmFzZUFtb3VudCxcbiAgICAgIHF1b3RlQW1vdW50LFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyIH07XG4gIH1cblxuICBhc3luYyBmaW5hbGl6ZVByb3Bvc2FsKHNpZ25lcjogUHVibGljS2V5LCBwcm9wb3NhbFBkYTogUHVibGljS2V5LCBvcHRpb25zPzogVHhPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBhd2FpdCB0aGlzLmZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGEpO1xuICAgIGNvbnN0IHZhdWx0ID0gYXdhaXQgdGhpcy52YXVsdC5mZXRjaFZhdWx0KHByb3Bvc2FsLnZhdWx0KTtcbiAgICBjb25zdCBudW1PcHRpb25zID0gcHJvcG9zYWwubnVtT3B0aW9ucztcblxuICAgIC8vIEJ1aWxkIHJlbWFpbmluZyBhY2NvdW50cyAoMyBwZXIgcG9vbDogcG9vbCwgcmVzZXJ2ZV9hLCByZXNlcnZlX2IpXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PcHRpb25zOyBpKyspIHtcbiAgICAgIGNvbnN0IHBvb2wgPSBwcm9wb3NhbC5wb29sc1tpXTtcbiAgICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wsIHZhdWx0LmNvbmRRdW90ZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Jlc2VydmVCXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgdmF1bHQuY29uZEJhc2VNaW50c1tpXSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcblxuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcG9vbCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiByZXNlcnZlQiwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0gZmluYWxpemVQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIHNpZ25lcixcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWwudmF1bHQsXG4gICAgICByZW1haW5pbmdBY2NvdW50c1xuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIgfTtcbiAgfVxuXG4gIGFzeW5jIHJlZGVlbUxpcXVpZGl0eShjcmVhdG9yOiBQdWJsaWNLZXksIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksIG9wdGlvbnM/OiBUeE9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgY29uc3QgeyB3aW5uaW5nSWR4IH0gPSBwYXJzZVByb3Bvc2FsU3RhdGUocHJvcG9zYWwuc3RhdGUpO1xuICAgIGlmICh3aW5uaW5nSWR4ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9wb3NhbCBub3QgZmluYWxpemVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB3aW5uaW5nUG9vbCA9IHByb3Bvc2FsLnBvb2xzW3dpbm5pbmdJZHhdO1xuXG4gICAgLy8gRGVyaXZlIHdpbm5pbmcgcG9vbCByZXNlcnZlc1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHdpbm5pbmdQb29sLCB2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQSh3aW5uaW5nUG9vbCwgdmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIFVzZXIncyB3aW5uaW5nIGNvbmRpdGlvbmFsIHRva2VuIEFUQXNcbiAgICBjb25zdCBjcmVhdG9yQ29uZFF1b3RlQXRhID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbd2lubmluZ0lkeF0sIGNyZWF0b3IpO1xuICAgIGNvbnN0IGNyZWF0b3JDb25kQmFzZUF0YSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LmNvbmRCYXNlTWludHNbd2lubmluZ0lkeF0sIGNyZWF0b3IpO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzIChzZWUgcmVkZWVtX2xpcXVpZGl0eS5ycylcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50czogeyBwdWJrZXk6IFB1YmxpY0tleTsgaXNTaWduZXI6IGJvb2xlYW47IGlzV3JpdGFibGU6IGJvb2xlYW4gfVtdID0gW1xuICAgICAgLy8gcmVtb3ZlX2xpcXVpZGl0eSBhY2NvdW50cyAoMC0zKVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiByZXNlcnZlQiwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogY3JlYXRvckNvbmRRdW90ZUF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogY3JlYXRvckNvbmRCYXNlQXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcblxuICAgICAgLy8gcmVkZWVtX3dpbm5pbmdzIGJhc2UgZml4ZWQgYWNjb3VudHMgKDQtNilcbiAgICAgIHsgcHVia2V5OiB2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuYmFzZU1pbnQuYWRkcmVzcywgcHJvcG9zYWwudmF1bHQsIHRydWUpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBiYXNlIHJlbWFpbmluZyAoNy4uNysyTik6IFtjb25kX2Jhc2VfbWludF9pLCB1c2VyX2NvbmRfYmFzZV9hdGFfaV1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogdmF1bHQuY29uZEJhc2VNaW50c1tpXSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZEJhc2VNaW50c1tpXSwgY3JlYXRvciksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyByZWRlZW1fd2lubmluZ3MgcXVvdGUgZml4ZWQgYWNjb3VudHNcbiAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgcHJvcG9zYWwudmF1bHQsIHRydWUpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG5cbiAgICAvLyByZWRlZW1fd2lubmluZ3MgcXVvdGUgcmVtYWluaW5nOiBbY29uZF9xdW90ZV9taW50X2ksIHVzZXJfY29uZF9xdW90ZV9hdGFfaV1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogdmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LmNvbmRRdW90ZU1pbnRzW2ldLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSByZWRlZW1MaXF1aWRpdHkoXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBjcmVhdG9yLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBwcm9wb3NhbC52YXVsdCxcbiAgICAgIHdpbm5pbmdQb29sLFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyIH07XG4gIH1cblxuICAvKiBBZGRyZXNzIExvb2t1cCBUYWJsZSAqL1xuXG4gIGFzeW5jIGNyZWF0ZVByb3Bvc2FsQUxUKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBtb2RlcmF0b3JQZGE6IFB1YmxpY0tleSxcbiAgICBudW1PcHRpb25zOiBudW1iZXIgPSAyLFxuICApOiBQcm9taXNlPHsgYWx0QWRkcmVzczogUHVibGljS2V5IH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCBtb2RlcmF0b3IgPSBhd2FpdCB0aGlzLmZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYSk7XG4gICAgY29uc3QgcHJvcG9zYWxJZCA9IG1vZGVyYXRvci5wcm9wb3NhbElkQ291bnRlcjtcbiAgICBjb25zdCBbcHJvcG9zYWxQZGFdID0gdGhpcy5kZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3JQZGEsIHByb3Bvc2FsSWQpO1xuICAgIGNvbnN0IFt2YXVsdFBkYV0gPSBkZXJpdmVWYXVsdFBEQShwcm9wb3NhbFBkYSwgcHJvcG9zYWxJZCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuXG4gICAgY29uc3QgYWRkcmVzc2VzOiBQdWJsaWNLZXlbXSA9IFtcbiAgICAgIC8vIFByb2dyYW1zXG4gICAgICB0aGlzLnByb2dyYW1JZCxcbiAgICAgIHRoaXMudmF1bHQucHJvZ3JhbUlkLFxuICAgICAgdGhpcy5hbW0ucHJvZ3JhbUlkLFxuICAgICAgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICAgICAgLy8gQ29yZSBhY2NvdW50c1xuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICB2YXVsdFBkYSxcbiAgICAgIG1vZGVyYXRvci5iYXNlTWludCxcbiAgICAgIG1vZGVyYXRvci5xdW90ZU1pbnQsXG4gICAgICBGRUVfQVVUSE9SSVRZLFxuICAgICAgLy8gVmF1bHQgdG9rZW4gYWNjb3VudHNcbiAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1vZGVyYXRvci5iYXNlTWludCwgdmF1bHRQZGEsIHRydWUpLFxuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgdmF1bHRQZGEsIHRydWUpLFxuICAgICAgLy8gQ3JlYXRvcidzIGJhc2UvcXVvdGUgQVRBc1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLmJhc2VNaW50LCBjcmVhdG9yKSxcbiAgICAgIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1vZGVyYXRvci5xdW90ZU1pbnQsIGNyZWF0b3IpLFxuICAgIF07XG5cbiAgICAvLyBQZXItb3B0aW9uIGFjY291bnRzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PcHRpb25zOyBpKyspIHtcbiAgICAgIGNvbnN0IFtjb25kQmFzZU1pbnRdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuQmFzZSwgaSwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW2NvbmRRdW90ZU1pbnRdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIGksIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtwb29sXSA9IGRlcml2ZVBvb2xQREEocHJvcG9zYWxQZGEsIGNvbmRRdW90ZU1pbnQsIGNvbmRCYXNlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wsIGNvbmRRdW90ZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbZmVlVmF1bHRdID0gZGVyaXZlRmVlVmF1bHRQREEocG9vbCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcblxuICAgICAgYWRkcmVzc2VzLnB1c2goXG4gICAgICAgIGNvbmRCYXNlTWludCxcbiAgICAgICAgY29uZFF1b3RlTWludCxcbiAgICAgICAgcG9vbCxcbiAgICAgICAgcmVzZXJ2ZUEsXG4gICAgICAgIHJlc2VydmVCLFxuICAgICAgICBmZWVWYXVsdCxcbiAgICAgICAgLy8gQ3JlYXRvcidzIGNvbmRpdGlvbmFsIHRva2VuIEFUQXNcbiAgICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoY29uZEJhc2VNaW50LCBjcmVhdG9yKSxcbiAgICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoY29uZFF1b3RlTWludCwgY3JlYXRvciksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbW9zdCByZWNlbnQgc2xvdCB1c2luZyBcImZpbmFsaXplZFwiIGNvbW1pdG1lbnQgZm9yIHN0YWJpbGl0eVxuICAgIGNvbnN0IHNsb3QgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldFNsb3QoXCJmaW5hbGl6ZWRcIik7XG5cbiAgICBjb25zdCBbY3JlYXRlSXgsIGFsdEFkZHJlc3NdID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5jcmVhdGVMb29rdXBUYWJsZSh7XG4gICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICBwYXllcjogY3JlYXRvcixcbiAgICAgIHJlY2VudFNsb3Q6IHNsb3QsXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIGNyZWF0ZSB0cmFuc2FjdGlvbiBpbW1lZGlhdGVseSwgc2tpcCBwcmVmbGlnaHQgdG8gYXZvaWQgc2xvdCB0aW1pbmcgaXNzdWVzXG4gICAgY29uc3QgY3JlYXRlVHggPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoY3JlYXRlSXgpO1xuICAgIGNyZWF0ZVR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAgY3JlYXRlVHguZmVlUGF5ZXIgPSBjcmVhdG9yO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgcHJvdmlkZXIud2FsbGV0LnNpZ25UcmFuc2FjdGlvbihjcmVhdGVUeCk7XG4gICAgY29uc3Qgc2lnID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24oc2lnbmVkVHguc2VyaWFsaXplKCksIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnLCBcImNvbmZpcm1lZFwiKTtcblxuICAgIC8vIFNwbGl0IGFkZHJlc3NlcyBpbnRvIGNodW5rcyB0byBhdm9pZCB0cmFuc2FjdGlvbiBzaXplIGxpbWl0c1xuICAgIC8vIEVhY2ggYWRkcmVzcyBpcyAzMiBieXRlcywgfjIwIGFkZHJlc3NlcyBwZXIgZXh0ZW5kIGluc3RydWN0aW9uIGlzIHNhZmVcbiAgICBjb25zdCBDSFVOS19TSVpFID0gMjA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYWRkcmVzc2VzLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgIGNvbnN0IGV4dGVuZEl4ID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5leHRlbmRMb29rdXBUYWJsZSh7XG4gICAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICAgIGxvb2t1cFRhYmxlOiBhbHRBZGRyZXNzLFxuICAgICAgICBhZGRyZXNzZXM6IGNodW5rLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbmRUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChleHRlbmRJeCk7XG4gICAgICBhd2FpdCBwcm92aWRlci5zZW5kQW5kQ29uZmlybShleHRlbmRUeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWx0QWRkcmVzcyB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hBTFQoYWx0QWRkcmVzczogUHVibGljS2V5KTogUHJvbWlzZTxBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50PiB7XG4gICAgY29uc3QgYWx0ID0gYXdhaXQgdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0QWRkcmVzc0xvb2t1cFRhYmxlKGFsdEFkZHJlc3MpO1xuICAgIGlmICghYWx0LnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBTFQgbm90IGZvdW5kXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYWx0LnZhbHVlO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRWZXJzaW9uZWRUeChcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICAgIGFsdEFkZHJlc3M6IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTxWZXJzaW9uZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGFsdCA9IGF3YWl0IHRoaXMuZmV0Y2hBTFQoYWx0QWRkcmVzcyk7XG4gICAgY29uc3QgYmxvY2toYXNoID0gYXdhaXQgdGhpcy5wcm9ncmFtLnByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IFRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICBwYXllcktleTogcGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGJsb2NraGFzaC5ibG9ja2hhc2gsXG4gICAgICBpbnN0cnVjdGlvbnMsXG4gICAgfSkuY29tcGlsZVRvVjBNZXNzYWdlKFthbHRdKTtcblxuICAgIHJldHVybiBuZXcgVmVyc2lvbmVkVHJhbnNhY3Rpb24obWVzc2FnZSk7XG4gIH1cblxuICAvKiBEQU8gTWV0aG9kcyAqL1xuXG4gIGRlcml2ZU1pbnRDcmVhdGVLZXlQREEoZGFvUGRhOiBQdWJsaWNLZXksIG5hbWU6IHN0cmluZyk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICAgIHJldHVybiBkZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYSwgbmFtZSwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNxdWFkc1Byb2dyYW1Db25maWcoKSB7XG4gICAgY29uc3QgW3Byb2dyYW1Db25maWdQZGFdID0gbXVsdGlzaWcuZ2V0UHJvZ3JhbUNvbmZpZ1BkYSh7XG4gICAgICBwcm9ncmFtSWQ6IFNRVUFEU19QUk9HUkFNX0lELFxuICAgIH0pO1xuICAgIGNvbnN0IHByb2dyYW1Db25maWcgPSBhd2FpdCBtdWx0aXNpZy5hY2NvdW50cy5Qcm9ncmFtQ29uZmlnLmZyb21BY2NvdW50QWRkcmVzcyhcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm92aWRlci5jb25uZWN0aW9uLFxuICAgICAgcHJvZ3JhbUNvbmZpZ1BkYVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2dyYW1Db25maWc6IHByb2dyYW1Db25maWdQZGEsXG4gICAgICBwcm9ncmFtQ29uZmlnVHJlYXN1cnk6IHByb2dyYW1Db25maWcudHJlYXN1cnksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlTXVsdGlzaWdQZGEoY3JlYXRlS2V5OiBQdWJsaWNLZXkpOiBQdWJsaWNLZXkge1xuICAgIGNvbnN0IFttdWx0aXNpZ1BkYV0gPSBtdWx0aXNpZy5nZXRNdWx0aXNpZ1BkYSh7XG4gICAgICBjcmVhdGVLZXksXG4gICAgICBwcm9ncmFtSWQ6IFNRVUFEU19QUk9HUkFNX0lELFxuICAgIH0pO1xuICAgIHJldHVybiBtdWx0aXNpZ1BkYTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemVQYXJlbnREQU8oXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBwYXJlbnRBZG1pbjogUHVibGljS2V5LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBiYXNlTWludDogUHVibGljS2V5LFxuICAgIHF1b3RlTWludDogUHVibGljS2V5LFxuICAgIHRyZWFzdXJ5Q29zaWduZXI6IFB1YmxpY0tleSxcbiAgICBwb29sOiBQdWJsaWNLZXksXG4gICAgcG9vbFR5cGU6IFBvb2xUeXBlLFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgW2Rhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShuYW1lKTtcbiAgICBjb25zdCBbbW9kZXJhdG9yUGRhXSA9IHRoaXMuZGVyaXZlTW9kZXJhdG9yUERBKG5hbWUpO1xuICAgIGNvbnN0IFttaW50Q3JlYXRlS2V5UGRhXSA9IHRoaXMuZGVyaXZlTWludENyZWF0ZUtleVBEQShkYW9QZGEsIG5hbWUpO1xuXG4gICAgLy8gRGVyaXZlIFNxdWFkcyBhY2NvdW50cyAoc2luZ2xlIFJQQyBjYWxsKVxuICAgIGNvbnN0IHNxdWFkc0NvbmZpZyA9IGF3YWl0IHRoaXMuZmV0Y2hTcXVhZHNQcm9ncmFtQ29uZmlnKCk7XG4gICAgY29uc3QgdHJlYXN1cnlNdWx0aXNpZ1BkYSA9IHRoaXMuZGVyaXZlTXVsdGlzaWdQZGEoZGFvUGRhKTtcbiAgICBjb25zdCBtaW50TXVsdGlzaWdQZGEgPSB0aGlzLmRlcml2ZU11bHRpc2lnUGRhKG1pbnRDcmVhdGVLZXlQZGEpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGluaXRpYWxpemVQYXJlbnREQU8oXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIHBhcmVudEFkbWluLFxuICAgICAgZGFvUGRhLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBzcXVhZHNDb25maWcucHJvZ3JhbUNvbmZpZyxcbiAgICAgIHNxdWFkc0NvbmZpZy5wcm9ncmFtQ29uZmlnVHJlYXN1cnksXG4gICAgICB0cmVhc3VyeU11bHRpc2lnUGRhLFxuICAgICAgbWludE11bHRpc2lnUGRhLFxuICAgICAgbWludENyZWF0ZUtleVBkYSxcbiAgICAgIFNRVUFEU19QUk9HUkFNX0lELFxuICAgICAgbmFtZSxcbiAgICAgIHRyZWFzdXJ5Q29zaWduZXIsXG4gICAgICBwb29sLFxuICAgICAgcG9vbFR5cGVcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIGRhb1BkYSxcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHRyZWFzdXJ5TXVsdGlzaWc6IHRyZWFzdXJ5TXVsdGlzaWdQZGEsXG4gICAgICBtaW50TXVsdGlzaWc6IG1pbnRNdWx0aXNpZ1BkYSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZUNoaWxkREFPKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50QWRtaW46IFB1YmxpY0tleSxcbiAgICBwYXJlbnREYW9OYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRva2VuTWludDogUHVibGljS2V5LFxuICAgIHRyZWFzdXJ5Q29zaWduZXI6IFB1YmxpY0tleSxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFtkYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEobmFtZSk7XG4gICAgY29uc3QgW3BhcmVudERhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShwYXJlbnREYW9OYW1lKTtcbiAgICBjb25zdCBbbWludENyZWF0ZUtleVBkYV0gPSB0aGlzLmRlcml2ZU1pbnRDcmVhdGVLZXlQREEoZGFvUGRhLCBuYW1lKTtcblxuICAgIC8vIERlcml2ZSBTcXVhZHMgYWNjb3VudHMgKHNpbmdsZSBSUEMgY2FsbClcbiAgICBjb25zdCBzcXVhZHNDb25maWcgPSBhd2FpdCB0aGlzLmZldGNoU3F1YWRzUHJvZ3JhbUNvbmZpZygpO1xuICAgIGNvbnN0IHRyZWFzdXJ5TXVsdGlzaWdQZGEgPSB0aGlzLmRlcml2ZU11bHRpc2lnUGRhKGRhb1BkYSk7XG4gICAgY29uc3QgbWludE11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShtaW50Q3JlYXRlS2V5UGRhKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0aWFsaXplQ2hpbGREQU8oXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIHBhcmVudEFkbWluLFxuICAgICAgZGFvUGRhLFxuICAgICAgcGFyZW50RGFvUGRhLFxuICAgICAgdG9rZW5NaW50LFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWcsXG4gICAgICBzcXVhZHNDb25maWcucHJvZ3JhbUNvbmZpZ1RyZWFzdXJ5LFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRDcmVhdGVLZXlQZGEsXG4gICAgICBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICAgIG5hbWUsXG4gICAgICB0cmVhc3VyeUNvc2lnbmVyXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBkYW9QZGEsXG4gICAgICBwYXJlbnREYW9QZGEsXG4gICAgICB0cmVhc3VyeU11bHRpc2lnOiB0cmVhc3VyeU11bHRpc2lnUGRhLFxuICAgICAgbWludE11bHRpc2lnOiBtaW50TXVsdGlzaWdQZGEsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZ3JhZGVEQU8oXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBwYXJlbnRBZG1pbjogUHVibGljS2V5LFxuICAgIGRhb05hbWU6IHN0cmluZyxcbiAgICBwYXJlbnREYW9OYW1lOiBzdHJpbmcsXG4gICAgYmFzZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBxdW90ZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBwb29sOiBQdWJsaWNLZXksXG4gICAgcG9vbFR5cGU6IFBvb2xUeXBlLFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgW2Rhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShkYW9OYW1lKTtcbiAgICBjb25zdCBbcGFyZW50RGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKHBhcmVudERhb05hbWUpO1xuICAgIGNvbnN0IFttb2RlcmF0b3JQZGFdID0gdGhpcy5kZXJpdmVNb2RlcmF0b3JQREEoZGFvTmFtZSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gdXBncmFkZURBTyhcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgcGFyZW50QWRtaW4sXG4gICAgICBkYW9QZGEsXG4gICAgICBwYXJlbnREYW9QZGEsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBiYXNlTWludCxcbiAgICAgIHF1b3RlTWludCxcbiAgICAgIHBvb2wsXG4gICAgICBwb29sVHlwZVxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIGRhb1BkYSwgbW9kZXJhdG9yUGRhIH07XG4gIH1cblxuICAvKiBIaWdoLUxldmVsIFByb3Bvc2FsIENyZWF0b3IgKi9cblxuICBhc3luYyBjcmVhdGVQcm9wb3NhbChcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgbW9kZXJhdG9yUGRhOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQYXJhbXM6IFByb3Bvc2FsUGFyYW1zLFxuICAgIGJhc2VBbW91bnQ6IEJOIHwgbnVtYmVyLFxuICAgIHF1b3RlQW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBudW1PcHRpb25zOiBudW1iZXIgPSAyLFxuICAgIG1ldGFkYXRhPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUeE9wdGlvbnNcbiAgKSB7XG4gICAgaWYgKG51bU9wdGlvbnMgPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaW5pbXVtIDIgb3B0aW9ucyByZXF1aXJlZFwiKTtcbiAgICB9XG5cbiAgICAvLyAxLiBDcmVhdGUgQUxUIChzZW5kcyB0eHMgaW50ZXJuYWxseSlcbiAgICBjb25zdCB7IGFsdEFkZHJlc3MgfSA9IGF3YWl0IHRoaXMuY3JlYXRlUHJvcG9zYWxBTFQoY3JlYXRvciwgbW9kZXJhdG9yUGRhLCBudW1PcHRpb25zKTtcblxuICAgIC8vIDIuIEJ1aWxkIGluaXRpYWxpemVQcm9wb3NhbFxuICAgIGNvbnN0IGluaXRSZXN1bHQgPSBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9wb3NhbChjcmVhdG9yLCBtb2RlcmF0b3JQZGEsIHByb3Bvc2FsUGFyYW1zLCBtZXRhZGF0YSwgb3B0aW9ucyk7XG5cbiAgICAvLyAzLiBCdWlsZCBhZGRPcHRpb24gZm9yIGVhY2ggYWRkaXRpb25hbCBvcHRpb24gKGJleW9uZCBpbml0aWFsIDIpXG4gICAgY29uc3QgYWRkT3B0aW9uQnVpbGRlcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5hZGRPcHRpb24+PltcImJ1aWxkZXJcIl1bXSA9IFtdO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxQb29sczogUHVibGljS2V5W10gPSBbXTtcbiAgICBjb25zdCBhZGRpdGlvbmFsQ29uZEJhc2VNaW50czogUHVibGljS2V5W10gPSBbXTtcbiAgICBjb25zdCBhZGRpdGlvbmFsQ29uZFF1b3RlTWludHM6IFB1YmxpY0tleVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgYWRkUmVzdWx0ID0gYXdhaXQgdGhpcy5hZGRPcHRpb24oY3JlYXRvciwgaW5pdFJlc3VsdC5wcm9wb3NhbFBkYSwgb3B0aW9ucyk7XG4gICAgICBhZGRPcHRpb25CdWlsZGVycy5wdXNoKGFkZFJlc3VsdC5idWlsZGVyKTtcbiAgICAgIGFkZGl0aW9uYWxQb29scy5wdXNoKGFkZFJlc3VsdC5wb29sKTtcbiAgICAgIGFkZGl0aW9uYWxDb25kQmFzZU1pbnRzLnB1c2goYWRkUmVzdWx0LmNvbmRCYXNlTWludCk7XG4gICAgICBhZGRpdGlvbmFsQ29uZFF1b3RlTWludHMucHVzaChhZGRSZXN1bHQuY29uZFF1b3RlTWludCk7XG4gICAgfVxuXG4gICAgLy8gNC4gQnVpbGQgbGF1bmNoUHJvcG9zYWxcbiAgICBjb25zdCBsYXVuY2hSZXN1bHQgPSBhd2FpdCB0aGlzLmxhdW5jaFByb3Bvc2FsKGNyZWF0b3IsIGluaXRSZXN1bHQucHJvcG9zYWxQZGEsIGJhc2VBbW91bnQsIHF1b3RlQW1vdW50LCBvcHRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhbHRBZGRyZXNzLFxuICAgICAgcHJvcG9zYWxQZGE6IGluaXRSZXN1bHQucHJvcG9zYWxQZGEsXG4gICAgICBwcm9wb3NhbElkOiBpbml0UmVzdWx0LnByb3Bvc2FsSWQsXG4gICAgICB2YXVsdFBkYTogaW5pdFJlc3VsdC52YXVsdFBkYSxcbiAgICAgIHBvb2xzOiBbLi4uaW5pdFJlc3VsdC5wb29scywgLi4uYWRkaXRpb25hbFBvb2xzXSxcbiAgICAgIGNvbmRCYXNlTWludHM6IFsuLi5pbml0UmVzdWx0LmNvbmRCYXNlTWludHMsIC4uLmFkZGl0aW9uYWxDb25kQmFzZU1pbnRzXSxcbiAgICAgIGNvbmRRdW90ZU1pbnRzOiBbLi4uaW5pdFJlc3VsdC5jb25kUXVvdGVNaW50cywgLi4uYWRkaXRpb25hbENvbmRRdW90ZU1pbnRzXSxcbiAgICAgIGluaXRpYWxpemVCdWlsZGVyOiBpbml0UmVzdWx0LmJ1aWxkZXIsXG4gICAgICBhZGRPcHRpb25CdWlsZGVycyxcbiAgICAgIGxhdW5jaEJ1aWxkZXI6IGxhdW5jaFJlc3VsdC5idWlsZGVyLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
672
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1dGFyY2h5L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4Q0FBZ0U7QUFDaEUsNkNBVXlCO0FBQ3pCLGlEQUsyQjtBQUMzQiwyQ0FBNEQ7QUFTNUQsbUNBV2lCO0FBQ2pCLGlEQVd3QjtBQUd4QixvQ0FBeUY7QUFDekYsZ0NBQXNHO0FBRXRHLDRDQUFnRDtBQUNoRCx5REFBMkM7QUFFM0MsTUFBTSxxQkFBcUIsR0FBRyxNQUFPLENBQUM7QUFFdEMsTUFBYSxjQUFjO0lBT3pCLFlBQVksUUFBd0IsRUFBRSxTQUFxQixFQUFFLFlBQXFCO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLHNCQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsa0JBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLG1CQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGVBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxJQUFJLHFCQUFxQixDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsWUFBWSxDQUFDLElBQVk7UUFDdkIsT0FBTyxJQUFBLG9CQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixPQUFPLElBQUEsMEJBQWtCLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxV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QUNwQixJQUFlLEVBQ2YsUUFBa0IsRUFDbEIsT0FBbUI7UUFFbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFVLEVBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksRUFDSixRQUFRLENBQ1QsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBcjdCRCx3Q0FxN0JDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhpZ2gtbGV2ZWwgY2xpZW50IGZvciB0aGUgRnV0YXJjaHkgcHJvZ3JhbS5cbiAqIEhhbmRsZXMgYWNjb3VudCBkZXJpdmF0aW9uLCBpbnN0cnVjdGlvbiBidWlsZGluZywgYW5kIHRyYW5zYWN0aW9uIGNvbXBvc2l0aW9uLlxuICovXG5cbmltcG9ydCB7IFByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBCTiB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uTWVzc2FnZSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7XG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jLFxuICBUT0tFTl9QUk9HUkFNX0lELFxuICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24sXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuaW1wb3J0IHsgUFJPR1JBTV9JRCwgU1FVQURTX1BST0dSQU1fSUQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZ1dGFyY2h5LFxuICBEQU9BY2NvdW50LFxuICBNb2RlcmF0b3JBY2NvdW50LFxuICBQcm9wb3NhbEFjY291bnQsXG4gIFByb3Bvc2FsUGFyYW1zLFxuICBQb29sVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlcml2ZURBT1BEQSxcbiAgZGVyaXZlTW9kZXJhdG9yUERBLFxuICBkZXJpdmVQcm9wb3NhbFBEQSxcbiAgZGVyaXZlTWludENyZWF0ZUtleVBEQSxcbiAgZmV0Y2hEQU9BY2NvdW50LFxuICBmZXRjaE1vZGVyYXRvckFjY291bnQsXG4gIGZldGNoUHJvcG9zYWxBY2NvdW50LFxuICBwYXJzZVByb3Bvc2FsU3RhdGUsXG4gIGlzUHJvcG9zYWxFeHBpcmVkLFxuICBnZXRUaW1lUmVtYWluaW5nLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZU1vZGVyYXRvcixcbiAgaW5pdGlhbGl6ZVByb3Bvc2FsLFxuICBhZGRPcHRpb24sXG4gIGxhdW5jaFByb3Bvc2FsLFxuICBmaW5hbGl6ZVByb3Bvc2FsLFxuICByZWRlZW1MaXF1aWRpdHksXG4gIGFkZEhpc3RvcmljYWxQcm9wb3NhbCxcbiAgaW5pdGlhbGl6ZVBhcmVudERBTyxcbiAgaW5pdGlhbGl6ZUNoaWxkREFPLFxuICB1cGdyYWRlREFPLFxufSBmcm9tIFwiLi9pbnN0cnVjdGlvbnNcIjtcbmltcG9ydCB7IFR4T3B0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBWYXVsdENsaWVudCwgZGVyaXZlVmF1bHRQREEsIGRlcml2ZUNvbmRpdGlvbmFsTWludCwgVmF1bHRUeXBlIH0gZnJvbSBcIi4uL3ZhdWx0XCI7XG5pbXBvcnQgeyBBTU1DbGllbnQsIGRlcml2ZVBvb2xQREEsIGRlcml2ZVJlc2VydmVQREEsIGRlcml2ZUZlZVZhdWx0UERBLCBGRUVfQVVUSE9SSVRZIH0gZnJvbSBcIi4uL2FtbVwiO1xuXG5pbXBvcnQgeyBGdXRhcmNoeUlETCB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvaWRsc1wiO1xuaW1wb3J0ICogYXMgbXVsdGlzaWcgZnJvbSBcIkBzcWRzL211bHRpc2lnXCI7XG5cbmNvbnN0IERFRkFVTFRfQ09NUFVURV9VTklUUyA9IDUwMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBGdXRhcmNoeUNsaWVudCB7XG4gIHB1YmxpYyBwcm9ncmFtOiBQcm9ncmFtPEZ1dGFyY2h5PjtcbiAgcHVibGljIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBwdWJsaWMgdmF1bHQ6IFZhdWx0Q2xpZW50O1xuICBwdWJsaWMgYW1tOiBBTU1DbGllbnQ7XG4gIHByaXZhdGUgZGVmYXVsdENvbXB1dGVVbml0czogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBBbmNob3JQcm92aWRlciwgcHJvZ3JhbUlkPzogUHVibGljS2V5LCBjb21wdXRlVW5pdHM/OiBudW1iZXIpIHtcbiAgICB0aGlzLnByb2dyYW1JZCA9IHByb2dyYW1JZCA/PyBQUk9HUkFNX0lEO1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBQcm9ncmFtKEZ1dGFyY2h5SURMIGFzIEZ1dGFyY2h5LCBwcm92aWRlcik7XG4gICAgdGhpcy52YXVsdCA9IG5ldyBWYXVsdENsaWVudChwcm92aWRlcik7XG4gICAgdGhpcy5hbW0gPSBuZXcgQU1NQ2xpZW50KHByb3ZpZGVyKTtcbiAgICB0aGlzLmRlZmF1bHRDb21wdXRlVW5pdHMgPSBjb21wdXRlVW5pdHMgPz8gREVGQVVMVF9DT01QVVRFX1VOSVRTO1xuICB9XG5cbiAgLyogUERBIEhlbHBlcnMgKi9cblxuICBkZXJpdmVEQU9QREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZURBT1BEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVNb2RlcmF0b3JQREEobmFtZTogc3RyaW5nKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZU1vZGVyYXRvclBEQShuYW1lLCB0aGlzLnByb2dyYW1JZCk7XG4gIH1cblxuICBkZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxJZDogbnVtYmVyKTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvciwgcHJvcG9zYWxJZCwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG5cbiAgLyogRmV0Y2hlcnMgKi9cblxuICBhc3luYyBmZXRjaERBTyhkYW9QZGE6IFB1YmxpY0tleSk6IFByb21pc2U8REFPQWNjb3VudD4ge1xuICAgIHJldHVybiBmZXRjaERBT0FjY291bnQodGhpcy5wcm9ncmFtLCBkYW9QZGEpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhOiBQdWJsaWNLZXkpOiBQcm9taXNlPE1vZGVyYXRvckFjY291bnQ+IHtcbiAgICByZXR1cm4gZmV0Y2hNb2RlcmF0b3JBY2NvdW50KHRoaXMucHJvZ3JhbSwgbW9kZXJhdG9yUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGE6IFB1YmxpY0tleSk6IFByb21pc2U8UHJvcG9zYWxBY2NvdW50PiB7XG4gICAgcmV0dXJuIGZldGNoUHJvcG9zYWxBY2NvdW50KHRoaXMucHJvZ3JhbSwgcHJvcG9zYWxQZGEpO1xuICB9XG5cbiAgLyogUHJvcG9zYWwgSGVscGVycyAqL1xuXG4gIGlzUHJvcG9zYWxFeHBpcmVkKHByb3Bvc2FsOiBQcm9wb3NhbEFjY291bnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcm9wb3NhbEV4cGlyZWQocHJvcG9zYWwpO1xuICB9XG5cbiAgZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbDogUHJvcG9zYWxBY2NvdW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0VGltZVJlbWFpbmluZyhwcm9wb3NhbCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbXB1dGVVbml0cyhvcHRpb25zPzogVHhPcHRpb25zKTogbnVtYmVyIHtcbiAgICByZXR1cm4gb3B0aW9ucz8uY29tcHV0ZVVuaXRzID8/IHRoaXMuZGVmYXVsdENvbXB1dGVVbml0cztcbiAgfVxuXG4gIHByaXZhdGUgbWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnM/OiBUeE9wdGlvbnMpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICAgIGlmIChvcHRpb25zPy5pbmNsdWRlQ3VCdWRnZXQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7IHVuaXRzOiB0aGlzLmdldENvbXB1dGVVbml0cyhvcHRpb25zKSB9KV07XG4gIH1cblxuICAvKiBJbnN0cnVjdGlvbiBCdWlsZGVycyAqL1xuXG4gIGFzeW5jIGluaXRpYWxpemVNb2RlcmF0b3IoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBiYXNlTWludDogUHVibGljS2V5LFxuICAgIHF1b3RlTWludDogUHVibGljS2V5LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFttb2RlcmF0b3JQZGFdID0gdGhpcy5kZXJpdmVNb2RlcmF0b3JQREEobmFtZSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZU1vZGVyYXRvcihcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBuYW1lXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciwgbW9kZXJhdG9yUGRhLCBuYW1lIH07XG4gIH1cblxuICBhc3luYyBhZGRIaXN0b3JpY2FsUHJvcG9zYWwoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtb2RlcmF0b3JQZGE6IFB1YmxpY0tleSxcbiAgICBudW1PcHRpb25zOiBudW1iZXIsXG4gICAgd2lubmluZ0lkeDogbnVtYmVyLFxuICAgIGxlbmd0aDogbnVtYmVyLFxuICAgIGNyZWF0ZWRBdDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlcmF0b3IgPSBhd2FpdCB0aGlzLmZldGNoTW9kZXJhdG9yKG1vZGVyYXRvclBkYSk7XG4gICAgY29uc3QgcHJvcG9zYWxJZCA9IG1vZGVyYXRvci5wcm9wb3NhbElkQ291bnRlcjtcbiAgICBjb25zdCBbcHJvcG9zYWxQZGFdID0gdGhpcy5kZXJpdmVQcm9wb3NhbFBEQShtb2RlcmF0b3JQZGEsIHByb3Bvc2FsSWQpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGFkZEhpc3RvcmljYWxQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGFkbWluLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBudW1PcHRpb25zLFxuICAgICAgd2lubmluZ0lkeCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIGNyZWF0ZWRBdFxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUHJvcG9zYWwoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIG1vZGVyYXRvclBkYTogUHVibGljS2V5LFxuICAgIHByb3Bvc2FsUGFyYW1zOiBQcm9wb3NhbFBhcmFtcyxcbiAgICBtZXRhZGF0YT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGVyYXRvciA9IGF3YWl0IHRoaXMuZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhKTtcbiAgICBjb25zdCBwcm9wb3NhbElkID0gbW9kZXJhdG9yLnByb3Bvc2FsSWRDb3VudGVyO1xuICAgIGNvbnN0IFtwcm9wb3NhbFBkYV0gPSB0aGlzLmRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvclBkYSwgcHJvcG9zYWxJZCk7XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBIChwcm9wb3NhbCBpcyB0aGUgb3duZXIsIG5vbmNlPXByb3Bvc2FsSWQpXG4gICAgY29uc3QgW3ZhdWx0UGRhXSA9IGRlcml2ZVZhdWx0UERBKHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgY29uZGl0aW9uYWwgbWludHMgZm9yIGluaXRpYWwgMiBvcHRpb25zXG4gICAgY29uc3QgW2NvbmRCYXNlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuQmFzZSwgMCwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtjb25kQmFzZU1pbnQxXSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludCh2YXVsdFBkYSwgVmF1bHRUeXBlLkJhc2UsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDBdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDAsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbY29uZFF1b3RlTWludDFdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHZhdWx0UGRhLCBWYXVsdFR5cGUuUXVvdGUsIDEsIHRoaXMudmF1bHQucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBwb29sIFBEQXMgZm9yIGluaXRpYWwgMiBvcHRpb25zIChwcm9wb3NhbCBpcyBhZG1pbiwgbWludEE9Y29uZFF1b3RlLCBtaW50Qj1jb25kQmFzZSlcbiAgICBjb25zdCBbcG9vbDBdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Bvb2wxXSA9IGRlcml2ZVBvb2xQREEocHJvcG9zYWxQZGEsIGNvbmRRdW90ZU1pbnQxLCBjb25kQmFzZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIHJlc2VydmVzIGFuZCBmZWUgdmF1bHRzXG4gICAgY29uc3QgW3Jlc2VydmVBMF0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wwLCBjb25kUXVvdGVNaW50MCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUIwXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDAsIGNvbmRCYXNlTWludDAsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0MF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sMCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUExXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbDEsIGNvbmRRdW90ZU1pbnQxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQjFdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sMSwgY29uZEJhc2VNaW50MSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbZmVlVmF1bHQxXSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wxLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVmF1bHQgdG9rZW4gYWNjb3VudHNcbiAgICBjb25zdCBiYXNlVG9rZW5BY2MgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIHZhdWx0UGRhLCB0cnVlKTtcbiAgICBjb25zdCBxdW90ZVRva2VuQWNjID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgdmF1bHRQZGEsIHRydWUpO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzIGluIGV4cGVjdGVkIG9yZGVyIChzZWUgaW5pdGlhbGl6ZV9wcm9wb3NhbC5ycylcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IFtcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IuYmFzZU1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAvLyAwOiBiYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBtb2RlcmF0b3IucXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAvLyAxOiBxdW90ZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHRQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gMjogdmF1bHRcbiAgICAgIHsgcHVia2V5OiBiYXNlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAvLyAzOiBiYXNlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IHF1b3RlVG9rZW5BY2MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDQ6IHF1b3RlX3Rva2VuX2FjY1xuICAgICAgeyBwdWJrZXk6IGNvbmRCYXNlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgIC8vIDU6IGNvbmRfYmFzZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kQmFzZU1pbnQxLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyA2OiBjb25kX2Jhc2VfbWludF8xXG4gICAgICB7IHB1YmtleTogY29uZFF1b3RlTWludDAsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgLy8gNzogY29uZF9xdW90ZV9taW50XzBcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAvLyA4OiBjb25kX3F1b3RlX21pbnRfMVxuICAgICAgeyBwdWJrZXk6IHBvb2wwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgIC8vIDk6IHBvb2xfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDEwOiByZXNlcnZlX2FfMFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDExOiByZXNlcnZlX2JfMFxuICAgICAgeyBwdWJrZXk6IEZFRV9BVVRIT1JJVFksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgIC8vIDEyOiBmZWVfYXV0aG9yaXR5XG4gICAgICB7IHB1YmtleTogZmVlVmF1bHQwLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgLy8gMTM6IGZlZV92YXVsdF8wXG4gICAgICB7IHB1YmtleTogcG9vbDEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgICAgLy8gMTQ6IHBvb2xfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVBMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE1OiByZXNlcnZlX2FfMVxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCMSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE2OiByZXNlcnZlX2JfMVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0MSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAgICAgICAgICAgICAgIC8vIDE3OiBmZWVfdmF1bHRfMVxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgY3JlYXRvcixcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxQYXJhbXMsXG4gICAgICBtZXRhZGF0YSA/PyBudWxsLFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGRlcixcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWxJZCxcbiAgICAgIHZhdWx0UGRhLFxuICAgICAgcG9vbHM6IFtwb29sMCwgcG9vbDFdLFxuICAgICAgY29uZEJhc2VNaW50czogW2NvbmRCYXNlTWludDAsIGNvbmRCYXNlTWludDFdLFxuICAgICAgY29uZFF1b3RlTWludHM6IFtjb25kUXVvdGVNaW50MCwgY29uZFF1b3RlTWludDFdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBhZGRPcHRpb24oY3JlYXRvcjogUHVibGljS2V5LCBwcm9wb3NhbFBkYTogUHVibGljS2V5LCBvcHRpb25zPzogVHhPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBhd2FpdCB0aGlzLmZldGNoUHJvcG9zYWwocHJvcG9zYWxQZGEpO1xuICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gcHJvcG9zYWwubnVtT3B0aW9ucztcblxuICAgIC8vIERlcml2ZSBuZXcgY29uZGl0aW9uYWwgbWludHNcbiAgICBjb25zdCBbY29uZEJhc2VNaW50XSA9IGRlcml2ZUNvbmRpdGlvbmFsTWludChwcm9wb3NhbC52YXVsdCwgVmF1bHRUeXBlLkJhc2UsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2NvbmRRdW90ZU1pbnRdID0gZGVyaXZlQ29uZGl0aW9uYWxNaW50KHByb3Bvc2FsLnZhdWx0LCBWYXVsdFR5cGUuUXVvdGUsIG9wdGlvbkluZGV4LCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICAvLyBEZXJpdmUgcG9vbCBQREFcbiAgICBjb25zdCBbcG9vbF0gPSBkZXJpdmVQb29sUERBKHByb3Bvc2FsUGRhLCBjb25kUXVvdGVNaW50LCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZFF1b3RlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCBjb25kQmFzZU1pbnQsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgY29uc3QgW2ZlZVZhdWx0XSA9IGRlcml2ZUZlZVZhdWx0UERBKHBvb2wsIHRoaXMuYW1tLnByb2dyYW1JZCk7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBhZGRfb3B0aW9uLnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzID0gW1xuICAgICAgeyBwdWJrZXk6IHByb3Bvc2FsLnZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgIC8vIDA6IHZhdWx0XG4gICAgICB7IHB1YmtleTogY29uZEJhc2VNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgLy8gMTogY29uZF9iYXNlX21pbnRcbiAgICAgIHsgcHVia2V5OiBjb25kUXVvdGVNaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAvLyAyOiBjb25kX3F1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgICAgICAvLyAzOiBwb29sXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNDogcmVzZXJ2ZV9hXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgICAgICAgICAgICAgICAgLy8gNTogcmVzZXJ2ZV9iXG4gICAgICB7IHB1YmtleTogRkVFX0FVVEhPUklUWSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LCAgICAgICAgICAgLy8gNjogZmVlX2F1dGhvcml0eVxuICAgICAgeyBwdWJrZXk6IGZlZVZhdWx0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgICAgICAgICAgICAgICAgIC8vIDc6IGZlZV92YXVsdFxuICAgIF07XG5cbiAgICBjb25zdCBidWlsZGVyID0gYWRkT3B0aW9uKHRoaXMucHJvZ3JhbSwgY3JlYXRvciwgcHJvcG9zYWxQZGEsIHJlbWFpbmluZ0FjY291bnRzKVxuICAgICAgLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBvcHRpb25JbmRleCwgcG9vbCwgY29uZEJhc2VNaW50LCBjb25kUXVvdGVNaW50IH07XG4gIH1cblxuICBhc3luYyBsYXVuY2hQcm9wb3NhbChcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgICBiYXNlQW1vdW50OiBCTiB8IG51bWJlcixcbiAgICBxdW90ZUFtb3VudDogQk4gfCBudW1iZXIsXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gU2xpY2UgYXJyYXlzIHRvIG51bU9wdGlvbnMgKGZpeGVkLXNpemUgYXJyYXlzIGZyb20gUnVzdCBpbmNsdWRlIGVtcHR5IHNsb3RzKVxuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIG51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBQcmUtY3JlYXRlIGNvbmRpdGlvbmFsIEFUQXMgZm9yIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIHRoZVxuICAgIC8vIDY0IGluc3RydWN0aW9uIHRyYWNlIGxpbWl0LiBFYWNoIEFUQSBjcmVhdGlvbiB2aWEgdmF1bHQgZGVwb3NpdCBhZGRzXG4gICAgLy8gNSBpbm5lciBpbnN0cnVjdGlvbnM7IHdpdGggNCBvcHRpb25zIHRoYXQncyA0MCBleHRyYSBpbnN0cnVjdGlvbnMuXG4gICAgY29uc3Qgc2hvdWxkRW5zdXJlQVRBcyA9IG9wdGlvbnM/LmVuc3VyZUFUQXMgPz8gKG51bU9wdGlvbnMgPj0gMyk7XG4gICAgaWYgKHNob3VsZEVuc3VyZUFUQXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gICAgfVxuICAgIGNvbnN0IHBvb2xzID0gcHJvcG9zYWwucG9vbHMuc2xpY2UoMCwgbnVtT3B0aW9ucyk7XG5cbiAgICAvLyBEZXJpdmUgYWxsIHVzZXIgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IHVzZXJDb25kQmFzZUFUQXMgPSBjb25kQmFzZU1pbnRzLm1hcCgobSkgPT4gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobSwgY3JlYXRvcikpO1xuICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBVEFzID0gY29uZFF1b3RlTWludHMubWFwKChtKSA9PiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtLCBjcmVhdG9yKSk7XG5cbiAgICAvLyBEZXJpdmUgcmVzZXJ2ZSBhY2NvdW50cyBmb3IgZWFjaCBwb29sXG4gICAgY29uc3QgcmVzZXJ2ZXNBOiBQdWJsaWNLZXlbXSA9IFtdO1xuICAgIGNvbnN0IHJlc2VydmVzQjogUHVibGljS2V5W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW3Jlc0FdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sc1tpXSwgY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2xzW2ldLCBjb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgcmVzZXJ2ZXNBLnB1c2gocmVzQSk7XG4gICAgICByZXNlcnZlc0IucHVzaChyZXNCKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSBsYXVuY2hfcHJvcG9zYWwucnMpXG4gICAgLy8gTGF5b3V0OiA2IGZpeGVkICsgNypOIHZhcmlhYmxlXG4gICAgY29uc3QgcmVtYWluaW5nQWNjb3VudHM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgICAgIHsgcHVia2V5OiB2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDogYmFzZV9taW50XG4gICAgICB7IHB1YmtleTogdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHF1b3RlX21pbnRcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LCAgIC8vIDI6IHZhdWx0X2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIHByb3Bvc2FsLnZhdWx0LCB0cnVlKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyAzOiB2YXVsdF9xdW90ZV9hdGFcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sICAvLyA0OiB1c2VyX2Jhc2VfYXRhXG4gICAgICB7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQucXVvdGVNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSwgLy8gNTogdXNlcl9xdW90ZV9hdGFcbiAgICBdO1xuXG4gICAgLy8gNi4uNitOOiBjb25kX2Jhc2VfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZEJhc2VNaW50cykge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogbWludCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2K04uLjYrMk46IGNvbmRfcXVvdGVfbWludHNcbiAgICBmb3IgKGNvbnN0IG1pbnQgb2YgY29uZFF1b3RlTWludHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNisyTi4uNiszTjogdXNlcl9jb25kX2Jhc2VfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kQmFzZUFUQXMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyA2KzNOLi42KzROOiB1c2VyX2NvbmRfcXVvdGVfYXRhc1xuICAgIGZvciAoY29uc3QgYXRhIG9mIHVzZXJDb25kUXVvdGVBVEFzKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBhdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis0Ti4uNis1TjogcG9vbHNcbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgcG9vbHMpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHBvb2wsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gNis1Ti4uNis2TjogcmVzZXJ2ZXNfYVxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc2VydmVzQSkge1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogcmVzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIDYrNk4uLjYrN046IHJlc2VydmVzX2JcbiAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNlcnZlc0IpIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlcywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBsYXVuY2hQcm9wb3NhbChcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgYmFzZUFtb3VudCxcbiAgICAgIHF1b3RlQW1vdW50LFxuICAgICAgcmVtYWluaW5nQWNjb3VudHNcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWNyZWF0ZXMgYWxsIGNvbmRpdGlvbmFsIHRva2VuIEFUQXMgZm9yIGEgdXNlciBiZWZvcmUgbGF1bmNoaW5nIGEgcHJvcG9zYWwuXG4gICAqXG4gICAqIFRoaXMgaXMgUkVRVUlSRUQgZm9yIHByb3Bvc2FscyB3aXRoIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIFNvbGFuYSdzXG4gICAqIG1heCBpbnN0cnVjdGlvbiB0cmFjZSBsZW5ndGggbGltaXQgKDY0IGluc3RydWN0aW9ucykuIFRoZSB2YXVsdCdzIGRlcG9zaXQgQ1BJXG4gICAqIGNyZWF0ZXMgQVRBcyBvbi10aGUtZmx5LCBlYWNoIHJlcXVpcmluZyA1IGlubmVyIGluc3RydWN0aW9ucy4gRm9yIDQgb3B0aW9uczpcbiAgICogOCBBVEFzIMOXIDUgPSA0MCBleHRyYSBpbnN0cnVjdGlvbnMsIHB1c2hpbmcgdGhlIHRvdGFsIG92ZXIgNjQuXG4gICAqXG4gICAqIFByZS1jcmVhdGluZyBBVEFzIGVsaW1pbmF0ZXMgdGhpcyBvdmVyaGVhZCwgcmVkdWNpbmcgdGhlIHRyYWNlIHRvIH4zMiBpbnN0cnVjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdG9yIC0gVGhlIHVzZXIgd2hvIHdpbGwgcmVjZWl2ZSBjb25kaXRpb25hbCB0b2tlbnNcbiAgICogQHBhcmFtIHByb3Bvc2FsUGRhIC0gVGhlIHByb3Bvc2FsIFBEQSAobXVzdCBiZSBpbml0aWFsaXplZCBidXQgbm90IGxhdW5jaGVkKVxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbiBzaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIGVuc3VyZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IGNvbmRCYXNlTWludHMgPSB2YXVsdC5jb25kQmFzZU1pbnRzLnNsaWNlKDAsIHByb3Bvc2FsLm51bU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbmRRdW90ZU1pbnRzID0gdmF1bHQuY29uZFF1b3RlTWludHMuc2xpY2UoMCwgcHJvcG9zYWwubnVtT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhjcmVhdG9yLCBjb25kQmFzZU1pbnRzLCBjb25kUXVvdGVNaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaGVscGVyIHRvIGNyZWF0ZSBjb25kaXRpb25hbCBBVEFzIGdpdmVuIG1pbnQgYXJyYXlzLlxuICAgKiBVc2VkIGJ5IGJvdGggZW5zdXJlQ29uZGl0aW9uYWxBVEFzIGFuZCBsYXVuY2hQcm9wb3NhbCB0byBhdm9pZCByZWR1bmRhbnQgZmV0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZUNvbmRpdGlvbmFsQVRBcyhcbiAgICBjcmVhdG9yOiBQdWJsaWNLZXksXG4gICAgY29uZEJhc2VNaW50czogUHVibGljS2V5W10sXG4gICAgY29uZFF1b3RlTWludHM6IFB1YmxpY0tleVtdLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuXG4gICAgLy8gQnVpbGQgQVRBIGNyZWF0aW9uIGluc3RydWN0aW9ucyAoaWRlbXBvdGVudCAtIHdvbid0IGZhaWwgaWYgZXhpc3RzKVxuICAgIGNvbnN0IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kQmFzZU1pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB1c2VyQ29uZEJhc2VBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKTtcbiAgICAgIGNvbnN0IHVzZXJDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kUXVvdGVNaW50c1tpXSwgY3JlYXRvcik7XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRCYXNlQXRhLFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgY29uZEJhc2VNaW50c1tpXVxuICAgICAgICApLFxuICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKFxuICAgICAgICAgIGNyZWF0b3IsXG4gICAgICAgICAgdXNlckNvbmRRdW90ZUF0YSxcbiAgICAgICAgICBjcmVhdG9yLFxuICAgICAgICAgIGNvbmRRdW90ZU1pbnRzW2ldXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnNlbmRBbmRDb25maXJtKHR4KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsaXplUHJvcG9zYWwoc2lnbmVyOiBQdWJsaWNLZXksIHByb3Bvc2FsUGRhOiBQdWJsaWNLZXksIG9wdGlvbnM/OiBUeE9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgLy8gQnVpbGQgcmVtYWluaW5nIGFjY291bnRzICgzIHBlciBwb29sOiBwb29sLCByZXNlcnZlX2EsIHJlc2VydmVfYilcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50czogeyBwdWJrZXk6IFB1YmxpY0tleTsgaXNTaWduZXI6IGJvb2xlYW47IGlzV3JpdGFibGU6IGJvb2xlYW4gfVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgcG9vbCA9IHByb3Bvc2FsLnBvb2xzW2ldO1xuICAgICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgdmF1bHQuY29uZFF1b3RlTWludHNbaV0sIHRoaXMuYW1tLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBwb29sLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiByZXNlcnZlQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBmaW5hbGl6ZVByb3Bvc2FsKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgc2lnbmVyLFxuICAgICAgcHJvcG9zYWxQZGEsXG4gICAgICBwcm9wb3NhbC52YXVsdCxcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHsgYnVpbGRlciB9O1xuICB9XG5cbiAgYXN5bmMgcmVkZWVtTGlxdWlkaXR5KGNyZWF0b3I6IFB1YmxpY0tleSwgcHJvcG9zYWxQZGE6IFB1YmxpY0tleSwgb3B0aW9ucz86IFR4T3B0aW9ucykge1xuICAgIGNvbnN0IHByb3Bvc2FsID0gYXdhaXQgdGhpcy5mZXRjaFByb3Bvc2FsKHByb3Bvc2FsUGRhKTtcbiAgICBjb25zdCB2YXVsdCA9IGF3YWl0IHRoaXMudmF1bHQuZmV0Y2hWYXVsdChwcm9wb3NhbC52YXVsdCk7XG4gICAgY29uc3QgbnVtT3B0aW9ucyA9IHByb3Bvc2FsLm51bU9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHdpbm5pbmdJZHggfSA9IHBhcnNlUHJvcG9zYWxTdGF0ZShwcm9wb3NhbC5zdGF0ZSk7XG4gICAgaWYgKHdpbm5pbmdJZHggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3Bvc2FsIG5vdCBmaW5hbGl6ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHdpbm5pbmdQb29sID0gcHJvcG9zYWwucG9vbHNbd2lubmluZ0lkeF07XG5cbiAgICAvLyBEZXJpdmUgd2lubmluZyBwb29sIHJlc2VydmVzXG4gICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEod2lubmluZ1Bvb2wsIHZhdWx0LmNvbmRRdW90ZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IFtyZXNlcnZlQl0gPSBkZXJpdmVSZXNlcnZlUERBKHdpbm5pbmdQb29sLCB2YXVsdC5jb25kQmFzZU1pbnRzW3dpbm5pbmdJZHhdLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gVXNlcidzIHdpbm5pbmcgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgIGNvbnN0IGNyZWF0b3JDb25kUXVvdGVBdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG4gICAgY29uc3QgY3JlYXRvckNvbmRCYXNlQXRhID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgY3JlYXRvcik7XG5cbiAgICAvLyBCdWlsZCByZW1haW5pbmcgYWNjb3VudHMgKHNlZSByZWRlZW1fbGlxdWlkaXR5LnJzKVxuICAgIGNvbnN0IHJlbWFpbmluZ0FjY291bnRzOiB7IHB1YmtleTogUHVibGljS2V5OyBpc1NpZ25lcjogYm9vbGVhbjsgaXNXcml0YWJsZTogYm9vbGVhbiB9W10gPSBbXG4gICAgICAvLyByZW1vdmVfbGlxdWlkaXR5IGFjY291bnRzICgwLTMpXG4gICAgICB7IHB1YmtleTogcmVzZXJ2ZUEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHJlc2VydmVCLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZFF1b3RlQXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBjcmVhdG9yQ29uZEJhc2VBdGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuXG4gICAgICAvLyByZWRlZW1fd2lubmluZ3MgYmFzZSBmaXhlZCBhY2NvdW50cyAoNC02KVxuICAgICAgeyBwdWJrZXk6IHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LmJhc2VNaW50LmFkZHJlc3MsIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICBdO1xuXG4gICAgLy8gcmVkZWVtX3dpbm5pbmdzIGJhc2UgcmVtYWluaW5nICg3Li43KzJOKTogW2NvbmRfYmFzZV9taW50X2ksIHVzZXJfY29uZF9iYXNlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSBmaXhlZCBhY2NvdW50c1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goeyBwdWJrZXk6IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHZhdWx0LnF1b3RlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIHJlZGVlbV93aW5uaW5ncyBxdW90ZSByZW1haW5pbmc6IFtjb25kX3F1b3RlX21pbnRfaSwgdXNlcl9jb25kX3F1b3RlX2F0YV9pXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3B0aW9uczsgaSsrKSB7XG4gICAgICByZW1haW5pbmdBY2NvdW50cy5wdXNoKHsgcHVia2V5OiB2YXVsdC5jb25kUXVvdGVNaW50c1tpXSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgcmVtYWluaW5nQWNjb3VudHMucHVzaCh7IHB1YmtleTogZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IHJlZGVlbUxpcXVpZGl0eShcbiAgICAgIHRoaXMucHJvZ3JhbSxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHByb3Bvc2FsLnZhdWx0LFxuICAgICAgd2lubmluZ1Bvb2wsXG4gICAgICByZW1haW5pbmdBY2NvdW50c1xuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7IGJ1aWxkZXIsIG51bU9wdGlvbnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFkZHJlc3MgTG9va3VwIFRhYmxlIGZvciByZWRlbXB0aW9uIG9wZXJhdGlvbnMuXG4gICAqIFJlcXVpcmVkIGZvciBwcm9wb3NhbHMgd2l0aCAzKyBvcHRpb25zIHRvIGF2b2lkIGV4Y2VlZGluZyB0cmFuc2FjdGlvbiBzaXplIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGNyZWF0b3IgLSBUaGUgdXNlciByZWRlZW1pbmcgKGNyZWF0b3Igb2YgcHJvcG9zYWwgb3IgbGlxdWlkaXR5IHByb3ZpZGVyKVxuICAgKiBAcGFyYW0gcHJvcG9zYWxQZGEgLSBUaGUgcHJvcG9zYWwgUERBXG4gICAqIEByZXR1cm5zIEFMVCBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVSZWRlbXB0aW9uQUxUKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBkYTogUHVibGljS2V5LFxuICApOiBQcm9taXNlPHsgYWx0QWRkcmVzczogUHVibGljS2V5IH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCBwcm9wb3NhbCA9IGF3YWl0IHRoaXMuZmV0Y2hQcm9wb3NhbChwcm9wb3NhbFBkYSk7XG4gICAgY29uc3QgdmF1bHQgPSBhd2FpdCB0aGlzLnZhdWx0LmZldGNoVmF1bHQocHJvcG9zYWwudmF1bHQpO1xuICAgIGNvbnN0IG51bU9wdGlvbnMgPSBwcm9wb3NhbC5udW1PcHRpb25zO1xuXG4gICAgY29uc3QgeyB3aW5uaW5nSWR4IH0gPSBwYXJzZVByb3Bvc2FsU3RhdGUocHJvcG9zYWwuc3RhdGUpO1xuICAgIGlmICh3aW5uaW5nSWR4ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9wb3NhbCBub3QgZmluYWxpemVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogUHVibGljS2V5W10gPSBbXG4gICAgICAvLyBQcm9ncmFtc1xuICAgICAgdGhpcy5wcm9ncmFtSWQsXG4gICAgICB0aGlzLnZhdWx0LnByb2dyYW1JZCxcbiAgICAgIHRoaXMuYW1tLnByb2dyYW1JZCxcbiAgICAgIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIC8vIENvcmUgYWNjb3VudHNcbiAgICAgIHByb3Bvc2FsUGRhLFxuICAgICAgcHJvcG9zYWwudmF1bHQsXG4gICAgICBwcm9wb3NhbC5tb2RlcmF0b3IsXG4gICAgICB2YXVsdC5iYXNlTWludC5hZGRyZXNzLFxuICAgICAgdmF1bHQucXVvdGVNaW50LmFkZHJlc3MsXG4gICAgICAvLyBXaW5uaW5nIHBvb2wgYW5kIHJlc2VydmVzXG4gICAgICBwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSxcbiAgICAgIC8vIFZhdWx0IHRva2VuIGFjY291bnRzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5iYXNlTWludC5hZGRyZXNzLCBwcm9wb3NhbC52YXVsdCwgdHJ1ZSksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgcHJvcG9zYWwudmF1bHQsIHRydWUpLFxuICAgICAgLy8gQ3JlYXRvcidzIGJhc2UvcXVvdGUgQVRBc1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuYmFzZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5xdW90ZU1pbnQuYWRkcmVzcywgY3JlYXRvciksXG4gICAgXTtcblxuICAgIC8vIFdpbm5pbmcgcG9vbCByZXNlcnZlc1xuICAgIGNvbnN0IFtyZXNlcnZlQV0gPSBkZXJpdmVSZXNlcnZlUERBKHByb3Bvc2FsLnBvb2xzW3dpbm5pbmdJZHhdLCB2YXVsdC5jb25kUXVvdGVNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBbcmVzZXJ2ZUJdID0gZGVyaXZlUmVzZXJ2ZVBEQShwcm9wb3NhbC5wb29sc1t3aW5uaW5nSWR4XSwgdmF1bHQuY29uZEJhc2VNaW50c1t3aW5uaW5nSWR4XSwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICBhZGRyZXNzZXMucHVzaChyZXNlcnZlQSwgcmVzZXJ2ZUIpO1xuXG4gICAgLy8gUGVyLW9wdGlvbiBhY2NvdW50cyAoY29uZGl0aW9uYWwgbWludHMgYW5kIHVzZXIgQVRBcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgYWRkcmVzc2VzLnB1c2goXG4gICAgICAgIHZhdWx0LmNvbmRCYXNlTWludHNbaV0sXG4gICAgICAgIHZhdWx0LmNvbmRRdW90ZU1pbnRzW2ldLFxuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh2YXVsdC5jb25kQmFzZU1pbnRzW2ldLCBjcmVhdG9yKSxcbiAgICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModmF1bHQuY29uZFF1b3RlTWludHNbaV0sIGNyZWF0b3IpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVjZW50IHNsb3QgZm9yIEFMVCBjcmVhdGlvblxuICAgIGNvbnN0IHNsb3QgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldFNsb3QoXCJmaW5hbGl6ZWRcIik7XG5cbiAgICBjb25zdCBbY3JlYXRlSXgsIGFsdEFkZHJlc3NdID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5jcmVhdGVMb29rdXBUYWJsZSh7XG4gICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICBwYXllcjogY3JlYXRvcixcbiAgICAgIHJlY2VudFNsb3Q6IHNsb3QsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQUxUXG4gICAgY29uc3QgY3JlYXRlVHggPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoY3JlYXRlSXgpO1xuICAgIGNyZWF0ZVR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAgY3JlYXRlVHguZmVlUGF5ZXIgPSBjcmVhdG9yO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgcHJvdmlkZXIud2FsbGV0LnNpZ25UcmFuc2FjdGlvbihjcmVhdGVUeCk7XG4gICAgY29uc3Qgc2lnID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24oc2lnbmVkVHguc2VyaWFsaXplKCksIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnLCBcImNvbmZpcm1lZFwiKTtcblxuICAgIC8vIEV4dGVuZCBBTFQgd2l0aCBhZGRyZXNzZXNcbiAgICBjb25zdCBDSFVOS19TSVpFID0gMjA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYWRkcmVzc2VzLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgIGNvbnN0IGV4dGVuZEl4ID0gQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5leHRlbmRMb29rdXBUYWJsZSh7XG4gICAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgICBhdXRob3JpdHk6IGNyZWF0b3IsXG4gICAgICAgIGxvb2t1cFRhYmxlOiBhbHRBZGRyZXNzLFxuICAgICAgICBhZGRyZXNzZXM6IGNodW5rLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbmRUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChleHRlbmRJeCk7XG4gICAgICBhd2FpdCBwcm92aWRlci5zZW5kQW5kQ29uZmlybShleHRlbmRUeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWx0QWRkcmVzcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBmb3IgcmVkZWVtaW5nIGxpcXVpZGl0eSB3aXRoIEFMVC5cbiAgICogUmVxdWlyZWQgZm9yIHByb3Bvc2FscyB3aXRoIDMrIG9wdGlvbnMgdG8gYXZvaWQgZXhjZWVkaW5nIHRyYW5zYWN0aW9uIHNpemUgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gY3JlYXRvciAtIFRoZSB1c2VyIHJlZGVlbWluZ1xuICAgKiBAcGFyYW0gcHJvcG9zYWxQZGEgLSBUaGUgcHJvcG9zYWwgUERBXG4gICAqIEBwYXJhbSBhbHRBZGRyZXNzIC0gT3B0aW9uYWwgQUxUIGFkZHJlc3MgKHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWQgZm9yIDMrIG9wdGlvbnMpXG4gICAqIEByZXR1cm5zIFVuc2lnbmVkIHZlcnNpb25lZCB0cmFuc2FjdGlvbiwgQUxUIGFkZHJlc3MsIGFuZCBudW1iZXIgb2Ygb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgcmVkZWVtTGlxdWlkaXR5VmVyc2lvbmVkKFxuICAgIGNyZWF0b3I6IFB1YmxpY0tleSxcbiAgICBwcm9wb3NhbFBkYTogUHVibGljS2V5LFxuICAgIGFsdEFkZHJlc3M/OiBQdWJsaWNLZXksXG4gICk6IFByb21pc2U8eyB2ZXJzaW9uZWRUeDogVmVyc2lvbmVkVHJhbnNhY3Rpb247IGFsdEFkZHJlc3M6IFB1YmxpY0tleTsgbnVtT3B0aW9uczogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvZ3JhbS5wcm92aWRlciBhcyBBbmNob3JQcm92aWRlcjtcbiAgICBjb25zdCB7IGJ1aWxkZXIsIG51bU9wdGlvbnMgfSA9IGF3YWl0IHRoaXMucmVkZWVtTGlxdWlkaXR5KGNyZWF0b3IsIHByb3Bvc2FsUGRhKTtcblxuICAgIC8vIENyZWF0ZSBBTFQgaWYgbm90IHByb3ZpZGVkIGFuZCBuZWVkZWRcbiAgICBsZXQgYWx0UHVia2V5ID0gYWx0QWRkcmVzcztcbiAgICBsZXQgdmVyaWZpZWRBTFQ6IEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQgfCBudWxsID0gbnVsbDtcblxuICAgIGlmICghYWx0UHVia2V5ICYmIG51bU9wdGlvbnMgPj0gMykge1xuICAgICAgY29uc29sZS5sb2coYCAgQ3JlYXRpbmcgcmVkZW1wdGlvbiBBTFQgZm9yICR7bnVtT3B0aW9uc30gb3B0aW9ucy4uLmApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jcmVhdGVSZWRlbXB0aW9uQUxUKGNyZWF0b3IsIHByb3Bvc2FsUGRhKTtcbiAgICAgIGFsdFB1YmtleSA9IHJlc3VsdC5hbHRBZGRyZXNzO1xuICAgICAgY29uc29sZS5sb2coYCAg4pyTIFJlZGVtcHRpb24gQUxUIGNyZWF0ZWQ6ICR7YWx0UHVia2V5LnRvQmFzZTU4KCl9YCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIEFMVCB0byBiZSBmdWxseSBhdmFpbGFibGUgd2l0aCBhbGwgYWRkcmVzc2VzXG4gICAgICAvLyBVc2UgbG9uZ2VyIGRlbGF5cyBhZnRlciBleHRlbmRpbmcgdG8gZW5zdXJlIHByb3BhZ2F0aW9uXG4gICAgICBjb25zb2xlLmxvZyhgICBXYWl0aW5nIGZvciBBTFQgcHJvcGFnYXRpb24uLi5gKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzc2VzID0gMTggKyAobnVtT3B0aW9ucyAqIDQpOyAvLyBCYXNlIGFjY291bnRzICsgcGVyLW9wdGlvbiBhY2NvdW50c1xuICAgICAgbGV0IGF0dGVtcHRzID0gMDtcblxuICAgICAgLy8gSW5pdGlhbCBkZWxheSBhZnRlciBleHRlbnNpb25cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDAwKSk7XG5cbiAgICAgIHdoaWxlIChhdHRlbXB0cyA8IDMwKSB7XG4gICAgICAgIGNvbnN0IGFsdEFjY291bnQgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmdldEFkZHJlc3NMb29rdXBUYWJsZShhbHRQdWJrZXksIHtcbiAgICAgICAgICBjb21taXRtZW50OiAnY29uZmlybWVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbHRBY2NvdW50LnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgYWRkcmVzc0NvdW50ID0gYWx0QWNjb3VudC52YWx1ZS5zdGF0ZS5hZGRyZXNzZXMubGVuZ3RoO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIEF0dGVtcHQgJHthdHRlbXB0cyArIDF9OiBBTFQgaGFzICR7YWRkcmVzc0NvdW50fS8ke2V4cGVjdGVkQWRkcmVzc2VzfSBhZGRyZXNzZXNgKTtcbiAgICAgICAgICBpZiAoYWRkcmVzc0NvdW50ID49IGV4cGVjdGVkQWRkcmVzc2VzKSB7XG4gICAgICAgICAgICB2ZXJpZmllZEFMVCA9IGFsdEFjY291bnQudmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICDinJMgQUxUIHZlcmlmaWVkIHdpdGggJHthZGRyZXNzQ291bnR9IGFkZHJlc3Nlc2ApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICB9XG5cbiAgICAgIGlmICghdmVyaWZpZWRBTFQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBTFQgZmFpbGVkIHRvIHBvcHVsYXRlIHdpdGggZXhwZWN0ZWQgJHtleHBlY3RlZEFkZHJlc3Nlc30gYWRkcmVzc2VzIGFmdGVyICR7YXR0ZW1wdHN9IGF0dGVtcHRzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFhbHRQdWJrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFMVCBhZGRyZXNzIHJlcXVpcmVkIGZvciBtdWx0aS1vcHRpb24gcmVkZW1wdGlvblwiKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBBTFQgaWYgd2UgZG9uJ3QgaGF2ZSBpdCB2ZXJpZmllZCBhbHJlYWR5XG4gICAgaWYgKCF2ZXJpZmllZEFMVCkge1xuICAgICAgdmVyaWZpZWRBTFQgPSBhd2FpdCB0aGlzLmZldGNoQUxUKGFsdFB1YmtleSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGF3YWl0IGJ1aWxkZXIuaW5zdHJ1Y3Rpb24oKTtcbiAgICBjb25zdCBjb21wdXRlQnVkZ2V0SXggPSBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdExpbWl0KHsgdW5pdHM6IDUwMF8wMDAgfSk7XG5cbiAgICAvLyBHZXQgZnJlc2ggYmxvY2toYXNoXG4gICAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCk7XG5cbiAgICAvLyBCdWlsZCB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHZlcmlmaWVkIEFMVCAobm8gcmUtZmV0Y2gpXG4gICAgY29uc3QgdmVyc2lvbmVkVHggPSB0aGlzLmJ1aWxkVmVyc2lvbmVkVHhXaXRoQUxUKFxuICAgICAgY3JlYXRvcixcbiAgICAgIFtjb21wdXRlQnVkZ2V0SXgsIGluc3RydWN0aW9uXSxcbiAgICAgIHZlcmlmaWVkQUxULFxuICAgICAgYmxvY2toYXNoLFxuICAgICk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBmb3IgdGhlIGNhbGxlciB0byBzaWduIGFuZCBzZW5kXG4gICAgLy8gVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byB1c2UgdGhlaXIgb3duIHNpZ25pbmcgbWVjaGFuaXNtIChlLmcuLCBrZXlwYWlyLnNpZ24pXG4gICAgcmV0dXJuIHsgdmVyc2lvbmVkVHgsIGFsdEFkZHJlc3M6IGFsdFB1YmtleSwgbnVtT3B0aW9ucyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBzZW5kIGEgc2lnbmVkIHZlcnNpb25lZCB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHNlbmRWZXJzaW9uZWRUcmFuc2FjdGlvbihcbiAgICBzaWduZWRUeDogVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIgYXMgQW5jaG9yUHJvdmlkZXI7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5zZW5kVHJhbnNhY3Rpb24oc2lnbmVkVHgsIHtcbiAgICAgIHNraXBQcmVmbGlnaHQ6IGZhbHNlLFxuICAgICAgcHJlZmxpZ2h0Q29tbWl0bWVudDogJ2NvbmZpcm1lZCcsXG4gICAgfSk7XG4gICAgYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnbmF0dXJlLCAnY29uZmlybWVkJyk7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfVxuXG4gIC8qIEFkZHJlc3MgTG9va3VwIFRhYmxlICovXG5cbiAgYXN5bmMgY3JlYXRlUHJvcG9zYWxBTFQoXG4gICAgY3JlYXRvcjogUHVibGljS2V5LFxuICAgIG1vZGVyYXRvclBkYTogUHVibGljS2V5LFxuICAgIG51bU9wdGlvbnM6IG51bWJlciA9IDIsXG4gICk6IFByb21pc2U8eyBhbHRBZGRyZXNzOiBQdWJsaWNLZXkgfT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm9ncmFtLnByb3ZpZGVyIGFzIEFuY2hvclByb3ZpZGVyO1xuICAgIGNvbnN0IG1vZGVyYXRvciA9IGF3YWl0IHRoaXMuZmV0Y2hNb2RlcmF0b3IobW9kZXJhdG9yUGRhKTtcbiAgICBjb25zdCBwcm9wb3NhbElkID0gbW9kZXJhdG9yLnByb3Bvc2FsSWRDb3VudGVyO1xuICAgIGNvbnN0IFtwcm9wb3NhbFBkYV0gPSB0aGlzLmRlcml2ZVByb3Bvc2FsUERBKG1vZGVyYXRvclBkYSwgcHJvcG9zYWxJZCk7XG4gICAgY29uc3QgW3ZhdWx0UGRhXSA9IGRlcml2ZVZhdWx0UERBKHByb3Bvc2FsUGRhLCBwcm9wb3NhbElkLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG5cbiAgICBjb25zdCBhZGRyZXNzZXM6IFB1YmxpY0tleVtdID0gW1xuICAgICAgLy8gUHJvZ3JhbXNcbiAgICAgIHRoaXMucHJvZ3JhbUlkLFxuICAgICAgdGhpcy52YXVsdC5wcm9ncmFtSWQsXG4gICAgICB0aGlzLmFtbS5wcm9ncmFtSWQsXG4gICAgICBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCxcbiAgICAgIFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gICAgICAvLyBDb3JlIGFjY291bnRzXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICBwcm9wb3NhbFBkYSxcbiAgICAgIHZhdWx0UGRhLFxuICAgICAgbW9kZXJhdG9yLmJhc2VNaW50LFxuICAgICAgbW9kZXJhdG9yLnF1b3RlTWludCxcbiAgICAgIEZFRV9BVVRIT1JJVFksXG4gICAgICAvLyBWYXVsdCB0b2tlbiBhY2NvdW50c1xuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLmJhc2VNaW50LCB2YXVsdFBkYSwgdHJ1ZSksXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IucXVvdGVNaW50LCB2YXVsdFBkYSwgdHJ1ZSksXG4gICAgICAvLyBDcmVhdG9yJ3MgYmFzZS9xdW90ZSBBVEFzXG4gICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtb2RlcmF0b3IuYmFzZU1pbnQsIGNyZWF0b3IpLFxuICAgICAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobW9kZXJhdG9yLnF1b3RlTWludCwgY3JlYXRvciksXG4gICAgXTtcblxuICAgIC8vIFBlci1vcHRpb24gYWNjb3VudHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9wdGlvbnM7IGkrKykge1xuICAgICAgY29uc3QgW2NvbmRCYXNlTWludF0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQodmF1bHRQZGEsIFZhdWx0VHlwZS5CYXNlLCBpLCB0aGlzLnZhdWx0LnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBbY29uZFF1b3RlTWludF0gPSBkZXJpdmVDb25kaXRpb25hbE1pbnQodmF1bHRQZGEsIFZhdWx0VHlwZS5RdW90ZSwgaSwgdGhpcy52YXVsdC5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Bvb2xdID0gZGVyaXZlUG9vbFBEQShwcm9wb3NhbFBkYSwgY29uZFF1b3RlTWludCwgY29uZEJhc2VNaW50LCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgW3Jlc2VydmVBXSA9IGRlcml2ZVJlc2VydmVQREEocG9vbCwgY29uZFF1b3RlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtyZXNlcnZlQl0gPSBkZXJpdmVSZXNlcnZlUERBKHBvb2wsIGNvbmRCYXNlTWludCwgdGhpcy5hbW0ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IFtmZWVWYXVsdF0gPSBkZXJpdmVGZWVWYXVsdFBEQShwb29sLCB0aGlzLmFtbS5wcm9ncmFtSWQpO1xuXG4gICAgICBhZGRyZXNzZXMucHVzaChcbiAgICAgICAgY29uZEJhc2VNaW50LFxuICAgICAgICBjb25kUXVvdGVNaW50LFxuICAgICAgICBwb29sLFxuICAgICAgICByZXNlcnZlQSxcbiAgICAgICAgcmVzZXJ2ZUIsXG4gICAgICAgIGZlZVZhdWx0LFxuICAgICAgICAvLyBDcmVhdG9yJ3MgY29uZGl0aW9uYWwgdG9rZW4gQVRBc1xuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kQmFzZU1pbnQsIGNyZWF0b3IpLFxuICAgICAgICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhjb25kUXVvdGVNaW50LCBjcmVhdG9yKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtb3N0IHJlY2VudCBzbG90IHVzaW5nIFwiZmluYWxpemVkXCIgY29tbWl0bWVudCBmb3Igc3RhYmlsaXR5XG4gICAgY29uc3Qgc2xvdCA9IGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0U2xvdChcImZpbmFsaXplZFwiKTtcblxuICAgIGNvbnN0IFtjcmVhdGVJeCwgYWx0QWRkcmVzc10gPSBBZGRyZXNzTG9va3VwVGFibGVQcm9ncmFtLmNyZWF0ZUxvb2t1cFRhYmxlKHtcbiAgICAgIGF1dGhvcml0eTogY3JlYXRvcixcbiAgICAgIHBheWVyOiBjcmVhdG9yLFxuICAgICAgcmVjZW50U2xvdDogc2xvdCxcbiAgICB9KTtcblxuICAgIC8vIFNlbmQgY3JlYXRlIHRyYW5zYWN0aW9uIGltbWVkaWF0ZWx5LCBza2lwIHByZWZsaWdodCB0byBhdm9pZCBzbG90IHRpbWluZyBpc3N1ZXNcbiAgICBjb25zdCBjcmVhdGVUeCA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChjcmVhdGVJeCk7XG4gICAgY3JlYXRlVHgucmVjZW50QmxvY2toYXNoID0gKGF3YWl0IHByb3ZpZGVyLmNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCkpLmJsb2NraGFzaDtcbiAgICBjcmVhdGVUeC5mZWVQYXllciA9IGNyZWF0b3I7XG4gICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBwcm92aWRlci53YWxsZXQuc2lnblRyYW5zYWN0aW9uKGNyZWF0ZVR4KTtcbiAgICBjb25zdCBzaWcgPSBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLnNlbmRSYXdUcmFuc2FjdGlvbihzaWduZWRUeC5zZXJpYWxpemUoKSwge1xuICAgICAgc2tpcFByZWZsaWdodDogdHJ1ZSxcbiAgICB9KTtcbiAgICBhd2FpdCBwcm92aWRlci5jb25uZWN0aW9uLmNvbmZpcm1UcmFuc2FjdGlvbihzaWcsIFwiY29uZmlybWVkXCIpO1xuXG4gICAgLy8gU3BsaXQgYWRkcmVzc2VzIGludG8gY2h1bmtzIHRvIGF2b2lkIHRyYW5zYWN0aW9uIHNpemUgbGltaXRzXG4gICAgLy8gRWFjaCBhZGRyZXNzIGlzIDMyIGJ5dGVzLCB+MjAgYWRkcmVzc2VzIHBlciBleHRlbmQgaW5zdHJ1Y3Rpb24gaXMgc2FmZVxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAyMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgY2h1bmsgPSBhZGRyZXNzZXMuc2xpY2UoaSwgaSArIENIVU5LX1NJWkUpO1xuICAgICAgY29uc3QgZXh0ZW5kSXggPSBBZGRyZXNzTG9va3VwVGFibGVQcm9ncmFtLmV4dGVuZExvb2t1cFRhYmxlKHtcbiAgICAgICAgcGF5ZXI6IGNyZWF0b3IsXG4gICAgICAgIGF1dGhvcml0eTogY3JlYXRvcixcbiAgICAgICAgbG9va3VwVGFibGU6IGFsdEFkZHJlc3MsXG4gICAgICAgIGFkZHJlc3NlczogY2h1bmssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dGVuZFR4ID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGV4dGVuZEl4KTtcbiAgICAgIGF3YWl0IHByb3ZpZGVyLnNlbmRBbmRDb25maXJtKGV4dGVuZFR4KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBhbHRBZGRyZXNzIH07XG4gIH1cblxuICBhc3luYyBmZXRjaEFMVChhbHRBZGRyZXNzOiBQdWJsaWNLZXkpOiBQcm9taXNlPEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQ+IHtcbiAgICBjb25zdCBhbHQgPSBhd2FpdCB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbi5nZXRBZGRyZXNzTG9va3VwVGFibGUoYWx0QWRkcmVzcyk7XG4gICAgaWYgKCFhbHQudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFMVCBub3QgZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBhbHQudmFsdWU7XG4gIH1cblxuICBhc3luYyBidWlsZFZlcnNpb25lZFR4KFxuICAgIHBheWVyOiBQdWJsaWNLZXksXG4gICAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gICAgYWx0QWRkcmVzczogUHVibGljS2V5LFxuICApOiBQcm9taXNlPFZlcnNpb25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb2dyYW0ucHJvdmlkZXIgYXMgQW5jaG9yUHJvdmlkZXI7XG4gICAgY29uc3QgYWx0ID0gYXdhaXQgdGhpcy5mZXRjaEFMVChhbHRBZGRyZXNzKTtcbiAgICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgcHJvdmlkZXIuY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKTtcbiAgICByZXR1cm4gdGhpcy5idWlsZFZlcnNpb25lZFR4V2l0aEFMVChwYXllciwgaW5zdHJ1Y3Rpb25zLCBhbHQsIGJsb2NraGFzaCk7XG4gIH1cblxuICBidWlsZFZlcnNpb25lZFR4V2l0aEFMVChcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICAgIGFsdDogQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgICBibG9ja2hhc2g6IHN0cmluZyxcbiAgKTogVmVyc2lvbmVkVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHBheWVyS2V5OiBwYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYmxvY2toYXNoLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgIH0pLmNvbXBpbGVUb1YwTWVzc2FnZShbYWx0XSk7XG5cbiAgICByZXR1cm4gbmV3IFZlcnNpb25lZFRyYW5zYWN0aW9uKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyogREFPIE1ldGhvZHMgKi9cblxuICBkZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYTogUHVibGljS2V5LCBuYW1lOiBzdHJpbmcpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgICByZXR1cm4gZGVyaXZlTWludENyZWF0ZUtleVBEQShkYW9QZGEsIG5hbWUsIHRoaXMucHJvZ3JhbUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTcXVhZHNQcm9ncmFtQ29uZmlnKCkge1xuICAgIGNvbnN0IFtwcm9ncmFtQ29uZmlnUGRhXSA9IG11bHRpc2lnLmdldFByb2dyYW1Db25maWdQZGEoe1xuICAgICAgcHJvZ3JhbUlkOiBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9ncmFtQ29uZmlnID0gYXdhaXQgbXVsdGlzaWcuYWNjb3VudHMuUHJvZ3JhbUNvbmZpZy5mcm9tQWNjb3VudEFkZHJlc3MoXG4gICAgICB0aGlzLnByb2dyYW0ucHJvdmlkZXIuY29ubmVjdGlvbixcbiAgICAgIHByb2dyYW1Db25maWdQZGFcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9ncmFtQ29uZmlnOiBwcm9ncmFtQ29uZmlnUGRhLFxuICAgICAgcHJvZ3JhbUNvbmZpZ1RyZWFzdXJ5OiBwcm9ncmFtQ29uZmlnLnRyZWFzdXJ5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGRlcml2ZU11bHRpc2lnUGRhKGNyZWF0ZUtleTogUHVibGljS2V5KTogUHVibGljS2V5IHtcbiAgICBjb25zdCBbbXVsdGlzaWdQZGFdID0gbXVsdGlzaWcuZ2V0TXVsdGlzaWdQZGEoe1xuICAgICAgY3JlYXRlS2V5LFxuICAgICAgcHJvZ3JhbUlkOiBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICB9KTtcbiAgICByZXR1cm4gbXVsdGlzaWdQZGE7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUGFyZW50REFPKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50QWRtaW46IFB1YmxpY0tleSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYmFzZU1pbnQ6IFB1YmxpY0tleSxcbiAgICBxdW90ZU1pbnQ6IFB1YmxpY0tleSxcbiAgICB0cmVhc3VyeUNvc2lnbmVyOiBQdWJsaWNLZXksXG4gICAgcG9vbDogUHVibGljS2V5LFxuICAgIHBvb2xUeXBlOiBQb29sVHlwZSxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFtkYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEobmFtZSk7XG4gICAgY29uc3QgW21vZGVyYXRvclBkYV0gPSB0aGlzLmRlcml2ZU1vZGVyYXRvclBEQShuYW1lKTtcbiAgICBjb25zdCBbbWludENyZWF0ZUtleVBkYV0gPSB0aGlzLmRlcml2ZU1pbnRDcmVhdGVLZXlQREEoZGFvUGRhLCBuYW1lKTtcblxuICAgIC8vIERlcml2ZSBTcXVhZHMgYWNjb3VudHMgKHNpbmdsZSBSUEMgY2FsbClcbiAgICBjb25zdCBzcXVhZHNDb25maWcgPSBhd2FpdCB0aGlzLmZldGNoU3F1YWRzUHJvZ3JhbUNvbmZpZygpO1xuICAgIGNvbnN0IHRyZWFzdXJ5TXVsdGlzaWdQZGEgPSB0aGlzLmRlcml2ZU11bHRpc2lnUGRhKGRhb1BkYSk7XG4gICAgY29uc3QgbWludE11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShtaW50Q3JlYXRlS2V5UGRhKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0aWFsaXplUGFyZW50REFPKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgYWRtaW4sXG4gICAgICBwYXJlbnRBZG1pbixcbiAgICAgIGRhb1BkYSxcbiAgICAgIG1vZGVyYXRvclBkYSxcbiAgICAgIGJhc2VNaW50LFxuICAgICAgcXVvdGVNaW50LFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWcsXG4gICAgICBzcXVhZHNDb25maWcucHJvZ3JhbUNvbmZpZ1RyZWFzdXJ5LFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRDcmVhdGVLZXlQZGEsXG4gICAgICBTUVVBRFNfUFJPR1JBTV9JRCxcbiAgICAgIG5hbWUsXG4gICAgICB0cmVhc3VyeUNvc2lnbmVyLFxuICAgICAgcG9vbCxcbiAgICAgIHBvb2xUeXBlXG4gICAgKS5wcmVJbnN0cnVjdGlvbnModGhpcy5tYXliZUFkZENvbXB1dGVCdWRnZXQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBkYW9QZGEsXG4gICAgICBtb2RlcmF0b3JQZGEsXG4gICAgICB0cmVhc3VyeU11bHRpc2lnOiB0cmVhc3VyeU11bHRpc2lnUGRhLFxuICAgICAgbWludE11bHRpc2lnOiBtaW50TXVsdGlzaWdQZGEsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemVDaGlsZERBTyhcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIHBhcmVudEFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50RGFvTmFtZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleSxcbiAgICB0cmVhc3VyeUNvc2lnbmVyOiBQdWJsaWNLZXksXG4gICAgb3B0aW9ucz86IFR4T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBbZGFvUGRhXSA9IHRoaXMuZGVyaXZlREFPUERBKG5hbWUpO1xuICAgIGNvbnN0IFtwYXJlbnREYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEocGFyZW50RGFvTmFtZSk7XG4gICAgY29uc3QgW21pbnRDcmVhdGVLZXlQZGFdID0gdGhpcy5kZXJpdmVNaW50Q3JlYXRlS2V5UERBKGRhb1BkYSwgbmFtZSk7XG5cbiAgICAvLyBEZXJpdmUgU3F1YWRzIGFjY291bnRzIChzaW5nbGUgUlBDIGNhbGwpXG4gICAgY29uc3Qgc3F1YWRzQ29uZmlnID0gYXdhaXQgdGhpcy5mZXRjaFNxdWFkc1Byb2dyYW1Db25maWcoKTtcbiAgICBjb25zdCB0cmVhc3VyeU11bHRpc2lnUGRhID0gdGhpcy5kZXJpdmVNdWx0aXNpZ1BkYShkYW9QZGEpO1xuICAgIGNvbnN0IG1pbnRNdWx0aXNpZ1BkYSA9IHRoaXMuZGVyaXZlTXVsdGlzaWdQZGEobWludENyZWF0ZUtleVBkYSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gaW5pdGlhbGl6ZUNoaWxkREFPKFxuICAgICAgdGhpcy5wcm9ncmFtLFxuICAgICAgYWRtaW4sXG4gICAgICBwYXJlbnRBZG1pbixcbiAgICAgIGRhb1BkYSxcbiAgICAgIHBhcmVudERhb1BkYSxcbiAgICAgIHRva2VuTWludCxcbiAgICAgIHNxdWFkc0NvbmZpZy5wcm9ncmFtQ29uZmlnLFxuICAgICAgc3F1YWRzQ29uZmlnLnByb2dyYW1Db25maWdUcmVhc3VyeSxcbiAgICAgIHRyZWFzdXJ5TXVsdGlzaWdQZGEsXG4gICAgICBtaW50TXVsdGlzaWdQZGEsXG4gICAgICBtaW50Q3JlYXRlS2V5UGRhLFxuICAgICAgU1FVQURTX1BST0dSQU1fSUQsXG4gICAgICBuYW1lLFxuICAgICAgdHJlYXN1cnlDb3NpZ25lclxuICAgICkucHJlSW5zdHJ1Y3Rpb25zKHRoaXMubWF5YmVBZGRDb21wdXRlQnVkZ2V0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWlsZGVyLFxuICAgICAgZGFvUGRhLFxuICAgICAgcGFyZW50RGFvUGRhLFxuICAgICAgdHJlYXN1cnlNdWx0aXNpZzogdHJlYXN1cnlNdWx0aXNpZ1BkYSxcbiAgICAgIG1pbnRNdWx0aXNpZzogbWludE11bHRpc2lnUGRhLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGdyYWRlREFPKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgcGFyZW50QWRtaW46IFB1YmxpY0tleSxcbiAgICBkYW9OYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50RGFvTmFtZTogc3RyaW5nLFxuICAgIGJhc2VNaW50OiBQdWJsaWNLZXksXG4gICAgcXVvdGVNaW50OiBQdWJsaWNLZXksXG4gICAgcG9vbDogUHVibGljS2V5LFxuICAgIHBvb2xUeXBlOiBQb29sVHlwZSxcbiAgICBvcHRpb25zPzogVHhPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IFtkYW9QZGFdID0gdGhpcy5kZXJpdmVEQU9QREEoZGFvTmFtZSk7XG4gICAgY29uc3QgW3BhcmVudERhb1BkYV0gPSB0aGlzLmRlcml2ZURBT1BEQShwYXJlbnREYW9OYW1lKTtcbiAgICBjb25zdCBbbW9kZXJhdG9yUGRhXSA9IHRoaXMuZGVyaXZlTW9kZXJhdG9yUERBKGRhb05hbWUpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IHVwZ3JhZGVEQU8oXG4gICAgICB0aGlzLnByb2dyYW0sXG4gICAgICBhZG1pbixcbiAgICAgIHBhcmVudEFkbWluLFxuICAgICAgZGFvUGRhLFxuICAgICAgcGFyZW50RGFvUGRhLFxuICAgICAgbW9kZXJhdG9yUGRhLFxuICAgICAgYmFzZU1pbnQsXG4gICAgICBxdW90ZU1pbnQsXG4gICAgICBwb29sLFxuICAgICAgcG9vbFR5cGVcbiAgICApLnByZUluc3RydWN0aW9ucyh0aGlzLm1heWJlQWRkQ29tcHV0ZUJ1ZGdldChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4geyBidWlsZGVyLCBkYW9QZGEsIG1vZGVyYXRvclBkYSB9O1xuICB9XG59XG4iXX0=
|