drama-pm-client 0.4.13 → 0.4.14
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/index.d.ts +6 -0
- package/dist/index.js +46 -43
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,12 @@ export interface PriorityFeeOptions {
|
|
|
15
15
|
/** Maximum compute units for the transaction (default: 200,000 for normal txs, 400,000 for complex ones) */
|
|
16
16
|
computeUnitLimit?: number;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Default priority fee options used when caller does not provide priorityFeeOptions.
|
|
20
|
+
* computeUnitPrice: 100,000 micro-lamports/CU — suitable for most network conditions.
|
|
21
|
+
* computeUnitLimit is not set here; each method applies its own default.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_PRIORITY_FEE: PriorityFeeOptions;
|
|
18
24
|
export interface CreateMarketParams {
|
|
19
25
|
admin: PublicKey;
|
|
20
26
|
marketId: number | BN;
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,14 @@ import { IDL } from "./idl.js";
|
|
|
6
6
|
import { getGlobalConfigPda, getMarketPda, getMarketPdas, getVaultPda, NO_MINT_SEED, VAULT_SEED, YES_MINT_SEED } from "./utils.js";
|
|
7
7
|
export * from "./utils.js";
|
|
8
8
|
export { IDL };
|
|
9
|
+
/**
|
|
10
|
+
* Default priority fee options used when caller does not provide priorityFeeOptions.
|
|
11
|
+
* computeUnitPrice: 100,000 micro-lamports/CU — suitable for most network conditions.
|
|
12
|
+
* computeUnitLimit is not set here; each method applies its own default.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_PRIORITY_FEE = {
|
|
15
|
+
computeUnitPrice: 100000,
|
|
16
|
+
};
|
|
9
17
|
export class DramaPmClient {
|
|
10
18
|
constructor(connection, wallet, programId) {
|
|
11
19
|
this.connection = connection;
|
|
@@ -212,19 +220,17 @@ export class DramaPmClient {
|
|
|
212
220
|
*/
|
|
213
221
|
async buildCreateMarketTx(params, priorityFeeOptions) {
|
|
214
222
|
const tx = new Transaction();
|
|
215
|
-
// Add priority fee instructions if
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
223
|
+
// Add priority fee instructions (use default if not provided)
|
|
224
|
+
const feeOpts = priorityFeeOptions ?? DEFAULT_PRIORITY_FEE;
|
|
225
|
+
// Set compute unit limit (createMarket is a complex tx, default to 400k)
|
|
226
|
+
const computeUnitLimit = feeOpts.computeUnitLimit ?? 400000;
|
|
227
|
+
tx.add(ComputeBudgetProgram.setComputeUnitLimit({
|
|
228
|
+
units: computeUnitLimit,
|
|
229
|
+
}));
|
|
230
|
+
if (feeOpts.computeUnitPrice !== undefined && feeOpts.computeUnitPrice > 0) {
|
|
231
|
+
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
232
|
+
microLamports: feeOpts.computeUnitPrice,
|
|
221
233
|
}));
|
|
222
|
-
// Set compute unit price if specified
|
|
223
|
-
if (priorityFeeOptions.computeUnitPrice !== undefined && priorityFeeOptions.computeUnitPrice > 0) {
|
|
224
|
-
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
225
|
-
microLamports: priorityFeeOptions.computeUnitPrice,
|
|
226
|
-
}));
|
|
227
|
-
}
|
|
228
234
|
}
|
|
229
235
|
const ix = await this.createMarket(params);
|
|
230
236
|
tx.add(ix);
|
|
@@ -765,17 +771,16 @@ export class DramaPmClient {
|
|
|
765
771
|
// allowOwnerOffCurve for multisig/PDA fee recipients
|
|
766
772
|
const feeRecipientToken = getAssociatedTokenAddressSync(marketInfo.bettingToken, feeRecipientAddress, true);
|
|
767
773
|
const tx = new Transaction();
|
|
768
|
-
// Add priority fee instructions if
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
774
|
+
// Add priority fee instructions (use default if not provided)
|
|
775
|
+
const feeOpts = priorityFeeOptions ?? DEFAULT_PRIORITY_FEE;
|
|
776
|
+
const computeUnitLimit = feeOpts.computeUnitLimit ?? 400000;
|
|
777
|
+
tx.add(ComputeBudgetProgram.setComputeUnitLimit({
|
|
778
|
+
units: computeUnitLimit,
|
|
779
|
+
}));
|
|
780
|
+
if (feeOpts.computeUnitPrice !== undefined && feeOpts.computeUnitPrice > 0) {
|
|
781
|
+
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
782
|
+
microLamports: feeOpts.computeUnitPrice,
|
|
773
783
|
}));
|
|
774
|
-
if (priorityFeeOptions.computeUnitPrice !== undefined && priorityFeeOptions.computeUnitPrice > 0) {
|
|
775
|
-
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
776
|
-
microLamports: priorityFeeOptions.computeUnitPrice,
|
|
777
|
-
}));
|
|
778
|
-
}
|
|
779
784
|
}
|
|
780
785
|
// Check if fee recipient token account exists and create if needed
|
|
781
786
|
const feeRecipientAtaExists = await this.ataExists(feeRecipientToken);
|
|
@@ -830,17 +835,16 @@ export class DramaPmClient {
|
|
|
830
835
|
// allowOwnerOffCurve for multisig/PDA fee recipients
|
|
831
836
|
const feeRecipientToken = getAssociatedTokenAddressSync(marketInfo.bettingToken, feeRecipientAddress, true);
|
|
832
837
|
const tx = new Transaction();
|
|
833
|
-
// Add priority fee instructions if
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
+
// Add priority fee instructions (use default if not provided)
|
|
839
|
+
const feeOpts = priorityFeeOptions ?? DEFAULT_PRIORITY_FEE;
|
|
840
|
+
const computeUnitLimit = feeOpts.computeUnitLimit ?? 400000;
|
|
841
|
+
tx.add(ComputeBudgetProgram.setComputeUnitLimit({
|
|
842
|
+
units: computeUnitLimit,
|
|
843
|
+
}));
|
|
844
|
+
if (feeOpts.computeUnitPrice !== undefined && feeOpts.computeUnitPrice > 0) {
|
|
845
|
+
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
846
|
+
microLamports: feeOpts.computeUnitPrice,
|
|
838
847
|
}));
|
|
839
|
-
if (priorityFeeOptions.computeUnitPrice !== undefined && priorityFeeOptions.computeUnitPrice > 0) {
|
|
840
|
-
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
841
|
-
microLamports: priorityFeeOptions.computeUnitPrice,
|
|
842
|
-
}));
|
|
843
|
-
}
|
|
844
848
|
}
|
|
845
849
|
// Check if fee recipient token account exists and create if needed
|
|
846
850
|
const feeRecipientAtaExists = await this.ataExists(feeRecipientToken);
|
|
@@ -1046,17 +1050,16 @@ export class DramaPmClient {
|
|
|
1046
1050
|
async buildClaimBurnMarketTx(params, priorityFeeOptions) {
|
|
1047
1051
|
const { user, market } = params;
|
|
1048
1052
|
const tx = new Transaction();
|
|
1049
|
-
// Add priority fee instructions if
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1053
|
+
// Add priority fee instructions (use default if not provided)
|
|
1054
|
+
const feeOpts = priorityFeeOptions ?? DEFAULT_PRIORITY_FEE;
|
|
1055
|
+
const computeUnitLimit = feeOpts.computeUnitLimit ?? 400000;
|
|
1056
|
+
tx.add(ComputeBudgetProgram.setComputeUnitLimit({
|
|
1057
|
+
units: computeUnitLimit,
|
|
1058
|
+
}));
|
|
1059
|
+
if (feeOpts.computeUnitPrice !== undefined && feeOpts.computeUnitPrice > 0) {
|
|
1060
|
+
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
1061
|
+
microLamports: feeOpts.computeUnitPrice,
|
|
1054
1062
|
}));
|
|
1055
|
-
if (priorityFeeOptions.computeUnitPrice !== undefined && priorityFeeOptions.computeUnitPrice > 0) {
|
|
1056
|
-
tx.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
1057
|
-
microLamports: priorityFeeOptions.computeUnitPrice,
|
|
1058
|
-
}));
|
|
1059
|
-
}
|
|
1060
1063
|
}
|
|
1061
1064
|
// Derive PDAs
|
|
1062
1065
|
const yesMint = PublicKey.findProgramAddressSync([Buffer.from(YES_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
@@ -1254,4 +1257,4 @@ export class DramaPmClient {
|
|
|
1254
1257
|
}
|
|
1255
1258
|
}
|
|
1256
1259
|
}
|
|
1257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1CQUFtQixDQUFDO0FBRW5HLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV2QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLE9BQU8sRUFDUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLFdBQVcsRUFDWCxzQkFBc0IsRUFDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9CLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2QsTUFBTSxZQUFZLENBQUM7QUFFcEIsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUFXLEdBQUcsRUFBRSxDQUFDO0FBdUl4QixNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUFZLFVBQXNCLEVBQUUsTUFBZSxFQUFFLFNBQXFCO1FBQ3hFLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBRTdCLDJDQUEyQztRQUMzQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsTUFBTSxhQUFhLEdBQVc7WUFDNUIsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTO1lBQ25DLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2pDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxD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X0lELFxuICBjcmVhdGVUcmFuc2Zlckluc3RydWN0aW9uLFxuICBnZXRBY2NvdW50LFxuICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBUT0tFTl9QUk9HUkFNX0lEXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuXG5pbXBvcnQgeyBQcm9ncmFtIGFzIEFuY2hvclByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBJZGwsIFByb2dyYW0sIFdhbGxldCB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCI7XG5cbmltcG9ydCB7XG4gIENvbXB1dGVCdWRnZXRQcm9ncmFtLFxuICBDb25uZWN0aW9uLFxuICBLZXlwYWlyLFxuICBQdWJsaWNLZXksXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7IElETCB9IGZyb20gXCIuL2lkbC5qc1wiO1xuaW1wb3J0IHsgRHJhbWFQbSB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRHbG9iYWxDb25maWdQZGEsXG4gIGdldE1hcmtldFBkYSxcbiAgZ2V0TWFya2V0UGRhcyxcbiAgZ2V0VmF1bHRQZGEsXG4gIE5PX01JTlRfU0VFRCxcbiAgVkFVTFRfU0VFRCxcbiAgWUVTX01JTlRfU0VFRFxufSBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy5qc1wiO1xuZXhwb3J0IHsgRHJhbWFQbSwgSURMIH07XG5cbmV4cG9ydCB0eXBlIE91dGNvbWUgPSBcIlllc1wiIHwgXCJOb1wiO1xuXG4vKipcbiAqIFByaW9yaXR5IGZlZSBvcHRpb25zIGZvciBhY2NlbGVyYXRpbmcgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpb3JpdHlGZWVPcHRpb25zIHtcbiAgLyoqIFByaWNlIHBlciBjb21wdXRlIHVuaXQgaW4gbWljcm8tbGFtcG9ydHMgKDEgU09MID0gMWU5IGxhbXBvcnRzID0gMWUxNSBtaWNyby1sYW1wb3J0cykgKi9cbiAgY29tcHV0ZVVuaXRQcmljZT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gY29tcHV0ZSB1bml0cyBmb3IgdGhlIHRyYW5zYWN0aW9uIChkZWZhdWx0OiAyMDAsMDAwIGZvciBub3JtYWwgdHhzLCA0MDAsMDAwIGZvciBjb21wbGV4IG9uZXMpICovXG4gIGNvbXB1dGVVbml0TGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTWFya2V0UGFyYW1zIHtcbiAgYWRtaW46IFB1YmxpY0tleTtcbiAgbWFya2V0SWQ6IG51bWJlciB8IEJOO1xuICB5ZXNQcmljZTogbnVtYmVyIHwgQk47XG4gIG5vUHJpY2U6IG51bWJlciB8IEJOO1xuICBlbmRUaW1lOiBudW1iZXIgfCBCTjtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYW1vdW50OiBudW1iZXIgfCBCTjtcbiAgb3V0Y29tZTogT3V0Y29tZTtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleTsgLy8gRmVlIHJlY2lwaWVudCBhZGRyZXNzIChvcHRpb25hbCwgd2lsbCBmZXRjaCBmcm9tIGNvbmZpZyBpZiBub3QgcHJvdmlkZWQpXG4gIGZlZVJlY2lwaWVudFRva2VuPzogUHVibGljS2V5IHwgbnVsbDsgLy8gRmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IChvcHRpb25hbCwgdXNlZCBpbnRlcm5hbGx5IGJ5IGJ1aWxkUGxhY2VCZXRUeClcbiAgY3JlYXRlQXRhPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjcmVhdGUgQVRBIGluc3RydWN0aW9uIGF1dG9tYXRpY2FsbHlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGZWVDb25maWdQYXJhbXMge1xuICBhdXRob3JpdHk6IFB1YmxpY0tleTsgLy8gQ2FuIGJlIGF1dGhvcml0eSBvciBhdXRob3JpemVkIGFkbWluXG4gIG5ld0ZlZUJwczogbnVtYmVyOyAvLyBGZWUgaW4gYmFzaXMgcG9pbnRzICgxIGJwcyA9IDAuMDElLCBtYXggMjAwMCA9IDIwJSlcbiAgbmV3RmVlUmVjaXBpZW50OiBQdWJsaWNLZXk7XG4gIG5ld0ZlZUNsYWltQnBzOiBudW1iZXI7IC8vIEZlZSBmb3IgY2xhaW1pbmcgcmV3YXJkcyBpbiBiYXNpcyBwb2ludHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGFpbVJld2FyZHNQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICBzaGFyZXNUb0NsYWltOiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCA9IGNsYWltIGFsbClcbiAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7IC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwsIHdpbGwgZmV0Y2ggZnJvbSBjb25maWcgaWYgbm90IHByb3ZpZGVkKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoQ2xhaW1QYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIGNsYWltczogQXJyYXk8e1xuICAgIG1hcmtldDogUHVibGljS2V5O1xuICAgIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICAgIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICAgIHNoYXJlc1RvQ2xhaW0/OiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCBvciB1bmRlZmluZWQgPSBjbGFpbSBhbGwpXG4gICAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXNcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmdW5kUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICBvdXRjb21lOiBPdXRjb21lO1xuICB0b2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAvLyBBbW91bnQgb2Ygc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbCBzaGFyZXMuXG4gIGNsb3NlQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIG91dGNvbWUgdG9rZW4gYWNjb3VudCBhZnRlciByZWZ1bmRpbmcgYWxsIHNoYXJlcyAoZGVmYXVsdDogZmFsc2UpXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcmVmdW5kVjIgLSByZWZ1bmRpbmcgYm90aCBZZXMgYW5kIE5vIHBvc2l0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gKiBVc2UgdGhpcyB3aGVuIGEgdXNlciBoYXMgYmV0IG9uIGJvdGggb3V0Y29tZXMgYW5kIHdhbnRzIHRvIHJlZnVuZCBldmVyeXRoaW5nIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVmdW5kVjJQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIHllc1Rva2VuQW1vdW50PzogbnVtYmVyIHwgQk47IC8vIEFtb3VudCBvZiBZZXMgc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbC5cbiAgbm9Ub2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAgLy8gQW1vdW50IG9mIE5vIHNoYXJlcyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkIG1lYW5zIHJlZnVuZCBhbGwuXG4gIGNsb3NlWWVzQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIFllcyBvdXRjb21lIHRva2VuIGFjY291bnQgKGRlZmF1bHQ6IHRydWUpXG4gIGNsb3NlTm9BY2NvdW50PzogYm9vbGVhbjsgIC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIE5vIG91dGNvbWUgdG9rZW4gYWNjb3VudCAoZGVmYXVsdDogdHJ1ZSlcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBjbGFpbV9idXJuX21hcmtldCBpbnN0cnVjdGlvblxuICogQ29tYmluZXMgY2xhaW1pbmcgcmV3YXJkcyAoaWYgd29uKSBhbmQgYnVybmluZyB0b2tlbnMgKGlmIGxvc3QpIGluIG9uZSBjYWxsLlxuICogQWx3YXlzIGNsb3NlcyB0b2tlbiBhY2NvdW50cyB0byByZWNsYWltIHJlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhaW1CdXJuTWFya2V0UGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNYXJrZXRIb2xkUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hcmtldEhvbGRSZXN1bHQge1xuICB5ZXNNaW50OiBQdWJsaWNLZXk7XG4gIG5vTWludDogUHVibGljS2V5O1xuICB5ZXNUb2tlbkJhbGFuY2U6IHN0cmluZzsgLy8gQmFsYW5jZSBhcyBzdHJpbmcgdG8gcHJlc2VydmUgcHJlY2lzaW9uXG4gIG5vVG9rZW5CYWxhbmNlOiBzdHJpbmc7ICAvLyBCYWxhbmNlIGFzIHN0cmluZyB0byBwcmVzZXJ2ZSBwcmVjaXNpb25cbiAgaGFzWWVzVG9rZW5BY2NvdW50OiBib29sZWFuO1xuICBoYXNOb1Rva2VuQWNjb3VudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBwbGFjZUJldFYyIC0gY29tYmluZXMgdXNlciBiZXQgYW5kIGJvbnVzIGFjY291bnQgYmV0IGluIG9uZSB0cmFuc2FjdGlvblxuICogUmVxdWlyZXMgYm90aCB1c2VyIGFuZCBib251c0FjY291bnQgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZUJldFYyUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5OyAgICAgICAgICAgICAgLy8gVXNlcidzIHB1YmxpYyBrZXkgKHNpZ25lcilcbiAgYm9udXNBY2NvdW50OiBQdWJsaWNLZXk7ICAgICAgLy8gQm9udXMgYWNjb3VudCBwdWJsaWMga2V5IChzaWduZXIpXG4gIG1hcmtldDogUHVibGljS2V5OyAgICAgICAgICAgIC8vIE1hcmtldCBQREEgYWRkcmVzc1xuICB1c2VyQW1vdW50OiBudW1iZXIgfCBCTjsgICAgICAvLyBBbW91bnQgdXNlciBwYXlzXG4gIGJvbnVzQW1vdW50OiBudW1iZXIgfCBCTjsgICAgIC8vIEFtb3VudCBib251cyBhY2NvdW50IHBheXNcbiAgb3V0Y29tZTogT3V0Y29tZTsgICAgICAgICAgICAgLy8gT3V0Y29tZSB0byBiZXQgb24gKFllcy9ObylcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7ICAgICAgLy8gQmV0dGluZyB0b2tlbiBtaW50XG4gIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleTsgICAgIC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwpXG4gIGNyZWF0ZUF0YT86IGJvb2xlYW47ICAgICAgICAgIC8vIFdoZXRoZXIgdG8gY3JlYXRlIEFUQSBpbnN0cnVjdGlvbiBhdXRvbWF0aWNhbGx5XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gYnVpbGRQbGFjZUJldFYyVHggY29udGFpbmluZyBib3RoIHRoZSB0cmFuc2FjdGlvbiBhbmQgaXRzIHNlcmlhbGl6ZWQgZm9ybVxuICogZm9yIHNwbGl0IHNpZ25pbmcgd29ya2Zsb3cgKGZyb250ZW5kIHVzZXIgc2lnbiArIGJhY2tlbmQgYm9udXMgc2lnbilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZUJldFYyUmVzdWx0IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyAgICAgLy8gVHJhbnNhY3Rpb24gb2JqZWN0IGZvciBsb2NhbCBzaWduaW5nICh0ZXN0aW5nKVxuICByZXF1aXJlZFNpZ25lcnM6IFB1YmxpY0tleVtdOyAvLyBMaXN0IG9mIHJlcXVpcmVkIHNpZ25lcnMgW3VzZXIsIGJvbnVzQWNjb3VudF1cbn1cblxuZXhwb3J0IGNsYXNzIERyYW1hUG1DbGllbnQge1xuICBwcm9ncmFtOiBQcm9ncmFtPERyYW1hUG0+O1xuICBwcm92aWRlcjogQW5jaG9yUHJvdmlkZXI7XG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgd2FsbGV0PzogV2FsbGV0LCBwcm9ncmFtSWQ/OiBQdWJsaWNLZXkpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgd2FsbGV0IGlmIG5vbmUgcHJvdmlkZWRcbiAgICBjb25zdCBkZWZhdWx0S2V5cGFpciA9IEtleXBhaXIuZ2VuZXJhdGUoKTtcbiAgICBjb25zdCBkZWZhdWx0V2FsbGV0OiBXYWxsZXQgPSB7XG4gICAgICBwdWJsaWNLZXk6IGRlZmF1bHRLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgIHNpZ25UcmFuc2FjdGlvbjogYXN5bmMgKHR4KSA9PiB0eCxcbiAgICAgIHNpZ25BbGxUcmFuc2FjdGlvbnM6IGFzeW5jICh0eHMpID0+IHR4cyxcbiAgICAgIHBheWVyOiBkZWZhdWx0S2V5cGFpcixcbiAgICB9O1xuICAgIFxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgQW5jaG9yUHJvdmlkZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgd2FsbGV0IHx8IGRlZmF1bHRXYWxsZXQsXG4gICAgICB7IGNvbW1pdG1lbnQ6IFwiY29uZmlybWVkXCIgfVxuICAgICk7XG4gICAgXG4gICAgLy8gVXNlIGN1c3RvbSBwcm9ncmFtSWQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgZnJvbSBJRExcbiAgICBjb25zdCBmaW5hbFByb2dyYW1JZCA9IHByb2dyYW1JZCB8fCBuZXcgUHVibGljS2V5KElETC5hZGRyZXNzKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBuZXcgSURMIHdpdGggdGhlIGN1c3RvbSBwcm9ncmFtSWRcbiAgICBjb25zdCBjdXN0b21JZGwgPSB7IC4uLklETCwgYWRkcmVzczogZmluYWxQcm9ncmFtSWQudG9CYXNlNTgoKSB9O1xuICAgIFxuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBBbmNob3JQcm9ncmFtKGN1c3RvbUlkbCBhcyBJZGwsIHRoaXMucHJvdmlkZXIpIGFzIHVua25vd24gYXMgUHJvZ3JhbTxEcmFtYVBtPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJvZ3JhbSBJRFxuICAgKi9cbiAgZ2V0UHJvZ3JhbUlkKCk6IFB1YmxpY0tleSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbmV3IHByb2dyYW0gSUQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgcHJvZ3JhbSBpbnN0YW5jZVxuICAgKiBVc2VmdWwgd2hlbiByZWRlcGxveWluZyB0aGUgcHJvZ3JhbSB0byBhIG5ldyBhZGRyZXNzXG4gICAqL1xuICBzZXRQcm9ncmFtSWQocHJvZ3JhbUlkOiBQdWJsaWNLZXkpOiB2b2lkIHtcbiAgICBjb25zdCBjdXN0b21JZGwgPSB7IC4uLklETCwgYWRkcmVzczogcHJvZ3JhbUlkLnRvQmFzZTU4KCkgfTtcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQW5jaG9yUHJvZ3JhbShjdXN0b21JZGwgYXMgSWRsLCB0aGlzLnByb3ZpZGVyKSBhcyB1bmtub3duIGFzIFByb2dyYW08RHJhbWFQbT47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgYXRhRXhpc3RzKGF0YTogUHVibGljS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCBhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudFxuICAgKiBAcGFyYW0gdG9rZW5Qcm9ncmFtIC0gVG9rZW4gcHJvZ3JhbSBJRCAoVE9LRU5fUFJPR1JBTV9JRCBmb3IgYmV0dGluZyB0b2tlbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEIGZvciBvdXRjb21lIHRva2VucylcbiAgICovXG4gIGNyZWF0ZUF0YUluc3RydWN0aW9uKFxuICAgIHBheWVyOiBQdWJsaWNLZXksXG4gICAgb3duZXI6IFB1YmxpY0tleSxcbiAgICBtaW50OiBQdWJsaWNLZXksXG4gICAgdG9rZW5Qcm9ncmFtOiBQdWJsaWNLZXkgPSBUT0tFTl9QUk9HUkFNX0lEXG4gICk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICAgIGNvbnN0IGF0YSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1pbnQsIG93bmVyLCB0cnVlLCB0b2tlblByb2dyYW0pO1xuICAgIFxuICAgIC8vIFVzZSBDcmVhdGVJZGVtcG90ZW50IGluc3RydWN0aW9uIChvcGNvZGUgMSkgdG8gc3VwcG9ydCBQREFzIGFuZCBpZGVtcG90ZW5jeVxuICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICB7IHB1YmtleTogcGF5ZXIsIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogYXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBvd25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IHRva2VuUHJvZ3JhbSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICAgICAgZGF0YTogQnVmZmVyLmZyb20oWzFdKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGdsb2JhbCBjb25maWd1cmF0aW9uIChBdXRob3JpdHkgb25seSlcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDb25maWcoYXV0aG9yaXR5OiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuaW5pdGlhbGl6ZUNvbmZpZygpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnLFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eSxcbiAgICAgICAgc3lzdGVtUHJvZ3JhbTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBpbml0aWFsaXplIGNvbmZpZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGRJbml0aWFsaXplQ29uZmlnVHgoYXV0aG9yaXR5OiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmluaXRpYWxpemVDb25maWcoYXV0aG9yaXR5KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlIEdsb2JhbENvbmZpZyB0byBuZXcgdmVyc2lvbiB3aXRoIGZlZV9jbGFpbV9icHMgZmllbGQgKEF1dGhvcml0eSBvbmx5KVxuICAgKiBTaG91bGQgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgcHJvZ3JhbSB1cGdyYWRlXG4gICAqL1xuICBhc3luYyBtaWdyYXRlQ29uZmlnKGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLm1pZ3JhdGVDb25maWcoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHksXG4gICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gbWlncmF0ZSBjb25maWdcbiAgICovXG4gIGFzeW5jIGJ1aWxkTWlncmF0ZUNvbmZpZ1R4KGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5taWdyYXRlQ29uZmlnKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGF1dGhvcml6ZWQgYWRtaW4gKEF1dGhvcml0eSBvbmx5KVxuICAgKi9cbiAgYXN5bmMgYWRkQWRtaW4obmV3QWRtaW46IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmFkZEFkbWluKG5ld0FkbWluKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhZG1pblxuICAgKi9cbiAgYXN5bmMgYnVpbGRBZGRBZG1pblR4KG5ld0FkbWluOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmFkZEFkbWluKG5ld0FkbWluKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYXV0aG9yaXplZCBhZG1pbiAoQXV0aG9yaXR5IG9ubHkpXG4gICAqL1xuICBhc3luYyByZW1vdmVBZG1pbihhZG1pblRvUmVtb3ZlOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5yZW1vdmVBZG1pbihhZG1pblRvUmVtb3ZlKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlbW92ZSBhZG1pblxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZW1vdmVBZG1pblR4KGFkbWluVG9SZW1vdmU6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMucmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGZlZSBjb25maWd1cmF0aW9uIChBdXRob3JpdHkgb3IgYXV0aG9yaXplZCBhZG1pbilcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUZlZUNvbmZpZyhwYXJhbXM6IFVwZGF0ZUZlZUNvbmZpZ1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnVwZGF0ZUZlZUNvbmZpZyhwYXJhbXMubmV3RmVlQnBzLCBwYXJhbXMubmV3RmVlUmVjaXBpZW50LCBwYXJhbXMubmV3RmVlQ2xhaW1CcHMpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnOiBnbG9iYWxDb25maWcsXG4gICAgICAgIGF1dGhvcml0eTogcGFyYW1zLmF1dGhvcml0eSxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBmZWUgY29uZmlnXG4gICAqL1xuICBhc3luYyBidWlsZFVwZGF0ZUZlZUNvbmZpZ1R4KHBhcmFtczogVXBkYXRlRmVlQ29uZmlnUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy51cGRhdGVGZWVDb25maWcocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJlZGljdGlvbiBtYXJrZXQgaW5zdHJ1Y3Rpb25cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU1hcmtldChwYXJhbXM6IENyZWF0ZU1hcmtldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgYWRtaW4sIG1hcmtldElkLCB5ZXNQcmljZSwgbm9QcmljZSwgZW5kVGltZSwgYmV0dGluZ1Rva2VuIH0gPSBwYXJhbXM7XG4gICAgXG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgeWVzUHJpY2VCbiA9IG5ldyBCTih5ZXNQcmljZSk7XG4gICAgY29uc3Qgbm9QcmljZUJuID0gbmV3IEJOKG5vUHJpY2UpO1xuICAgIGNvbnN0IGVuZFRpbWVCbiA9IG5ldyBCTihlbmRUaW1lKTtcblxuICAgIGNvbnN0IHBkYXMgPSBnZXRNYXJrZXRQZGFzKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jcmVhdGVNYXJrZXQoe1xuICAgICAgICAgIG1hcmtldElkOiBtYXJrZXRJZEJuLFxuICAgICAgICAgIHllc1ByaWNlOiB5ZXNQcmljZUJuLFxuICAgICAgICAgIG5vUHJpY2U6IG5vUHJpY2VCbixcbiAgICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQm4sXG4gICAgICAgIH0pXG4gICAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgICBtYXJrZXQ6IHBkYXMubWFya2V0LFxuICAgICAgICAgIHllc01pbnQ6IHBkYXMueWVzTWludCxcbiAgICAgICAgICBub01pbnQ6IHBkYXMubm9NaW50LFxuICAgICAgICAgIGJldHRpbmdUb2tlbjogYmV0dGluZ1Rva2VuLFxuICAgICAgICAgIHZhdWx0OiBwZGFzLnZhdWx0LFxuICAgICAgICAgIGFkbWluOiBhZG1pbixcbiAgICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICAgICAgc3lzdGVtUHJvZ3JhbTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgbWFya2V0XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBNYXJrZXQgY3JlYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcHJpb3JpdHlGZWVPcHRpb25zIC0gT3B0aW9uYWwgcHJpb3JpdHkgZmVlIHNldHRpbmdzIHRvIGFjY2VsZXJhdGUgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uXG4gICAqIEBwYXJhbSBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSAtIFByaWNlIHBlciBjb21wdXRlIHVuaXQgaW4gbWljcm8tbGFtcG9ydHMgKGUuZy4sIDEwMDAgPSAwLjAwMDAwMSBTT0wgcGVyIENVKVxuICAgKiBAcGFyYW0gcHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0TGltaXQgLSBNYXggY29tcHV0ZSB1bml0cyAoZGVmYXVsdDogNDAwLDAwMCBmb3IgY3JlYXRlTWFya2V0IGR1ZSB0byBtdWx0aXBsZSBQREEgaW5pdHMpXG4gICAqL1xuICBhc3luYyBidWlsZENyZWF0ZU1hcmtldFR4KFxuICAgIHBhcmFtczogQ3JlYXRlTWFya2V0UGFyYW1zLFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIEFkZCBwcmlvcml0eSBmZWUgaW5zdHJ1Y3Rpb25zIGlmIHNwZWNpZmllZFxuICAgIGlmIChwcmlvcml0eUZlZU9wdGlvbnMpIHtcbiAgICAgIC8vIFNldCBjb21wdXRlIHVuaXQgbGltaXQgKGNyZWF0ZU1hcmtldCBpcyBhIGNvbXBsZXggdHgsIGRlZmF1bHQgdG8gNDAwaylcbiAgICAgIGNvbnN0IGNvbXB1dGVVbml0TGltaXQgPSBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRMaW1pdCA/PyA0MDBfMDAwO1xuICAgICAgdHguYWRkKFxuICAgICAgICBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdExpbWl0KHtcbiAgICAgICAgICB1bml0czogY29tcHV0ZVVuaXRMaW1pdCxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBjb21wdXRlIHVuaXQgcHJpY2UgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAocHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0UHJpY2UgIT09IHVuZGVmaW5lZCAmJiBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSA+IDApIHtcbiAgICAgICAgdHguYWRkKFxuICAgICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0UHJpY2Uoe1xuICAgICAgICAgICAgbWljcm9MYW1wb3J0czogcHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0UHJpY2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY3JlYXRlTWFya2V0KHBhcmFtcyk7XG4gICAgdHguYWRkKGl4KTtcbiAgICBcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgYSBiZXQgaW5zdHJ1Y3Rpb24gKHdpdGhvdXQgQVRBIGNyZWF0aW9uKVxuICAgKi9cbiAgYXN5bmMgcGxhY2VCZXQocGFyYW1zOiBQbGFjZUJldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBhbW91bnQsIG91dGNvbWUsIGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50VG9rZW4gfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCBhbW91bnRCbiA9IG5ldyBCTihhbW91bnQpO1xuICAgIGNvbnN0IG91dGNvbWVFbnVtID0gb3V0Y29tZSA9PT0gXCJZZXNcIiA/IHsgeWVzOiB7fSB9IDogeyBubzoge30gfTtcblxuICAgIC8vIEdldCBnbG9iYWwgY29uZmlnIGZvciBmZWUgaW5mb1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIG91dGNvbWUgdG9rZW4gdGhlIHVzZXIgd2lsbCByZWNlaXZlXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5wbGFjZUJldCh7XG4gICAgICAgIGJ1eU91dGNvbWU6IG91dGNvbWVFbnVtLFxuICAgICAgICBhbW91bnQ6IGFtb3VudEJuLFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50VG9rZW46IGZlZVJlY2lwaWVudFRva2VuIHx8IG51bGwsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBwbGFjZSBhIGJldCAod2l0aCBvcHRpb25hbCBBVEEgY3JlYXRpb24gZm9yIGJvdGggb3V0Y29tZSB0b2tlbiBhbmQgZmVlIHJlY2lwaWVudClcbiAgICovXG4gIGFzeW5jIGJ1aWxkUGxhY2VCZXRUeChwYXJhbXM6IFBsYWNlQmV0UGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBvdXRjb21lLCBiZXR0aW5nVG9rZW4sIGNyZWF0ZUF0YSA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGlmIChjcmVhdGVBdGEpIHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIHVzZXIsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBpZiBmZWVfYnBzID4gMFxuICAgIGxldCBmZWVSZWNpcGllbnRUb2tlbjogUHVibGljS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGNvbmZpZ0FjY291bnQuZmVlQnBzID4gMCkge1xuICAgICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IHBhcmFtcy5mZWVSZWNpcGllbnQgfHwgY29uZmlnQWNjb3VudC5mZWVSZWNpcGllbnQ7XG4gICAgICBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcyk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgZmVlQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHMoZmVlUmVjaXBpZW50VG9rZW4pO1xuICAgICAgaWYgKCFmZWVBdGFFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlRmVlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIGZlZVJlY2lwaWVudEFkZHJlc3MsIGJldHRpbmdUb2tlbik7XG4gICAgICAgIHR4LmFkZChjcmVhdGVGZWVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGxhY2VCZXRJeCA9IGF3YWl0IHRoaXMucGxhY2VCZXQoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKHBsYWNlQmV0SXgpO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gcGxhY2UgYmV0cyBmcm9tIGJvdGggdXNlciBhbmQgYm9udXMgYWNjb3VudCBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqIFRoaXMgdHJhbnNhY3Rpb24gcmVxdWlyZXMgdHdvIHNpZ25lcnM6IHVzZXIgYW5kIGJvbnVzQWNjb3VudC5cbiAgICogXG4gICAqIFVzZSBjYXNlOiBVc2VyIHBheXMgcGFydCBvZiB0aGUgYmV0LCBib251cyBhY2NvdW50IChiYWNrZW5kKSBwYXlzIHRoZSByZXN0LlxuICAgKiBFeGFtcGxlOiBVc2VyIGJldHMgMTBVIHRvdGFsLCB1c2VyIHBheXMgOFUsIGJvbnVzIGFjY291bnQgcGF5cyAyVS5cbiAgICogXG4gICAqIEJvdGggYmV0cyBhcmUgcGxhY2VkIG9uIHRoZSBzYW1lIG91dGNvbWUsIGJ1dCBvdXRjb21lIHRva2VucyBnbyB0byBlYWNoIGFjY291bnQgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRQbGFjZUJldFYyVHgocGFyYW1zOiBQbGFjZUJldFYyUGFyYW1zKTogUHJvbWlzZTxQbGFjZUJldFYyUmVzdWx0PiB7XG4gICAgY29uc3QgeyBcbiAgICAgIHVzZXIsIFxuICAgICAgYm9udXNBY2NvdW50LCBcbiAgICAgIG1hcmtldCwgXG4gICAgICB1c2VyQW1vdW50LCBcbiAgICAgIGJvbnVzQW1vdW50LCBcbiAgICAgIG91dGNvbWUsIFxuICAgICAgYmV0dGluZ1Rva2VuLCBcbiAgICAgIGNyZWF0ZUF0YSA9IHRydWUgXG4gICAgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBcbiAgICAvLyBVc2VyJ3Mgb3V0Y29tZSB0b2tlbiBhY2NvdW50XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIFxuICAgIC8vIEJvbnVzIGFjY291bnQncyBvdXRjb21lIHRva2VuIGFjY291bnRcbiAgICBjb25zdCBib251c091dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIGJvbnVzQWNjb3VudCwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDcmVhdGUgQVRBcyBpZiBuZWVkZWRcbiAgICBpZiAoY3JlYXRlQXRhKSB7XG4gICAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgdXNlckF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCF1c2VyQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVVzZXJBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgdXNlciwgdGFyZ2V0TWludCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZVVzZXJBdGFJeCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGJvbnVzIGFjY291bnQgb3V0Y29tZSBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBib251c0F0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGJvbnVzT3V0Y29tZVRva2VuKTtcbiAgICAgIGlmICghYm9udXNBdGFFeGlzdHMpIHtcbiAgICAgICAgLy8gVXNlciBwYXlzIGZvciBjcmVhdGluZyB0aGUgYm9udXMgYWNjb3VudCdzIEFUQVxuICAgICAgICBjb25zdCBjcmVhdGVCb251c0F0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbih1c2VyLCBib251c0FjY291bnQsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVCb251c0F0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGlmIGZlZV9icHMgPiAwXG4gICAgbGV0IGZlZVJlY2lwaWVudFRva2VuOiBQdWJsaWNLZXkgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY29uZmlnQWNjb3VudC5mZWVCcHMgPiAwKSB7XG4gICAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gcGFyYW1zLmZlZVJlY2lwaWVudCB8fCBjb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBmZWVBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgICBpZiAoIWZlZUF0YUV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVGZWVBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgZmVlUmVjaXBpZW50QWRkcmVzcywgYmV0dGluZ1Rva2VuKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUZlZUF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdXNlcidzIHBsYWNlQmV0IGluc3RydWN0aW9uXG4gICAgY29uc3QgdXNlckJldEl4ID0gYXdhaXQgdGhpcy5wbGFjZUJldCh7XG4gICAgICB1c2VyLFxuICAgICAgbWFya2V0LFxuICAgICAgYW1vdW50OiB1c2VyQW1vdW50LFxuICAgICAgb3V0Y29tZSxcbiAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuLFxuICAgIH0pO1xuICAgIHR4LmFkZCh1c2VyQmV0SXgpO1xuXG4gICAgLy8gQ3JlYXRlIGJvbnVzIGFjY291bnQncyBwbGFjZUJldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IGJvbnVzQmV0SXggPSBhd2FpdCB0aGlzLnBsYWNlQmV0KHtcbiAgICAgIHVzZXI6IGJvbnVzQWNjb3VudCxcbiAgICAgIG1hcmtldCxcbiAgICAgIGFtb3VudDogYm9udXNBbW91bnQsXG4gICAgICBvdXRjb21lLFxuICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKGJvbnVzQmV0SXgpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICByZXF1aXJlZFNpZ25lcnM6IFt1c2VyLCBib251c0FjY291bnRdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYSBiYXNlNjQgZW5jb2RlZCB0cmFuc2FjdGlvblxuICAgKiBVc2UgdGhpcyBvbiBmcm9udGVuZCB0byBkZWNvZGUgdGhlIHRyYW5zYWN0aW9uIHJlY2VpdmVkIGZyb20gYmFja2VuZFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4OiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uLmZyb20oYnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgcGFydGlhbGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHRoZSBib251cyBhY2NvdW50IChiYWNrZW5kIHNpZGUpXG4gICAqIFxuICAgKiBAcGFyYW0gdXNlclNpZ25lZFR4QmFzZTY0IC0gQmFzZTY0IGVuY29kZWQgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYmVlbiBzaWduZWQgYnkgdXNlclxuICAgKiBAcGFyYW0gYm9udXNBY2NvdW50S2V5cGFpciAtIFRoZSBib251cyBhY2NvdW50IGtleXBhaXIgZm9yIHNpZ25pbmdcbiAgICogQHJldHVybnMgVGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiByZWFkeSBmb3Igc3VibWlzc2lvblxuICAgKi9cbiAgc3RhdGljIHNpZ25XaXRoS2V5UGFpcih1c2VyU2lnbmVkVHhCYXNlNjQ6IHN0cmluZywga2V5UGFpcjogS2V5cGFpcik6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh1c2VyU2lnbmVkVHhCYXNlNjQsICdiYXNlNjQnKTtcbiAgICBjb25zdCB0eCA9IFRyYW5zYWN0aW9uLmZyb20oYnVmZmVyKTtcbiAgICB0eC5wYXJ0aWFsU2lnbihrZXlQYWlyKTtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvLyBhc3luYyB0cmFuc2ZlcigpXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gd2l0aGRyYXcgYm9udXMgKHRyYW5zZmVyIFVTRFQgZnJvbSBib251cyBhY2NvdW50IHRvIHVzZXIpXG4gICAqIFRoaXMgdHJhbnNhY3Rpb24gcmVxdWlyZXMgdGhlIGJvbnVzIGFjY291bnQgdG8gc2lnbi5cbiAgICogXG4gICAqIEBwYXJhbSBib251c0FjY291bnQgLSBUaGUgYm9udXMgYWNjb3VudCBwdWJsaWMga2V5IChzaWduZXIsIHNvdXJjZSBvZiBmdW5kcylcbiAgICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlcidzIHB1YmxpYyBrZXkgKGRlc3RpbmF0aW9uKVxuICAgKiBAcGFyYW0gdG9rZW5NaW50IC0gVGhlIHRva2VuIG1pbnQgYWRkcmVzcyAoZS5nLiwgVVNEVClcbiAgICogQHBhcmFtIGFtb3VudCAtIEFtb3VudCB0byB0cmFuc2ZlciAoaW4gdG9rZW4ncyBzbWFsbGVzdCB1bml0LCBlLmcuLCAxXzAwMF8wMDAgZm9yIDEgVVNEVCB3aXRoIDYgZGVjaW1hbHMpXG4gICAqIEBwYXJhbSBjcmVhdGVBdGEgLSBXaGV0aGVyIHRvIGNyZWF0ZSB0aGUgdXNlcidzIEFUQSBpZiBpdCBkb2Vzbid0IGV4aXN0IChkZWZhdWx0OiB0cnVlKVxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbiByZWFkeSBmb3Igc2lnbmluZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGRXaXRoZHJhd0JvbnVzVHgocGFyYW1zOiB7XG4gICAgYm9udXNBY2NvdW50OiBQdWJsaWNLZXk7XG4gICAgdXNlcjogUHVibGljS2V5O1xuICAgIHRva2VuTWludDogUHVibGljS2V5O1xuICAgIGFtb3VudDogbnVtYmVyIHwgQk47XG4gICAgY3JlYXRlQXRhPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB7IGJvbnVzQWNjb3VudCwgdXNlciwgdG9rZW5NaW50LCBhbW91bnQsIGNyZWF0ZUF0YSA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBhbW91bnRCbiA9IG5ldyBCTihhbW91bnQpO1xuICAgIFxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgXG4gICAgLy8gR2V0IEFUQSBhZGRyZXNzZXMgZm9yIGJvdGggYWNjb3VudHNcbiAgICBjb25zdCBib251c1Rva2VuQWNjb3VudCA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRva2VuTWludCwgYm9udXNBY2NvdW50KTtcbiAgICBjb25zdCB1c2VyVG9rZW5BY2NvdW50ID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModG9rZW5NaW50LCB1c2VyKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdXNlcidzIEFUQSBpZiBuZWVkZWRcbiAgICBpZiAoY3JlYXRlQXRhKSB7XG4gICAgICBjb25zdCB1c2VyQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHModXNlclRva2VuQWNjb3VudCk7XG4gICAgICBpZiAoIXVzZXJBdGFFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlVXNlckF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbihib251c0FjY291bnQsIHVzZXIsIHRva2VuTWludCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVVc2VyQXRhSXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCB0cmFuc2Zlckl4ID0gY3JlYXRlVHJhbnNmZXJJbnN0cnVjdGlvbihcbiAgICAgIGJvbnVzVG9rZW5BY2NvdW50LCAgLy8gc291cmNlXG4gICAgICB1c2VyVG9rZW5BY2NvdW50LCAgIC8vIGRlc3RpbmF0aW9uXG4gICAgICBib251c0FjY291bnQsICAgICAgIC8vIG93bmVyIChzaWduZXIpXG4gICAgICBCaWdJbnQoYW1vdW50Qm4udG9TdHJpbmcoKSksICAvLyBhbW91bnRcbiAgICAgIFtdLCAgICAgICAgICAgICAgICAgLy8gbXVsdGlTaWduZXJzIChlbXB0eSBmb3Igc2luZ2xlIHNpZ25lcilcbiAgICAgIFRPS0VOX1BST0dSQU1fSUQgICAgLy8gcHJvZ3JhbSBpZFxuICAgICk7XG4gICAgdHguYWRkKHRyYW5zZmVySXgpO1xuICAgIFxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdHJhbnNhY3Rpb24gZm9yIHdpdGhkcmF3aW5nIGJvbnVzIHdpdGggc2VyaWFsaXphdGlvbiBpbmZvXG4gICAqIFVzZWZ1bCBmb3Igc3BsaXQgc2lnbmluZyB3b3JrZmxvdyB3aGVyZSB1c2VyL2FkbWluIGJ1aWxkcyB0eCBhbmQgYm9udXMgYWNjb3VudCBzaWduc1xuICAgKiBcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gYW5kIHJlcXVpcmVkIHNpZ25lcnNcbiAgICovXG4gIGFzeW5jIGJ1aWxkV2l0aGRyYXdCb251c1R4V2l0aEluZm8ocGFyYW1zOiB7XG4gICAgYm9udXNBY2NvdW50OiBQdWJsaWNLZXk7XG4gICAgdXNlcjogUHVibGljS2V5O1xuICAgIHRva2VuTWludDogUHVibGljS2V5O1xuICAgIGFtb3VudDogbnVtYmVyIHwgQk47XG4gICAgY3JlYXRlQXRhPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHJlcXVpcmVkU2lnbmVyczogUHVibGljS2V5W10gfT4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5idWlsZFdpdGhkcmF3Qm9udXNUeChwYXJhbXMpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICByZXF1aXJlZFNpZ25lcnM6IFtwYXJhbXMuYm9udXNBY2NvdW50XSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsYWltIHJld2FyZHMgYWZ0ZXIgbWFya2V0IHJlc29sdXRpb25cbiAgICovXG4gIGFzeW5jIGNsYWltUmV3YXJkcyhwYXJhbXM6IENsYWltUmV3YXJkc1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBiZXR0aW5nVG9rZW4sIHdpbm5pbmdPdXRjb21lIH0gPSBwYXJhbXM7XG5cbiAgICAvLyBEZXJpdmUgbWludCBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSB3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIiA/IHllc01pbnQgOiBub01pbnQ7XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIGNvbnN0IHNoYXJlc1RvQ2xhaW1CbiA9IG5ldyBCTihwYXJhbXMuc2hhcmVzVG9DbGFpbSk7XG4gICAgY29uc3QgY2xvc2VBY2NvdW50ID0gcGFyYW1zLmNsb3NlQWNjb3VudCA/PyB0cnVlO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsYWltUmV3YXJkcyh7XG4gICAgICAgIHRva2VuQW1vdW50OiBzaGFyZXNUb0NsYWltQm4sXG4gICAgICAgIGNsb3NlQWNjb3VudCxcbiAgICAgIH0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICB1c2VyT3V0Y29tZVRva2VuLFxuICAgICAgICB1c2VyQmV0dGluZ1Rva2VuLFxuICAgICAgICB1c2VyLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xhaW0gcmV3YXJkc1xuICAgKi9cbiAgYXN5bmMgYnVpbGRDbGFpbVJld2FyZHNUeChwYXJhbXM6IENsYWltUmV3YXJkc1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCwgYmV0dGluZ1Rva2VuLCB3aW5uaW5nT3V0Y29tZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG5cbiAgICAvLyBEZXJpdmUgbWludCBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBXG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IHdpbm5pbmdPdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3Qgc2hhcmVzVG9DbGFpbUJuID0gbmV3IEJOKHBhcmFtcy5zaGFyZXNUb0NsYWltKTtcbiAgICBjb25zdCBjbG9zZUFjY291bnQgPSBwYXJhbXMuY2xvc2VBY2NvdW50ID8/IHRydWU7XG5cbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xhaW1SZXdhcmRzKHtcbiAgICAgICAgdG9rZW5BbW91bnQ6IHNoYXJlc1RvQ2xhaW1CbixcbiAgICAgICAgY2xvc2VBY2NvdW50LFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQsXG4gICAgICAgIHllc01pbnQsXG4gICAgICAgIG5vTWludCxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gICAgXG4gICAgdHguYWRkKGl4KTtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgaW5zdHJ1Y3Rpb25zIHRvIGNsYWltIHJld2FyZHMgZnJvbSBtdWx0aXBsZSBtYXJrZXRzXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGJlIGJhdGNoZWQgaW50byB0cmFuc2FjdGlvbnNcbiAgICovXG4gIGFzeW5jIGJhdGNoQ2xhaW1SZXdhcmRzKHBhcmFtczogQmF0Y2hDbGFpbVBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdPiB7XG4gICAgY29uc3QgeyB1c2VyLCBjbGFpbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjbGFpbSBvZiBjbGFpbXMpIHtcbiAgICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jbGFpbVJld2FyZHMoe1xuICAgICAgICB1c2VyLFxuICAgICAgICBtYXJrZXQ6IGNsYWltLm1hcmtldCxcbiAgICAgICAgYmV0dGluZ1Rva2VuOiBjbGFpbS5iZXR0aW5nVG9rZW4sXG4gICAgICAgIHdpbm5pbmdPdXRjb21lOiBjbGFpbS53aW5uaW5nT3V0Y29tZSxcbiAgICAgICAgc2hhcmVzVG9DbGFpbTogY2xhaW0uc2hhcmVzVG9DbGFpbSA/PyAwLFxuICAgICAgICBjbG9zZUFjY291bnQ6IGNsYWltLmNsb3NlQWNjb3VudCA/PyB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0cmFuc2FjdGlvbnMgdG8gY2xhaW0gcmV3YXJkcyBmcm9tIG11bHRpcGxlIG1hcmtldHNcbiAgICogQXV0b21hdGljYWxseSBzcGxpdHMgaW50byBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgaWYgbmVlZGVkIChtYXggNSBjbGFpbXMgcGVyIHR4IHRvIGF2b2lkIHNpemUgbGltaXRzKVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQmF0Y2ggY2xhaW0gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gbWF4Q2xhaW1zUGVyVHggLSBNYXhpbXVtIGNsYWltcyBwZXIgdHJhbnNhY3Rpb24gKGRlZmF1bHQ6IDUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgYXN5bmMgYnVpbGRCYXRjaENsYWltUmV3YXJkc1R4KFxuICAgIHBhcmFtczogQmF0Y2hDbGFpbVBhcmFtcyxcbiAgICBtYXhDbGFpbXNQZXJUeDogbnVtYmVyID0gNVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhd2FpdCB0aGlzLmJhdGNoQ2xhaW1SZXdhcmRzKHBhcmFtcyk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdID0gW107XG5cbiAgICAvLyBTcGxpdCBpbnN0cnVjdGlvbnMgaW50byBjaHVua3NcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkgKz0gbWF4Q2xhaW1zUGVyVHgpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gaW5zdHJ1Y3Rpb25zLnNsaWNlKGksIGkgKyBtYXhDbGFpbXNQZXJUeCk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgY2h1bmsuZm9yRWFjaChpeCA9PiB0eC5hZGQoaXgpKTtcbiAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKHR4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVuZCBiZXRzIGlmIG1hcmtldCBpcyByZWZ1bmRlZFxuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQW1vdW50IC0gQW1vdW50IG9mIHNoYXJlcyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkIG1lYW5zIHJlZnVuZCBhbGwgc2hhcmVzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gcGFydGlhbGx5IHJlZnVuZCB0aGVpciBwb3NpdGlvbiBhY3Jvc3MgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLlxuICAgKi9cbiAgYXN5bmMgcmVmdW5kKHBhcmFtczogUmVmdW5kUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGJldHRpbmdUb2tlbiwgb3V0Y29tZSwgdG9rZW5BbW91bnQsIGNsb3NlQWNjb3VudCA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCBvdXRjb21lRW51bSA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB7IHllczoge30gfSA6IHsgbm86IHt9IH07XG4gICAgXG4gICAgLy8gQ29udmVydCB0b2tlbkFtb3VudCB0byBCTiAoMCBtZWFucyByZWZ1bmQgYWxsKVxuICAgIGNvbnN0IHRva2VuQW1vdW50Qm4gPSBuZXcgQk4odG9rZW5BbW91bnQgPz8gMCk7XG4gICAgXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IHVzZXJCZXR0aW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIHVzZXIpO1xuICAgIC8vIE91dGNvbWUgdG9rZW5zIChZZXMvTm8pIHVzZSBUb2tlbi0yMDIyIHByb2dyYW1cbiAgICBjb25zdCB0YXJnZXRNaW50ID0gb3V0Y29tZSA9PT0gXCJZZXNcIiA/IHllc01pbnQgOiBub01pbnQ7XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVmdW5kKHtcbiAgICAgICAgb3V0Y29tZTogb3V0Y29tZUVudW0sXG4gICAgICAgIHRva2VuQW1vdW50OiB0b2tlbkFtb3VudEJuLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldDogbWFya2V0LFxuICAgICAgICB5ZXNNaW50OiB5ZXNNaW50LFxuICAgICAgICBub01pbnQ6IG5vTWludCxcbiAgICAgICAgdmF1bHQ6IHZhdWx0LFxuICAgICAgICB1c2VyT3V0Y29tZVRva2VuOiB1c2VyT3V0Y29tZVRva2VuLFxuICAgICAgICB1c2VyQmV0dGluZ1Rva2VuOiB1c2VyQmV0dGluZ1Rva2VuLFxuICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICAgIHRva2VuMjAyMlByb2dyYW06IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgICAgICAgdXNlcjogdXNlcixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlZnVuZFxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZWZ1bmRUeChwYXJhbXM6IFJlZnVuZFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMucmVmdW5kKHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdW5kIGJvdGggWWVzIGFuZCBObyBwb3NpdGlvbnMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uXG4gICAqIFxuICAgKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiBhIHVzZXIgaGFzIGJldCBvbiBib3RoIFllcyBhbmQgTm8gb3V0Y29tZXMgYW5kIG5lZWRzIHRvIFxuICAgKiByZWZ1bmQgYWxsIHBvc2l0aW9ucyBhZnRlciB0aGUgbWFya2V0IGhhcyBiZWVuIHJlc29sdmVkIGFzIFwiUmVmdW5kZWRcIiAoTm9uZSkuXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5OlxuICAgKiAtIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgWWVzIHRva2VucyBhbmQvb3IgTm8gdG9rZW5zXG4gICAqIC0gT25seSBpbmNsdWRlcyByZWZ1bmQgaW5zdHJ1Y3Rpb25zIGZvciBvdXRjb21lcyB0aGUgdXNlciBhY3R1YWxseSBob2xkc1xuICAgKiAtIENsb3NlcyB0aGUgdG9rZW4gYWNjb3VudHMgYWZ0ZXIgcmVmdW5kaW5nIChieSBkZWZhdWx0KVxuICAgKiBcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJlZnVuZFYyUGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlciAtIFVzZXIncyBwdWJsaWMga2V5IChzaWduZXIpXG4gICAqIEBwYXJhbSBwYXJhbXMubWFya2V0IC0gTWFya2V0IFBEQSBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYmV0dGluZ1Rva2VuIC0gQmV0dGluZyB0b2tlbiBtaW50IChlLmcuLCBVU0RDKVxuICAgKiBAcGFyYW0gcGFyYW1zLnllc1Rva2VuQW1vdW50IC0gT3B0aW9uYWwuIEFtb3VudCBvZiBZZXMgdG9rZW5zIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgPSByZWZ1bmQgYWxsLlxuICAgKiBAcGFyYW0gcGFyYW1zLm5vVG9rZW5BbW91bnQgLSBPcHRpb25hbC4gQW1vdW50IG9mIE5vIHRva2VucyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkID0gcmVmdW5kIGFsbC5cbiAgICogQHBhcmFtIHBhcmFtcy5jbG9zZVllc0FjY291bnQgLSBPcHRpb25hbC4gV2hldGhlciB0byBjbG9zZSB0aGUgWWVzIHRva2VuIGFjY291bnQgYWZ0ZXIgcmVmdW5kLiBEZWZhdWx0OiB0cnVlXG4gICAqIEBwYXJhbSBwYXJhbXMuY2xvc2VOb0FjY291bnQgLSBPcHRpb25hbC4gV2hldGhlciB0byBjbG9zZSB0aGUgTm8gdG9rZW4gYWNjb3VudCBhZnRlciByZWZ1bmQuIERlZmF1bHQ6IHRydWVcbiAgICogXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uIGNvbnRhaW5pbmcgcmVmdW5kIGluc3RydWN0aW9ucyBmb3IgYm90aCBvdXRjb21lcyAoaWYgYXBwbGljYWJsZSlcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQmFzaWMgdXNhZ2U6IFJlZnVuZCBhbGwgWWVzIGFuZCBObyB0b2tlbnNcbiAgICogY29uc3QgdHggPSBhd2FpdCBjbGllbnQuYnVpbGRSZWZ1bmRWMlR4KHtcbiAgICogICB1c2VyOiB1c2VyUHVibGljS2V5LFxuICAgKiAgIG1hcmtldDogbWFya2V0UGRhLFxuICAgKiAgIGJldHRpbmdUb2tlbjogdXNkY01pbnQsXG4gICAqIH0pO1xuICAgKiBcbiAgICogLy8gU2lnbiBhbmQgc2VuZFxuICAgKiB0eC5yZWNlbnRCbG9ja2hhc2ggPSAoYXdhaXQgY29ubmVjdGlvbi5nZXRMYXRlc3RCbG9ja2hhc2goKSkuYmxvY2toYXNoO1xuICAgKiB0eC5mZWVQYXllciA9IHVzZXJQdWJsaWNLZXk7XG4gICAqIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24odHgpO1xuICAgKiBhd2FpdCBjb25uZWN0aW9uLnNlbmRSYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemUoKSk7XG4gICAqIGBgYFxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBLZWVwIHRva2VuIGFjY291bnRzIG9wZW4gKGRvbid0IGNsb3NlIHRoZW0pXG4gICAqIGNvbnN0IHR4ID0gYXdhaXQgY2xpZW50LmJ1aWxkUmVmdW5kVjJUeCh7XG4gICAqICAgdXNlcjogdXNlclB1YmxpY0tleSxcbiAgICogICBtYXJrZXQ6IG1hcmtldFBkYSxcbiAgICogICBiZXR0aW5nVG9rZW46IHVzZGNNaW50LFxuICAgKiAgIGNsb3NlWWVzQWNjb3VudDogZmFsc2UsIC8vIEtlZXAgWWVzIHRva2VuIGFjY291bnQgb3BlblxuICAgKiAgIGNsb3NlTm9BY2NvdW50OiBmYWxzZSwgIC8vIEtlZXAgTm8gdG9rZW4gYWNjb3VudCBvcGVuXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICogXG4gICAqIEByZW1hcmtzXG4gICAqIC0gVGhlIG1hcmtldCBtdXN0IGJlIGluIFwiUmVmdW5kZWRcIiBzdGF0dXMgZm9yIHRoaXMgbWV0aG9kIHRvIHdvcmtcbiAgICogLSBJZiB0aGUgdXNlciBvbmx5IGhhcyB0b2tlbnMgb24gb25lIHNpZGUsIG9ubHkgdGhhdCBzaWRlIHdpbGwgYmUgcmVmdW5kZWRcbiAgICogLSBUaGUgcmV0dXJuZWQgdHJhbnNhY3Rpb24gd2lsbCBiZSBlbXB0eSBpZiB0aGUgdXNlciBoYXMgbm8gdG9rZW5zIG9uIGVpdGhlciBzaWRlXG4gICAqL1xuICBhc3luYyBidWlsZFJlZnVuZFYyVHgocGFyYW1zOiBSZWZ1bmRWMlBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB7IFxuICAgICAgdXNlciwgXG4gICAgICBtYXJrZXQsIFxuICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgeWVzVG9rZW5BbW91bnQsXG4gICAgICBub1Rva2VuQW1vdW50LFxuICAgICAgY2xvc2VZZXNBY2NvdW50ID0gdHJ1ZSxcbiAgICAgIGNsb3NlTm9BY2NvdW50ID0gdHJ1ZSBcbiAgICB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBcbiAgICAvLyBHZXQgdXNlcidzIG91dGNvbWUgdG9rZW4gYWNjb3VudHNcbiAgICBjb25zdCB1c2VyWWVzVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh5ZXNNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBjb25zdCB1c2VyTm9Ub2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG5vTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgWWVzIHRva2Vuc1xuICAgIGxldCBoYXNZZXNUb2tlbnMgPSBmYWxzZTtcbiAgICBsZXQgeWVzQmFsYW5jZSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHllc0FjY291bnQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uZ2V0VG9rZW5BY2NvdW50QmFsYW5jZSh1c2VyWWVzVG9rZW4pO1xuICAgICAgeWVzQmFsYW5jZSA9IE51bWJlcih5ZXNBY2NvdW50LnZhbHVlLmFtb3VudCk7XG4gICAgICBoYXNZZXNUb2tlbnMgPSB5ZXNCYWxhbmNlID4gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFjY291bnQgZG9lc24ndCBleGlzdCBvciBoYXMgbm8gYmFsYW5jZVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBObyB0b2tlbnNcbiAgICBsZXQgaGFzTm9Ub2tlbnMgPSBmYWxzZTtcbiAgICBsZXQgbm9CYWxhbmNlID0gMDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgbm9BY2NvdW50ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLmdldFRva2VuQWNjb3VudEJhbGFuY2UodXNlck5vVG9rZW4pO1xuICAgICAgbm9CYWxhbmNlID0gTnVtYmVyKG5vQWNjb3VudC52YWx1ZS5hbW91bnQpO1xuICAgICAgaGFzTm9Ub2tlbnMgPSBub0JhbGFuY2UgPiAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjb3VudCBkb2Vzbid0IGV4aXN0IG9yIGhhcyBubyBiYWxhbmNlXG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBZZXMgcmVmdW5kIGluc3RydWN0aW9uIGlmIHVzZXIgaGFzIFllcyB0b2tlbnNcbiAgICBpZiAoaGFzWWVzVG9rZW5zKSB7XG4gICAgICBjb25zdCB5ZXNSZWZ1bmRJeCA9IGF3YWl0IHRoaXMucmVmdW5kKHtcbiAgICAgICAgdXNlcixcbiAgICAgICAgbWFya2V0LFxuICAgICAgICBiZXR0aW5nVG9rZW4sXG4gICAgICAgIG91dGNvbWU6IFwiWWVzXCIsXG4gICAgICAgIHRva2VuQW1vdW50OiAwLFxuICAgICAgICBjbG9zZUFjY291bnQ6IGNsb3NlWWVzQWNjb3VudCxcbiAgICAgIH0pO1xuICAgICAgdHguYWRkKHllc1JlZnVuZEl4KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIE5vIHJlZnVuZCBpbnN0cnVjdGlvbiBpZiB1c2VyIGhhcyBObyB0b2tlbnNcbiAgICBpZiAoaGFzTm9Ub2tlbnMpIHtcbiAgICAgIGNvbnN0IG5vUmVmdW5kSXggPSBhd2FpdCB0aGlzLnJlZnVuZCh7XG4gICAgICAgIHVzZXIsXG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgICBvdXRjb21lOiBcIk5vXCIsXG4gICAgICAgIHRva2VuQW1vdW50OiAwLFxuICAgICAgICBjbG9zZUFjY291bnQ6IGNsb3NlTm9BY2NvdW50LFxuICAgICAgfSk7XG4gICAgICB0eC5hZGQobm9SZWZ1bmRJeCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZU1hcmtldEJ5SUQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXRJZDogbnVtYmVyIHwgQk4sXG4gICAgd2lubmluZ091dGNvbWU6IFwiWWVzXCIgfCBcIk5vXCIgfCBudWxsLFxuICAgIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBtYXJrZXRJZEJuID0gbmV3IEJOKG1hcmtldElkKTtcbiAgICBjb25zdCBtYXJrZXRQZGEgPSBnZXRNYXJrZXRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgYWRtaW4sIG1hcmtldElkQm4pO1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIGxldCBvdXRjb21lRW51bTogYW55ID0gbnVsbDtcbiAgICBpZiAod2lubmluZ091dGNvbWUgPT09IFwiWWVzXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyB5ZXM6IHt9IH07XG4gICAgfSBlbHNlIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJOb1wiKSB7XG4gICAgICBvdXRjb21lRW51bSA9IHsgbm86IHt9IH07XG4gICAgfVxuXG4gICAgLy8gR2V0IG1hcmtldCBpbmZvIHRvIGRldGVybWluZSBiZXR0aW5nIHRva2VuXG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXRQZGEpO1xuICAgIC8vIGZlZSByZWNpcGllbnQgYWRkcmVzc1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudEFkZHJlc3MgPSBmZWVSZWNpcGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpKS5mZWVSZWNpcGllbnQ7XG4gICAgLy8gZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IChhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSlcbiAgICBjb25zdCBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1hcmtldEluZm8uYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzLCB0cnVlKTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXRQZGEudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnJlc29sdmVNYXJrZXQob3V0Y29tZUVudW0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnLFxuICAgICAgICBtYXJrZXQ6IG1hcmtldFBkYSxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIGZlZVJlY2lwaWVudDogZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgICAgIGFkbWluLFxuICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZXNvbHZlIGEgbWFya2V0XG4gICAqIEBwYXJhbSBwcmlvcml0eUZlZU9wdGlvbnMgLSBPcHRpb25hbCBwcmlvcml0eSBmZWUgc2V0dGluZ3MgdG8gYWNjZWxlcmF0ZSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb25cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVzb2x2ZU1hcmtldFR4QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTixcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5LFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgbWFya2V0UGRhID0gZ2V0TWFya2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldFBkYSk7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudEFkZHJlc3MgPSBmZWVSZWNpcGllbnQgfHwgZ2xvYmFsQ29uZmlnQWNjb3VudC5mZWVSZWNpcGllbnQ7XG4gICAgLy8gYWxsb3dPd25lck9mZkN1cnZlIGZvciBtdWx0aXNpZy9QREEgZmVlIHJlY2lwaWVudHNcbiAgICBjb25zdCBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1hcmtldEluZm8uYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzLCB0cnVlKTtcblxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG5cbiAgICAvLyBBZGQgcHJpb3JpdHkgZmVlIGluc3RydWN0aW9ucyBpZiBzcGVjaWZpZWRcbiAgICBpZiAocHJpb3JpdHlGZWVPcHRpb25zKSB7XG4gICAgICBjb25zdCBjb21wdXRlVW5pdExpbWl0ID0gcHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0TGltaXQgPz8gMjAwXzAwMDtcbiAgICAgIHR4LmFkZChcbiAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgICAgICAgdW5pdHM6IGNvbXB1dGVVbml0TGltaXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYgKHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdFByaWNlICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0UHJpY2UgPiAwKSB7XG4gICAgICAgIHR4LmFkZChcbiAgICAgICAgICBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdFByaWNlKHtcbiAgICAgICAgICAgIG1pY3JvTGFtcG9ydHM6IHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdFByaWNlLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IGZlZVJlY2lwaWVudEF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGZlZVJlY2lwaWVudFRva2VuKTtcbiAgICBpZiAoIWZlZVJlY2lwaWVudEF0YUV4aXN0cykge1xuICAgICAgY29uc3QgY3JlYXRlRmVlUmVjaXBpZW50QXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKGFkbWluLCBmZWVSZWNpcGllbnRBZGRyZXNzLCBtYXJrZXRJbmZvLmJldHRpbmdUb2tlbik7XG4gICAgICB0eC5hZGQoY3JlYXRlRmVlUmVjaXBpZW50QXRhSXgpO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNvbHZlIG1hcmtldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IHJlc29sdmVNYXJrZXRJeCA9IGF3YWl0IHRoaXMucmVzb2x2ZU1hcmtldEJ5SUQoYWRtaW4sIG1hcmtldElkLCB3aW5uaW5nT3V0Y29tZSwgZmVlUmVjaXBpZW50KTtcbiAgICB0eC5hZGQocmVzb2x2ZU1hcmtldEl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZU1hcmtldChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgbGV0IG91dGNvbWVFbnVtOiBhbnkgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IHllczoge30gfTtcbiAgICB9IGVsc2UgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIk5vXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyBubzoge30gfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbWFya2V0IGluZm8gdG8gZGV0ZXJtaW5lIGJldHRpbmcgdG9rZW5cbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCkpLmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVzb2x2ZU1hcmtldChvdXRjb21lRW51bSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldDogbWFya2V0LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50OiBmZWVSZWNpcGllbnRUb2tlbixcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlc29sdmUgYSBtYXJrZXRcbiAgICogQHBhcmFtIHByaW9yaXR5RmVlT3B0aW9ucyAtIE9wdGlvbmFsIHByaW9yaXR5IGZlZSBzZXR0aW5ncyB0byBhY2NlbGVyYXRlIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXNvbHZlTWFya2V0VHgoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5LFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXQpO1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZ0FjY291bnQgPSBhd2FpdCB0aGlzLmdldEdsb2JhbENvbmZpZ0FjY291bnQoKTtcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gZmVlUmVjaXBpZW50IHx8IGdsb2JhbENvbmZpZ0FjY291bnQuZmVlUmVjaXBpZW50O1xuICAgIC8vIGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBIGZlZSByZWNpcGllbnRzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtYXJrZXRJbmZvLmJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgdHJ1ZSk7XG5cbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gQWRkIHByaW9yaXR5IGZlZSBpbnN0cnVjdGlvbnMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKHByaW9yaXR5RmVlT3B0aW9ucykge1xuICAgICAgY29uc3QgY29tcHV0ZVVuaXRMaW1pdCA9IHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdExpbWl0ID8/IDIwMF8wMDA7XG4gICAgICB0eC5hZGQoXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdExpbWl0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSAhPT0gdW5kZWZpbmVkICYmIHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdFByaWNlID4gMCkge1xuICAgICAgICB0eC5hZGQoXG4gICAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7XG4gICAgICAgICAgICBtaWNyb0xhbXBvcnRzOiBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgaWYgKCFmZWVSZWNpcGllbnRBdGFFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbihhZG1pbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgbWFya2V0SW5mby5iZXR0aW5nVG9rZW4pO1xuICAgICAgdHguYWRkKGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzb2x2ZSBtYXJrZXQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCByZXNvbHZlTWFya2V0SXggPSBhd2FpdCB0aGlzLnJlc29sdmVNYXJrZXQoYWRtaW4sIG1hcmtldCwgd2lubmluZ091dGNvbWUsIGZlZVJlY2lwaWVudCk7XG4gICAgdHguYWRkKHJlc29sdmVNYXJrZXRJeCk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsb3NlTWFya2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldCxcbiAgICAgICAgYWRtaW46IGFkbWluLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRUeChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xvc2VNYXJrZXQoYWRtaW4sIG1hcmtldCk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldEJ5SUQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXRJZDogbnVtYmVyIHwgQk5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgbWFya2V0UGRhID0gZ2V0TWFya2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsb3NlTWFya2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldFBkYSxcbiAgICAgICAgYWRtaW46IGFkbWluLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRUeEJ5SUQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXRJZDogbnVtYmVyIHwgQk5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jbG9zZU1hcmtldEJ5SUQoYWRtaW4sIG1hcmtldElkKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBtYXJrZXQgYWNjb3VudCBhbmQgcmVjbGFpbSByZW50IChBZG1pbiBvbmx5KVxuICAgKiBDYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbWFya2V0IGlzIHJlc29sdmVkIGFuZCBhbGwgcmV3YXJkcyBjbGFpbWVkXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldEFjY291bnQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbG9zZU1hcmtldEFjY291bnQoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgICAgdG9rZW4yMDIyUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgbWFya2V0IGFjY291bnRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRBY2NvdW50VHgoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsb3NlTWFya2V0QWNjb3VudChhZG1pbiwgbWFya2V0KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJuIHdvcnRobGVzcyB0b2tlbnMgZnJvbSB0aGUgbG9zaW5nIHNpZGUgb2YgYSByZXNvbHZlZCBtYXJrZXQuXG4gICAqIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNsZWFuIHVwIHRoZWlyIGxvc2luZyB0b2tlbnMgc28gdGhlIG1hcmtldCBhY2NvdW50IGNhbiBiZSBjbG9zZWQuXG4gICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIgd2hvIGhvbGRzIGxvc2luZyB0b2tlbnNcbiAgICogQHBhcmFtIG1hcmtldCAtIFRoZSBtYXJrZXQgUERBXG4gICAqIEBwYXJhbSBsb3NpbmdPdXRjb21lIC0gVGhlIG91dGNvbWUgdGhhdCBsb3N0ICh0aGUgc2lkZSB0byBidXJuKVxuICAgKiBAcGFyYW0gdG9rZW5BbW91bnQgLSBBbW91bnQgdG8gYnVybiAoMCA9IGJ1cm4gYWxsKVxuICAgKiBAcGFyYW0gY2xvc2VBY2NvdW50IC0gV2hldGhlciB0byBjbG9zZSB0aGUgbG9zaW5nIHRva2VuIGFjY291bnQgYWZ0ZXIgYnVybmluZyBhbGwgdG9rZW5zIChkZWZhdWx0OiBmYWxzZSlcbiAgICovXG4gIGFzeW5jIGJ1cm5NYXJrZXRUb2tlbnMoXG4gICAgdXNlcjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIGxvc2luZ091dGNvbWU6IE91dGNvbWUsXG4gICAgdG9rZW5BbW91bnQ6IG51bWJlciB8IEJOID0gMCxcbiAgICBjbG9zZUFjY291bnQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBUaGUgbG9zaW5nIG1pbnQgaXMgdGhlIHNpZGUgdGhhdCBsb3N0XG4gICAgY29uc3QgbG9zaW5nTWludCA9IGxvc2luZ091dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJMb3NpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGxvc2luZ01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuYnVybk1hcmtldFRva2Vucyh7XG4gICAgICAgIHRva2VuQW1vdW50OiBuZXcgQk4odG9rZW5BbW91bnQpLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICBsb3NpbmdNaW50LFxuICAgICAgICB1c2VyTG9zaW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICAgIHRva2VuMjAyMlByb2dyYW06IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGJ1cm4gbWFya2V0IHRva2Vuc1xuICAgKiBAcGFyYW0gY2xvc2VBY2NvdW50IC0gV2hldGhlciB0byBjbG9zZSB0aGUgbG9zaW5nIHRva2VuIGFjY291bnQgYWZ0ZXIgYnVybmluZyBhbGwgdG9rZW5zIChkZWZhdWx0OiBmYWxzZSlcbiAgICovXG4gIGFzeW5jIGJ1aWxkQnVybk1hcmtldFRva2Vuc1R4KFxuICAgIHVzZXI6IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICBsb3NpbmdPdXRjb21lOiBPdXRjb21lLFxuICAgIHRva2VuQW1vdW50OiBudW1iZXIgfCBCTiA9IDAsXG4gICAgY2xvc2VBY2NvdW50OiBib29sZWFuID0gdHJ1ZVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmJ1cm5NYXJrZXRUb2tlbnModXNlciwgbWFya2V0LCBsb3NpbmdPdXRjb21lLCB0b2tlbkFtb3VudCwgY2xvc2VBY2NvdW50KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlcidzIHRva2VuIGJhbGFuY2UgZm9yIGEgc3BlY2lmaWMgbWFya2V0XG4gICAqIFJldHVybnMgdGhlIGJhbGFuY2Ugb2YgYm90aCBZZXMgYW5kIE5vIHRva2Vuc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gVXNlck1hcmtldEhvbGRQYXJhbXMgY29udGFpbmluZyB1c2VyIGFuZCBtYXJrZXQgYWRkcmVzc2VzXG4gICAqIEByZXR1cm5zIFVzZXJNYXJrZXRIb2xkUmVzdWx0IHdpdGggeWVzIGFuZCBubyB0b2tlbiBiYWxhbmNlc1xuICAgKi9cbiAgYXN5bmMgZ2V0VXNlck1hcmtldFRva2VuQmFsYW5jZShcbiAgICBwYXJhbXM6IFVzZXJNYXJrZXRIb2xkUGFyYW1zXG4gICk6IFByb21pc2U8VXNlck1hcmtldEhvbGRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCB9ID0gcGFyYW1zO1xuICAgIFxuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIEdldCB1c2VyIHRva2VuIGFjY291bnRzXG4gICAgY29uc3QgdXNlclllc1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoeWVzTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3QgdXNlck5vVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhub01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgLy8gQ2hlY2sgWWVzIHRva2VuIGJhbGFuY2VcbiAgICBsZXQgeWVzQmFsYW5jZSA9IFwiMFwiO1xuICAgIGxldCBoYXNZZXNBY2NvdW50ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHllc0FjY291bnQgPSBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgdXNlclllc1Rva2VuLCB1bmRlZmluZWQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICB5ZXNCYWxhbmNlID0geWVzQWNjb3VudC5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgIGhhc1llc0FjY291bnQgPSB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjb3VudCBkb2Vzbid0IGV4aXN0IG9yIGhhcyBubyBiYWxhbmNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgTm8gdG9rZW4gYmFsYW5jZVxuICAgIGxldCBub0JhbGFuY2UgPSBcIjBcIjtcbiAgICBsZXQgaGFzTm9BY2NvdW50ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vQWNjb3VudCA9IGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCB1c2VyTm9Ub2tlbiwgdW5kZWZpbmVkLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgbm9CYWxhbmNlID0gbm9BY2NvdW50LmFtb3VudC50b1N0cmluZygpO1xuICAgICAgaGFzTm9BY2NvdW50ID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFjY291bnQgZG9lc24ndCBleGlzdCBvciBoYXMgbm8gYmFsYW5jZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB5ZXNNaW50LFxuICAgICAgbm9NaW50LFxuICAgICAgeWVzVG9rZW5CYWxhbmNlOiB5ZXNCYWxhbmNlLFxuICAgICAgbm9Ub2tlbkJhbGFuY2U6IG5vQmFsYW5jZSxcbiAgICAgIGhhc1llc1Rva2VuQWNjb3VudDogaGFzWWVzQWNjb3VudCxcbiAgICAgIGhhc05vVG9rZW5BY2NvdW50OiBoYXNOb0FjY291bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSByZXdhcmRzIGlmIHdvbiwgb3IgYnVybiB0b2tlbnMgaWYgbG9zdCwgd2l0aCBvcHRpb25hbCBhY2NvdW50IGNsb3N1cmUuXG4gICAqIFRoaXMgaW5zdHJ1Y3Rpb24gY29tYmluZXMgY2xhaW1fcmV3YXJkcyBhbmQgYnVybl9tYXJrZXRfdG9rZW5zIGxvZ2ljIGludG8gYSBzaW5nbGUgY2FsbC5cbiAgICogXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDbGFpbUJ1cm5NYXJrZXRQYXJhbXNcbiAgICogQHBhcmFtIHVzZXJZZXNUb2tlbiAtIFVzZXIncyBZRVMgdG9rZW4gYWNjb3VudCAob3B0aW9uYWwsIHBhc3MgbnVsbCBpZiB1c2VyIGhhcyBubyBZRVMgdG9rZW5zKVxuICAgKiBAcGFyYW0gdXNlck5vVG9rZW4gLSBVc2VyJ3MgTk8gdG9rZW4gYWNjb3VudCAob3B0aW9uYWwsIHBhc3MgbnVsbCBpZiB1c2VyIGhhcyBubyBOTyB0b2tlbnMpXG4gICAqL1xuICBhc3luYyBjbGFpbUJ1cm5NYXJrZXQoXG4gICAgcGFyYW1zOiBDbGFpbUJ1cm5NYXJrZXRQYXJhbXMsXG4gICAgdXNlclllc1Rva2VuOiBQdWJsaWNLZXkgfCBudWxsLFxuICAgIHVzZXJOb1Rva2VuOiBQdWJsaWNLZXkgfCBudWxsXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBiZXR0aW5nVG9rZW4gfSA9IHBhcmFtcztcblxuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IHVzZXJCZXR0aW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIHVzZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xhaW1CdXJuTWFya2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQsXG4gICAgICAgIHllc01pbnQsXG4gICAgICAgIG5vTWludCxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIHVzZXJZZXNUb2tlbjogdXNlclllc1Rva2VuLFxuICAgICAgICB1c2VyTm9Ub2tlbjogdXNlck5vVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgICAgdG9rZW4yMDIyUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBjbGFpbSByZXdhcmRzIChpZiB3b24pIG9yIGJ1cm4gdG9rZW5zIChpZiBsb3N0KVxuICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgdXNlciBvdXRjb21lIHRva2VuIGFjY291bnRzIGJhc2VkIG9uIHVzZXIncyBob2xkaW5nc1xuICAgKiBAcGFyYW0gcHJpb3JpdHlGZWVPcHRpb25zIC0gT3B0aW9uYWwgcHJpb3JpdHkgZmVlIHNldHRpbmdzIHRvIGFjY2VsZXJhdGUgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uXG4gICAqL1xuICBhc3luYyBidWlsZENsYWltQnVybk1hcmtldFR4KFxuICAgIHBhcmFtczogQ2xhaW1CdXJuTWFya2V0UGFyYW1zLFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gQWRkIHByaW9yaXR5IGZlZSBpbnN0cnVjdGlvbnMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKHByaW9yaXR5RmVlT3B0aW9ucykge1xuICAgICAgY29uc3QgY29tcHV0ZVVuaXRMaW1pdCA9IHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdExpbWl0ID8/IDIwMF8wMDA7XG4gICAgICB0eC5hZGQoXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdExpbWl0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSAhPT0gdW5kZWZpbmVkICYmIHByaW9yaXR5RmVlT3B0aW9ucy5jb21wdXRlVW5pdFByaWNlID4gMCkge1xuICAgICAgICB0eC5hZGQoXG4gICAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7XG4gICAgICAgICAgICBtaWNyb0xhbXBvcnRzOiBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIEdldCB1c2VyIHRva2VuIGFjY291bnRzXG4gICAgY29uc3QgdXNlclllc1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoeWVzTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3QgdXNlck5vVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhub01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgLy8gQ2hlY2sgd2hpY2ggYWNjb3VudHMgZXhpc3QgYW5kIGhhdmUgdG9rZW5zXG4gICAgbGV0IGhhc1llc1Rva2VucyA9IGZhbHNlO1xuICAgIGxldCBoYXNOb1Rva2VucyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHllc0FjY291bnQgPSBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgdXNlclllc1Rva2VuLCB1bmRlZmluZWQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICBoYXNZZXNUb2tlbnMgPSB5ZXNBY2NvdW50LmFtb3VudCA+IDBuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjb3VudCBkb2Vzbid0IGV4aXN0XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vQWNjb3VudCA9IGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCB1c2VyTm9Ub2tlbiwgdW5kZWZpbmVkLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgaGFzTm9Ub2tlbnMgPSBub0FjY291bnQuYW1vdW50ID4gMG47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3RcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBpbnN0cnVjdGlvbiB3aXRoIGFwcHJvcHJpYXRlIGFjY291bnRzXG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsYWltQnVybk1hcmtldChcbiAgICAgIHBhcmFtcyxcbiAgICAgIGhhc1llc1Rva2VucyA/IHVzZXJZZXNUb2tlbiA6IG51bGwsXG4gICAgICBoYXNOb1Rva2VucyA/IHVzZXJOb1Rva2VuIDogbnVsbFxuICAgICk7XG4gICAgdHguYWRkKGl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIGdsb2JhbCBjb25maWcgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRHbG9iYWxDb25maWdBY2NvdW50KCkge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLmFjY291bnQuZ2xvYmFsQ29uZmlnLmZldGNoKGdsb2JhbENvbmZpZyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBGZXRjaCBtYXJrZXQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRNYXJrZXRBY2NvdW50KGFkbWluOiBQdWJsaWNLZXksIG1hcmtldElkOiBudW1iZXIgfCBCTikge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50Lm1hcmtldC5mZXRjaChtYXJrZXRQZGEpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWFya2V0SW5mbyhtYXJrZXRQZGE6IFB1YmxpY0tleSkge1xuICAgIGNvbnN0IG1hcmtldEFjY291bnQgPSBhd2FpdCB0aGlzLnByb2dyYW0uYWNjb3VudC5tYXJrZXQuZmV0Y2gobWFya2V0UGRhKTtcbiAgICByZXR1cm4gbWFya2V0QWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB2YXVsdCBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFZhdWx0QWNjb3VudChtYXJrZXRQZGE6IFB1YmxpY0tleSkge1xuICAgIGNvbnN0IHZhdWx0UGRhID0gZ2V0VmF1bHRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgbWFya2V0UGRhKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QWNjb3VudCh0aGlzLmNvbm5lY3Rpb24sIHZhdWx0UGRhKTtcbiAgfVxuXG4vKipcbiAgICog6I635Y+W54m55a6a5Luj5biBIChNaW50KSDnmoTmjIHmnInogIXmlbDph49cbiAgICog6Ieq5Yqo5YW85a6557uP5YW4IFRva2VuIFByb2dyYW0g5ZKMIFRva2VuLTIwMjIgUHJvZ3JhbVxuICAgKiBcbiAgICogQHBhcmFtIG1pbnQgLSDku6PluIEgTWludCDnmoTlhazpkqVcbiAgICogQHBhcmFtIHRva2VuUHJvZ3JhbSAtIOWPr+mAie+8muaYjuehruaMh+WumuS7o+W4geeoi+W6jyBJROOAguWmguaenOS4jeaPkOS+m++8jOWwhuiHquWKqOmAmui/h+afpeivoiBNaW50IOi0puaIt+S/oeaBr+adpeehruWumlxuICAgKiBAcmV0dXJucyDkvZnpop3lpKfkuo4gMCDnmoTllK/kuIDmjIHmnInogIXmlbDph49cbiAgICovXG5hc3luYyBnZXRUb2tlbkhvbGRlckNvdW50KFxuICBtaW50OiBQdWJsaWNLZXksXG4gIHRva2VuUHJvZ3JhbT86IFB1YmxpY0tleSB8IHN0cmluZ1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgdHJ5IHtcbiAgICAvLyAxLiDnoa7lrpogVG9rZW4g56iL5bqPIElEXG4gICAgbGV0IHByb2dyYW1JZDogUHVibGljS2V5O1xuICAgIGlmICghdG9rZW5Qcm9ncmFtKSB7XG4gICAgICBjb25zdCBtaW50SW5mbyA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyhtaW50KTtcbiAgICAgIGlmICghbWludEluZm8pIHRocm93IG5ldyBFcnJvcihgTWludCDotKbmiLfkuI3lrZjlnKg6ICR7bWludC50b0Jhc2U1OCgpfWApO1xuICAgICAgXG4gICAgICAvLyDlop7liqDmoKHpqozvvJrlj6rmnIkgVG9rZW4g5oiWIFRva2VuLTIwMjIg56iL5bqP5oul5pyJ55qE6LSm5oi35omN5piv5ZCI5rOV55qEIE1pbnRcbiAgICAgIGlmICghbWludEluZm8ub3duZXIuZXF1YWxzKFRPS0VOX1BST0dSQU1fSUQpICYmICFtaW50SW5mby5vd25lci5lcXVhbHMoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOWcsOWdgCAke21pbnQudG9CYXNlNTgoKX0g5LiN5piv5LiA5Liq5pyJ5pWI55qE5Luj5biBIE1pbnQgKE93bmVyIOS4uiAke21pbnRJbmZvLm93bmVyLnRvQmFzZTU4KCl9KWApO1xuICAgICAgfVxuICAgICAgcHJvZ3JhbUlkID0gbWludEluZm8ub3duZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW1JZCA9IHR5cGVvZiB0b2tlblByb2dyYW0gPT09ICdzdHJpbmcnID8gbmV3IFB1YmxpY0tleSh0b2tlblByb2dyYW0pIDogdG9rZW5Qcm9ncmFtO1xuICAgIH1cblxuICAgIC8vIDIuIOaehOmAoOi/h+a7pOWZqFxuICAgIGNvbnN0IGZpbHRlcnM6IGFueVtdID0gW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsIC8vIE1pbnQg5Zyw5Z2A5aeL57uI5Zyo5Luj5biB6LSm5oi35pWw5o2u55qE5YGP56e76YePIDAg5aSEXG4gICAgICAgICAgYnl0ZXM6IG1pbnQudG9CYXNlNTgoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIOWPquaciee7j+WFuCBUb2tlbiBQcm9ncmFtIChUb2tlbmtlZy4uLikg6LSm5oi35aSn5bCP5Zu65a6a5Li6IDE2NSDlrZfoioJcbiAgICAvLyBUb2tlbi0yMDIyIChUb2tlbnpRZC4uLikg6LSm5oi35Zug5Li65Y+v6IO95YyF5ZCrIEV4dGVuc2lvbnPvvIzlpKflsI/mmK/lj6/lj5jnmoTvvIzlm6DmraTkuI3kvb/nlKggZGF0YVNpemUg6L+H5rukXG4gICAgaWYgKHByb2dyYW1JZC5lcXVhbHMoVE9LRU5fUFJPR1JBTV9JRCkpIHtcbiAgICAgIGZpbHRlcnMudW5zaGlmdCh7IGRhdGFTaXplOiAxNjUgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4g5omn6KGMIGdldFByb2dyYW1BY2NvdW50cyDmn6Xor6JcbiAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5nZXRQcm9ncmFtQWNjb3VudHMocHJvZ3JhbUlkLCB7XG4gICAgICBmaWx0ZXJzLFxuICAgIH0pO1xuXG4gICAgLy8gNC4g6L+H5ruk5Ye65L2Z6aKdID4gMCDnmoTotKbmiLdcbiAgICAvLyDml6Dorrrlk6rkuKrnqIvluo/vvIzkvZnpop0gKEFtb3VudCkg6YO95Zyo5YGP56e76YePIDY0IOWkhOeahCA4IOWtl+iKgiAodTY0KVxuICAgIGNvbnN0IGhvbGRlcnNXaXRoQmFsYW5jZSA9IGFjY291bnRzLmZpbHRlcigoYWNjb3VudCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGFjY291bnQuYWNjb3VudC5kYXRhO1xuICAgICAgY29uc3QgYW1vdW50ID0gZGF0YS5yZWFkQmlnVUludDY0TEUoNjQpO1xuICAgICAgcmV0dXJuIGFtb3VudCA+IDBuO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhvbGRlcnNXaXRoQmFsYW5jZS5sZW5ndGg7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihg6I635Y+WIE1pbnQgJHttaW50LnRvQmFzZTU4KCl9IOeahOaMgeacieiAheaVsOmHj+Wksei0pTpgLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuICAgIC8qKlxuICAgKiDojrflj5bnu7zlkIjnmoTluILlnLrlm57mlLbnirbmgIHvvIjljIXlkKvpk77kuIrmlbDmja7vvIlcbiAgICog6K+l5pa55rOV5p+l6K+i5omA5pyJ5b+F6KaB5L+h5oGv77yM5Lul5Yik5pat5biC5Zy65piv5ZCm5Y+v5Lul5a6J5YWo5Zyw5Zue5pS256ef6YeRXG4gICAqIFxuICAgKiBAcGFyYW0gbWFya2V0UGRhIC0g5biC5Zy655qEIFBEQSDlhazpkqVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDphY3nva7pgInpoblcbiAgICogQHBhcmFtIG9wdGlvbnMuc2tpcEhvbGRlckNvdW50IC0g5piv5ZCm6Lez6L+H5piC6LS155qE5oyB5pyJ5Lq65pWw5p+l6K+i77yI6buY6K6k5Li6IGZhbHNl77yJ44CCXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWmguaenOWPqumcgOWIpOaWreaYr+WQpua7oei2s+WQiOe6puWFs+mXreadoeS7tu+8jOW7uuiuruiuvuS4uiB0cnVlIOS7peaPkOWNh+aAp+iDveOAglxuICAgKiBAcmV0dXJucyDljIXlkKvmiYDmnInnm7jlhbPmlbDmja7nmoTluILlnLrlm57mlLbnirbmgIFcbiAgICovXG4gICAgYXN5bmMgZ2V0TWFya2V0UmVjbGFpbVN0YXR1cyhcbiAgICAgIG1hcmtldFBkYTogUHVibGljS2V5LFxuICAgICAgb3B0aW9uczogeyBza2lwSG9sZGVyQ291bnQ/OiBib29sZWFuIH0gPSB7fVxuICAgICk6IFByb21pc2U8e1xuICAgICAgeWVzTWludDogUHVibGljS2V5O1xuICAgICAgbm9NaW50OiBQdWJsaWNLZXk7XG4gICAgICB2YXVsdDogUHVibGljS2V5O1xuICAgICAgeWVzU3VwcGx5OiBudW1iZXI7XG4gICAgICBub1N1cHBseTogbnVtYmVyO1xuICAgICAgeWVzSG9sZGVyQ291bnQ6IG51bWJlcjtcbiAgICAgIG5vSG9sZGVyQ291bnQ6IG51bWJlcjtcbiAgICAgIHZhdWx0QmFsYW5jZTogYmlnaW50O1xuICAgICAgY2FuQ2xvc2VPbkNoYWluOiBib29sZWFuO1xuICAgICAgYmxvY2tlcnM6IHN0cmluZ1tdO1xuICAgIH0+IHtcbiAgICAgIGNvbnN0IHNraXBIb2xkZXJDb3VudCA9IG9wdGlvbnMuc2tpcEhvbGRlckNvdW50ID8/IGZhbHNlO1xuICBcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIDEuIOiOt+WPluW4guWcuuWfuuehgOS/oeaBryAo5YyF5ZCrIHRvdGFsWWVzU3VwcGx5IOWSjCB0b3RhbE5vU3VwcGx5KVxuICAgICAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldFBkYSk7XG4gICAgICAgIFxuICAgICAgICAvLyAyLiDmtL7nlJ/nm7jlhbPnmoQgUERBIOWcsOWdgFxuICAgICAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXRQZGEudG9CdWZmZXIoKV0sXG4gICAgICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgICAgICApWzBdO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldFBkYS50b0J1ZmZlcigpXSxcbiAgICAgICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgICAgIClbMF07XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0UGRhLnRvQnVmZmVyKCldLFxuICAgICAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICAgICAgKVswXTtcbiAgXG4gICAgICAgIC8vIDMuIOW5tuihjOafpeivoumTvuS4iuivpue7huaVsOaNrlxuICAgICAgICAvLyDlp4vnu4jmn6Xor6IgdmF1bHQg5L2Z6aKd77yM5qC55o2u6YCJ6aG55Yaz5a6a5piv5ZCm5p+l6K+iIGhvbGRlciDmlbDph49cbiAgICAgICAgY29uc3QgcXVlcmllczogUHJvbWlzZTxhbnk+W10gPSBbdGhpcy5nZXRWYXVsdEFjY291bnQobWFya2V0UGRhKV07XG4gICAgICAgIFxuICAgICAgICBpZiAoIXNraXBIb2xkZXJDb3VudCkge1xuICAgICAgICAgIC8vIGdldFRva2VuSG9sZGVyQ291bnQg546w5Zyo5YaF6YOo5Lya6Ieq5Yqo6K+G5YirIFRva2VuIOeoi+W6j+exu+Wei1xuICAgICAgICAgIHF1ZXJpZXMucHVzaCh0aGlzLmdldFRva2VuSG9sZGVyQ291bnQoeWVzTWludCkpO1xuICAgICAgICAgIHF1ZXJpZXMucHVzaCh0aGlzLmdldFRva2VuSG9sZGVyQ291bnQobm9NaW50KSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgICAgY29uc3QgdmF1bHRBY2NvdW50ID0gcmVzdWx0c1swXTtcbiAgICAgICAgY29uc3QgeWVzSG9sZGVyQ291bnQgPSBza2lwSG9sZGVyQ291bnQgPyAwIDogcmVzdWx0c1sxXTtcbiAgICAgICAgY29uc3Qgbm9Ib2xkZXJDb3VudCA9IHNraXBIb2xkZXJDb3VudCA/IDAgOiByZXN1bHRzWzJdO1xuICBcbiAgICAgICAgLy8gNC4g5o+Q5Y+W5YWz6ZSu5oyH5qCHXG4gICAgICAgIGNvbnN0IHllc1N1cHBseSA9IE51bWJlcihtYXJrZXRJbmZvLnRvdGFsWWVzU3VwcGx5KTtcbiAgICAgICAgY29uc3Qgbm9TdXBwbHkgPSBOdW1iZXIobWFya2V0SW5mby50b3RhbE5vU3VwcGx5KTtcbiAgICAgICAgY29uc3QgdmF1bHRCYWxhbmNlID0gdmF1bHRBY2NvdW50LmFtb3VudDtcbiAgXG4gICAgICAgIC8vIDUuIOWIpOaWreaYr+WQpua7oei2s+mTvuS4iuWFs+mXreadoeS7tu+8iOmBteW+quWQiOe6pumAu+i+ke+8iVxuICAgICAgICBjb25zdCBibG9ja2Vyczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgXG4gICAgICAgIC8vIOaguOW/g+ajgOafpe+8muiOt+iDnOaWueS7o+W4geS+m+W6lOmHj+W/hemhu+S4uiAwXG4gICAgICAgIGlmIChtYXJrZXRJbmZvLndpbm5pbmdPdXRjb21lICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgd2lubmluZ1N1cHBseSA9IG1hcmtldEluZm8ud2lubmluZ091dGNvbWUueWVzICE9PSB1bmRlZmluZWQgPyB5ZXNTdXBwbHkgOiBub1N1cHBseTtcbiAgICAgICAgICBpZiAod2lubmluZ1N1cHBseSA+IDApIHtcbiAgICAgICAgICAgIGJsb2NrZXJzLnB1c2goYOiOt+iDnOaWueS7jeaciSAke3dpbm5pbmdTdXBwbHl9IOS4quS7o+W4geacqumihuWPli/plIDmr4FgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIOaguOW/g+ajgOafpe+8mlZhdWx0IOS9memineW/hemhu+WHoOS5juS4uiAwXG4gICAgICAgIGNvbnN0IERVU1RfVEhSRVNIT0xEID0gMTAwbjtcbiAgICAgICAgaWYgKHZhdWx0QmFsYW5jZSA+PSBEVVNUX1RIUkVTSE9MRCkge1xuICAgICAgICAgIGJsb2NrZXJzLnB1c2goYFZhdWx0IOS9memineS4uiAke3ZhdWx0QmFsYW5jZX3vvIjotoXov4flrrnlt67pmIjlgLw6ICR7RFVTVF9USFJFU0hPTER977yJYCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIOWmguaenOacqui3s+i/hyBIb2xkZXIg5qOA5p+l77yM5YiZ5re75YqgIEhvbGRlciDnm7jlhbPnmoQgYmxvY2tlclxuICAgICAgICBpZiAoIXNraXBIb2xkZXJDb3VudCkge1xuICAgICAgICAgIGlmICh5ZXNIb2xkZXJDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGJsb2NrZXJzLnB1c2goYOS7jeaciSAke3llc0hvbGRlckNvdW50fSDkuKrnlKjmiLfmjIHmnIkgWWVzIOS7o+W4gei0puaIt2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9Ib2xkZXJDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGJsb2NrZXJzLnB1c2goYOS7jeaciSAke25vSG9sZGVyQ291bnR9IOS4queUqOaIt+aMgeaciSBObyDku6PluIHotKbmiLdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgXG4gICAgICAgIC8vIOWmguaenCBTdXBwbHkgPiAw77yM6YCa5bi45Lmf5LiN5bu66K6u5YWz6ZetXG4gICAgICAgIGlmICh5ZXNTdXBwbHkgPiAwKSB7XG4gICAgICAgICAgYmxvY2tlcnMucHVzaChgWWVzIOS7o+W4geaAu+S+m+W6lOmHj+S4jeS4uiAwOiAke3llc1N1cHBseX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9TdXBwbHkgPiAwKSB7XG4gICAgICAgICAgYmxvY2tlcnMucHVzaChgTm8g5Luj5biB5oC75L6b5bqU6YeP5LiN5Li6IDA6ICR7bm9TdXBwbHl9YCk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNvbnN0IGNhbkNsb3NlT25DaGFpbiA9IGJsb2NrZXJzLmxlbmd0aCA9PT0gMDtcbiAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeWVzTWludCxcbiAgICAgICAgICBub01pbnQsXG4gICAgICAgICAgdmF1bHQsXG4gICAgICAgICAgeWVzU3VwcGx5LFxuICAgICAgICAgIG5vU3VwcGx5LFxuICAgICAgICAgIHllc0hvbGRlckNvdW50LFxuICAgICAgICAgIG5vSG9sZGVyQ291bnQsXG4gICAgICAgICAgdmF1bHRCYWxhbmNlLFxuICAgICAgICAgIGNhbkNsb3NlT25DaGFpbixcbiAgICAgICAgICBibG9ja2VycyxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYOiOt+WPluW4guWcuiAke21hcmtldFBkYS50b0Jhc2U1OCgpfSDnmoTlm57mlLbnirbmgIHlpLHotKU6YCwgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
1260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1CQUFtQixDQUFDO0FBRW5HLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV2QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLE9BQU8sRUFDUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLFdBQVcsRUFDWCxzQkFBc0IsRUFDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9CLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2QsTUFBTSxZQUFZLENBQUM7QUFFcEIsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUFXLEdBQUcsRUFBRSxDQUFDO0FBY3hCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBdUI7SUFDdEQsZ0JBQWdCLEVBQUUsTUFBTztDQUMxQixDQUFDO0FBMkhGLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQVksVUFBc0IsRUFBRSxNQUFlLEVBQUUsU0FBcUI7UUFDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFN0IsMkNBQTJDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FBVztZQUM1QixTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7WUFDbkMsZUFBZSxFQUFF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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICBjcmVhdGVUcmFuc2Zlckluc3RydWN0aW9uLFxuICBnZXRBY2NvdW50LFxuICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBUT0tFTl9QUk9HUkFNX0lEXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuXG5pbXBvcnQgeyBQcm9ncmFtIGFzIEFuY2hvclByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBJZGwsIFByb2dyYW0sIFdhbGxldCB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCI7XG5cbmltcG9ydCB7XG4gIENvbXB1dGVCdWRnZXRQcm9ncmFtLFxuICBDb25uZWN0aW9uLFxuICBLZXlwYWlyLFxuICBQdWJsaWNLZXksXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7IElETCB9IGZyb20gXCIuL2lkbC5qc1wiO1xuaW1wb3J0IHsgRHJhbWFQbSB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRHbG9iYWxDb25maWdQZGEsXG4gIGdldE1hcmtldFBkYSxcbiAgZ2V0TWFya2V0UGRhcyxcbiAgZ2V0VmF1bHRQZGEsXG4gIE5PX01JTlRfU0VFRCxcbiAgVkFVTFRfU0VFRCxcbiAgWUVTX01JTlRfU0VFRFxufSBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy5qc1wiO1xuZXhwb3J0IHsgRHJhbWFQbSwgSURMIH07XG5cbmV4cG9ydCB0eXBlIE91dGNvbWUgPSBcIlllc1wiIHwgXCJOb1wiO1xuXG4vKipcbiAqIFByaW9yaXR5IGZlZSBvcHRpb25zIGZvciBhY2NlbGVyYXRpbmcgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpb3JpdHlGZWVPcHRpb25zIHtcbiAgLyoqIFByaWNlIHBlciBjb21wdXRlIHVuaXQgaW4gbWljcm8tbGFtcG9ydHMgKDEgU09MID0gMWU5IGxhbXBvcnRzID0gMWUxNSBtaWNyby1sYW1wb3J0cykgKi9cbiAgY29tcHV0ZVVuaXRQcmljZT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gY29tcHV0ZSB1bml0cyBmb3IgdGhlIHRyYW5zYWN0aW9uIChkZWZhdWx0OiAyMDAsMDAwIGZvciBub3JtYWwgdHhzLCA0MDAsMDAwIGZvciBjb21wbGV4IG9uZXMpICovXG4gIGNvbXB1dGVVbml0TGltaXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVmYXVsdCBwcmlvcml0eSBmZWUgb3B0aW9ucyB1c2VkIHdoZW4gY2FsbGVyIGRvZXMgbm90IHByb3ZpZGUgcHJpb3JpdHlGZWVPcHRpb25zLlxuICogY29tcHV0ZVVuaXRQcmljZTogMTAwLDAwMCBtaWNyby1sYW1wb3J0cy9DVSDigJQgc3VpdGFibGUgZm9yIG1vc3QgbmV0d29yayBjb25kaXRpb25zLlxuICogY29tcHV0ZVVuaXRMaW1pdCBpcyBub3Qgc2V0IGhlcmU7IGVhY2ggbWV0aG9kIGFwcGxpZXMgaXRzIG93biBkZWZhdWx0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QUklPUklUWV9GRUU6IFByaW9yaXR5RmVlT3B0aW9ucyA9IHtcbiAgY29tcHV0ZVVuaXRQcmljZTogMTAwXzAwMCxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTWFya2V0UGFyYW1zIHtcbiAgYWRtaW46IFB1YmxpY0tleTtcbiAgbWFya2V0SWQ6IG51bWJlciB8IEJOO1xuICB5ZXNQcmljZTogbnVtYmVyIHwgQk47XG4gIG5vUHJpY2U6IG51bWJlciB8IEJOO1xuICBlbmRUaW1lOiBudW1iZXIgfCBCTjtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYW1vdW50OiBudW1iZXIgfCBCTjtcbiAgb3V0Y29tZTogT3V0Y29tZTtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleTsgLy8gRmVlIHJlY2lwaWVudCBhZGRyZXNzIChvcHRpb25hbCwgd2lsbCBmZXRjaCBmcm9tIGNvbmZpZyBpZiBub3QgcHJvdmlkZWQpXG4gIGZlZVJlY2lwaWVudFRva2VuPzogUHVibGljS2V5IHwgbnVsbDsgLy8gRmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IChvcHRpb25hbCwgdXNlZCBpbnRlcm5hbGx5IGJ5IGJ1aWxkUGxhY2VCZXRUeClcbiAgY3JlYXRlQXRhPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjcmVhdGUgQVRBIGluc3RydWN0aW9uIGF1dG9tYXRpY2FsbHlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGZWVDb25maWdQYXJhbXMge1xuICBhdXRob3JpdHk6IFB1YmxpY0tleTsgLy8gQ2FuIGJlIGF1dGhvcml0eSBvciBhdXRob3JpemVkIGFkbWluXG4gIG5ld0ZlZUJwczogbnVtYmVyOyAvLyBGZWUgaW4gYmFzaXMgcG9pbnRzICgxIGJwcyA9IDAuMDElLCBtYXggMjAwMCA9IDIwJSlcbiAgbmV3RmVlUmVjaXBpZW50OiBQdWJsaWNLZXk7XG4gIG5ld0ZlZUNsYWltQnBzOiBudW1iZXI7IC8vIEZlZSBmb3IgY2xhaW1pbmcgcmV3YXJkcyBpbiBiYXNpcyBwb2ludHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGFpbVJld2FyZHNQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICBzaGFyZXNUb0NsYWltOiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCA9IGNsYWltIGFsbClcbiAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7IC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwsIHdpbGwgZmV0Y2ggZnJvbSBjb25maWcgaWYgbm90IHByb3ZpZGVkKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoQ2xhaW1QYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIGNsYWltczogQXJyYXk8e1xuICAgIG1hcmtldDogUHVibGljS2V5O1xuICAgIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICAgIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICAgIHNoYXJlc1RvQ2xhaW0/OiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCBvciB1bmRlZmluZWQgPSBjbGFpbSBhbGwpXG4gICAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXNcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmdW5kUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICBvdXRjb21lOiBPdXRjb21lO1xuICB0b2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAvLyBBbW91bnQgb2Ygc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbCBzaGFyZXMuXG4gIGNsb3NlQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIG91dGNvbWUgdG9rZW4gYWNjb3VudCBhZnRlciByZWZ1bmRpbmcgYWxsIHNoYXJlcyAoZGVmYXVsdDogZmFsc2UpXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcmVmdW5kVjIgLSByZWZ1bmRpbmcgYm90aCBZZXMgYW5kIE5vIHBvc2l0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gKiBVc2UgdGhpcyB3aGVuIGEgdXNlciBoYXMgYmV0IG9uIGJvdGggb3V0Y29tZXMgYW5kIHdhbnRzIHRvIHJlZnVuZCBldmVyeXRoaW5nIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVmdW5kVjJQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIHllc1Rva2VuQW1vdW50PzogbnVtYmVyIHwgQk47IC8vIEFtb3VudCBvZiBZZXMgc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbC5cbiAgbm9Ub2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAgLy8gQW1vdW50IG9mIE5vIHNoYXJlcyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkIG1lYW5zIHJlZnVuZCBhbGwuXG4gIGNsb3NlWWVzQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIFllcyBvdXRjb21lIHRva2VuIGFjY291bnQgKGRlZmF1bHQ6IHRydWUpXG4gIGNsb3NlTm9BY2NvdW50PzogYm9vbGVhbjsgIC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIE5vIG91dGNvbWUgdG9rZW4gYWNjb3VudCAoZGVmYXVsdDogdHJ1ZSlcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBjbGFpbV9idXJuX21hcmtldCBpbnN0cnVjdGlvblxuICogQ29tYmluZXMgY2xhaW1pbmcgcmV3YXJkcyAoaWYgd29uKSBhbmQgYnVybmluZyB0b2tlbnMgKGlmIGxvc3QpIGluIG9uZSBjYWxsLlxuICogQWx3YXlzIGNsb3NlcyB0b2tlbiBhY2NvdW50cyB0byByZWNsYWltIHJlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhaW1CdXJuTWFya2V0UGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNYXJrZXRIb2xkUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hcmtldEhvbGRSZXN1bHQge1xuICB5ZXNNaW50OiBQdWJsaWNLZXk7XG4gIG5vTWludDogUHVibGljS2V5O1xuICB5ZXNUb2tlbkJhbGFuY2U6IHN0cmluZzsgLy8gQmFsYW5jZSBhcyBzdHJpbmcgdG8gcHJlc2VydmUgcHJlY2lzaW9uXG4gIG5vVG9rZW5CYWxhbmNlOiBzdHJpbmc7ICAvLyBCYWxhbmNlIGFzIHN0cmluZyB0byBwcmVzZXJ2ZSBwcmVjaXNpb25cbiAgaGFzWWVzVG9rZW5BY2NvdW50OiBib29sZWFuO1xuICBoYXNOb1Rva2VuQWNjb3VudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBwbGFjZUJldFYyIC0gY29tYmluZXMgdXNlciBiZXQgYW5kIGJvbnVzIGFjY291bnQgYmV0IGluIG9uZSB0cmFuc2FjdGlvblxuICogUmVxdWlyZXMgYm90aCB1c2VyIGFuZCBib251c0FjY291bnQgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZUJldFYyUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5OyAgICAgICAgICAgICAgLy8gVXNlcidzIHB1YmxpYyBrZXkgKHNpZ25lcilcbiAgYm9udXNBY2NvdW50OiBQdWJsaWNLZXk7ICAgICAgLy8gQm9udXMgYWNjb3VudCBwdWJsaWMga2V5IChzaWduZXIpXG4gIG1hcmtldDogUHVibGljS2V5OyAgICAgICAgICAgIC8vIE1hcmtldCBQREEgYWRkcmVzc1xuICB1c2VyQW1vdW50OiBudW1iZXIgfCBCTjsgICAgICAvLyBBbW91bnQgdXNlciBwYXlzXG4gIGJvbnVzQW1vdW50OiBudW1iZXIgfCBCTjsgICAgIC8vIEFtb3VudCBib251cyBhY2NvdW50IHBheXNcbiAgb3V0Y29tZTogT3V0Y29tZTsgICAgICAgICAgICAgLy8gT3V0Y29tZSB0byBiZXQgb24gKFllcy9ObylcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7ICAgICAgLy8gQmV0dGluZyB0b2tlbiBtaW50XG4gIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleTsgICAgIC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwpXG4gIGNyZWF0ZUF0YT86IGJvb2xlYW47ICAgICAgICAgIC8vIFdoZXRoZXIgdG8gY3JlYXRlIEFUQSBpbnN0cnVjdGlvbiBhdXRvbWF0aWNhbGx5XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gYnVpbGRQbGFjZUJldFYyVHggY29udGFpbmluZyBib3RoIHRoZSB0cmFuc2FjdGlvbiBhbmQgaXRzIHNlcmlhbGl6ZWQgZm9ybVxuICogZm9yIHNwbGl0IHNpZ25pbmcgd29ya2Zsb3cgKGZyb250ZW5kIHVzZXIgc2lnbiArIGJhY2tlbmQgYm9udXMgc2lnbilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZUJldFYyUmVzdWx0IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyAgICAgLy8gVHJhbnNhY3Rpb24gb2JqZWN0IGZvciBsb2NhbCBzaWduaW5nICh0ZXN0aW5nKVxuICByZXF1aXJlZFNpZ25lcnM6IFB1YmxpY0tleVtdOyAvLyBMaXN0IG9mIHJlcXVpcmVkIHNpZ25lcnMgW3VzZXIsIGJvbnVzQWNjb3VudF1cbn1cblxuZXhwb3J0IGNsYXNzIERyYW1hUG1DbGllbnQge1xuICBwcm9ncmFtOiBQcm9ncmFtPERyYW1hUG0+O1xuICBwcm92aWRlcjogQW5jaG9yUHJvdmlkZXI7XG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgd2FsbGV0PzogV2FsbGV0LCBwcm9ncmFtSWQ/OiBQdWJsaWNLZXkpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgd2FsbGV0IGlmIG5vbmUgcHJvdmlkZWRcbiAgICBjb25zdCBkZWZhdWx0S2V5cGFpciA9IEtleXBhaXIuZ2VuZXJhdGUoKTtcbiAgICBjb25zdCBkZWZhdWx0V2FsbGV0OiBXYWxsZXQgPSB7XG4gICAgICBwdWJsaWNLZXk6IGRlZmF1bHRLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgIHNpZ25UcmFuc2FjdGlvbjogYXN5bmMgKHR4KSA9PiB0eCxcbiAgICAgIHNpZ25BbGxUcmFuc2FjdGlvbnM6IGFzeW5jICh0eHMpID0+IHR4cyxcbiAgICAgIHBheWVyOiBkZWZhdWx0S2V5cGFpcixcbiAgICB9O1xuICAgIFxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgQW5jaG9yUHJvdmlkZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgd2FsbGV0IHx8IGRlZmF1bHRXYWxsZXQsXG4gICAgICB7IGNvbW1pdG1lbnQ6IFwiY29uZmlybWVkXCIgfVxuICAgICk7XG4gICAgXG4gICAgLy8gVXNlIGN1c3RvbSBwcm9ncmFtSWQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgZnJvbSBJRExcbiAgICBjb25zdCBmaW5hbFByb2dyYW1JZCA9IHByb2dyYW1JZCB8fCBuZXcgUHVibGljS2V5KElETC5hZGRyZXNzKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBuZXcgSURMIHdpdGggdGhlIGN1c3RvbSBwcm9ncmFtSWRcbiAgICBjb25zdCBjdXN0b21JZGwgPSB7IC4uLklETCwgYWRkcmVzczogZmluYWxQcm9ncmFtSWQudG9CYXNlNTgoKSB9O1xuICAgIFxuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBBbmNob3JQcm9ncmFtKGN1c3RvbUlkbCBhcyBJZGwsIHRoaXMucHJvdmlkZXIpIGFzIHVua25vd24gYXMgUHJvZ3JhbTxEcmFtYVBtPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJvZ3JhbSBJRFxuICAgKi9cbiAgZ2V0UHJvZ3JhbUlkKCk6IFB1YmxpY0tleSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbmV3IHByb2dyYW0gSUQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgcHJvZ3JhbSBpbnN0YW5jZVxuICAgKiBVc2VmdWwgd2hlbiByZWRlcGxveWluZyB0aGUgcHJvZ3JhbSB0byBhIG5ldyBhZGRyZXNzXG4gICAqL1xuICBzZXRQcm9ncmFtSWQocHJvZ3JhbUlkOiBQdWJsaWNLZXkpOiB2b2lkIHtcbiAgICBjb25zdCBjdXN0b21JZGwgPSB7IC4uLklETCwgYWRkcmVzczogcHJvZ3JhbUlkLnRvQmFzZTU4KCkgfTtcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQW5jaG9yUHJvZ3JhbShjdXN0b21JZGwgYXMgSWRsLCB0aGlzLnByb3ZpZGVyKSBhcyB1bmtub3duIGFzIFByb2dyYW08RHJhbWFQbT47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgYXRhRXhpc3RzKGF0YTogUHVibGljS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCBhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudFxuICAgKiBAcGFyYW0gdG9rZW5Qcm9ncmFtIC0gVG9rZW4gcHJvZ3JhbSBJRCAoVE9LRU5fUFJPR1JBTV9JRCBmb3IgYmV0dGluZyB0b2tlbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEIGZvciBvdXRjb21lIHRva2VucylcbiAgICovXG4gIGNyZWF0ZUF0YUluc3RydWN0aW9uKFxuICAgIHBheWVyOiBQdWJsaWNLZXksXG4gICAgb3duZXI6IFB1YmxpY0tleSxcbiAgICBtaW50OiBQdWJsaWNLZXksXG4gICAgdG9rZW5Qcm9ncmFtOiBQdWJsaWNLZXkgPSBUT0tFTl9QUk9HUkFNX0lEXG4gICk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICAgIGNvbnN0IGF0YSA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1pbnQsIG93bmVyLCB0cnVlLCB0b2tlblByb2dyYW0pO1xuICAgIFxuICAgIC8vIFVzZSBDcmVhdGVJZGVtcG90ZW50IGluc3RydWN0aW9uIChvcGNvZGUgMSkgdG8gc3VwcG9ydCBQREFzIGFuZCBpZGVtcG90ZW5jeVxuICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICB7IHB1YmtleTogcGF5ZXIsIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogYXRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBvd25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IG1pbnQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IHRva2VuUHJvZ3JhbSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICAgICAgZGF0YTogQnVmZmVyLmZyb20oWzFdKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGdsb2JhbCBjb25maWd1cmF0aW9uIChBdXRob3JpdHkgb25seSlcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDb25maWcoYXV0aG9yaXR5OiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuaW5pdGlhbGl6ZUNvbmZpZygpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnLFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eSxcbiAgICAgICAgc3lzdGVtUHJvZ3JhbTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBpbml0aWFsaXplIGNvbmZpZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGRJbml0aWFsaXplQ29uZmlnVHgoYXV0aG9yaXR5OiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmluaXRpYWxpemVDb25maWcoYXV0aG9yaXR5KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlIEdsb2JhbENvbmZpZyB0byBuZXcgdmVyc2lvbiB3aXRoIGZlZV9jbGFpbV9icHMgZmllbGQgKEF1dGhvcml0eSBvbmx5KVxuICAgKiBTaG91bGQgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgcHJvZ3JhbSB1cGdyYWRlXG4gICAqL1xuICBhc3luYyBtaWdyYXRlQ29uZmlnKGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLm1pZ3JhdGVDb25maWcoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHksXG4gICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gbWlncmF0ZSBjb25maWdcbiAgICovXG4gIGFzeW5jIGJ1aWxkTWlncmF0ZUNvbmZpZ1R4KGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5taWdyYXRlQ29uZmlnKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGF1dGhvcml6ZWQgYWRtaW4gKEF1dGhvcml0eSBvbmx5KVxuICAgKi9cbiAgYXN5bmMgYWRkQWRtaW4obmV3QWRtaW46IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmFkZEFkbWluKG5ld0FkbWluKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhZG1pblxuICAgKi9cbiAgYXN5bmMgYnVpbGRBZGRBZG1pblR4KG5ld0FkbWluOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmFkZEFkbWluKG5ld0FkbWluKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYXV0aG9yaXplZCBhZG1pbiAoQXV0aG9yaXR5IG9ubHkpXG4gICAqL1xuICBhc3luYyByZW1vdmVBZG1pbihhZG1pblRvUmVtb3ZlOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5yZW1vdmVBZG1pbihhZG1pblRvUmVtb3ZlKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlbW92ZSBhZG1pblxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZW1vdmVBZG1pblR4KGFkbWluVG9SZW1vdmU6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMucmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGZlZSBjb25maWd1cmF0aW9uIChBdXRob3JpdHkgb3IgYXV0aG9yaXplZCBhZG1pbilcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUZlZUNvbmZpZyhwYXJhbXM6IFVwZGF0ZUZlZUNvbmZpZ1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnVwZGF0ZUZlZUNvbmZpZyhwYXJhbXMubmV3RmVlQnBzLCBwYXJhbXMubmV3RmVlUmVjaXBpZW50LCBwYXJhbXMubmV3RmVlQ2xhaW1CcHMpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnOiBnbG9iYWxDb25maWcsXG4gICAgICAgIGF1dGhvcml0eTogcGFyYW1zLmF1dGhvcml0eSxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBmZWUgY29uZmlnXG4gICAqL1xuICBhc3luYyBidWlsZFVwZGF0ZUZlZUNvbmZpZ1R4KHBhcmFtczogVXBkYXRlRmVlQ29uZmlnUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy51cGRhdGVGZWVDb25maWcocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJlZGljdGlvbiBtYXJrZXQgaW5zdHJ1Y3Rpb25cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU1hcmtldChwYXJhbXM6IENyZWF0ZU1hcmtldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgYWRtaW4sIG1hcmtldElkLCB5ZXNQcmljZSwgbm9QcmljZSwgZW5kVGltZSwgYmV0dGluZ1Rva2VuIH0gPSBwYXJhbXM7XG4gICAgXG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgeWVzUHJpY2VCbiA9IG5ldyBCTih5ZXNQcmljZSk7XG4gICAgY29uc3Qgbm9QcmljZUJuID0gbmV3IEJOKG5vUHJpY2UpO1xuICAgIGNvbnN0IGVuZFRpbWVCbiA9IG5ldyBCTihlbmRUaW1lKTtcblxuICAgIGNvbnN0IHBkYXMgPSBnZXRNYXJrZXRQZGFzKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jcmVhdGVNYXJrZXQoe1xuICAgICAgICAgIG1hcmtldElkOiBtYXJrZXRJZEJuLFxuICAgICAgICAgIHllc1ByaWNlOiB5ZXNQcmljZUJuLFxuICAgICAgICAgIG5vUHJpY2U6IG5vUHJpY2VCbixcbiAgICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQm4sXG4gICAgICAgIH0pXG4gICAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgICBtYXJrZXQ6IHBkYXMubWFya2V0LFxuICAgICAgICAgIHllc01pbnQ6IHBkYXMueWVzTWludCxcbiAgICAgICAgICBub01pbnQ6IHBkYXMubm9NaW50LFxuICAgICAgICAgIGJldHRpbmdUb2tlbjogYmV0dGluZ1Rva2VuLFxuICAgICAgICAgIHZhdWx0OiBwZGFzLnZhdWx0LFxuICAgICAgICAgIGFkbWluOiBhZG1pbixcbiAgICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICAgICAgc3lzdGVtUHJvZ3JhbTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgbWFya2V0XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBNYXJrZXQgY3JlYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcHJpb3JpdHlGZWVPcHRpb25zIC0gT3B0aW9uYWwgcHJpb3JpdHkgZmVlIHNldHRpbmdzIHRvIGFjY2VsZXJhdGUgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uXG4gICAqIEBwYXJhbSBwcmlvcml0eUZlZU9wdGlvbnMuY29tcHV0ZVVuaXRQcmljZSAtIFByaWNlIHBlciBjb21wdXRlIHVuaXQgaW4gbWljcm8tbGFtcG9ydHMgKGUuZy4sIDEwMDAgPSAwLjAwMDAwMSBTT0wgcGVyIENVKVxuICAgKiBAcGFyYW0gcHJpb3JpdHlGZWVPcHRpb25zLmNvbXB1dGVVbml0TGltaXQgLSBNYXggY29tcHV0ZSB1bml0cyAoZGVmYXVsdDogNDAwLDAwMCBmb3IgY3JlYXRlTWFya2V0IGR1ZSB0byBtdWx0aXBsZSBQREEgaW5pdHMpXG4gICAqL1xuICBhc3luYyBidWlsZENyZWF0ZU1hcmtldFR4KFxuICAgIHBhcmFtczogQ3JlYXRlTWFya2V0UGFyYW1zLFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIEFkZCBwcmlvcml0eSBmZWUgaW5zdHJ1Y3Rpb25zICh1c2UgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQpXG4gICAgY29uc3QgZmVlT3B0cyA9IHByaW9yaXR5RmVlT3B0aW9ucyA/PyBERUZBVUxUX1BSSU9SSVRZX0ZFRTtcbiAgICAvLyBTZXQgY29tcHV0ZSB1bml0IGxpbWl0IChjcmVhdGVNYXJrZXQgaXMgYSBjb21wbGV4IHR4LCBkZWZhdWx0IHRvIDQwMGspXG4gICAgY29uc3QgY29tcHV0ZVVuaXRMaW1pdCA9IGZlZU9wdHMuY29tcHV0ZVVuaXRMaW1pdCA/PyA0MDBfMDAwO1xuICAgIHR4LmFkZChcbiAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0TGltaXQoe1xuICAgICAgICB1bml0czogY29tcHV0ZVVuaXRMaW1pdCxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoZmVlT3B0cy5jb21wdXRlVW5pdFByaWNlICE9PSB1bmRlZmluZWQgJiYgZmVlT3B0cy5jb21wdXRlVW5pdFByaWNlID4gMCkge1xuICAgICAgdHguYWRkKFxuICAgICAgICBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdFByaWNlKHtcbiAgICAgICAgICBtaWNyb0xhbXBvcnRzOiBmZWVPcHRzLmNvbXB1dGVVbml0UHJpY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jcmVhdGVNYXJrZXQocGFyYW1zKTtcbiAgICB0eC5hZGQoaXgpO1xuICAgIFxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGFjZSBhIGJldCBpbnN0cnVjdGlvbiAod2l0aG91dCBBVEEgY3JlYXRpb24pXG4gICAqL1xuICBhc3luYyBwbGFjZUJldChwYXJhbXM6IFBsYWNlQmV0UGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGFtb3VudCwgb3V0Y29tZSwgYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRUb2tlbiB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IGFtb3VudEJuID0gbmV3IEJOKGFtb3VudCk7XG4gICAgY29uc3Qgb3V0Y29tZUVudW0gPSBvdXRjb21lID09PSBcIlllc1wiID8geyB5ZXM6IHt9IH0gOiB7IG5vOiB7fSB9O1xuXG4gICAgLy8gR2V0IGdsb2JhbCBjb25maWcgZm9yIGZlZSBpbmZvXG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgLy8gRGVyaXZlIFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggb3V0Y29tZSB0b2tlbiB0aGUgdXNlciB3aWxsIHJlY2VpdmVcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnBsYWNlQmV0KHtcbiAgICAgICAgYnV5T3V0Y29tZTogb3V0Y29tZUVudW0sXG4gICAgICAgIGFtb3VudDogYW1vdW50Qm4sXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICBmZWVSZWNpcGllbnRUb2tlbjogZmVlUmVjaXBpZW50VG9rZW4gfHwgbnVsbCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHBsYWNlIGEgYmV0ICh3aXRoIG9wdGlvbmFsIEFUQSBjcmVhdGlvbiBmb3IgYm90aCBvdXRjb21lIHRva2VuIGFuZCBmZWUgcmVjaXBpZW50KVxuICAgKi9cbiAgYXN5bmMgYnVpbGRQbGFjZUJldFR4KHBhcmFtczogUGxhY2VCZXRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIG91dGNvbWUsIGJldHRpbmdUb2tlbiwgY3JlYXRlQXRhID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgXG4gICAgLy8gRmV0Y2ggY29uZmlnIHRvIGNoZWNrIGZlZV9icHNcbiAgICBjb25zdCBjb25maWdBY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCk7XG4gICAgXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgb3V0Y29tZSBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgaWYgKGNyZWF0ZUF0YSkge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHModXNlck91dGNvbWVUb2tlbik7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgdXNlciwgdGFyZ2V0TWludCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGlmIGZlZV9icHMgPiAwXG4gICAgbGV0IGZlZVJlY2lwaWVudFRva2VuOiBQdWJsaWNLZXkgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY29uZmlnQWNjb3VudC5mZWVCcHMgPiAwKSB7XG4gICAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gcGFyYW1zLmZlZVJlY2lwaWVudCB8fCBjb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBmZWVBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgICBpZiAoIWZlZUF0YUV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVGZWVBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgZmVlUmVjaXBpZW50QWRkcmVzcywgYmV0dGluZ1Rva2VuKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUZlZUF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZUJldEl4ID0gYXdhaXQgdGhpcy5wbGFjZUJldCh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBmZWVSZWNpcGllbnRUb2tlbixcbiAgICB9KTtcbiAgICB0eC5hZGQocGxhY2VCZXRJeCk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSB0cmFuc2FjdGlvbiB0byBwbGFjZSBiZXRzIGZyb20gYm90aCB1c2VyIGFuZCBib251cyBhY2NvdW50IGluIG9uZSB0cmFuc2FjdGlvbi5cbiAgICogVGhpcyB0cmFuc2FjdGlvbiByZXF1aXJlcyB0d28gc2lnbmVyczogdXNlciBhbmQgYm9udXNBY2NvdW50LlxuICAgKiBcbiAgICogVXNlIGNhc2U6IFVzZXIgcGF5cyBwYXJ0IG9mIHRoZSBiZXQsIGJvbnVzIGFjY291bnQgKGJhY2tlbmQpIHBheXMgdGhlIHJlc3QuXG4gICAqIEV4YW1wbGU6IFVzZXIgYmV0cyAxMFUgdG90YWwsIHVzZXIgcGF5cyA4VSwgYm9udXMgYWNjb3VudCBwYXlzIDJVLlxuICAgKiBcbiAgICogQm90aCBiZXRzIGFyZSBwbGFjZWQgb24gdGhlIHNhbWUgb3V0Y29tZSwgYnV0IG91dGNvbWUgdG9rZW5zIGdvIHRvIGVhY2ggYWNjb3VudCByZXNwZWN0aXZlbHkuXG4gICAqL1xuICBhc3luYyBidWlsZFBsYWNlQmV0VjJUeChwYXJhbXM6IFBsYWNlQmV0VjJQYXJhbXMpOiBQcm9taXNlPFBsYWNlQmV0VjJSZXN1bHQ+IHtcbiAgICBjb25zdCB7IFxuICAgICAgdXNlciwgXG4gICAgICBib251c0FjY291bnQsIFxuICAgICAgbWFya2V0LCBcbiAgICAgIHVzZXJBbW91bnQsIFxuICAgICAgYm9udXNBbW91bnQsIFxuICAgICAgb3V0Y29tZSwgXG4gICAgICBiZXR0aW5nVG9rZW4sIFxuICAgICAgY3JlYXRlQXRhID0gdHJ1ZSBcbiAgICB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgXG4gICAgLy8gRmV0Y2ggY29uZmlnIHRvIGNoZWNrIGZlZV9icHNcbiAgICBjb25zdCBjb25maWdBY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCk7XG4gICAgXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIFxuICAgIC8vIFVzZXIncyBvdXRjb21lIHRva2VuIGFjY291bnRcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgXG4gICAgLy8gQm9udXMgYWNjb3VudCdzIG91dGNvbWUgdG9rZW4gYWNjb3VudFxuICAgIGNvbnN0IGJvbnVzT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgYm9udXNBY2NvdW50LCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIC8vIENyZWF0ZSBBVEFzIGlmIG5lZWRlZFxuICAgIGlmIChjcmVhdGVBdGEpIHtcbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgb3V0Y29tZSBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCB1c2VyQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHModXNlck91dGNvbWVUb2tlbik7XG4gICAgICBpZiAoIXVzZXJBdGFFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlVXNlckF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbih1c2VyLCB1c2VyLCB0YXJnZXRNaW50LCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgICB0eC5hZGQoY3JlYXRlVXNlckF0YUl4KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgYm9udXMgYWNjb3VudCBvdXRjb21lIEFUQSBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGJvbnVzQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHMoYm9udXNPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCFib251c0F0YUV4aXN0cykge1xuICAgICAgICAvLyBVc2VyIHBheXMgZm9yIGNyZWF0aW5nIHRoZSBib251cyBhY2NvdW50J3MgQVRBXG4gICAgICAgIGNvbnN0IGNyZWF0ZUJvbnVzQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIGJvbnVzQWNjb3VudCwgdGFyZ2V0TWludCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUJvbnVzQXRhSXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBmZWUgcmVjaXBpZW50IHRva2VuIGFjY291bnQgaWYgZmVlX2JwcyA+IDBcbiAgICBsZXQgZmVlUmVjaXBpZW50VG9rZW46IFB1YmxpY0tleSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjb25maWdBY2NvdW50LmZlZUJwcyA+IDApIHtcbiAgICAgIGNvbnN0IGZlZVJlY2lwaWVudEFkZHJlc3MgPSBwYXJhbXMuZmVlUmVjaXBpZW50IHx8IGNvbmZpZ0FjY291bnQuZmVlUmVjaXBpZW50O1xuICAgICAgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBmZWUgcmVjaXBpZW50IEFUQSBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGZlZUF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGZlZVJlY2lwaWVudFRva2VuKTtcbiAgICAgIGlmICghZmVlQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZUZlZUF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbih1c2VyLCBmZWVSZWNpcGllbnRBZGRyZXNzLCBiZXR0aW5nVG9rZW4pO1xuICAgICAgICB0eC5hZGQoY3JlYXRlRmVlQXRhSXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB1c2VyJ3MgcGxhY2VCZXQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCB1c2VyQmV0SXggPSBhd2FpdCB0aGlzLnBsYWNlQmV0KHtcbiAgICAgIHVzZXIsXG4gICAgICBtYXJrZXQsXG4gICAgICBhbW91bnQ6IHVzZXJBbW91bnQsXG4gICAgICBvdXRjb21lLFxuICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKHVzZXJCZXRJeCk7XG5cbiAgICAvLyBDcmVhdGUgYm9udXMgYWNjb3VudCdzIHBsYWNlQmV0IGluc3RydWN0aW9uXG4gICAgY29uc3QgYm9udXNCZXRJeCA9IGF3YWl0IHRoaXMucGxhY2VCZXQoe1xuICAgICAgdXNlcjogYm9udXNBY2NvdW50LFxuICAgICAgbWFya2V0LFxuICAgICAgYW1vdW50OiBib251c0Ftb3VudCxcbiAgICAgIG91dGNvbWUsXG4gICAgICBiZXR0aW5nVG9rZW4sXG4gICAgICBmZWVSZWNpcGllbnRUb2tlbixcbiAgICB9KTtcbiAgICB0eC5hZGQoYm9udXNCZXRJeCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uOiB0eCxcbiAgICAgIHJlcXVpcmVkU2lnbmVyczogW3VzZXIsIGJvbnVzQWNjb3VudF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBhIGJhc2U2NCBlbmNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIFVzZSB0aGlzIG9uIGZyb250ZW5kIHRvIGRlY29kZSB0aGUgdHJhbnNhY3Rpb24gcmVjZWl2ZWQgZnJvbSBiYWNrZW5kXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVUcmFuc2FjdGlvbihzZXJpYWxpemVkVHg6IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKTtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb24uZnJvbShidWZmZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBwYXJ0aWFsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggdGhlIGJvbnVzIGFjY291bnQgKGJhY2tlbmQgc2lkZSlcbiAgICogXG4gICAqIEBwYXJhbSB1c2VyU2lnbmVkVHhCYXNlNjQgLSBCYXNlNjQgZW5jb2RlZCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBiZWVuIHNpZ25lZCBieSB1c2VyXG4gICAqIEBwYXJhbSBib251c0FjY291bnRLZXlwYWlyIC0gVGhlIGJvbnVzIGFjY291bnQga2V5cGFpciBmb3Igc2lnbmluZ1xuICAgKiBAcmV0dXJucyBUaGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHJlYWR5IGZvciBzdWJtaXNzaW9uXG4gICAqL1xuICBzdGF0aWMgc2lnbldpdGhLZXlQYWlyKHVzZXJTaWduZWRUeEJhc2U2NDogc3RyaW5nLCBrZXlQYWlyOiBLZXlwYWlyKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHVzZXJTaWduZWRUeEJhc2U2NCwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbShidWZmZXIpO1xuICAgIHR4LnBhcnRpYWxTaWduKGtleVBhaXIpO1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8vIGFzeW5jIHRyYW5zZmVyKClcblxuICAvKipcbiAgICogQnVpbGQgYSB0cmFuc2FjdGlvbiB0byB3aXRoZHJhdyBib251cyAodHJhbnNmZXIgVVNEVCBmcm9tIGJvbnVzIGFjY291bnQgdG8gdXNlcilcbiAgICogVGhpcyB0cmFuc2FjdGlvbiByZXF1aXJlcyB0aGUgYm9udXMgYWNjb3VudCB0byBzaWduLlxuICAgKiBcbiAgICogQHBhcmFtIGJvbnVzQWNjb3VudCAtIFRoZSBib251cyBhY2NvdW50IHB1YmxpYyBrZXkgKHNpZ25lciwgc291cmNlIG9mIGZ1bmRzKVxuICAgKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyJ3MgcHVibGljIGtleSAoZGVzdGluYXRpb24pXG4gICAqIEBwYXJhbSB0b2tlbk1pbnQgLSBUaGUgdG9rZW4gbWludCBhZGRyZXNzIChlLmcuLCBVU0RUKVxuICAgKiBAcGFyYW0gYW1vdW50IC0gQW1vdW50IHRvIHRyYW5zZmVyIChpbiB0b2tlbidzIHNtYWxsZXN0IHVuaXQsIGUuZy4sIDFfMDAwXzAwMCBmb3IgMSBVU0RUIHdpdGggNiBkZWNpbWFscylcbiAgICogQHBhcmFtIGNyZWF0ZUF0YSAtIFdoZXRoZXIgdG8gY3JlYXRlIHRoZSB1c2VyJ3MgQVRBIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKGRlZmF1bHQ6IHRydWUpXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uIHJlYWR5IGZvciBzaWduaW5nXG4gICAqL1xuICBhc3luYyBidWlsZFdpdGhkcmF3Qm9udXNUeChwYXJhbXM6IHtcbiAgICBib251c0FjY291bnQ6IFB1YmxpY0tleTtcbiAgICB1c2VyOiBQdWJsaWNLZXk7XG4gICAgdG9rZW5NaW50OiBQdWJsaWNLZXk7XG4gICAgYW1vdW50OiBudW1iZXIgfCBCTjtcbiAgICBjcmVhdGVBdGE/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgYm9udXNBY2NvdW50LCB1c2VyLCB0b2tlbk1pbnQsIGFtb3VudCwgY3JlYXRlQXRhID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGFtb3VudEJuID0gbmV3IEJOKGFtb3VudCk7XG4gICAgXG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICBcbiAgICAvLyBHZXQgQVRBIGFkZHJlc3NlcyBmb3IgYm90aCBhY2NvdW50c1xuICAgIGNvbnN0IGJvbnVzVG9rZW5BY2NvdW50ID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModG9rZW5NaW50LCBib251c0FjY291bnQpO1xuICAgIGNvbnN0IHVzZXJUb2tlbkFjY291bnQgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0b2tlbk1pbnQsIHVzZXIpO1xuICAgIFxuICAgIC8vIENyZWF0ZSB1c2VyJ3MgQVRBIGlmIG5lZWRlZFxuICAgIGlmIChjcmVhdGVBdGEpIHtcbiAgICAgIGNvbnN0IHVzZXJBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyh1c2VyVG9rZW5BY2NvdW50KTtcbiAgICAgIGlmICghdXNlckF0YUV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVVc2VyQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKGJvbnVzQWNjb3VudCwgdXNlciwgdG9rZW5NaW50KTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZVVzZXJBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSB0cmFuc2ZlciBpbnN0cnVjdGlvblxuICAgIGNvbnN0IHRyYW5zZmVySXggPSBjcmVhdGVUcmFuc2Zlckluc3RydWN0aW9uKFxuICAgICAgYm9udXNUb2tlbkFjY291bnQsICAvLyBzb3VyY2VcbiAgICAgIHVzZXJUb2tlbkFjY291bnQsICAgLy8gZGVzdGluYXRpb25cbiAgICAgIGJvbnVzQWNjb3VudCwgICAgICAgLy8gb3duZXIgKHNpZ25lcilcbiAgICAgIEJpZ0ludChhbW91bnRCbi50b1N0cmluZygpKSwgIC8vIGFtb3VudFxuICAgICAgW10sICAgICAgICAgICAgICAgICAvLyBtdWx0aVNpZ25lcnMgKGVtcHR5IGZvciBzaW5nbGUgc2lnbmVyKVxuICAgICAgVE9LRU5fUFJPR1JBTV9JRCAgICAvLyBwcm9ncmFtIGlkXG4gICAgKTtcbiAgICB0eC5hZGQodHJhbnNmZXJJeCk7XG4gICAgXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0cmFuc2FjdGlvbiBmb3Igd2l0aGRyYXdpbmcgYm9udXMgd2l0aCBzZXJpYWxpemF0aW9uIGluZm9cbiAgICogVXNlZnVsIGZvciBzcGxpdCBzaWduaW5nIHdvcmtmbG93IHdoZXJlIHVzZXIvYWRtaW4gYnVpbGRzIHR4IGFuZCBib251cyBhY2NvdW50IHNpZ25zXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0cmFuc2FjdGlvbiBhbmQgcmVxdWlyZWQgc2lnbmVyc1xuICAgKi9cbiAgYXN5bmMgYnVpbGRXaXRoZHJhd0JvbnVzVHhXaXRoSW5mbyhwYXJhbXM6IHtcbiAgICBib251c0FjY291bnQ6IFB1YmxpY0tleTtcbiAgICB1c2VyOiBQdWJsaWNLZXk7XG4gICAgdG9rZW5NaW50OiBQdWJsaWNLZXk7XG4gICAgYW1vdW50OiBudW1iZXIgfCBCTjtcbiAgICBjcmVhdGVBdGE/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgcmVxdWlyZWRTaWduZXJzOiBQdWJsaWNLZXlbXSB9PiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLmJ1aWxkV2l0aGRyYXdCb251c1R4KHBhcmFtcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uOiB0eCxcbiAgICAgIHJlcXVpcmVkU2lnbmVyczogW3BhcmFtcy5ib251c0FjY291bnRdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xhaW0gcmV3YXJkcyBhZnRlciBtYXJrZXQgcmVzb2x1dGlvblxuICAgKi9cbiAgYXN5bmMgY2xhaW1SZXdhcmRzKHBhcmFtczogQ2xhaW1SZXdhcmRzUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGJldHRpbmdUb2tlbiwgd2lubmluZ091dGNvbWUgfSA9IHBhcmFtcztcblxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBXG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IHdpbm5pbmdPdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3Qgc2hhcmVzVG9DbGFpbUJuID0gbmV3IEJOKHBhcmFtcy5zaGFyZXNUb0NsYWltKTtcbiAgICBjb25zdCBjbG9zZUFjY291bnQgPSBwYXJhbXMuY2xvc2VBY2NvdW50ID8/IHRydWU7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xhaW1SZXdhcmRzKHtcbiAgICAgICAgdG9rZW5BbW91bnQ6IHNoYXJlc1RvQ2xhaW1CbixcbiAgICAgICAgY2xvc2VBY2NvdW50LFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQsXG4gICAgICAgIHllc01pbnQsXG4gICAgICAgIG5vTWludCxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBjbGFpbSByZXdhcmRzXG4gICAqL1xuICBhc3luYyBidWlsZENsYWltUmV3YXJkc1R4KHBhcmFtczogQ2xhaW1SZXdhcmRzUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBiZXR0aW5nVG9rZW4sIHdpbm5pbmdPdXRjb21lIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IHVzZXJCZXR0aW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIHVzZXIpO1xuICAgIC8vIE91dGNvbWUgdG9rZW5zIChZZXMvTm8pIHVzZSBUb2tlbi0yMDIyIHByb2dyYW1cbiAgICBjb25zdCB0YXJnZXRNaW50ID0gd2lubmluZ091dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBjb25zdCBzaGFyZXNUb0NsYWltQm4gPSBuZXcgQk4ocGFyYW1zLnNoYXJlc1RvQ2xhaW0pO1xuICAgIGNvbnN0IGNsb3NlQWNjb3VudCA9IHBhcmFtcy5jbG9zZUFjY291bnQgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbGFpbVJld2FyZHMoe1xuICAgICAgICB0b2tlbkFtb3VudDogc2hhcmVzVG9DbGFpbUJuLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgICBcbiAgICB0eC5hZGQoaXgpO1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBpbnN0cnVjdGlvbnMgdG8gY2xhaW0gcmV3YXJkcyBmcm9tIG11bHRpcGxlIG1hcmtldHNcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgYmF0Y2hlZCBpbnRvIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgYXN5bmMgYmF0Y2hDbGFpbVJld2FyZHMocGFyYW1zOiBCYXRjaENsYWltUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uW10+IHtcbiAgICBjb25zdCB7IHVzZXIsIGNsYWltcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNsYWltIG9mIGNsYWltcykge1xuICAgICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsYWltUmV3YXJkcyh7XG4gICAgICAgIHVzZXIsXG4gICAgICAgIG1hcmtldDogY2xhaW0ubWFya2V0LFxuICAgICAgICBiZXR0aW5nVG9rZW46IGNsYWltLmJldHRpbmdUb2tlbixcbiAgICAgICAgd2lubmluZ091dGNvbWU6IGNsYWltLndpbm5pbmdPdXRjb21lLFxuICAgICAgICBzaGFyZXNUb0NsYWltOiBjbGFpbS5zaGFyZXNUb0NsYWltID8/IDAsXG4gICAgICAgIGNsb3NlQWNjb3VudDogY2xhaW0uY2xvc2VBY2NvdW50ID8/IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKGl4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRyYW5zYWN0aW9ucyB0byBjbGFpbSByZXdhcmRzIGZyb20gbXVsdGlwbGUgbWFya2V0c1xuICAgKiBBdXRvbWF0aWNhbGx5IHNwbGl0cyBpbnRvIG11bHRpcGxlIHRyYW5zYWN0aW9ucyBpZiBuZWVkZWQgKG1heCA1IGNsYWltcyBwZXIgdHggdG8gYXZvaWQgc2l6ZSBsaW1pdHMpXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBCYXRjaCBjbGFpbSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBtYXhDbGFpbXNQZXJUeCAtIE1heGltdW0gY2xhaW1zIHBlciB0cmFuc2FjdGlvbiAoZGVmYXVsdDogNSlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBhc3luYyBidWlsZEJhdGNoQ2xhaW1SZXdhcmRzVHgoXG4gICAgcGFyYW1zOiBCYXRjaENsYWltUGFyYW1zLFxuICAgIG1heENsYWltc1BlclR4OiBudW1iZXIgPSA1XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25bXT4ge1xuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGF3YWl0IHRoaXMuYmF0Y2hDbGFpbVJld2FyZHMocGFyYW1zKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcblxuICAgIC8vIFNwbGl0IGluc3RydWN0aW9ucyBpbnRvIGNodW5rc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSArPSBtYXhDbGFpbXNQZXJUeCkge1xuICAgICAgY29uc3QgY2h1bmsgPSBpbnN0cnVjdGlvbnMuc2xpY2UoaSwgaSArIG1heENsYWltc1BlclR4KTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICBjaHVuay5mb3JFYWNoKGl4ID0+IHR4LmFkZChpeCkpO1xuICAgICAgdHJhbnNhY3Rpb25zLnB1c2godHgpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmVmdW5kIGJldHMgaWYgbWFya2V0IGlzIHJlZnVuZGVkXG4gICAqIEBwYXJhbSBwYXJhbXMudG9rZW5BbW91bnQgLSBBbW91bnQgb2Ygc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbCBzaGFyZXMuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyB1c2VycyB0byBwYXJ0aWFsbHkgcmVmdW5kIHRoZWlyIHBvc2l0aW9uIGFjcm9zcyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICBhc3luYyByZWZ1bmQocGFyYW1zOiBSZWZ1bmRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCwgYmV0dGluZ1Rva2VuLCBvdXRjb21lLCB0b2tlbkFtb3VudCwgY2xvc2VBY2NvdW50ID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IG91dGNvbWVFbnVtID0gb3V0Y29tZSA9PT0gXCJZZXNcIiA/IHsgeWVzOiB7fSB9IDogeyBubzoge30gfTtcbiAgICBcbiAgICAvLyBDb252ZXJ0IHRva2VuQW1vdW50IHRvIEJOICgwIG1lYW5zIHJlZnVuZCBhbGwpXG4gICAgY29uc3QgdG9rZW5BbW91bnRCbiA9IG5ldyBCTih0b2tlbkFtb3VudCA/PyAwKTtcbiAgICBcbiAgICAvLyBEZXJpdmUgbWludCBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5yZWZ1bmQoe1xuICAgICAgICBvdXRjb21lOiBvdXRjb21lRW51bSxcbiAgICAgICAgdG9rZW5BbW91bnQ6IHRva2VuQW1vdW50Qm4sXG4gICAgICAgIGNsb3NlQWNjb3VudCxcbiAgICAgIH0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0OiBtYXJrZXQsXG4gICAgICAgIHllc01pbnQ6IHllc01pbnQsXG4gICAgICAgIG5vTWludDogbm9NaW50LFxuICAgICAgICB2YXVsdDogdmF1bHQsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW46IHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW46IHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgICAgdG9rZW4yMDIyUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICAgICAgICB1c2VyOiB1c2VyLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gcmVmdW5kXG4gICAqL1xuICBhc3luYyBidWlsZFJlZnVuZFR4KHBhcmFtczogUmVmdW5kUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5yZWZ1bmQocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1bmQgYm90aCBZZXMgYW5kIE5vIHBvc2l0aW9ucyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi5cbiAgICogXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIGEgdXNlciBoYXMgYmV0IG9uIGJvdGggWWVzIGFuZCBObyBvdXRjb21lcyBhbmQgbmVlZHMgdG8gXG4gICAqIHJlZnVuZCBhbGwgcG9zaXRpb25zIGFmdGVyIHRoZSBtYXJrZXQgaGFzIGJlZW4gcmVzb2x2ZWQgYXMgXCJSZWZ1bmRlZFwiIChOb25lKS5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHk6XG4gICAqIC0gQ2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBZZXMgdG9rZW5zIGFuZC9vciBObyB0b2tlbnNcbiAgICogLSBPbmx5IGluY2x1ZGVzIHJlZnVuZCBpbnN0cnVjdGlvbnMgZm9yIG91dGNvbWVzIHRoZSB1c2VyIGFjdHVhbGx5IGhvbGRzXG4gICAqIC0gQ2xvc2VzIHRoZSB0b2tlbiBhY2NvdW50cyBhZnRlciByZWZ1bmRpbmcgKGJ5IGRlZmF1bHQpXG4gICAqIFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUmVmdW5kVjJQYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyIC0gVXNlcidzIHB1YmxpYyBrZXkgKHNpZ25lcilcbiAgICogQHBhcmFtIHBhcmFtcy5tYXJrZXQgLSBNYXJrZXQgUERBIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtcy5iZXR0aW5nVG9rZW4gLSBCZXR0aW5nIHRva2VuIG1pbnQgKGUuZy4sIFVTREMpXG4gICAqIEBwYXJhbSBwYXJhbXMueWVzVG9rZW5BbW91bnQgLSBPcHRpb25hbC4gQW1vdW50IG9mIFllcyB0b2tlbnMgdG8gcmVmdW5kLiAwIG9yIHVuZGVmaW5lZCA9IHJlZnVuZCBhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMubm9Ub2tlbkFtb3VudCAtIE9wdGlvbmFsLiBBbW91bnQgb2YgTm8gdG9rZW5zIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgPSByZWZ1bmQgYWxsLlxuICAgKiBAcGFyYW0gcGFyYW1zLmNsb3NlWWVzQWNjb3VudCAtIE9wdGlvbmFsLiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBZZXMgdG9rZW4gYWNjb3VudCBhZnRlciByZWZ1bmQuIERlZmF1bHQ6IHRydWVcbiAgICogQHBhcmFtIHBhcmFtcy5jbG9zZU5vQWNjb3VudCAtIE9wdGlvbmFsLiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBObyB0b2tlbiBhY2NvdW50IGFmdGVyIHJlZnVuZC4gRGVmYXVsdDogdHJ1ZVxuICAgKiBcbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb24gY29udGFpbmluZyByZWZ1bmQgaW5zdHJ1Y3Rpb25zIGZvciBib3RoIG91dGNvbWVzIChpZiBhcHBsaWNhYmxlKVxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBCYXNpYyB1c2FnZTogUmVmdW5kIGFsbCBZZXMgYW5kIE5vIHRva2Vuc1xuICAgKiBjb25zdCB0eCA9IGF3YWl0IGNsaWVudC5idWlsZFJlZnVuZFYyVHgoe1xuICAgKiAgIHVzZXI6IHVzZXJQdWJsaWNLZXksXG4gICAqICAgbWFya2V0OiBtYXJrZXRQZGEsXG4gICAqICAgYmV0dGluZ1Rva2VuOiB1c2RjTWludCxcbiAgICogfSk7XG4gICAqIFxuICAgKiAvLyBTaWduIGFuZCBzZW5kXG4gICAqIHR4LnJlY2VudEJsb2NraGFzaCA9IChhd2FpdCBjb25uZWN0aW9uLmdldExhdGVzdEJsb2NraGFzaCgpKS5ibG9ja2hhc2g7XG4gICAqIHR4LmZlZVBheWVyID0gdXNlclB1YmxpY0tleTtcbiAgICogYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih0eCk7XG4gICAqIGF3YWl0IGNvbm5lY3Rpb24uc2VuZFJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZSgpKTtcbiAgICogYGBgXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEtlZXAgdG9rZW4gYWNjb3VudHMgb3BlbiAoZG9uJ3QgY2xvc2UgdGhlbSlcbiAgICogY29uc3QgdHggPSBhd2FpdCBjbGllbnQuYnVpbGRSZWZ1bmRWMlR4KHtcbiAgICogICB1c2VyOiB1c2VyUHVibGljS2V5LFxuICAgKiAgIG1hcmtldDogbWFya2V0UGRhLFxuICAgKiAgIGJldHRpbmdUb2tlbjogdXNkY01pbnQsXG4gICAqICAgY2xvc2VZZXNBY2NvdW50OiBmYWxzZSwgLy8gS2VlcCBZZXMgdG9rZW4gYWNjb3VudCBvcGVuXG4gICAqICAgY2xvc2VOb0FjY291bnQ6IGZhbHNlLCAgLy8gS2VlcCBObyB0b2tlbiBhY2NvdW50IG9wZW5cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKiBcbiAgICogQHJlbWFya3NcbiAgICogLSBUaGUgbWFya2V0IG11c3QgYmUgaW4gXCJSZWZ1bmRlZFwiIHN0YXR1cyBmb3IgdGhpcyBtZXRob2QgdG8gd29ya1xuICAgKiAtIElmIHRoZSB1c2VyIG9ubHkgaGFzIHRva2VucyBvbiBvbmUgc2lkZSwgb25seSB0aGF0IHNpZGUgd2lsbCBiZSByZWZ1bmRlZFxuICAgKiAtIFRoZSByZXR1cm5lZCB0cmFuc2FjdGlvbiB3aWxsIGJlIGVtcHR5IGlmIHRoZSB1c2VyIGhhcyBubyB0b2tlbnMgb24gZWl0aGVyIHNpZGVcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVmdW5kVjJUeChwYXJhbXM6IFJlZnVuZFYyUGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgXG4gICAgICB1c2VyLCBcbiAgICAgIG1hcmtldCwgXG4gICAgICBiZXR0aW5nVG9rZW4sXG4gICAgICB5ZXNUb2tlbkFtb3VudCxcbiAgICAgIG5vVG9rZW5BbW91bnQsXG4gICAgICBjbG9zZVllc0FjY291bnQgPSB0cnVlLFxuICAgICAgY2xvc2VOb0FjY291bnQgPSB0cnVlIFxuICAgIH0gPSBwYXJhbXM7XG4gICAgXG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICBcbiAgICAvLyBEZXJpdmUgbWludCBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIFxuICAgIC8vIEdldCB1c2VyJ3Mgb3V0Y29tZSB0b2tlbiBhY2NvdW50c1xuICAgIGNvbnN0IHVzZXJZZXNUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHllc01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIGNvbnN0IHVzZXJOb1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobm9NaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBZZXMgdG9rZW5zXG4gICAgbGV0IGhhc1llc1Rva2VucyA9IGZhbHNlO1xuICAgIGxldCB5ZXNCYWxhbmNlID0gMDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWVzQWNjb3VudCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5nZXRUb2tlbkFjY291bnRCYWxhbmNlKHVzZXJZZXNUb2tlbik7XG4gICAgICB5ZXNCYWxhbmNlID0gTnVtYmVyKHllc0FjY291bnQudmFsdWUuYW1vdW50KTtcbiAgICAgIGhhc1llc1Rva2VucyA9IHllc0JhbGFuY2UgPiAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjb3VudCBkb2Vzbid0IGV4aXN0IG9yIGhhcyBubyBiYWxhbmNlXG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIE5vIHRva2Vuc1xuICAgIGxldCBoYXNOb1Rva2VucyA9IGZhbHNlO1xuICAgIGxldCBub0JhbGFuY2UgPSAwO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub0FjY291bnQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uZ2V0VG9rZW5BY2NvdW50QmFsYW5jZSh1c2VyTm9Ub2tlbik7XG4gICAgICBub0JhbGFuY2UgPSBOdW1iZXIobm9BY2NvdW50LnZhbHVlLmFtb3VudCk7XG4gICAgICBoYXNOb1Rva2VucyA9IG5vQmFsYW5jZSA+IDA7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIG5vIGJhbGFuY2VcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIFllcyByZWZ1bmQgaW5zdHJ1Y3Rpb24gaWYgdXNlciBoYXMgWWVzIHRva2Vuc1xuICAgIGlmIChoYXNZZXNUb2tlbnMpIHtcbiAgICAgIGNvbnN0IHllc1JlZnVuZEl4ID0gYXdhaXQgdGhpcy5yZWZ1bmQoe1xuICAgICAgICB1c2VyLFxuICAgICAgICBtYXJrZXQsXG4gICAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgICAgb3V0Y29tZTogXCJZZXNcIixcbiAgICAgICAgdG9rZW5BbW91bnQ6IDAsXG4gICAgICAgIGNsb3NlQWNjb3VudDogY2xvc2VZZXNBY2NvdW50LFxuICAgICAgfSk7XG4gICAgICB0eC5hZGQoeWVzUmVmdW5kSXgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgTm8gcmVmdW5kIGluc3RydWN0aW9uIGlmIHVzZXIgaGFzIE5vIHRva2Vuc1xuICAgIGlmIChoYXNOb1Rva2Vucykge1xuICAgICAgY29uc3Qgbm9SZWZ1bmRJeCA9IGF3YWl0IHRoaXMucmVmdW5kKHtcbiAgICAgICAgdXNlcixcbiAgICAgICAgbWFya2V0LFxuICAgICAgICBiZXR0aW5nVG9rZW4sXG4gICAgICAgIG91dGNvbWU6IFwiTm9cIixcbiAgICAgICAgdG9rZW5BbW91bnQ6IDAsXG4gICAgICAgIGNsb3NlQWNjb3VudDogY2xvc2VOb0FjY291bnQsXG4gICAgICB9KTtcbiAgICAgIHR4LmFkZChub1JlZnVuZEl4KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyByZXNvbHZlTWFya2V0QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTixcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgbGV0IG91dGNvbWVFbnVtOiBhbnkgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IHllczoge30gfTtcbiAgICB9IGVsc2UgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIk5vXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyBubzoge30gfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbWFya2V0IGluZm8gdG8gZGV0ZXJtaW5lIGJldHRpbmcgdG9rZW5cbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldFBkYSk7XG4gICAgLy8gZmVlIHJlY2lwaWVudCBhZGRyZXNzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCkpLmZlZVJlY2lwaWVudDtcbiAgICAvLyBmZWUgcmVjaXBpZW50IHRva2VuIGFjY291bnQgKGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBKVxuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldFBkYS50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVzb2x2ZU1hcmtldChvdXRjb21lRW51bSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldDogbWFya2V0UGRhLFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50OiBmZWVSZWNpcGllbnRUb2tlbixcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlc29sdmUgYSBtYXJrZXRcbiAgICogQHBhcmFtIHByaW9yaXR5RmVlT3B0aW9ucyAtIE9wdGlvbmFsIHByaW9yaXR5IGZlZSBzZXR0aW5ncyB0byBhY2NlbGVyYXRlIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXNvbHZlTWFya2V0VHhCeUlEKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0SWQ6IG51bWJlciB8IEJOLFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXksXG4gICAgcHJpb3JpdHlGZWVPcHRpb25zPzogUHJpb3JpdHlGZWVPcHRpb25zXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBtYXJrZXRJZEJuID0gbmV3IEJOKG1hcmtldElkKTtcbiAgICBjb25zdCBtYXJrZXRQZGEgPSBnZXRNYXJrZXRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgYWRtaW4sIG1hcmtldElkQm4pO1xuICAgIGNvbnN0IG1hcmtldEluZm8gPSBhd2FpdCB0aGlzLmdldE1hcmtldEluZm8obWFya2V0UGRhKTtcbiAgICBjb25zdCBnbG9iYWxDb25maWdBY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCBnbG9iYWxDb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIEFkZCBwcmlvcml0eSBmZWUgaW5zdHJ1Y3Rpb25zICh1c2UgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQpXG4gICAgY29uc3QgZmVlT3B0cyA9IHByaW9yaXR5RmVlT3B0aW9ucyA/PyBERUZBVUxUX1BSSU9SSVRZX0ZFRTtcbiAgICBjb25zdCBjb21wdXRlVW5pdExpbWl0ID0gZmVlT3B0cy5jb21wdXRlVW5pdExpbWl0ID8/IDQwMF8wMDA7XG4gICAgdHguYWRkKFxuICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdExpbWl0LFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChmZWVPcHRzLmNvbXB1dGVVbml0UHJpY2UgIT09IHVuZGVmaW5lZCAmJiBmZWVPcHRzLmNvbXB1dGVVbml0UHJpY2UgPiAwKSB7XG4gICAgICB0eC5hZGQoXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0UHJpY2Uoe1xuICAgICAgICAgIG1pY3JvTGFtcG9ydHM6IGZlZU9wdHMuY29tcHV0ZVVuaXRQcmljZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IGZlZVJlY2lwaWVudEF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGZlZVJlY2lwaWVudFRva2VuKTtcbiAgICBpZiAoIWZlZVJlY2lwaWVudEF0YUV4aXN0cykge1xuICAgICAgY29uc3QgY3JlYXRlRmVlUmVjaXBpZW50QXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKGFkbWluLCBmZWVSZWNpcGllbnRBZGRyZXNzLCBtYXJrZXRJbmZvLmJldHRpbmdUb2tlbik7XG4gICAgICB0eC5hZGQoY3JlYXRlRmVlUmVjaXBpZW50QXRhSXgpO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNvbHZlIG1hcmtldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IHJlc29sdmVNYXJrZXRJeCA9IGF3YWl0IHRoaXMucmVzb2x2ZU1hcmtldEJ5SUQoYWRtaW4sIG1hcmtldElkLCB3aW5uaW5nT3V0Y29tZSwgZmVlUmVjaXBpZW50KTtcbiAgICB0eC5hZGQocmVzb2x2ZU1hcmtldEl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZU1hcmtldChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgbGV0IG91dGNvbWVFbnVtOiBhbnkgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IHllczoge30gfTtcbiAgICB9IGVsc2UgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIk5vXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyBubzoge30gfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbWFya2V0IGluZm8gdG8gZGV0ZXJtaW5lIGJldHRpbmcgdG9rZW5cbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCkpLmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVzb2x2ZU1hcmtldChvdXRjb21lRW51bSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldDogbWFya2V0LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50OiBmZWVSZWNpcGllbnRUb2tlbixcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlc29sdmUgYSBtYXJrZXRcbiAgICogQHBhcmFtIHByaW9yaXR5RmVlT3B0aW9ucyAtIE9wdGlvbmFsIHByaW9yaXR5IGZlZSBzZXR0aW5ncyB0byBhY2NlbGVyYXRlIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXNvbHZlTWFya2V0VHgoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5LFxuICAgIHByaW9yaXR5RmVlT3B0aW9ucz86IFByaW9yaXR5RmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXQpO1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZ0FjY291bnQgPSBhd2FpdCB0aGlzLmdldEdsb2JhbENvbmZpZ0FjY291bnQoKTtcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gZmVlUmVjaXBpZW50IHx8IGdsb2JhbENvbmZpZ0FjY291bnQuZmVlUmVjaXBpZW50O1xuICAgIC8vIGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBIGZlZSByZWNpcGllbnRzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtYXJrZXRJbmZvLmJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgdHJ1ZSk7XG5cbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gQWRkIHByaW9yaXR5IGZlZSBpbnN0cnVjdGlvbnMgKHVzZSBkZWZhdWx0IGlmIG5vdCBwcm92aWRlZClcbiAgICBjb25zdCBmZWVPcHRzID0gcHJpb3JpdHlGZWVPcHRpb25zID8/IERFRkFVTFRfUFJJT1JJVFlfRkVFO1xuICAgIGNvbnN0IGNvbXB1dGVVbml0TGltaXQgPSBmZWVPcHRzLmNvbXB1dGVVbml0TGltaXQgPz8gNDAwXzAwMDtcbiAgICB0eC5hZGQoXG4gICAgICBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdExpbWl0KHtcbiAgICAgICAgdW5pdHM6IGNvbXB1dGVVbml0TGltaXQsXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKGZlZU9wdHMuY29tcHV0ZVVuaXRQcmljZSAhPT0gdW5kZWZpbmVkICYmIGZlZU9wdHMuY29tcHV0ZVVuaXRQcmljZSA+IDApIHtcbiAgICAgIHR4LmFkZChcbiAgICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7XG4gICAgICAgICAgbWljcm9MYW1wb3J0czogZmVlT3B0cy5jb21wdXRlVW5pdFByaWNlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBmZWUgcmVjaXBpZW50IHRva2VuIGFjY291bnQgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgY29uc3QgZmVlUmVjaXBpZW50QXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHMoZmVlUmVjaXBpZW50VG9rZW4pO1xuICAgIGlmICghZmVlUmVjaXBpZW50QXRhRXhpc3RzKSB7XG4gICAgICBjb25zdCBjcmVhdGVGZWVSZWNpcGllbnRBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24oYWRtaW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIG1hcmtldEluZm8uYmV0dGluZ1Rva2VuKTtcbiAgICAgIHR4LmFkZChjcmVhdGVGZWVSZWNpcGllbnRBdGFJeCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc29sdmUgbWFya2V0IGluc3RydWN0aW9uXG4gICAgY29uc3QgcmVzb2x2ZU1hcmtldEl4ID0gYXdhaXQgdGhpcy5yZXNvbHZlTWFya2V0KGFkbWluLCBtYXJrZXQsIHdpbm5pbmdPdXRjb21lLCBmZWVSZWNpcGllbnQpO1xuICAgIHR4LmFkZChyZXNvbHZlTWFya2V0SXgpO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgY2xvc2VNYXJrZXQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbG9zZU1hcmtldCgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0OiBtYXJrZXQsXG4gICAgICAgIGFkbWluOiBhZG1pbixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsb3NlIGEgbWFya2V0XG4gICAqL1xuICBhc3luYyBidWlsZENsb3NlTWFya2V0VHgoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsb3NlTWFya2V0KGFkbWluLCBtYXJrZXQpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgY2xvc2VNYXJrZXRCeUlEKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0SWQ6IG51bWJlciB8IEJOXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbG9zZU1hcmtldCgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0OiBtYXJrZXRQZGEsXG4gICAgICAgIGFkbWluOiBhZG1pbixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsb3NlIGEgbWFya2V0XG4gICAqL1xuICBhc3luYyBidWlsZENsb3NlTWFya2V0VHhCeUlEKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0SWQ6IG51bWJlciB8IEJOXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xvc2VNYXJrZXRCeUlEKGFkbWluLCBtYXJrZXRJZCk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgbWFya2V0IGFjY291bnQgYW5kIHJlY2xhaW0gcmVudCAoQWRtaW4gb25seSlcbiAgICogQ2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG1hcmtldCBpcyByZXNvbHZlZCBhbmQgYWxsIHJld2FyZHMgY2xhaW1lZFxuICAgKi9cbiAgYXN5bmMgY2xvc2VNYXJrZXRBY2NvdW50KFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgLy8gRGVyaXZlIFBEQXNcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xvc2VNYXJrZXRBY2NvdW50KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQsXG4gICAgICAgIHllc01pbnQsXG4gICAgICAgIG5vTWludCxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIGFkbWluLFxuICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICAgIHRva2VuMjAyMlByb2dyYW06IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsb3NlIG1hcmtldCBhY2NvdW50XG4gICAqL1xuICBhc3luYyBidWlsZENsb3NlTWFya2V0QWNjb3VudFR4KFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jbG9zZU1hcmtldEFjY291bnQoYWRtaW4sIG1hcmtldCk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQnVybiB3b3J0aGxlc3MgdG9rZW5zIGZyb20gdGhlIGxvc2luZyBzaWRlIG9mIGEgcmVzb2x2ZWQgbWFya2V0LlxuICAgKiBUaGlzIGFsbG93cyB1c2VycyB0byBjbGVhbiB1cCB0aGVpciBsb3NpbmcgdG9rZW5zIHNvIHRoZSBtYXJrZXQgYWNjb3VudCBjYW4gYmUgY2xvc2VkLlxuICAgKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyIHdobyBob2xkcyBsb3NpbmcgdG9rZW5zXG4gICAqIEBwYXJhbSBtYXJrZXQgLSBUaGUgbWFya2V0IFBEQVxuICAgKiBAcGFyYW0gbG9zaW5nT3V0Y29tZSAtIFRoZSBvdXRjb21lIHRoYXQgbG9zdCAodGhlIHNpZGUgdG8gYnVybilcbiAgICogQHBhcmFtIHRva2VuQW1vdW50IC0gQW1vdW50IHRvIGJ1cm4gKDAgPSBidXJuIGFsbClcbiAgICogQHBhcmFtIGNsb3NlQWNjb3VudCAtIFdoZXRoZXIgdG8gY2xvc2UgdGhlIGxvc2luZyB0b2tlbiBhY2NvdW50IGFmdGVyIGJ1cm5pbmcgYWxsIHRva2VucyAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBhc3luYyBidXJuTWFya2V0VG9rZW5zKFxuICAgIHVzZXI6IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICBsb3NpbmdPdXRjb21lOiBPdXRjb21lLFxuICAgIHRva2VuQW1vdW50OiBudW1iZXIgfCBCTiA9IDAsXG4gICAgY2xvc2VBY2NvdW50OiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgLy8gRGVyaXZlIFBEQXNcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gVGhlIGxvc2luZyBtaW50IGlzIHRoZSBzaWRlIHRoYXQgbG9zdFxuICAgIGNvbnN0IGxvc2luZ01pbnQgPSBsb3NpbmdPdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyTG9zaW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhsb3NpbmdNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmJ1cm5NYXJrZXRUb2tlbnMoe1xuICAgICAgICB0b2tlbkFtb3VudDogbmV3IEJOKHRva2VuQW1vdW50KSxcbiAgICAgICAgY2xvc2VBY2NvdW50LFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQsXG4gICAgICAgIHllc01pbnQsXG4gICAgICAgIG5vTWludCxcbiAgICAgICAgbG9zaW5nTWludCxcbiAgICAgICAgdXNlckxvc2luZ1Rva2VuLFxuICAgICAgICB1c2VyLFxuICAgICAgICB0b2tlbjIwMjJQcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBidXJuIG1hcmtldCB0b2tlbnNcbiAgICogQHBhcmFtIGNsb3NlQWNjb3VudCAtIFdoZXRoZXIgdG8gY2xvc2UgdGhlIGxvc2luZyB0b2tlbiBhY2NvdW50IGFmdGVyIGJ1cm5pbmcgYWxsIHRva2VucyAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBhc3luYyBidWlsZEJ1cm5NYXJrZXRUb2tlbnNUeChcbiAgICB1c2VyOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXksXG4gICAgbG9zaW5nT3V0Y29tZTogT3V0Y29tZSxcbiAgICB0b2tlbkFtb3VudDogbnVtYmVyIHwgQk4gPSAwLFxuICAgIGNsb3NlQWNjb3VudDogYm9vbGVhbiA9IHRydWVcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5idXJuTWFya2V0VG9rZW5zKHVzZXIsIG1hcmtldCwgbG9zaW5nT3V0Y29tZSwgdG9rZW5BbW91bnQsIGNsb3NlQWNjb3VudCk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXIncyB0b2tlbiBiYWxhbmNlIGZvciBhIHNwZWNpZmljIG1hcmtldFxuICAgKiBSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGJvdGggWWVzIGFuZCBObyB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtIFVzZXJNYXJrZXRIb2xkUGFyYW1zIGNvbnRhaW5pbmcgdXNlciBhbmQgbWFya2V0IGFkZHJlc3Nlc1xuICAgKiBAcmV0dXJucyBVc2VyTWFya2V0SG9sZFJlc3VsdCB3aXRoIHllcyBhbmQgbm8gdG9rZW4gYmFsYW5jZXNcbiAgICovXG4gIGFzeW5jIGdldFVzZXJNYXJrZXRUb2tlbkJhbGFuY2UoXG4gICAgcGFyYW1zOiBVc2VyTWFya2V0SG9sZFBhcmFtc1xuICApOiBQcm9taXNlPFVzZXJNYXJrZXRIb2xkUmVzdWx0PiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQgfSA9IHBhcmFtcztcbiAgICBcbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBHZXQgdXNlciB0b2tlbiBhY2NvdW50c1xuICAgIGNvbnN0IHVzZXJZZXNUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHllc01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIGNvbnN0IHVzZXJOb1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobm9NaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIC8vIENoZWNrIFllcyB0b2tlbiBiYWxhbmNlXG4gICAgbGV0IHllc0JhbGFuY2UgPSBcIjBcIjtcbiAgICBsZXQgaGFzWWVzQWNjb3VudCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB5ZXNBY2NvdW50ID0gYXdhaXQgZ2V0QWNjb3VudCh0aGlzLmNvbm5lY3Rpb24sIHVzZXJZZXNUb2tlbiwgdW5kZWZpbmVkLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgeWVzQmFsYW5jZSA9IHllc0FjY291bnQuYW1vdW50LnRvU3RyaW5nKCk7XG4gICAgICBoYXNZZXNBY2NvdW50ID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFjY291bnQgZG9lc24ndCBleGlzdCBvciBoYXMgbm8gYmFsYW5jZVxuICAgIH1cblxuICAgIC8vIENoZWNrIE5vIHRva2VuIGJhbGFuY2VcbiAgICBsZXQgbm9CYWxhbmNlID0gXCIwXCI7XG4gICAgbGV0IGhhc05vQWNjb3VudCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub0FjY291bnQgPSBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgdXNlck5vVG9rZW4sIHVuZGVmaW5lZCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgIG5vQmFsYW5jZSA9IG5vQWNjb3VudC5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgIGhhc05vQWNjb3VudCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIG5vIGJhbGFuY2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeWVzTWludCxcbiAgICAgIG5vTWludCxcbiAgICAgIHllc1Rva2VuQmFsYW5jZTogeWVzQmFsYW5jZSxcbiAgICAgIG5vVG9rZW5CYWxhbmNlOiBub0JhbGFuY2UsXG4gICAgICBoYXNZZXNUb2tlbkFjY291bnQ6IGhhc1llc0FjY291bnQsXG4gICAgICBoYXNOb1Rva2VuQWNjb3VudDogaGFzTm9BY2NvdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xhaW0gcmV3YXJkcyBpZiB3b24sIG9yIGJ1cm4gdG9rZW5zIGlmIGxvc3QsIHdpdGggb3B0aW9uYWwgYWNjb3VudCBjbG9zdXJlLlxuICAgKiBUaGlzIGluc3RydWN0aW9uIGNvbWJpbmVzIGNsYWltX3Jld2FyZHMgYW5kIGJ1cm5fbWFya2V0X3Rva2VucyBsb2dpYyBpbnRvIGEgc2luZ2xlIGNhbGwuXG4gICAqIFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ2xhaW1CdXJuTWFya2V0UGFyYW1zXG4gICAqIEBwYXJhbSB1c2VyWWVzVG9rZW4gLSBVc2VyJ3MgWUVTIHRva2VuIGFjY291bnQgKG9wdGlvbmFsLCBwYXNzIG51bGwgaWYgdXNlciBoYXMgbm8gWUVTIHRva2VucylcbiAgICogQHBhcmFtIHVzZXJOb1Rva2VuIC0gVXNlcidzIE5PIHRva2VuIGFjY291bnQgKG9wdGlvbmFsLCBwYXNzIG51bGwgaWYgdXNlciBoYXMgbm8gTk8gdG9rZW5zKVxuICAgKi9cbiAgYXN5bmMgY2xhaW1CdXJuTWFya2V0KFxuICAgIHBhcmFtczogQ2xhaW1CdXJuTWFya2V0UGFyYW1zLFxuICAgIHVzZXJZZXNUb2tlbjogUHVibGljS2V5IHwgbnVsbCxcbiAgICB1c2VyTm9Ub2tlbjogUHVibGljS2V5IHwgbnVsbFxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCwgYmV0dGluZ1Rva2VuIH0gPSBwYXJhbXM7XG5cbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsYWltQnVybk1hcmtldCgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICB1c2VyWWVzVG9rZW46IHVzZXJZZXNUb2tlbixcbiAgICAgICAgdXNlck5vVG9rZW46IHVzZXJOb1Rva2VuLFxuICAgICAgICB1c2VyQmV0dGluZ1Rva2VuLFxuICAgICAgICB1c2VyLFxuICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICAgIHRva2VuMjAyMlByb2dyYW06IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xhaW0gcmV3YXJkcyAoaWYgd29uKSBvciBidXJuIHRva2VucyAoaWYgbG9zdClcbiAgICogQXV0b21hdGljYWxseSBjcmVhdGVzIHVzZXIgb3V0Y29tZSB0b2tlbiBhY2NvdW50cyBiYXNlZCBvbiB1c2VyJ3MgaG9sZGluZ3NcbiAgICogQHBhcmFtIHByaW9yaXR5RmVlT3B0aW9ucyAtIE9wdGlvbmFsIHByaW9yaXR5IGZlZSBzZXR0aW5ncyB0byBhY2NlbGVyYXRlIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgYnVpbGRDbGFpbUJ1cm5NYXJrZXRUeChcbiAgICBwYXJhbXM6IENsYWltQnVybk1hcmtldFBhcmFtcyxcbiAgICBwcmlvcml0eUZlZU9wdGlvbnM/OiBQcmlvcml0eUZlZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIEFkZCBwcmlvcml0eSBmZWUgaW5zdHJ1Y3Rpb25zICh1c2UgZGVmYXVsdCBpZiBub3QgcHJvdmlkZWQpXG4gICAgY29uc3QgZmVlT3B0cyA9IHByaW9yaXR5RmVlT3B0aW9ucyA/PyBERUZBVUxUX1BSSU9SSVRZX0ZFRTtcbiAgICBjb25zdCBjb21wdXRlVW5pdExpbWl0ID0gZmVlT3B0cy5jb21wdXRlVW5pdExpbWl0ID8/IDQwMF8wMDA7XG4gICAgdHguYWRkKFxuICAgICAgQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgICAgIHVuaXRzOiBjb21wdXRlVW5pdExpbWl0LFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChmZWVPcHRzLmNvbXB1dGVVbml0UHJpY2UgIT09IHVuZGVmaW5lZCAmJiBmZWVPcHRzLmNvbXB1dGVVbml0UHJpY2UgPiAwKSB7XG4gICAgICB0eC5hZGQoXG4gICAgICAgIENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0UHJpY2Uoe1xuICAgICAgICAgIG1pY3JvTGFtcG9ydHM6IGZlZU9wdHMuY29tcHV0ZVVuaXRQcmljZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGVyaXZlIFBEQXNcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gR2V0IHVzZXIgdG9rZW4gYWNjb3VudHNcbiAgICBjb25zdCB1c2VyWWVzVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh5ZXNNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBjb25zdCB1c2VyTm9Ub2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG5vTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDaGVjayB3aGljaCBhY2NvdW50cyBleGlzdCBhbmQgaGF2ZSB0b2tlbnNcbiAgICBsZXQgaGFzWWVzVG9rZW5zID0gZmFsc2U7XG4gICAgbGV0IGhhc05vVG9rZW5zID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeWVzQWNjb3VudCA9IGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCB1c2VyWWVzVG9rZW4sIHVuZGVmaW5lZCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgIGhhc1llc1Rva2VucyA9IHllc0FjY291bnQuYW1vdW50ID4gMG47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3RcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgbm9BY2NvdW50ID0gYXdhaXQgZ2V0QWNjb3VudCh0aGlzLmNvbm5lY3Rpb24sIHVzZXJOb1Rva2VuLCB1bmRlZmluZWQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICBoYXNOb1Rva2VucyA9IG5vQWNjb3VudC5hbW91bnQgPiAwbjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFjY291bnQgZG9lc24ndCBleGlzdFxuICAgIH1cblxuICAgIC8vIEJ1aWxkIGluc3RydWN0aW9uIHdpdGggYXBwcm9wcmlhdGUgYWNjb3VudHNcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xhaW1CdXJuTWFya2V0KFxuICAgICAgcGFyYW1zLFxuICAgICAgaGFzWWVzVG9rZW5zID8gdXNlclllc1Rva2VuIDogbnVsbCxcbiAgICAgIGhhc05vVG9rZW5zID8gdXNlck5vVG9rZW4gOiBudWxsXG4gICAgKTtcbiAgICB0eC5hZGQoaXgpO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG4gIFxuICAvKipcbiAgICogRmV0Y2ggZ2xvYmFsIGNvbmZpZyBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldEdsb2JhbENvbmZpZ0FjY291bnQoKSB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0uYWNjb3VudC5nbG9iYWxDb25maWcuZmV0Y2goZ2xvYmFsQ29uZmlnKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZldGNoIG1hcmtldCBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldE1hcmtldEFjY291bnQoYWRtaW46IFB1YmxpY0tleSwgbWFya2V0SWQ6IG51bWJlciB8IEJOKSB7XG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgbWFya2V0UGRhID0gZ2V0TWFya2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLmFjY291bnQubWFya2V0LmZldGNoKG1hcmtldFBkYSk7XG4gIH1cblxuICBhc3luYyBnZXRNYXJrZXRJbmZvKG1hcmtldFBkYTogUHVibGljS2V5KSB7XG4gICAgY29uc3QgbWFya2V0QWNjb3VudCA9IGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50Lm1hcmtldC5mZXRjaChtYXJrZXRQZGEpO1xuICAgIHJldHVybiBtYXJrZXRBY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHZhdWx0IGFjY291bnQgZGF0YVxuICAgKi9cbiAgYXN5bmMgZ2V0VmF1bHRBY2NvdW50KG1hcmtldFBkYTogUHVibGljS2V5KSB7XG4gICAgY29uc3QgdmF1bHRQZGEgPSBnZXRWYXVsdFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBtYXJrZXRQZGEpO1xuICAgIHJldHVybiBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgdmF1bHRQZGEpO1xuICB9XG5cbi8qKlxuICAgKiDojrflj5bnibnlrprku6PluIEgKE1pbnQpIOeahOaMgeacieiAheaVsOmHj1xuICAgKiDoh6rliqjlhbzlrrnnu4/lhbggVG9rZW4gUHJvZ3JhbSDlkowgVG9rZW4tMjAyMiBQcm9ncmFtXG4gICAqIFxuICAgKiBAcGFyYW0gbWludCAtIOS7o+W4gSBNaW50IOeahOWFrOmSpVxuICAgKiBAcGFyYW0gdG9rZW5Qcm9ncmFtIC0g5Y+v6YCJ77ya5piO56Gu5oyH5a6a5Luj5biB56iL5bqPIElE44CC5aaC5p6c5LiN5o+Q5L6b77yM5bCG6Ieq5Yqo6YCa6L+H5p+l6K+iIE1pbnQg6LSm5oi35L+h5oGv5p2l56Gu5a6aXG4gICAqIEByZXR1cm5zIOS9memineWkp+S6jiAwIOeahOWUr+S4gOaMgeacieiAheaVsOmHj1xuICAgKi9cbmFzeW5jIGdldFRva2VuSG9sZGVyQ291bnQoXG4gIG1pbnQ6IFB1YmxpY0tleSxcbiAgdG9rZW5Qcm9ncmFtPzogUHVibGljS2V5IHwgc3RyaW5nXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIC8vIDEuIOehruWumiBUb2tlbiDnqIvluo8gSURcbiAgICBsZXQgcHJvZ3JhbUlkOiBQdWJsaWNLZXk7XG4gICAgaWYgKCF0b2tlblByb2dyYW0pIHtcbiAgICAgIGNvbnN0IG1pbnRJbmZvID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLmdldEFjY291bnRJbmZvKG1pbnQpO1xuICAgICAgaWYgKCFtaW50SW5mbykgdGhyb3cgbmV3IEVycm9yKGBNaW50IOi0puaIt+S4jeWtmOWcqDogJHttaW50LnRvQmFzZTU4KCl9YCk7XG4gICAgICBcbiAgICAgIC8vIOWinuWKoOagoemqjO+8muWPquaciSBUb2tlbiDmiJYgVG9rZW4tMjAyMiDnqIvluo/mi6XmnInnmoTotKbmiLfmiY3mmK/lkIjms5XnmoQgTWludFxuICAgICAgaWYgKCFtaW50SW5mby5vd25lci5lcXVhbHMoVE9LRU5fUFJPR1JBTV9JRCkgJiYgIW1pbnRJbmZvLm93bmVyLmVxdWFscyhUT0tFTl8yMDIyX1BST0dSQU1fSUQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg5Zyw5Z2AICR7bWludC50b0Jhc2U1OCgpfSDkuI3mmK/kuIDkuKrmnInmlYjnmoTku6PluIEgTWludCAoT3duZXIg5Li6ICR7bWludEluZm8ub3duZXIudG9CYXNlNTgoKX0pYCk7XG4gICAgICB9XG4gICAgICBwcm9ncmFtSWQgPSBtaW50SW5mby5vd25lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbUlkID0gdHlwZW9mIHRva2VuUHJvZ3JhbSA9PT0gJ3N0cmluZycgPyBuZXcgUHVibGljS2V5KHRva2VuUHJvZ3JhbSkgOiB0b2tlblByb2dyYW07XG4gICAgfVxuXG4gICAgLy8gMi4g5p6E6YCg6L+H5ruk5ZmoXG4gICAgY29uc3QgZmlsdGVyczogYW55W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1lbWNtcDoge1xuICAgICAgICAgIG9mZnNldDogMCwgLy8gTWludCDlnLDlnYDlp4vnu4jlnKjku6PluIHotKbmiLfmlbDmja7nmoTlgY/np7vph48gMCDlpIRcbiAgICAgICAgICBieXRlczogbWludC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8g5Y+q5pyJ57uP5YW4IFRva2VuIFByb2dyYW0gKFRva2Vua2VnLi4uKSDotKbmiLflpKflsI/lm7rlrprkuLogMTY1IOWtl+iKglxuICAgIC8vIFRva2VuLTIwMjIgKFRva2VuelFkLi4uKSDotKbmiLflm6DkuLrlj6/og73ljIXlkKsgRXh0ZW5zaW9uc++8jOWkp+Wwj+aYr+WPr+WPmOeahO+8jOWboOatpOS4jeS9v+eUqCBkYXRhU2l6ZSDov4fmu6RcbiAgICBpZiAocHJvZ3JhbUlkLmVxdWFscyhUT0tFTl9QUk9HUkFNX0lEKSkge1xuICAgICAgZmlsdGVycy51bnNoaWZ0KHsgZGF0YVNpemU6IDE2NSB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiDmiafooYwgZ2V0UHJvZ3JhbUFjY291bnRzIOafpeivolxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhwcm9ncmFtSWQsIHtcbiAgICAgIGZpbHRlcnMsXG4gICAgfSk7XG5cbiAgICAvLyA0LiDov4fmu6Tlh7rkvZnpop0gPiAwIOeahOi0puaIt1xuICAgIC8vIOaXoOiuuuWTquS4queoi+W6j++8jOS9meminSAoQW1vdW50KSDpg73lnKjlgY/np7vph48gNjQg5aSE55qEIDgg5a2X6IqCICh1NjQpXG4gICAgY29uc3QgaG9sZGVyc1dpdGhCYWxhbmNlID0gYWNjb3VudHMuZmlsdGVyKChhY2NvdW50KSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYWNjb3VudC5hY2NvdW50LmRhdGE7XG4gICAgICBjb25zdCBhbW91bnQgPSBkYXRhLnJlYWRCaWdVSW50NjRMRSg2NCk7XG4gICAgICByZXR1cm4gYW1vdW50ID4gMG47XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9sZGVyc1dpdGhCYWxhbmNlLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGDojrflj5YgTWludCAke21pbnQudG9CYXNlNTgoKX0g55qE5oyB5pyJ6ICF5pWw6YeP5aSx6LSlOmAsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4gICAgLyoqXG4gICAqIOiOt+WPlue7vOWQiOeahOW4guWcuuWbnuaUtueKtuaAge+8iOWMheWQq+mTvuS4iuaVsOaNru+8iVxuICAgKiDor6Xmlrnms5Xmn6Xor6LmiYDmnInlv4XopoHkv6Hmga/vvIzku6XliKTmlq3luILlnLrmmK/lkKblj6/ku6XlronlhajlnLDlm57mlLbnp5/ph5FcbiAgICogXG4gICAqIEBwYXJhbSBtYXJrZXRQZGEgLSDluILlnLrnmoQgUERBIOWFrOmSpVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOmFjee9rumAiemhuVxuICAgKiBAcGFyYW0gb3B0aW9ucy5za2lwSG9sZGVyQ291bnQgLSDmmK/lkKbot7Pov4fmmILotLXnmoTmjIHmnInkurrmlbDmn6Xor6LvvIjpu5jorqTkuLogZmFsc2XvvInjgIJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5aaC5p6c5Y+q6ZyA5Yik5pat5piv5ZCm5ruh6Laz5ZCI57qm5YWz6Zet5p2h5Lu277yM5bu66K6u6K6+5Li6IHRydWUg5Lul5o+Q5Y2H5oCn6IO944CCXG4gICAqIEByZXR1cm5zIOWMheWQq+aJgOacieebuOWFs+aVsOaNrueahOW4guWcuuWbnuaUtueKtuaAgVxuICAgKi9cbiAgICBhc3luYyBnZXRNYXJrZXRSZWNsYWltU3RhdHVzKFxuICAgICAgbWFya2V0UGRhOiBQdWJsaWNLZXksXG4gICAgICBvcHRpb25zOiB7IHNraXBIb2xkZXJDb3VudD86IGJvb2xlYW4gfSA9IHt9XG4gICAgKTogUHJvbWlzZTx7XG4gICAgICB5ZXNNaW50OiBQdWJsaWNLZXk7XG4gICAgICBub01pbnQ6IFB1YmxpY0tleTtcbiAgICAgIHZhdWx0OiBQdWJsaWNLZXk7XG4gICAgICB5ZXNTdXBwbHk6IG51bWJlcjtcbiAgICAgIG5vU3VwcGx5OiBudW1iZXI7XG4gICAgICB5ZXNIb2xkZXJDb3VudDogbnVtYmVyO1xuICAgICAgbm9Ib2xkZXJDb3VudDogbnVtYmVyO1xuICAgICAgdmF1bHRCYWxhbmNlOiBiaWdpbnQ7XG4gICAgICBjYW5DbG9zZU9uQ2hhaW46IGJvb2xlYW47XG4gICAgICBibG9ja2Vyczogc3RyaW5nW107XG4gICAgfT4ge1xuICAgICAgY29uc3Qgc2tpcEhvbGRlckNvdW50ID0gb3B0aW9ucy5za2lwSG9sZGVyQ291bnQgPz8gZmFsc2U7XG4gIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gMS4g6I635Y+W5biC5Zy65Z+656GA5L+h5oGvICjljIXlkKsgdG90YWxZZXNTdXBwbHkg5ZKMIHRvdGFsTm9TdXBwbHkpXG4gICAgICAgIGNvbnN0IG1hcmtldEluZm8gPSBhd2FpdCB0aGlzLmdldE1hcmtldEluZm8obWFya2V0UGRhKTtcbiAgICAgICAgXG4gICAgICAgIC8vIDIuIOa0vueUn+ebuOWFs+eahCBQREEg5Zyw5Z2AXG4gICAgICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldFBkYS50b0J1ZmZlcigpXSxcbiAgICAgICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgICAgIClbMF07XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0UGRhLnRvQnVmZmVyKCldLFxuICAgICAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICAgICAgKVswXTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXRQZGEudG9CdWZmZXIoKV0sXG4gICAgICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgICAgICApWzBdO1xuICBcbiAgICAgICAgLy8gMy4g5bm26KGM5p+l6K+i6ZO+5LiK6K+m57uG5pWw5o2uXG4gICAgICAgIC8vIOWni+e7iOafpeivoiB2YXVsdCDkvZnpop3vvIzmoLnmja7pgInpobnlhrPlrprmmK/lkKbmn6Xor6IgaG9sZGVyIOaVsOmHj1xuICAgICAgICBjb25zdCBxdWVyaWVzOiBQcm9taXNlPGFueT5bXSA9IFt0aGlzLmdldFZhdWx0QWNjb3VudChtYXJrZXRQZGEpXTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc2tpcEhvbGRlckNvdW50KSB7XG4gICAgICAgICAgLy8gZ2V0VG9rZW5Ib2xkZXJDb3VudCDnjrDlnKjlhoXpg6jkvJroh6rliqjor4bliKsgVG9rZW4g56iL5bqP57G75Z6LXG4gICAgICAgICAgcXVlcmllcy5wdXNoKHRoaXMuZ2V0VG9rZW5Ib2xkZXJDb3VudCh5ZXNNaW50KSk7XG4gICAgICAgICAgcXVlcmllcy5wdXNoKHRoaXMuZ2V0VG9rZW5Ib2xkZXJDb3VudChub01pbnQpKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xuICAgICAgICBjb25zdCB2YXVsdEFjY291bnQgPSByZXN1bHRzWzBdO1xuICAgICAgICBjb25zdCB5ZXNIb2xkZXJDb3VudCA9IHNraXBIb2xkZXJDb3VudCA/IDAgOiByZXN1bHRzWzFdO1xuICAgICAgICBjb25zdCBub0hvbGRlckNvdW50ID0gc2tpcEhvbGRlckNvdW50ID8gMCA6IHJlc3VsdHNbMl07XG4gIFxuICAgICAgICAvLyA0LiDmj5Dlj5blhbPplK7mjIfmoIdcbiAgICAgICAgY29uc3QgeWVzU3VwcGx5ID0gTnVtYmVyKG1hcmtldEluZm8udG90YWxZZXNTdXBwbHkpO1xuICAgICAgICBjb25zdCBub1N1cHBseSA9IE51bWJlcihtYXJrZXRJbmZvLnRvdGFsTm9TdXBwbHkpO1xuICAgICAgICBjb25zdCB2YXVsdEJhbGFuY2UgPSB2YXVsdEFjY291bnQuYW1vdW50O1xuICBcbiAgICAgICAgLy8gNS4g5Yik5pat5piv5ZCm5ruh6Laz6ZO+5LiK5YWz6Zet5p2h5Lu277yI6YG15b6q5ZCI57qm6YC76L6R77yJXG4gICAgICAgIGNvbnN0IGJsb2NrZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8g5qC45b+D5qOA5p+l77ya6I636IOc5pa55Luj5biB5L6b5bqU6YeP5b+F6aG75Li6IDBcbiAgICAgICAgaWYgKG1hcmtldEluZm8ud2lubmluZ091dGNvbWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB3aW5uaW5nU3VwcGx5ID0gbWFya2V0SW5mby53aW5uaW5nT3V0Y29tZS55ZXMgIT09IHVuZGVmaW5lZCA/IHllc1N1cHBseSA6IG5vU3VwcGx5O1xuICAgICAgICAgIGlmICh3aW5uaW5nU3VwcGx5ID4gMCkge1xuICAgICAgICAgICAgYmxvY2tlcnMucHVzaChg6I636IOc5pa55LuN5pyJICR7d2lubmluZ1N1cHBseX0g5Liq5Luj5biB5pyq6aKG5Y+WL+mUgOavgWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g5qC45b+D5qOA5p+l77yaVmF1bHQg5L2Z6aKd5b+F6aG75Yeg5LmO5Li6IDBcbiAgICAgICAgY29uc3QgRFVTVF9USFJFU0hPTEQgPSAxMDBuO1xuICAgICAgICBpZiAodmF1bHRCYWxhbmNlID49IERVU1RfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgYmxvY2tlcnMucHVzaChgVmF1bHQg5L2Z6aKd5Li6ICR7dmF1bHRCYWxhbmNlfe+8iOi2hei/h+WuueW3rumYiOWAvDogJHtEVVNUX1RIUkVTSE9MRH3vvIlgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g5aaC5p6c5pyq6Lez6L+HIEhvbGRlciDmo4Dmn6XvvIzliJnmt7vliqAgSG9sZGVyIOebuOWFs+eahCBibG9ja2VyXG4gICAgICAgIGlmICghc2tpcEhvbGRlckNvdW50KSB7XG4gICAgICAgICAgaWYgKHllc0hvbGRlckNvdW50ID4gMCkge1xuICAgICAgICAgICAgYmxvY2tlcnMucHVzaChg5LuN5pyJICR7eWVzSG9sZGVyQ291bnR9IOS4queUqOaIt+aMgeaciSBZZXMg5Luj5biB6LSm5oi3YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChub0hvbGRlckNvdW50ID4gMCkge1xuICAgICAgICAgICAgYmxvY2tlcnMucHVzaChg5LuN5pyJICR7bm9Ib2xkZXJDb3VudH0g5Liq55So5oi35oyB5pyJIE5vIOS7o+W4gei0puaIt2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICBcbiAgICAgICAgLy8g5aaC5p6cIFN1cHBseSA+IDDvvIzpgJrluLjkuZ/kuI3lu7rorq7lhbPpl61cbiAgICAgICAgaWYgKHllc1N1cHBseSA+IDApIHtcbiAgICAgICAgICBibG9ja2Vycy5wdXNoKGBZZXMg5Luj5biB5oC75L6b5bqU6YeP5LiN5Li6IDA6ICR7eWVzU3VwcGx5fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub1N1cHBseSA+IDApIHtcbiAgICAgICAgICBibG9ja2Vycy5wdXNoKGBObyDku6PluIHmgLvkvpvlupTph4/kuI3kuLogMDogJHtub1N1cHBseX1gKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY29uc3QgY2FuQ2xvc2VPbkNoYWluID0gYmxvY2tlcnMubGVuZ3RoID09PSAwO1xuICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB5ZXNNaW50LFxuICAgICAgICAgIG5vTWludCxcbiAgICAgICAgICB2YXVsdCxcbiAgICAgICAgICB5ZXNTdXBwbHksXG4gICAgICAgICAgbm9TdXBwbHksXG4gICAgICAgICAgeWVzSG9sZGVyQ291bnQsXG4gICAgICAgICAgbm9Ib2xkZXJDb3VudCxcbiAgICAgICAgICB2YXVsdEJhbGFuY2UsXG4gICAgICAgICAgY2FuQ2xvc2VPbkNoYWluLFxuICAgICAgICAgIGJsb2NrZXJzLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihg6I635Y+W5biC5Zy6ICR7bWFya2V0UGRhLnRvQmFzZTU4KCl9IOeahOWbnuaUtueKtuaAgeWksei0pTpgLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|