@workflow/core 5.0.0-beta.34 → 5.0.0-beta.36
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/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +5 -2
- package/dist/create-hook.d.ts +41 -22
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +12 -1
- package/dist/flushable-stream.d.ts +29 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +228 -2
- package/dist/global.d.ts +2 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/private.d.ts +6 -17
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +1 -1
- package/dist/replay-payload-cache.d.ts +56 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +137 -0
- package/dist/runtime/constants.d.ts +11 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +26 -1
- package/dist/runtime/get-port-lazy.js +4 -4
- package/dist/runtime/helpers.d.ts +57 -0
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +102 -3
- package/dist/runtime/resume-hook.d.ts +4 -1
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +23 -20
- package/dist/runtime/run-id-time.d.ts +9 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -1
- package/dist/runtime/run-id-time.js +15 -4
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +38 -8
- package/dist/runtime/step-executor.d.ts +41 -0
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +137 -18
- package/dist/runtime/step-handler.js +3 -3
- package/dist/runtime/step-latency.d.ts +70 -4
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +59 -7
- package/dist/runtime/suspension-handler.d.ts +10 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +22 -9
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +491 -115
- package/dist/serialization.d.ts +44 -4
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +88 -54
- package/dist/step/context-storage.d.ts +6 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +10 -16
- package/dist/symbols.d.ts +13 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +14 -1
- package/dist/telemetry/semantic-conventions.d.ts +25 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +3 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +22 -7
- package/dist/workflow.d.ts +12 -9
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +16 -10
- package/docs/api-reference/create-hook.mdx +43 -2
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +3 -4
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/hooks.mdx +1 -1
- package/docs/foundations/idempotency.mdx +16 -9
- package/docs/how-it-works/encryption.mdx +3 -3
- package/docs/how-it-works/event-sourcing.mdx +6 -6
- package/docs/how-it-works/framework-integrations.mdx +3 -3
- package/package.json +5 -5
- package/dist/step-hydration-cache.d.ts +0 -148
- package/dist/step-hydration-cache.d.ts.map +0 -1
- package/dist/step-hydration-cache.js +0 -171
package/dist/serialization.js
CHANGED
|
@@ -24,7 +24,7 @@ import * as stepModule from './serialization/step.js';
|
|
|
24
24
|
import { isFormatPrefix, SerializationFormat, } from './serialization/types.js';
|
|
25
25
|
import * as workflowModule from './serialization/workflow.js';
|
|
26
26
|
import { contextStorage } from './step/context-storage.js';
|
|
27
|
-
import { ABORT_HOOK_TOKEN, ABORT_LISTENER_ATTACHED, ABORT_READER_CANCEL, ABORT_STREAM_NAME, BODY_INIT_SYMBOL, STABLE_ULID, STREAM_FRAMING_SYMBOL, STREAM_NAME_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, STREAM_TYPE_SYMBOL, WEBHOOK_RESPONSE_WRITABLE, } from './symbols.js';
|
|
27
|
+
import { ABORT_HOOK_TOKEN, ABORT_LISTENER_ATTACHED, ABORT_READER_CANCEL, ABORT_STREAM_NAME, BODY_INIT_SYMBOL, STABLE_ULID, STREAM_FRAMING_SYMBOL, STREAM_NAME_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, STREAM_TYPE_SYMBOL, STREAM_WRITE_BATCH_SYMBOL, WEBHOOK_RESPONSE_WRITABLE, } from './symbols.js';
|
|
28
28
|
import * as Attr from './telemetry/semantic-conventions.js';
|
|
29
29
|
import { getActiveSpan, getSpanKind, recordElapsedSpan } from './telemetry.js';
|
|
30
30
|
import { getAbortStreamId } from './util.js';
|
|
@@ -950,6 +950,35 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
950
950
|
w.reject(abortError);
|
|
951
951
|
},
|
|
952
952
|
});
|
|
953
|
+
// Batched, durable write entry point used by `flushablePipe` to coalesce
|
|
954
|
+
// chunks that arrive while a previous batch is still in flight into a
|
|
955
|
+
// single server write. It buffers every chunk and awaits one `flush()`,
|
|
956
|
+
// so the whole batch goes out as one `writeMulti` and resolves only once
|
|
957
|
+
// the batch has reached the server. It shares the buffer/flush machinery
|
|
958
|
+
// with the per-chunk sink `write()`, but the two are never used
|
|
959
|
+
// concurrently on the same stream: `flushablePipe` uses either this path
|
|
960
|
+
// or the writer, never both. On failure `flush()` retains the batch in the
|
|
961
|
+
// buffer and rethrows, so the caller's durability tracking stays accurate.
|
|
962
|
+
//
|
|
963
|
+
// No-`writeMulti` fallback: when the world lacks `writeMulti`, `flush()`
|
|
964
|
+
// degrades to sequential `write`s for the batch's chunks — one round trip
|
|
965
|
+
// each, within this single call, while backpressure holds the producer.
|
|
966
|
+
// `flushablePipe` bounds that stall by capping each coalesced batch (see
|
|
967
|
+
// `MAX_CHUNKS_PER_BATCH` / `MAX_BYTES_PER_BATCH`), so the fallback can't
|
|
968
|
+
// turn one drain into an unbounded sequential run.
|
|
969
|
+
Object.defineProperty(this, STREAM_WRITE_BATCH_SYMBOL, {
|
|
970
|
+
value: async (chunks) => {
|
|
971
|
+
if (chunks.length === 0)
|
|
972
|
+
return;
|
|
973
|
+
if (batchStartAt === undefined)
|
|
974
|
+
batchStartAt = Date.now();
|
|
975
|
+
for (const chunk of chunks)
|
|
976
|
+
buffer.push(chunk);
|
|
977
|
+
await flush();
|
|
978
|
+
},
|
|
979
|
+
enumerable: false,
|
|
980
|
+
writable: false,
|
|
981
|
+
});
|
|
953
982
|
}
|
|
954
983
|
}
|
|
955
984
|
// ---- Composed reducers ----
|
|
@@ -2163,6 +2192,52 @@ export async function maybeEncrypt(data, key) {
|
|
|
2163
2192
|
export async function maybeDecrypt(data, key) {
|
|
2164
2193
|
return decrypt(data, key);
|
|
2165
2194
|
}
|
|
2195
|
+
/**
|
|
2196
|
+
* Decrypt and decompress persisted data without parsing it into JavaScript.
|
|
2197
|
+
* Legacy non-binary values pass through unchanged for their consumer to revive.
|
|
2198
|
+
*/
|
|
2199
|
+
export const prepareReplayPayload = async (value, key) => {
|
|
2200
|
+
const compressionStats = {};
|
|
2201
|
+
const prepared = await decompress(await decrypt(value, key), compressionStats);
|
|
2202
|
+
await recordCompression(compressionStats, 'deserialize');
|
|
2203
|
+
return { data: prepared };
|
|
2204
|
+
};
|
|
2205
|
+
/**
|
|
2206
|
+
* Parse a prepared workflow argument or successful step/hook payload using the
|
|
2207
|
+
* current workflow VM's globals and revivers. Each call intentionally creates
|
|
2208
|
+
* a fresh object graph so mutations cannot leak across replay iterations.
|
|
2209
|
+
*/
|
|
2210
|
+
export function deserializePreparedReplayPayload(prepared, global = globalThis, extraRevivers = {}) {
|
|
2211
|
+
return workflowModule.deserialize(prepared.data, {
|
|
2212
|
+
global,
|
|
2213
|
+
extraRevivers: {
|
|
2214
|
+
...getStreamAndRequestRevivers(getWorkflowRevivers(global)),
|
|
2215
|
+
...extraRevivers,
|
|
2216
|
+
},
|
|
2217
|
+
});
|
|
2218
|
+
}
|
|
2219
|
+
/**
|
|
2220
|
+
* Parse a prepared step error using the current workflow VM's class revivers.
|
|
2221
|
+
* This preserves thrown-value identity without sharing objects between VMs.
|
|
2222
|
+
*/
|
|
2223
|
+
export function deserializePreparedStepError(prepared, global = globalThis, extraRevivers = {}) {
|
|
2224
|
+
const { data } = prepared;
|
|
2225
|
+
if (!(data instanceof Uint8Array)) {
|
|
2226
|
+
return unflatten(data, {
|
|
2227
|
+
...getWorkflowRevivers(global),
|
|
2228
|
+
...extraRevivers,
|
|
2229
|
+
});
|
|
2230
|
+
}
|
|
2231
|
+
const { format, payload } = decodeFormatPrefix(data);
|
|
2232
|
+
if (format === SerializationFormat.DEVALUE_V1) {
|
|
2233
|
+
const str = new TextDecoder().decode(payload);
|
|
2234
|
+
return parse(str, {
|
|
2235
|
+
...getWorkflowRevivers(global),
|
|
2236
|
+
...extraRevivers,
|
|
2237
|
+
});
|
|
2238
|
+
}
|
|
2239
|
+
throw new Error(`Unsupported serialization format: ${format}`);
|
|
2240
|
+
}
|
|
2166
2241
|
// ============================================================================
|
|
2167
2242
|
// Dehydrate / Hydrate Functions
|
|
2168
2243
|
// ============================================================================
|
|
@@ -2210,19 +2285,11 @@ export async function dehydrateWorkflowArguments(value, runId, key, ops = [], gl
|
|
|
2210
2285
|
}
|
|
2211
2286
|
/**
|
|
2212
2287
|
* Called from workflow execution environment to hydrate the workflow
|
|
2213
|
-
* arguments from the database at the start of workflow execution.
|
|
2288
|
+
* arguments from the database at the start of workflow execution. A prepared
|
|
2289
|
+
* payload skips host-side decrypt/decompress but always performs VM revival.
|
|
2214
2290
|
*/
|
|
2215
|
-
export async function hydrateWorkflowArguments(value, _runId, key, global = globalThis, extraRevivers = {}) {
|
|
2216
|
-
|
|
2217
|
-
const inflated = await decompress(await maybeDecrypt(value, key), compressionStats);
|
|
2218
|
-
await recordCompression(compressionStats, 'deserialize');
|
|
2219
|
-
return workflowModule.deserialize(inflated, {
|
|
2220
|
-
global,
|
|
2221
|
-
extraRevivers: {
|
|
2222
|
-
...getStreamAndRequestRevivers(getWorkflowRevivers(global)),
|
|
2223
|
-
...extraRevivers,
|
|
2224
|
-
},
|
|
2225
|
-
});
|
|
2291
|
+
export async function hydrateWorkflowArguments(value, _runId, key, global = globalThis, extraRevivers = {}, prepared) {
|
|
2292
|
+
return deserializePreparedReplayPayload(prepared ?? (await prepareReplayPayload(value, key)), global, extraRevivers);
|
|
2226
2293
|
}
|
|
2227
2294
|
/**
|
|
2228
2295
|
* Dehydrate workflow return value for storage.
|
|
@@ -2396,36 +2463,11 @@ export async function dehydrateStepError(value, runId, key, ops = [], global = g
|
|
|
2396
2463
|
* @param key - Encryption key (undefined to skip decryption)
|
|
2397
2464
|
* @param global - Global object for deserialization context
|
|
2398
2465
|
* @param extraRevivers - Additional revivers for custom types
|
|
2466
|
+
* @param prepared - Optional cached decrypt/decompress result
|
|
2399
2467
|
* @returns The hydrated thrown value, ready to reject the step promise
|
|
2400
2468
|
*/
|
|
2401
|
-
export async function hydrateStepError(value, _runId, key, global = globalThis, extraRevivers = {}) {
|
|
2402
|
-
|
|
2403
|
-
const decrypted = await decompress(await maybeDecrypt(value, key), compressionStats);
|
|
2404
|
-
await recordCompression(compressionStats, 'deserialize');
|
|
2405
|
-
if (!(decrypted instanceof Uint8Array)) {
|
|
2406
|
-
// Treated as a devalue "flattened" array. In production this branch is
|
|
2407
|
-
// exercised by legacy code paths that bypassed `dehydrateStepError`; the
|
|
2408
|
-
// SDK version is pinned per workflow run via skew protection, so a
|
|
2409
|
-
// current-version producer always emits a Uint8Array here. If a
|
|
2410
|
-
// misshapen value reaches us, `unflatten` throws — that's intentional:
|
|
2411
|
-
// the higher-level hydration helpers (`hydrateStepIO`,
|
|
2412
|
-
// `hydrateResourceIO`) already wrap us in a try/catch that leaves the
|
|
2413
|
-
// field un-hydrated for o11y display, and surfacing the throw to logs
|
|
2414
|
-
// is more debuggable than silently masking the unsupported shape.
|
|
2415
|
-
return unflatten(decrypted, {
|
|
2416
|
-
...getWorkflowRevivers(global),
|
|
2417
|
-
...extraRevivers,
|
|
2418
|
-
});
|
|
2419
|
-
}
|
|
2420
|
-
const { format, payload } = decodeFormatPrefix(decrypted);
|
|
2421
|
-
if (format === SerializationFormat.DEVALUE_V1) {
|
|
2422
|
-
const str = new TextDecoder().decode(payload);
|
|
2423
|
-
return parse(str, {
|
|
2424
|
-
...getWorkflowRevivers(global),
|
|
2425
|
-
...extraRevivers,
|
|
2426
|
-
});
|
|
2427
|
-
}
|
|
2428
|
-
throw new Error(`Unsupported serialization format: ${format}`);
|
|
2469
|
+
export async function hydrateStepError(value, _runId, key, global = globalThis, extraRevivers = {}, prepared) {
|
|
2470
|
+
return deserializePreparedStepError(prepared ?? (await prepareReplayPayload(value, key)), global, extraRevivers);
|
|
2429
2471
|
}
|
|
2430
2472
|
/**
|
|
2431
2473
|
* Called from the workflow handler when the workflow itself throws.
|
|
@@ -2470,7 +2512,7 @@ export async function dehydrateRunError(value, _runId, key, global = globalThis,
|
|
|
2470
2512
|
*/
|
|
2471
2513
|
export async function hydrateRunError(value, runId, key, ops = [], global = globalThis, extraRevivers = {}) {
|
|
2472
2514
|
const compressionStats = {};
|
|
2473
|
-
const decrypted = await decompress(await
|
|
2515
|
+
const decrypted = await decompress(await decrypt(value, key), compressionStats);
|
|
2474
2516
|
await recordCompression(compressionStats, 'deserialize');
|
|
2475
2517
|
if (!(decrypted instanceof Uint8Array)) {
|
|
2476
2518
|
// See the matching note in `hydrateStepError`: this branch is for
|
|
@@ -2502,20 +2544,12 @@ export async function hydrateRunError(value, runId, key, ops = [], global = glob
|
|
|
2502
2544
|
* @param key - Encryption key (undefined to skip decryption)
|
|
2503
2545
|
* @param global - Global object for deserialization context
|
|
2504
2546
|
* @param extraRevivers - Additional revivers for custom types
|
|
2547
|
+
* @param prepared - Optional cached decrypt/decompress result
|
|
2505
2548
|
* Called from the workflow handler when replaying the event log
|
|
2506
2549
|
* of a `step_completed` event.
|
|
2507
2550
|
*/
|
|
2508
|
-
export async function hydrateStepReturnValue(value, _runId, key, global = globalThis, extraRevivers = {}) {
|
|
2509
|
-
|
|
2510
|
-
const inflated = await decompress(await maybeDecrypt(value, key), compressionStats);
|
|
2511
|
-
await recordCompression(compressionStats, 'deserialize');
|
|
2512
|
-
return workflowModule.deserialize(inflated, {
|
|
2513
|
-
global,
|
|
2514
|
-
extraRevivers: {
|
|
2515
|
-
...getStreamAndRequestRevivers(getWorkflowRevivers(global)),
|
|
2516
|
-
...extraRevivers,
|
|
2517
|
-
},
|
|
2518
|
-
});
|
|
2551
|
+
export async function hydrateStepReturnValue(value, _runId, key, global = globalThis, extraRevivers = {}, prepared) {
|
|
2552
|
+
return deserializePreparedReplayPayload(prepared ?? (await prepareReplayPayload(value, key)), global, extraRevivers);
|
|
2519
2553
|
}
|
|
2520
2554
|
// ---- Helpers to extract stream/Request/Response reducers and revivers ----
|
|
2521
2555
|
// The mode-specific get*Reducers/get*Revivers functions return objects that
|
|
@@ -2554,4 +2588,4 @@ function getStreamAndRequestRevivers(allRevivers) {
|
|
|
2554
2588
|
}
|
|
2555
2589
|
return extra;
|
|
2556
2590
|
}
|
|
2557
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHlDQUF5QztBQUN6Qyw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLEVBRVAsT0FBTyxFQUNQLG9CQUFvQixHQUNyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3RCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGtCQUFr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SUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHtcbiAgZGVjcnlwdCBhcyBhZXNHY21EZWNyeXB0LFxuICBlbmNyeXB0IGFzIGFlc0djbUVuY3J5cHQsXG4gIHR5cGUgQ3J5cHRvS2V5LFxuICBpbXBvcnRLZXksXG59IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVGbHVzaGFibGVTdGF0ZSxcbiAgZmx1c2hhYmxlUGlwZSxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyBob3N0IHdvcmxkIG1vZHVsZSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCAqIGFzIGNsaWVudE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY2xpZW50LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ29tcHJlc3Npb25TdGF0cyxcbiAgY29tcHJlc3MsXG4gIGRlY29tcHJlc3MsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21wcmVzc2lvbi5qcyc7XG5pbXBvcnQge1xuICBkZWNyeXB0LFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZW5jcnlwdCxcbiAgcmVzb2x2ZUVuY3J5cHRpb25LZXksXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcixcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgZW5jb2RlV2l0aEZvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9mb3JtYXQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlIOKAlCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aCDigJQgYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJpYWxpemVTdHJlYW0oXG4gIHJlZHVjZXJzOiBQYXJ0aWFsPFJlZHVjZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIC8vIE5vdGU6IGlmIHJlc29sdmluZyBjcnlwdG9LZXkgcmVqZWN0cyAoZS5nLiwgbmV0d29yayBlcnJvciBmZXRjaGluZ1xuICAvLyB0aGUgZGVyaXZlZCBrZXkpLCB0aGUgcmVqZWN0aW9uIHdvbid0IHN1cmZhY2UgdW50aWwgdGhlIGZpcnN0IGNodW5rXG4gIC8vIGlzIHByb2Nlc3NlZCDigJQgbm90IGF0IHN0cmVhbSBjb25zdHJ1Y3Rpb24gdGltZS5cbiAgY29uc3Qga2V5U3RhdGUgPSB7IHJlc29sdmVkOiBmYWxzZSwga2V5OiB1bmRlZmluZWQgYXMgQ3J5cHRvS2V5IHwgdW5kZWZpbmVkIH07XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeShjaHVuaywgcmVkdWNlcnMpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gZW5jb2Rlci5lbmNvZGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGxldCBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIGZyYW1lIHBheWxvYWQgaWYgYSBrZXkgaXMgcHJvdmlkZWQuXG4gICAgICAgIC8vIFRoZSBsZW5ndGggaGVhZGVyIHJlbWFpbnMgaW4gdGhlIGNsZWFyIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuXG4gICAgICAgIC8vIGZpbmQgZnJhbWUgYm91bmRhcmllcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAgICAgICAgaWYgKGtleVN0YXRlLmtleSkge1xuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGFlc0djbUVuY3J5cHQoa2V5U3RhdGUua2V5LCBwcmVmaXhlZCk7XG4gICAgICAgICAgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQsXG4gICAgICAgICAgICBlbmNyeXB0ZWRcbiAgICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWU6IFs0LWJ5dGUgbGVuZ3RoXVtwcmVmaXhlZCBkYXRhXVxuICAgICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgcHJlZml4ZWQubGVuZ3RoKTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIHByZWZpeGVkLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgICBmcmFtZS5zZXQocHJlZml4ZWQsIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVuY3J5cHRpb24gZmFpbHVyZXMgbXVzdCBrZWVwIHRoZWlyIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JcbiAgICAgICAgLy8gaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIHJhdGhlciB0aGFuIGJlIHJlZnJhbWVkIGFzIGFcbiAgICAgICAgLy8gU2VyaWFsaXphdGlvbkVycm9yIChVU0VSX0VSUk9SKS5cbiAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdzdHJlYW0gY2h1bmsnLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlOiBlcnJvciB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gIHJldml2ZXJzOiBQYXJ0aWFsPFJldml2ZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+IHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgY29uc3Qga2V5U3RhdGUgPSB7IHJlc29sdmVkOiBmYWxzZSwga2V5OiB1bmRlZmluZWQgYXMgQ3J5cHRvS2V5IHwgdW5kZWZpbmVkIH07XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV3QnVmZmVyLnNldChidWZmZXIsIDApO1xuICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV3QnVmZmVyO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYW1lcyhcbiAgICBjb250cm9sbGVyOiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjxhbnk+XG4gICkge1xuICAgIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdFxuICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICBrZXlTdGF0ZS5yZXNvbHZlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgY29tcGxldGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lc1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCkge1xuICAgICAgICBicmVhazsgLy8gSW5jb21wbGV0ZSBmcmFtZSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYW1lRGF0YSA9IGJ1ZmZlci5zbGljZShcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUsXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGhcbiAgICAgICk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCk7XG5cbiAgICAgIGxldCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSk7XG5cbiAgICAgIC8vIElmIHRoZSBmcmFtZSBwYXlsb2FkIGlzIGVuY3J5cHRlZCwgZGVjcnlwdCBpdCBmaXJzdCB0byByZXZlYWxcbiAgICAgIC8vIHRoZSBpbm5lciBmb3JtYXQtcHJlZml4ZWQgZGF0YSAoZS5nLiwgJ2RldmwnICsgc2VyaWFsaXplZCB0ZXh0KSxcbiAgICAgIC8vIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgZGVzZXJpYWxpemF0aW9uIHBhdGguXG4gICAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCkge1xuICAgICAgICBpZiAoIWtleVN0YXRlLmtleSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICAgICAgICAgJ0VuY3J5cHRlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAnRW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZCBvciBubyBrZXkgd2FzIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBwYXlsb2FkLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBmb3JtYXRQcmVmaXg6ICdlbmNyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlY3J5cHRlZDogVWludDhBcnJheTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWNyeXB0ZWQgPSBhd2FpdCBhZXNHY21EZWNyeXB0KGtleVN0YXRlLmtleSwgcGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGxvdy1sZXZlbCBBRVMgbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdFxuICAgICAgICAgIC8vIGNhbm5vdCByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gV2UgcGVla2VkIGl0IGhlcmVcbiAgICAgICAgICAvLyAoYGVuY3JgKSwgc28gZW5yaWNoIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgd2l0aCB0aGUgcmVhbCBmb3JtYXRcbiAgICAgICAgICAvLyBwcmVmaXggYmVmb3JlIHByb3BhZ2F0aW5nIOKAlCBtaXJyb3Jpbmcgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICAgICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSAmJiBlcnJvci5jb250ZXh0KSB7XG4gICAgICAgICAgICBlcnJvci5jb250ZXh0LmZvcm1hdFByZWZpeCA9IGZvcm1hdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgKHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUocGF5bG9hZCk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZSh0ZXh0LCByZXZpdmVycykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAvLyBGaXJzdCwgdHJ5IHRvIGRldGVjdCBpZiB0aGlzIGlzIGxlbmd0aC1wcmVmaXhlZCBmcmFtZWQgZGF0YVxuICAgICAgLy8gYnkgY2hlY2tpbmcgaWYgdGhlIGZpcnN0IDQgYnl0ZXMgZm9ybSBhIHBsYXVzaWJsZSBsZW5ndGguXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiBjaHVuay5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgY2h1bmsuYnVmZmVyLFxuICAgICAgICAgIGNodW5rLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA8IDEwMF8wMDBfMDAwIC8vIHNhbml0eSBjaGVjazogPCAxMDBNQlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBMb29rcyBsaWtlIGZyYW1lZCBkYXRhXG4gICAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEFscmVhZHkgaW4gZnJhbWVkIG1vZGUgKGhhdmUgYnVmZmVyZWQgZGF0YSlcbiAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBmb3JtYXQ6IG5ld2xpbmUtZGVsaW1pdGVkIGRldmFsdWUgdGV4dCAobm8gZnJhbWluZylcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShjaHVuayk7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UobGluZSwgcmV2aXZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgLy8gUHJvY2VzcyBhbnkgcmVtYWluaW5nIGZyYW1lZCBkYXRhXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gQnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2AgUmVhZGFibGVTdHJlYW1zIHBhc3NlZCBhY3Jvc3MgYm91bmRhcmllcylcbi8vIGFyZSB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHdvcmxkJ3Mgc3RyZWFtIHRyYW5zcG9ydCBvbmUgdXNlciBjaHVuayBhdFxuLy8gYSB0aW1lLiBXaXRob3V0IGFuIGluLWJhbmQgZW52ZWxvcGUsIHRoZSByZWFkZXIgc2VlcyBhIGZsYXQgc3RyZWFtIG9mXG4vLyBieXRlcyDigJQgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hlcmUgb25lIHVzZXIgY2h1bmsgZW5kcyBhbmQgdGhlIG5leHRcbi8vIGJlZ2lucywgd2hpY2ggbWFrZXMgbWlkLXN0cmVhbSByZWNvbm5lY3QgaW1wb3NzaWJsZSAod2UgZG9uJ3Qga25vdyBob3dcbi8vIG1hbnkgc2VydmVyLXNpZGUgY2h1bmtzIGhhdmUgYmVlbiBjb25zdW1lZCkuXG4vL1xuLy8gVG8gZW5hYmxlIHRyYW5zcGFyZW50IHJlY29ubmVjdCwgdGhpcyBQUiBpbnRyb2R1Y2VzIGFuIG9wdC1pbiB3aXJlXG4vLyBlbnZlbG9wZSB0aGF0IHdyYXBzIGVhY2ggdXNlciBjaHVuayBpbiBhIGxlbmd0aC1wcmVmaXg6XG4vL1xuLy8gICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVt1c2VyIHBheWxvYWQgYnl0ZXNdXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIGlkZW50aWNhbCBpbiBzaGFwZSB0byBgZ2V0U2VyaWFsaXplU3RyZWFtYCdzIGZyYW1pbmcsXG4vLyBidXQgdGhlIHBheWxvYWQgaGVyZSBpcyAqcmF3IHVzZXIgYnl0ZXMqIOKAlCB0aGVyZSBpcyBubyBpbm5lclxuLy8gZm9ybWF0LXByZWZpeCwgbm8gZGV2YWx1ZSwgbm8gZW5jcnlwdGlvbi4gQSBmcmFtZWQgYnl0ZSBzdHJlYW0gc3RheXNcbi8vIHNlbWFudGljYWxseSBhIGJ5dGUgc3RyZWFtIGVuZC10by1lbmQ7IHRoZSBmcmFtaW5nIGlzIHB1cmVseSB0cmFuc3BvcnQuXG4vL1xuLy8gVGhlIGRlY2lzaW9uIHRvIHVzZSBmcmFtaW5nIGZvciBhIGdpdmVuIHN0cmVhbSBpcyByZWNvcmRlZCBpbiB0aGVcbi8vIHNlcmlhbGl6ZWQgc3RyZWFtIHJlZiAoYGZyYW1pbmc6ICdmcmFtZWQtdjEnYCksIHNvIGJvdGggc2lkZXMgYWdyZWUgb25cbi8vIHRoZSB3aXJlIGZvcm1hdCB3aXRob3V0IHJ1bnRpbWUgbmVnb3RpYXRpb24uIFByb2R1Y2VycyB0aGF0IHRhcmdldCBhXG4vLyBydW4gd2hvc2UgZGVwbG95bWVudCBkb2Vzbid0IHN1cHBvcnQgZnJhbWluZyAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgXG4vLyBpbiBjYXBhYmlsaXRpZXMudHMpIGVtaXQgcmF3IGJ5dGVzIGFuZCBhIHJlZiB3aXRob3V0IHRoZSBmaWVsZCDigJQgd2hpY2hcbi8vIHRoZSByZWFkZXIgdHJlYXRzIGFzIGxlZ2FjeSByYXcgYnl0ZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG4vKipcbiAqIE1heGltdW0gYWxsb3dlZCBieXRlLXN0cmVhbSBmcmFtZSBwYXlsb2FkIHNpemUgKDEwME1CKS4gU2hhcmVkIGJ5IHRoZVxuICogZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCB1c2VyIGNodW5rcyBhdCB3cml0ZSB0aW1lLCB3aGVyZSB0aGUgZXJyb3IgaXNcbiAqIGFjdGlvbmFibGUpIGFuZCB0aGUgdW5mcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIGxlbmd0aCBoZWFkZXJzIGF0IHJlYWRcbiAqIHRpbWUsIHdoaWNoIHVzdWFsbHkgaW5kaWNhdGUgYSBub24tZnJhbWVkIHdpcmUgYmVpbmcgcmVhZCBhcyBmcmFtZWQpLlxuICogS2VlcGluZyBib3RoIHNpZGVzIG9uIG9uZSBjb25zdGFudCBndWFyYW50ZWVzIGFueSBjaHVuayB0aGUgZnJhbWVyXG4gKiBhY2NlcHRzIGNhbiBhbHdheXMgYmUgZGVjb2RlZCBieSB0aGUgdW5mcmFtZXIuXG4gKi9cbmNvbnN0IE1BWF9GUkFNRV9TSVpFID0gMTAwXzAwMF8wMDA7XG5cbi8qKlxuICogV3JhcHMgZWFjaCBjaHVuayBvZiBhIGJ5dGUgc3RyZWFtIGluIGEgNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXG4gKiBwcmVmaXguIFVzZWQgYnkgdGhlIHByb2R1Y2VyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBFbXB0eSBjaHVua3MgKGxlbmd0aCAwKSBhcmUgZHJvcHBlZCDigJQgdGhlIHJlc3VsdGluZyBgWzB4MDAgMHgwMCAweDAwIDB4MDBdYFxuICogZnJhbWUgd291bGQgYmUgYW1iaWd1b3VzIHdpdGggdGhlIGxlZ2FjeSBcImxvb2tzIGZyYW1lZFwiIGRldGVjdGlvbiBpblxuICogYGdldERlc2VyaWFsaXplU3RyZWFtYCwgYW5kIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24uXG4gKlxuICogTG9hZC1iZWFyaW5nIGludmFyaWFudDogZWFjaCB1c2VyIGNodW5rIGJlY29tZXMgZXhhY3RseSBvbmUgZnJhbWUsIGFuZFxuICogZWFjaCBmcmFtZSBpcyBlbnF1ZXVlZCBhcyBleGFjdGx5IG9uZSB0cmFuc3BvcnQgY2h1bmsgKHRoZSBkb3duc3RyZWFtXG4gKiB3cml0YWJsZSBwZXJmb3JtcyBvbmUgd2lyZSB3cml0ZSBwZXIgY2h1bmssIHByZXNlcnZpbmcgYm91bmRhcmllcykuIFRoZVxuICogc2VydmVyIHRoZXJlZm9yZSBzdG9yZXMgb25lIGZyYW1lIHBlciBjaHVuayBpbmRleCwgd2hpY2ggaXMgd2hhdCBhbGxvd3NcbiAqIGEgZnV0dXJlIHJlY29ubmVjdGluZyByZWFkZXIgdG8gcmVzdW1lIGEgZnJhbWVkIGJ5dGUgc3RyZWFtIGF0XG4gKiBgc3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYCDigJQgdGhlIHNhbWUgYXJpdGhtZXRpY1xuICogYGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbWAgcmVsaWVzIG9uIGZvciBvYmplY3Qgc3RyZWFtcy4gRG8gbm90XG4gKiBjb2FsZXNjZSBvciBzcGxpdCBmcmFtZXMgaGVyZSB3aXRob3V0IHJldmlzaXRpbmcgdGhhdCByZXN1bWUgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlRnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gY2h1bmsgb2YgJHtjaHVuay5sZW5ndGh9IGJ5dGVzIGV4Y2VlZHMgdGhlIG1heGltdW0gYCArXG4gICAgICAgICAgICAgIGBmcmFtZWQgY2h1bmsgc2l6ZSAoJHtNQVhfRlJBTUVfU0laRX0pLiBTcGxpdCB0aGUgZGF0YSBpbnRvIGAgK1xuICAgICAgICAgICAgICBgc21hbGxlciBjaHVua3MgYmVmb3JlIHdyaXRpbmcuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTtcbiAgICAgIGZyYW1lLnNldChjaHVuaywgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGxlbmd0aC1wcmVmaXhlZCBieXRlLXN0cmVhbSBmcmFtZXMgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCB1c2VyXG4gKiBjaHVua3MuIFVzZWQgYnkgdGhlIGNvbnN1bWVyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBCdWZmZXJzIGFjcm9zcyByZWFkIGJvdW5kYXJpZXMg4oCUIHRoZSB0cmFuc3BvcnQgbWF5IHNwbGl0IGEgc2luZ2xlXG4gKiBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcmVhZHMgKGhlYWRlciBpbiBvbmUgY2h1bmssIHBheWxvYWQgaW4gYW5vdGhlcilcbiAqIG9yIGNvYWxlc2NlIG11bHRpcGxlIGZyYW1lcyBpbnRvIGEgc2luZ2xlIHJlYWQuIFRoZSB0cmFuc2Zvcm0gZW1pdHNcbiAqIHdob2xlIHVzZXIgY2h1bmtzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICpcbiAqIEVycm9ycyB0aGUgc3RyZWFtIGlmIHRoZSBsZW5ndGggaGVhZGVyIGFkdmVydGlzZXMgYSBmcmFtZSBsYXJnZXIgdGhhblxuICogYE1BWF9GUkFNRV9TSVpFYCBieXRlcywgc2luY2UgdGhhdCBhbG1vc3QgY2VydGFpbmx5IGluZGljYXRlcyBhXG4gKiBtaXNmcmFtZWQgd2lyZSAoZS5nLiBhIHJhdyBieXRlIHN0cmVhbSBiZWluZyBmZWQgdGhyb3VnaCB0aGlzIHRyYW5zZm9ybVxuICogYnkgbWlzdGFrZSkgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5leHQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV4dC5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiAwKSBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG5cbiAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmcmFtZUxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGZyYW1lIGxlbmd0aCAke2ZyYW1lTGVuZ3RofSBleGNlZWRzIG1heGltdW0gKCR7TUFYX0ZSQU1FX1NJWkV9KS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgdXN1YWxseSBtZWFucyBhIG5vbi1mcmFtZWQgYnl0ZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCBhcyBmcmFtZWQuYCxcbiAgICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSwgdG90YWwpKTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBlbmRlZCB3aXRoICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgb2YgaW5jb21wbGV0ZSBmcmFtZSBkYXRhLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBzdHJlYW0gd2FzIHRydW5jYXRlZCBtaWQtZnJhbWUuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBlbmQtdG8tZW5kIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3BhbiBmb3IgYSBsaXZlIHJlYWQ6XG4gKiByZWFkIGRpc3BhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hpbmcgdGhlXG4gKiByZWFkZXIsIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlcixcbiAgY29ubmVjdE1zPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWQnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudHRmY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgIC4uLih0eXBlb2YgY29ubmVjdE1zID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29ubmVjdF9tcyc6IGNvbm5lY3RNcyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5zdGFydF9pbmRleCc6IHN0YXJ0SW5kZXggfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgcmVhZC1jb21wbGV0aW9uIHNwYW4gd2hlbiBhIHN0cmVhbSByZWFkIGRyYWluczpcbiAqIGJhY2stZGF0ZWQgdG8gdGhlIHJlYWQgZGlzcGF0Y2gsIHNvIGl0cyBkdXJhdGlvbiBpcyB0aGUgdG90YWwgcmVhZCwgd2l0aFxuICogY2h1bmsvYnl0ZSBjb3VudHMgZm9yIHRocm91Z2hwdXQuIENhbmNlbGxlZCByZWFkcyBlbWl0IG5vdGhpbmcuIEZpcmUtYW5kLVxuICogZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgY2h1bmtDb3VudDogbnVtYmVyLFxuICBieXRlQ291bnQ6IG51bWJlcixcbiAgcmVjb25uZWN0cz86IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29tcGxldGUnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdyZWFkX2NvbXBsZXRlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnRvdGFsX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNodW5rcyc6IGNodW5rQ291bnQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLi4uKHR5cGVvZiByZWNvbm5lY3RzID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQucmVjb25uZWN0cyc6IHJlY29ubmVjdHMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0gZXh0ZW5kcyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gICNyZWFkZXI/OiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT47XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdGFydEluZGV4PzogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIC8vIENsaWVudC1vYnNlcnZlZCB0aW1lLXRvLWZpcnN0LWNodW5rIHN0YXRlLiBgcmVhZFN0YXJ0YCBpcyBzdGFtcGVkIHdoZW4gdGhlXG4gICAgLy8gcmVhZGVyIHN0YXJ0cyBjb25zdW1pbmcgKGZpcnN0IHB1bGwg4oaSIHRoZSByZWFkIGRpc3BhdGNoKTsgdGhlIHNwYW4gaXNcbiAgICAvLyBlbWl0dGVkIG9uY2UsIHdoZW4gdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGVzIHRoZSByZWFkZXIuIFNvIGl0c1xuICAgIC8vIGR1cmF0aW9uIGlzIHRoZSBlbmQtdG8tZW5kIFRURkMgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gTm8tb3Agd2l0aG91dFxuICAgIC8vIGFuIE9wZW5UZWxlbWV0cnkgU0RLIHJlZ2lzdGVyZWQuXG4gICAgbGV0IHJlYWRTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmaXJzdENodW5rUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgY29ubmVjdCBkdXJhdGlvbjogdGhlIHdvcmxkLnN0cmVhbXMuZ2V0IGF3YWl0IChyZWFkXG4gICAgLy8gZGlzcGF0Y2ggLT4gc3RyZWFtIGhhbmRsZSAvIHJlc3BvbnNlIGhlYWRlcnMpLiBTdGFtcGVkIG9uIHRoZVxuICAgIC8vIHdvcmtmbG93LnN0cmVhbS5yZWFkIHNwYW4gb25jZSB0aGUgZmlyc3QgY2h1bmsgYXJyaXZlcy5cbiAgICBsZXQgY29ubmVjdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgLy8gUmVhZC1jb21wbGV0aW9uIGNvdW50ZXJzIGZvciB0aGUgd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29tcGxldGUgc3BhblxuICAgIC8vIGVtaXR0ZWQgd2hlbiB0aGUgc3RyZWFtIGRyYWlucy5cbiAgICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgICBsZXQgYnl0ZXNEZWxpdmVyZWQgPSAwO1xuICAgIHN1cGVyKHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgaXMgY29tcGxhaW5pbmcgYWJvdXQgdGhpc1xuICAgICAgdHlwZTogJ2J5dGVzJyxcblxuICAgICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgbGV0IHJlYWRlciA9IHRoaXMuI3JlYWRlcjtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ID09PSB1bmRlZmluZWQpIHJlYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgICAgICBjb25zdCBjb25uZWN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KHJ1bklkLCBuYW1lLCBzdGFydEluZGV4KTtcbiAgICAgICAgICBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgICAgICAgIHJlYWRlciA9IHRoaXMuI3JlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IobmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHJlYWRlcicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc2VydmVyIGZsdXNoZXMgYSBsZWFkaW5nIHplcm8tbGVuZ3RoIGNodW5rICh2MyspIHRvIGNvbW1pdFxuICAgICAgICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgYmVmb3JlIGFueSBkYXRhOyBza2lwIGVtcHRpZXMgc28gVFRGQyBtZWFzdXJlcyB0b1xuICAgICAgICAgIC8vIHRoZSBmaXJzdCByZWFsIGNodW5rLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFmaXJzdENodW5rUmVwb3J0ZWQgJiZcbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgcmVhZFN0YXJ0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpcnN0Q2h1bmtSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgY29ubmVjdE1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaHVua3NEZWxpdmVyZWQgKz0gMTtcbiAgICAgICAgICBieXRlc0RlbGl2ZXJlZCArPSByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAvLyBGb3J3YXJkIHJhdyBieXRlczsgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlXG4gICAgICAgICAgLy8gZnJhbWluZyBsZXZlbCBieSBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0uXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWRlcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuI3JlYWRlci5jYW5jZWwocmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWF4aW11bSBjb25zZWN1dGl2ZSByZWNvbm5lY3QgYXR0ZW1wdHMgZm9yIGEgc2luZ2xlIGZyYW1lZCBzdHJlYW0gc2Vzc2lvbi5cbiAqIFRoZSBjb3VudGVyIHJlc2V0cyB0byB6ZXJvIHdoZW5ldmVyIGEgcmVjb25uZWN0IG1ha2VzIGZvcndhcmQgcHJvZ3Jlc3MgKGFcbiAqIGZyYW1lIGlzIGRlbGl2ZXJlZCksIHNvIHRoaXMgYm91bmRzICpjb25zZWN1dGl2ZSogZmFpbHVyZXMsIG5vdCB0aGUgbGlmZXRpbWVcbiAqIHRvdGFsIOKAlCBhIGxvbmctbGl2ZWQgc2VydmVybGVzcyBzdHJlYW0gbWF5IGxlZ2l0aW1hdGVseSByZWNvbm5lY3QgZmFyIG1vcmVcbiAqIHRoYW4gdGhpcyBtYW55IHRpbWVzIGFzIGxvbmcgYXMgZWFjaCByZWNvbm5lY3Qga2VlcHMgZGVsaXZlcmluZyBkYXRhLiBXZSBvbmx5XG4gKiBnaXZlIHVwIGFmdGVyIHRoaXMgbWFueSByZWNvbm5lY3RzIGluIGEgcm93IHByb2R1Y2Ugbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMgPSA1MDtcblxuLyoqIEVmZmVjdGl2ZSBjb25zZWN1dGl2ZS1yZWNvbm5lY3QgY2FwLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTLFxuICAgIHtcbiAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICBtaW46IDEsXG4gICAgfVxuICApO1xuXG4vKipcbiAqIEFic29sdXRlIGJhY2tzdG9wIG9uIHRvdGFsIHJlY29ubmVjdHMgZm9yIGEgc2luZ2xlIHNlc3Npb24sIGluZGVwZW5kZW50IG9mXG4gKiBwcm9ncmVzcy4gVGhlIGNvbnNlY3V0aXZlIGNhcCBhYm92ZSByZXNldHMgb24gZm9yd2FyZCBwcm9ncmVzcywgd2hpY2ggaXNcbiAqIGNvcnJlY3QgZm9yIGEgd2VsbC1iZWhhdmVkIGJhY2tlbmQgdGhhdCBob25vcnMgYHN0YXJ0SW5kZXhgLiBCdXQgaWYgYSBXb3JsZCdzXG4gKiBgc3RyZWFtcy5nZXRgIGV2ZXIgaWdub3JlZCBgc3RhcnRJbmRleGAgYW5kIHJlLWRlbGl2ZXJlZCBlYXJsaWVyIGNodW5rcyxcbiAqIFwicHJvZ3Jlc3NcIiB3b3VsZCBiZSByZXBvcnRlZCBldmVyeSByZWNvbm5lY3QgYW5kIHRoZSBjb25zZWN1dGl2ZSBjYXAgd291bGRcbiAqIG5ldmVyIHRyaXAg4oCUIHR1cm5pbmcgYSBib3VuZGVkIGZhaWx1cmUgaW50byBhbiB1bmJvdW5kZWQgcmVjb25uZWN0IGxvb3AuIFRoaXNcbiAqIGhhcmQgY2VpbGluZyBndWFyYW50ZWVzIHRoZSBsb29wIGFsd2F5cyB0ZXJtaW5hdGVzLiBJdCBpcyBzZXQgaGlnaCBlbm91Z2hcbiAqIChob3VycyBvZiBzdHJlYW1pbmcgYXQgcmVhbGlzdGljIHBlci1zZXNzaW9uIHRpbWVvdXRzKSB0byBuZXZlciBpbnRlcmZlcmVcbiAqIHdpdGggbGVnaXRpbWF0ZSBsb25nLWxpdmVkIHN0cmVhbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTID0gMTAwMDtcblxuLyoqIEVmZmVjdGl2ZSB0b3RhbC1yZWNvbm5lY3QgYmFja3N0b3AuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSB9XG4gICk7XG5cbi8qKlxuICogV3JhcHMgdGhlIGxlbmd0aC1wcmVmaXgtZnJhbWVkIGJ5dGUgc3RyZWFtIGZyb20gYHdvcmxkLnN0cmVhbXMuZ2V0YCB3aXRoXG4gKiB0cmFuc3BhcmVudCBhdXRvLXJlY29ubmVjdC5cbiAqXG4gKiBFdmVyeSBmdWxseS1kZWNvZGVkIG91dGVyIGZyYW1lIGNvcnJlc3BvbmRzIHRvIGV4YWN0bHkgb25lIHNlcnZlci1zaWRlXG4gKiBjaHVuayAodGhlIHNlcmlhbGl6ZSB0cmFuc2Zvcm0gZW5xdWV1ZXMgb25lIGZyYW1lIHBlciB3b3JrZmxvdyB3cml0ZSwgYW5kXG4gKiB0aGUgd3JpdGFibGUgYnVmZmVycyBvbmUgZnJhbWUgcGVyIGNodW5rIHdoZW4gbXVsdGktd3JpdGluZykuIFRoZSB3cmFwcGVyXG4gKiBjb3VudHMgY29tcGxldGVkIGZyYW1lcyBhbmQsIG9uIHVwc3RyZWFtIGVycm9yLCByZW9wZW5zIHRoZSBjb25uZWN0aW9uXG4gKiB3aXRoIGBzdGFydEluZGV4ID0gcmVzb2x2ZWRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgLiBQYXJ0aWFsLWZyYW1lXG4gKiBieXRlcyBidWZmZXJlZCBiZWZvcmUgdGhlIGN1dCBhcmUgZGlzY2FyZGVkIOKAlCB0aGUgc2VydmVyIHdpbGwgcmVzZW5kIHRoZVxuICogaW4tZmxpZ2h0IGNodW5rIGluIGZ1bGwgZnJvbSB0aGUgbmV3IHN0YXJ0SW5kZXguXG4gKlxuICogQSBjbGVhbiB1cHN0cmVhbSBjbG9zZSAoRU9GIHdpdGggbm8gZXJyb3IpIHNpZ25hbHMgdGhlIHN0cmVhbSBpcyB0cnVseVxuICogZG9uZTsgd2UgY2xvc2UgdGhlIHdyYXBwZXIgYW5kIGRvIG5vdCByZWNvbm5lY3QuXG4gKlxuICogTmVnYXRpdmUgYHN0YXJ0SW5kZXhgIHZhbHVlcyAobGFzdC1OIHNlbWFudGljcykgc2tpcCB0aGUgcmVjb25uZWN0XG4gKiBtYWNoaW5lcnkgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBhYnNvbHV0ZSByZXN1bWUgcG9zaXRpb24gd2l0aG91dFxuICogYSB0YWlsLWluZGV4IGxvb2t1cCDigJQgdGhlIHJldHVybmVkIHN0cmVhbSBiZWhhdmVzIGFzIGEgc2luZ2xlLXNob3QgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyXG4pOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHJlY29ubmVjdFN1cHBvcnRlZCA9IHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBzdGFydEluZGV4ID49IDA7XG4gIGxldCBjdXJyZW50U3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPz8gMDtcbiAgbGV0IGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgbGV0IHJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHRvdGFsUmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4gfCB1bmRlZmluZWQ7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVhZCB0ZWxlbWV0cnkgKHNhbWUgc2VtYW50aWNzIGFzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0pOlxuICAvLyBkaXNwYXRjaCB0aW1lLCBmaXJzdC1jb25uZWN0IGR1cmF0aW9uLCBmaXJzdC1mcmFtZSBsYXRjaCwgYW5kIHRvdGFscy5cbiAgbGV0IHJlYWRTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29ubmVjdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdENodW5rUmVwb3J0ZWQgPSBmYWxzZTtcbiAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVN0YXJ0SW5kZXggPSByZWNvbm5lY3RTdXBwb3J0ZWRcbiAgICAgID8gY3VycmVudFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc1xuICAgICAgOiBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIGVmZmVjdGl2ZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChjb25uZWN0TXMgPT09IHVuZGVmaW5lZCkgY29ubmVjdE1zID0gRGF0ZS5ub3coKSAtIGNvbm5lY3RTdGFydDtcbiAgICByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlYWRlcikge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQWR2YW5jZSB0aGUgcmVzdW1lIHBvc2l0aW9uIHBhc3QgdGhlIGZyYW1lcyBhbHJlYWR5IGRlbGl2ZXJlZCwgdGhlblxuICAgIC8vIGRyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXMg4oCUIHRoZSByZW9wZW5lZCBjb25uZWN0aW9uIHJlLXNlbmRzIGZyb20gYVxuICAgIC8vIGZyYW1lIGJvdW5kYXJ5IGF0IHRoZSBuZXcgaW5kZXguXG4gICAgY3VycmVudFN0YXJ0SW5kZXggKz0gY29uc3VtZWRGcmFtZXM7XG4gICAgY29uc3VtZWRGcmFtZXMgPSAwO1xuICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgLy8gUmV0cnkgdGhlIHJlb3BlbiBpdHNlbGYgYWdhaW5zdCB0aGUgcmVjb25uZWN0IGJ1ZGdldC4gQSB0cmFuc2llbnRcbiAgICAvLyBmYWlsdXJlIG9mIGNvbm5lY3QoKSDigJQgdGhlIHNlcnZlciBicmllZmx5IHVuYXZhaWxhYmxlIGR1cmluZyB0aGVcbiAgICAvLyByZWNvbm5lY3Qgd2luZG93IOKAlCBpcyB0aGUgZXhhY3QgYmxpcCB0aGlzIHdyYXBwZXIgZXhpc3RzIHRvIHN1cnZpdmUsIHNvXG4gICAgLy8gY291bnQgaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0cnkgYWdhaW4gcmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXNcbiAgICAvLyBmYXRhbC4gT25seSBidWRnZXQgZXhoYXVzdGlvbiAoYSBzZXJ2ZXIgdGhhdCBzdGF5cyBkb3duKSB0ZXJtaW5hdGVzIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBjb25zdCBtYXhSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cygpO1xuICAgIGNvbnN0IG1heFRvdGFsUmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cygpO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHJlY29ubmVjdENvdW50Kys7XG4gICAgICB0b3RhbFJlY29ubmVjdENvdW50Kys7XG4gICAgICBpZiAocmVjb25uZWN0Q291bnQgPiBtYXhSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbFJlY29ubmVjdENvdW50ID4gbWF4VG90YWxSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gdG90YWwgcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFRvdGFsUmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gUmVvcGVuIGZhaWxlZCB0cmFuc2llbnRseTsgbG9vcCB0byByZXRyeSwgY291bnRpbmcgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gYnVkZ2V0IHNvIGEgc2VydmVyIHRoYXQgbmV2ZXIgcmVjb3ZlcnMgc3RpbGwgdGVybWluYXRlcyB0aGUgc3RyZWFtLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICBpZiAocmVhZFN0YXJ0ID09PSB1bmRlZmluZWQpIHJlYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAvLyBMb29wIHVudGlsIHdlIGVtaXQgc29tZXRoaW5nLCBoaXQgRU9GLCBvciBmYXRhbGx5IGVycm9yLiBSZWFkcyB0aGF0XG4gICAgICAvLyBvbmx5IGV4dGVuZCB0aGUgaW4tZmxpZ2h0LWZyYW1lIGJ1ZmZlciBkb24ndCBlbnF1ZXVlIGFueXRoaW5nIOKAlCB3ZVxuICAgICAgLy8ga2VlcCByZWFkaW5nIHJhdGhlciB0aGFuIHJldHVybmluZyBlbXB0eS1oYW5kZWQuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3QoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB7IGRvbmU6IGJvb2xlYW47IHZhbHVlPzogVWludDhBcnJheSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogY29ubmVjdCgpIGd1YXJhbnRlZXMgcmVhZGVyXG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyIS5yZWFkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghcmVjb25uZWN0U3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZWNvbm5lY3QoKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmRvbmUgfHwgIXJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgIC8vIENsZWFuIEVPRiDigJQgc3RyZWFtIGlzIHRydWx5IGNvbXBsZXRlLiBEcm9wIGFueSBwYXJ0aWFsLWZyYW1lXG4gICAgICAgICAgLy8gYnl0ZXMgKHRoZXJlIHNob3VsZG4ndCBiZSBhbnk7IGEgd2VsbC1mb3JtZWQgc3RyZWFtIGVuZHMgb24gYVxuICAgICAgICAgIC8vIGZyYW1lIGJvdW5kYXJ5KS5cbiAgICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIHRvdGFsUmVjb25uZWN0Q291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdG8gYnVmZmVyIGFuZCBlbWl0IGFsbCBjb21wbGV0ZSBmcmFtZXMuXG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAoaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGluY29taW5nLmxlbmd0aCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGluY29taW5nLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICBidWZmZXIgPSBjb21iaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgZW50aXJlIGZyYW1lZCBjaHVuayAoaGVhZGVyICsgcGF5bG9hZCkgdG8gdGhlXG4gICAgICAgICAgLy8gZG93bnN0cmVhbSBkZXNlcmlhbGl6ZXIsIHdoaWNoIGFscmVhZHkgZXhwZWN0cyB0aGlzIGxheW91dC5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKDAsIHRvdGFsKSk7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgICAgICBjb25zdW1lZEZyYW1lcysrO1xuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCsrO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHRvdGFsO1xuICAgICAgICAgIGlmICghZmlyc3RDaHVua1JlcG9ydGVkICYmIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdHRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1pdHRlZCkge1xuICAgICAgICAgIC8vIEZvcndhcmQgcHJvZ3Jlc3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbiDigJQgY2xlYXIgdGhlXG4gICAgICAgICAgLy8gY29uc2VjdXRpdmUtZmFpbHVyZSBidWRnZXQgc28gYSBsb25nIHN0cmVhbSB0aGF0IHJlY29ubmVjdHNcbiAgICAgICAgICAvLyBtYW55IHRpbWVzIChidXQga2VlcHMgZGVsaXZlcmluZykgaXMgbmV2ZXIgZmFsc2VseSBjYXBwZWQuXG4gICAgICAgICAgcmVjb25uZWN0Q291bnQgPSAwO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHBhcnRpYWwgYnl0ZXMg4oCUIHJlYWQgbW9yZS5cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbDogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHJlYWRlcikge1xuICAgICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgY2xvc2luZyBSZWFkYWJsZVN0cmVhbSByZWFkZXI6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGZsdXNoIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgYnVmZmVyZWQgc3RyZWFtIHdyaXRlcy5cbiAqIENodW5rcyBhcmUgYWNjdW11bGF0ZWQgYW5kIGZsdXNoZWQgdG9nZXRoZXIgdG8gcmVkdWNlIG5ldHdvcmsgb3ZlcmhlYWQuXG4gKi9cbmNvbnN0IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUyA9IDEwO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWZhdWx0IHN0cmVhbS1mbHVzaCBpbnRlcnZhbCAoYSBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYFxuICogc3RpbGwgdGFrZXMgcHJlY2VkZW5jZSkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYC5cbiAqL1xuY29uc3QgZ2V0U3RyZWFtRmx1c2hJbnRlcnZhbE1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUycsIFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gIH0pO1xuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciBvbmUgZmx1c2hlZCBiYXRjaCBvZiBzdHJlYW0gd3JpdGVzOiBmaXJzdFxuICogYHdyaXRlKClgIG9mIHRoZSBiYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgc2VydmVyIHdyaXRlIHNldHRsaW5nLiBUaGVcbiAqIHNwYW4ncyBkdXJhdGlvbiBpcyB0aGVyZWZvcmUgdGhlIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeSBvZiB0aGUgYmF0Y2hcbiAqIChidWZmZXIgZHdlbGwgKyBiYWNrcHJlc3N1cmUgKyBSUEMpOyBgYnVmZmVyX2R3ZWxsX21zYCBpc29sYXRlcyB0aGVcbiAqIHByZS1kaXNwYXRjaCBzaGFyZSBzbyBjbGllbnQtc2lkZSBiYXRjaGluZyBjb3N0IGNhbiBiZSB0b2xkIGFwYXJ0IGZyb21cbiAqIG5ldHdvcmsvc2VydmVyIHRpbWUuIE5hbWVkIGB3b3JrZmxvdy5zdHJlYW0uZmx1c2hgIOKAlCB0aGUgcGVyLXJlcXVlc3QgUlBDXG4gKiBiZW5lYXRoIGl0IGlzIHdvcmxkLXZlcmNlbCdzIGB3b3JrZmxvdy5zdHJlYW0ud3JpdGVgIHNwYW4gKGNodW5rX3J0dCksIGFuZFxuICogdGhlIHR3byBtdXN0IHN0YXkgZGlzdGluZ3Vpc2hhYmxlLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIGRpc3BhdGNoRXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJwY01zOiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5mbHVzaCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2ZsdXNoJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5idWZmZXJfZHdlbGxfbXMnOiBkaXNwYXRjaEVwb2NoTXMgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLy8gQ2xpZW50LW9ic2VydmVkIFdvcmxkIHdyaXRlIFJQQyBkdXJhdGlvbiAobmV0d29yayBob3AgaW5jbHVkZWQpLlxuICAgICAgICAvLyBTYW1lIGtleSBhcyB3b3JsZC12ZXJjZWwncyBwZXItcmVxdWVzdCBzcGFuIGF0dHJpYnV0ZSBzbyBxdWVyaWVzXG4gICAgICAgIC8vIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGljaCBsYXllciBlbWl0dGVkIGl0LlxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLndyaXRlLmNodW5rX3J0dCc6IHJwY01zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3IgdGhlIHN0cmVhbS1jbG9zZSBSUEM6IGl0cyBkdXJhdGlvbiBpcyB0aGVcbiAqIGB3b3JsZC5zdHJlYW1zLmNsb3NlYCByb3VuZCB0cmlwIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuIEZpcmUtYW5kLWZvcmdldDtcbiAqIG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtQ2xvc2UoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5jbG9zZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2Nsb3NlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5jbG9zZS5ycGNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5IOKAlCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXJpbmcgc3RhdGUgZm9yIGJhdGNoZWQgd3JpdGVzXG4gICAgLy8gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlIGZyYW1pbmcgbGV2ZWwgYnlcbiAgICAvLyBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0sIG5vdCBoZXJlLlxuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGxldCBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBmbHVzaFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcmVzb2x2ZWRGbHVzaEludGVydmFsTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgd3JpdGUtYmF0Y2ggdGltaW5nOiBzdGFtcGVkIGF0IGB3cml0ZSgpYCBlbnRyeSBmb3IgdGhlXG4gICAgLy8gZmlyc3QgY2h1bmsgb2YgYSBiYXRjaCDigJQgYmVmb3JlIHRoZSBiYWNrcHJlc3N1cmUgd2FpdCBvbiBhbnkgaW4tZmxpZ2h0XG4gICAgLy8gZmx1c2gg4oCUIHNvIHRoZSBlbWl0dGVkIHNwYW4gY292ZXJzIHRoZSBmdWxsIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeVxuICAgIC8vIChxdWV1ZWluZyArIGZsdXNoLXRpbWVyIGR3ZWxsICsgUlBDKS4gQ2xlYXJlZCB3aGVuIGEgZmx1c2ggdGFrZXMgdGhlXG4gICAgLy8gYmF0Y2g7IHJlc3RvcmVkIG9uIHdyaXRlIGZhaWx1cmUgc28gYSByZXRyaWVkIGJhdGNoIGtlZXBzIGl0cyB0cnVlIHQwLlxuICAgIGxldCBiYXRjaFN0YXJ0QXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZsdXNoID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gT3JkZXIgdGhlIGZpcnN0IHNlcnZlciB3cml0ZSBhZnRlciB0aGUgcnVuIGV4aXN0cyAodHVyYm8gb3B0aW1pc3RpY1xuICAgICAgLy8gc3RhcnQpOyBhIG5vLW9wIG9uIGV2ZXJ5IGxhdGVyIGZsdXNoIGFuZCBvdXRzaWRlIHR1cmJvLlxuICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcblxuICAgICAgLy8gQ29weSBjaHVua3MgdG8gZmx1c2gsIGJ1dCBkb24ndCBjbGVhciBidWZmZXIgdW50aWwgd3JpdGUgc3VjY2VlZHNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgZGF0YSBsb3NzIGlmIHRoZSB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICAgIGNvbnN0IGNodW5rc1RvRmx1c2ggPSBidWZmZXIuc2xpY2UoKTtcbiAgICAgIGNvbnN0IGJhdGNoU3RhcnQgPSBiYXRjaFN0YXJ0QXQ7XG4gICAgICBiYXRjaFN0YXJ0QXQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkaXNwYXRjaEF0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAvLyBDYWNoZSB0aGUgZmx1c2ggaW50ZXJ2YWwgZnJvbSB0aGUgd29ybGQgb24gZmlyc3QgdXNlXG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9XG4gICAgICAgICAgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zID8/IGdldFN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpO1xuICAgICAgfVxuICAgICAgY29uc3QgcnBjU3RhcnRBdCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2Ugd3JpdGVNdWx0aSBpZiBhdmFpbGFibGUgZm9yIGJhdGNoIHdyaXRlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIGNodW5rc1RvRmx1c2gubGVuZ3RoID4gMVxuICAgICAgICApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkocnVuSWQsIG5hbWUsIGNodW5rc1RvRmx1c2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBzZXF1ZW50aWFsIHdyaXRlc1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzVG9GbHVzaCkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgbmFtZSwgY2h1bmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIGJhdGNoIHN0YXlzIGJ1ZmZlcmVkIGZvciByZXRyeSDigJQgcmVzdG9yZSBpdHMgb3JpZ2luYWwgdDAgKHRoZVxuICAgICAgICAvLyBvbGRlc3QsIGlmIGEgbmV3ZXIgd3JpdGUgc3RhbXBlZCBvbmUgbWVhbndoaWxlKSBzbyB0aGUgZXZlbnR1YWxseVxuICAgICAgICAvLyBzdWNjZXNzZnVsIGZsdXNoIHJlcG9ydHMgdGhlIGZ1bGwgZHdlbGwuXG4gICAgICAgIGlmIChiYXRjaFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBiYXRjaFN0YXJ0QXQgPVxuICAgICAgICAgICAgYmF0Y2hTdGFydEF0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBiYXRjaFN0YXJ0XG4gICAgICAgICAgICAgIDogTWF0aC5taW4oYmF0Y2hTdGFydEF0LCBiYXRjaFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJhdGNoU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICAgICAgICAgIGJhdGNoU3RhcnQsXG4gICAgICAgICAgZGlzcGF0Y2hBdCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGNodW5rc1RvRmx1c2gubGVuZ3RoLFxuICAgICAgICAgIGNodW5rc1RvRmx1c2gucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIGMuYnl0ZUxlbmd0aCwgMCksXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIHJwY1N0YXJ0QXRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBjbGVhciBidWZmZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCB3cml0ZSB0byBwcmV2ZW50IGRhdGEgbG9zc1xuICAgICAgYnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIC8qKiBSZXNvbHZlcnMvcmVqZWN0b3JzIHdhaXRpbmcgZm9yIHRoZSBjdXJyZW50IHNjaGVkdWxlZCBmbHVzaCAqL1xuICAgIGxldCBmbHVzaFdhaXRlcnM6IEFycmF5PHtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgfT4gPSBbXTtcblxuICAgIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZmx1c2hUaW1lcikgcmV0dXJuOyAvLyBBbHJlYWR5IHNjaGVkdWxlZFxuXG4gICAgICBmbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBjdXJyZW50V2FpdGVycyA9IGZsdXNoV2FpdGVycztcbiAgICAgICAgZmx1c2hXYWl0ZXJzID0gW107XG4gICAgICAgIGZsdXNoUHJvbWlzZSA9IGZsdXNoKCkudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHcgb2YgY3VycmVudFdhaXRlcnMpIHcucmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB3IG9mIGN1cnJlbnRXYWl0ZXJzKSB3LnJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID8/IGdldFN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpKTtcbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgLy8gQmF0Y2ggdDAgZm9yIHRoZSB3cml0ZS1mbHVzaCBzcGFuOiBhdCBlbnRyeSwgYmVmb3JlIHRoZVxuICAgICAgICAvLyBiYWNrcHJlc3N1cmUgd2FpdCBiZWxvdywgc28gcXVldWVpbmcgYmVoaW5kIGFuIGluLWZsaWdodCBmbHVzaFxuICAgICAgICAvLyBjb3VudHMgdG93YXJkIHRoZSBhcHAtcGVyY2VpdmVkIGR3ZWxsLlxuICAgICAgICBpZiAoYmF0Y2hTdGFydEF0ID09PSB1bmRlZmluZWQpIGJhdGNoU3RhcnRBdCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IGluLXByb2dyZXNzIGZsdXNoIHRvIGNvbXBsZXRlIGJlZm9yZSBhZGRpbmcgdG8gYnVmZmVyXG4gICAgICAgIGlmIChmbHVzaFByb21pc2UpIHtcbiAgICAgICAgICBhd2FpdCBmbHVzaFByb21pc2U7XG4gICAgICAgICAgZmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgc2NoZWR1bGVGbHVzaCgpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzY2hlZHVsZWQgZmx1c2ggdG8gY29tcGxldGUgc28gdGhhdCBjYWxsZXJzXG4gICAgICAgIC8vIChsaWtlIGZsdXNoYWJsZVBpcGUpIGtub3cgZGF0YSBoYXMgcmVhY2hlZCB0aGUgc2VydmVyXG4gICAgICAgIC8vIGJlZm9yZSBkZWNyZW1lbnRpbmcgcGVuZGluZ09wcy4gV2l0aG91dCB0aGlzLCBwZW5kaW5nT3BzXG4gICAgICAgIC8vIHJlYWNoZXMgMCB3aGVuIHRoZSBidWZmZXJlZCB3cml0ZSByZXR1cm5zIChpbnN0YW50KSwgYnV0XG4gICAgICAgIC8vIHRoZSAxMG1zIGZsdXNoIHRpbWVyIGhhc24ndCBmaXJlZCB5ZXQuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBmbHVzaFdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIGFueSBpbi1wcm9ncmVzcyBmbHVzaCB0byBjb21wbGV0ZVxuICAgICAgICBpZiAoZmx1c2hQcm9taXNlKSB7XG4gICAgICAgICAgYXdhaXQgZmx1c2hQcm9taXNlO1xuICAgICAgICAgIGZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGbHVzaCBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGNodW5rc1xuICAgICAgICBhd2FpdCBmbHVzaCgpO1xuXG4gICAgICAgIC8vIEEgY2xvc2Ugd2l0aCBhbiBlbXB0eSBidWZmZXIgc2tpcHMgZmx1c2goKSdzIHdyaXRlIChhbmQgaXRzIGJhcnJpZXIpLFxuICAgICAgICAvLyBidXQgY2FuIGl0c2VsZiBiZSB0aGUgZmlyc3Qgd3JpdGUgdG8gYSBicmFuZC1uZXcgc3RyZWFtIOKAlCBnYXRlIGl0IHRvby5cbiAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcblxuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgY2xvc2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UocnVuSWQsIG5hbWUpO1xuICAgICAgICByZWNvcmRTdHJlYW1DbG9zZShjbG9zZVN0YXJ0LCBydW5JZCwgbmFtZSk7XG4gICAgICB9LFxuICAgICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIHRpbWVyIHRvIHByZXZlbnQgbGVha3NcbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGlzY2FyZCBidWZmZXJlZCBjaHVua3MgLSB0aGV5IHdvbid0IGJlIHdyaXR0ZW5cbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgIC8vIFJlamVjdCBhbnkgcGVuZGluZyBmbHVzaFdhaXRlcnMgc28gdGhlIHdyaXRlKCkgcHJvbWlzZXMgc2V0dGxlXG4gICAgICAgIC8vIGFuZCBkb24ndCBsZWFrLiBXaXRob3V0IHRoaXMsIHdyaXRlKCkgaGFuZ3MgZm9yZXZlciBvbiBhblxuICAgICAgICAvLyB1bnNldHRsZWQgcHJvbWlzZSBiZWNhdXNlIHRoZSBjbGVhcmVkIHRpbWVyIHdpbGwgbmV2ZXIgZmlyZS5cbiAgICAgICAgY29uc3Qgd2FpdGVycyA9IGZsdXNoV2FpdGVycztcbiAgICAgICAgZmx1c2hXYWl0ZXJzID0gW107XG4gICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSByZWFzb24gPz8gbmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZCcpO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygd2FpdGVycykgdy5yZWplY3QoYWJvcnRFcnJvcik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlcy5cbmV4cG9ydCB0eXBlIHtcbiAgQnl0ZVN0cmVhbUZyYW1pbmcsXG4gIFJlZHVjZXJzLFxuICBSZXZpdmVycyxcbiAgU2VyaWFsaXphYmxlU3BlY2lhbCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcblxuLy8gSW1wb3J0IHR5cGVzIGxvY2FsbHkgZm9yIHVzZSB3aXRoaW4gdGhpcyBmaWxlLlxuaW1wb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyAtLS0tIENvbXBvc2VkIHJlZHVjZXJzIC0tLS1cbi8vIENvbXBvc2VzIG1vZHVsYXIgcmVkdWNlcnMgKGNvbW1vbiwgY2xhc3MsIHN0ZXAtZnVuY3Rpb24pIHdpdGhcbi8vIG1vZGUtc3BlY2lmaWMgUmVxdWVzdC9SZXNwb25zZS9TdHJlYW0gcmVkdWNlcnMgYmVsb3cuXG5cbi8qKlxuICogQmFzZSByZWR1Y2VycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBzdGVwLWZ1bmN0aW9uICsgY29tbW9uIHJlZHVjZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsQmFzZVJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQg4oCUIHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSDigJQgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlLnNpZ25hbCAmJlxuICAgICAgICAodmFsdWUuc2lnbmFsLmFib3J0ZWQgfHxcbiAgICAgICAgICAodmFsdWUuc2lnbmFsIGFzIEFib3J0SW50ZXJuYWxzKVtBQk9SVF9TVFJFQU1fTkFNRV0pXG4gICAgICApIHtcbiAgICAgICAgZGF0YS5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlc3BvbnNlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB2YWx1ZS5oZWFkZXJzLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICByZWRpcmVjdGVkOiB2YWx1ZS5yZWRpcmVjdGVkLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBhYm9ydCByZWR1Y2VyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEFib3J0U2VyaWFsaXplZERhdGEgPSB7XG4gIHN0cmVhbU5hbWU6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbjogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3ltYm9sLWtleWVkIGludGVybmFsIGZpZWxkcyB0YWdnZWQgb250byBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWxcbiAqIGluc3RhbmNlcyAoYW5kIGBob2xkZXJgcyBpbiByZWR1Y2VyIGhlbHBlcnMpLiBBbGwgb3B0aW9uYWwg4oCUIGEgcGxhaW5cbiAqIG5hdGl2ZSBpbnN0YW5jZSBoYXMgbm9uZSBvZiB0aGVtIHNldC5cbiAqL1xudHlwZSBBYm9ydEludGVybmFscyA9IHtcbiAgW0FCT1JUX1NUUkVBTV9OQU1FXT86IHN0cmluZztcbiAgW0FCT1JUX0hPT0tfVE9LRU5dPzogc3RyaW5nO1xuICBbQUJPUlRfUkVBREVSX0NBTkNFTF0/OiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG50eXBlIEFib3J0U2lnbmFsTGlrZSA9IEFib3J0SW50ZXJuYWxzICYge1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb24/OiB1bmtub3duO1xuICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIEFib3J0SG9sZGVyID0gQWJvcnRJbnRlcm5hbHMgJiB7IHNpZ25hbD86IEFib3J0SW50ZXJuYWxzIH07XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gZXh0ZXJuYWwgYW5kIHN0ZXBcbiAqIGNvbnRleHRzLiBBc3NpZ25zIHN0cmVhbS9ob29rIG5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIG9wdGlvbmFsbHlcbiAqIGF0dGFjaGVzIGFuIGFib3J0IGxpc3RlbmVyIGZvciByZWFsLXRpbWUgcHJvcGFnYXRpb24sIGFuZCByZXR1cm5zIHRoZVxuICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gIHNpZ25hbDogQWJvcnRTaWduYWxMaWtlLFxuICBob2xkZXI6IEFib3J0SG9sZGVyLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB7XG4gIGxldCBzdHJlYW1OYW1lID0gaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgbGV0IGhvb2tUb2tlbiA9IGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgaWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgaG9va1Rva2VuID0gYGFicnRfJHtpZH1gO1xuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICBpZiAoaG9sZGVyLnNpZ25hbCkge1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICB9XG4gIH1cblxuICAvLyBEZWR1cGVkIHZpYSBBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRCBtYXJrZXIg4oCUIHNlZSBhdHRhY2hBYm9ydExpc3RlbmVyT25jZS5cbiAgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gICAgc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxuICAgIHN0cmVhbU5hbWUsXG4gICAgcnVuSWQsXG4gICAgY3J5cHRvS2V5LFxuICAgIG9wc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gd29ya2Zsb3cgY29udGV4dC5cbiAqIFJlYWRzIGV4aXN0aW5nIHN0cmVhbS9ob29rIG5hbWVzIGZyb20gc3ltYm9scyAobXVzdCBhbHJlYWR5IGJlIHNldCkuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogQWJvcnRIb2xkZXJcbik6IEFib3J0U2VyaWFsaXplZERhdGEgfCBmYWxzZSB7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPVxuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgY29uc3QgaG9va1Rva2VuID1cbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBzdHJlYW0gbmFtZSBpcyBub3Qgc2V0Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBzaW5nbGUgYWJvcnQgbGlzdGVuZXIgdG8gYSBzaWduYWwsIGRlZHVwZWQgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEVhY2ggc2VyaWFsaXphdGlvbiBwYXNzIGdvZXMgdGhyb3VnaCB0aGUgcmVkdWNlciwgYnV0IGEgY29udHJvbGxlciBwYXNzZWRcbiAqIHRvIE4gc3RlcHMgd291bGQgb3RoZXJ3aXNlIGFjY3VtdWxhdGUgTiBsaXN0ZW5lcnMg4oCUIGVhY2ggd3JpdGluZyB0aGUgc2FtZVxuICogc3RyZWFtIHBhY2tldCBhbmQgZG91YmxlLWNsb3NpbmcgdGhlIHN0cmVhbSBvbiBhYm9ydC4gVGhlIG1hcmtlciBzeW1ib2xcbiAqIGVuc3VyZXMgdGhlIHN0cmVhbS13cml0ZSBzaWRlLWVmZmVjdCBydW5zIGF0IG1vc3Qgb25jZSBwZXIgKHNpZ25hbCwgcnVuSWQpLlxuICovXG5mdW5jdGlvbiBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IHZvaWQge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgaWYgKChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0pIHJldHVybjtcbiAgKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSA9IHRydWU7XG5cbiAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ2Fib3J0JyxcbiAgICAoKSA9PiB7XG4gICAgICBvcHMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVoeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHJlYWRlciB1c2VzIChoeWRyYXRlU3RlcEFyZ3VtZW50cylcbiAgICAgICAgICAgIC8vIHNvIHRoZSByZWFzb24gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkgKERPTUV4Y2VwdGlvbixcbiAgICAgICAgICAgIC8vIEVycm9ycywgY3VzdG9tIGNsYXNzZXMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3MgZW5jcnlwdGlvbiBrZXkuXG4gICAgICAgICAgICAvLyBBIGJhcmUgSlNPTi5zdHJpbmdpZnkgaGVyZSB3b3VsZCB3cml0ZSBhIHBhY2tldCB0aGUgcmVhZGVyIGNhbid0XG4gICAgICAgICAgICAvLyBkZWNvZGUgYW5kIHRoZSBsaXN0ZW5lci1zaWRlIGFib3J0IHdvdWxkIHByb3BhZ2F0ZSB3aXRoIG5vIHJlYXNvbi5cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb246IHNpZ25hbC5yZWFzb24gfSxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0sXG4gICAgeyBvbmNlOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSwgcGFzc2luZyBhcmd1bWVudHNcbiAqIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHBhcmFtIGNyeXB0b0tleVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hlbiBgdHJ1ZWAsIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgKVxuICogICBhcmUgd3JhcHBlZCBpbiBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzIG9uIHRoZSB3aXJlIHNvIHRoZSBjb25zdW1lclxuICogICBjYW4gcmVjb25uZWN0IG9uIHRyYW5zaWVudCBlcnJvcnMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IHJ1bidzXG4gKiAgIGNhcGFiaWxpdHkg4oCUIHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHNcbiAqICAgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSBuZXN0ZWQgYFJlYWRhYmxlU3RyZWFtYCBmb3VuZCB3aGlsZSBzZXJpYWxpemluZ1xuICAvLyBpcyBwaXBlZCB0byBpdHMgb3duIHNlcnZlciBzdHJlYW0gaW5kZXBlbmRlbnRseSBvZiB0aGUgb3V0ZXIgc2luaywgc28gaXRzXG4gIC8vIGZpcnN0IGNodW5rIGNhbiByYWNlIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGF0XG4gIC8vIHNpbmsgc28gdGhlIHdyaXRlIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gL1xuICAvLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMpIHMuZnJhbWluZyA9ICdmcmFtZWQtdjEnO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHdoZW4gdGhlIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0gKGUuZy4gaXQgY2FtZSBmcm9tIGEgc3RlcC1jb250ZXh0IGBnZXRXcml0YWJsZSgpYFxuICAgICAgLy8gb3Igd2FzIGh5ZHJhdGVkIGZyb20gYSB3b3JrZmxvdyBpbnB1dCBieSBgZ2V0U3RlcFJldml2ZXJzYCksXG4gICAgICAvLyBmb3J3YXJkIGl0cyB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCB0byB0aGUgcmVjZWl2aW5nIHJ1bi5cbiAgICAgIC8vIFRoZSByZWNlaXZpbmcgcnVuJ3Mgc3RlcC1zaWRlIHJldml2ZXIgb3BlbnMgYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZXMgdGhhdCBydW4nc1xuICAgICAgLy8gZW5jcnlwdGlvbiBrZXkgZGlyZWN0bHksIHNvIHdyaXRlcyBsYW5kIG9uIHRoZSBvcmlnaW5hbCBzdHJlYW1cbiAgICAgIC8vIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgcmVjZWl2aW5nIHJ1biDigJQgbm8gaW4tcHJvY2Vzc1xuICAgICAgLy8gYnJpZGdlIHRpZWQgdG8gdGhlIGRlaHlkcmF0aW5nIHN0ZXAncyBsaWZldGltZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBleGlzdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nUnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHtcbiAgICAgICAgICBuYW1lOiBleGlzdGluZ05hbWUsXG4gICAgICAgICAgcnVuSWQ6IGV4aXN0aW5nUnVuSWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZGVwbG95bWVudElkID0gZXhpc3RpbmdEZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gICAgICBvcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgLy8gUmVhZGFibGUvV3JpdGFibGUgc3RyZWFtcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAgLy8gYXJlIHNpbXBseSBcImhhbmRsZXNcIiB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIHRvIG90aGVyIHN0ZXBzLlxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWVbQk9EWV9JTklUX1NZTUJPTF07XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgZmFrZSBzdHJlYW0gLSBzZXJpYWxpemUgdGhlIEJvZHlJbml0IGRpcmVjdGx5XG4gICAgICAgIC8vIGRldmFsdWUgd2lsbCBoYW5kbGUgc2VyaWFsaXppbmcgc3RyaW5ncywgVWludDhBcnJheSwgZXRjLlxuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1JlYWRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBjb25zdCB0eXBlID0gdmFsdWVbU1RSRUFNX1RZUEVfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgY29uc3QgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPVxuICAgICAgICB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXcml0YWJsZVN0cmVhbSBgbmFtZWAgaXMgbm90IHNldCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgLy8gV2hlbiB0aGUgaGFuZGxlIHdhcyBmb3J3YXJkZWQgZnJvbSBhbm90aGVyIHJ1biAocGFyZW50IOKGkiBjaGlsZFxuICAgICAgLy8gdmlhIGBzdGFydCgpYCksIHByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkIHNvIHRoZSBzdGVwLXNpZGVcbiAgICAgIC8vIHJldml2ZXIgb3BlbnMgdGhlIHdyaXRhYmxlIGFnYWluc3QgdGhlIG9yaWdpbmFsIHN0cmVhbS5cbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9IHZhbHVlW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25SdW5JZCA9PT0gJ3N0cmluZycpIHMucnVuSWQgPSBmb3JlaWduUnVuSWQ7XG4gICAgICBjb25zdCBmb3JlaWduRGVwbG95bWVudElkID0gdmFsdWVbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICAvLyBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgaW4gd29ya2Zsb3cgY29udGV4dCDigJQganVzdCByZWFkIHN5bWJvbHMgKGhhbmRsZXMpLlxuICAgIC8vIEluIHRoZSB3b3JrZmxvdyBWTSwgZ2xvYmFsLkFib3J0Q29udHJvbGxlciBpcyBhIGNsYXNzIGJ1dCBnbG9iYWwuQWJvcnRTaWduYWxcbiAgICAvLyBpcyBhIHBsYWluIG9iamVjdCAobm90IGEgY2xhc3MpLCBzbyBpbnN0YW5jZW9mIGNoZWNrcyB3b24ndCB3b3JrIGZvciBzaWduYWxzLlxuICAgIC8vIERldGVjdCBpbnN0YW5jZXMgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBBQk9SVF9TVFJFQU1fTkFNRSBzeW1ib2wgaW5zdGVhZC5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBob2xkZXIgPSB2YWx1ZSBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEhvbGRlcjtcbiAgICAgIGNvbnN0IGhhc0Fib3J0U3ltYm9sID1cbiAgICAgICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIgPVxuICAgICAgICBnbG9iYWwuQWJvcnRDb250cm9sbGVyICYmXG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcjtcbiAgICAgIGlmICghaGFzQWJvcnRTeW1ib2wgJiYgIWlzTmF0aXZlQWJvcnRDb250cm9sbGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZS5zaWduYWwsIGhvbGRlcik7XG4gICAgfSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzaWduYWwgPSB2YWx1ZSBhcyAoQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscykgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9IHNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRTaWduYWwgPVxuICAgICAgICBnbG9iYWwuQWJvcnRTaWduYWwgJiZcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbDtcbiAgICAgIGlmICghaGFzQWJvcnRTeW1ib2wgJiYgIWlzTmF0aXZlQWJvcnRTaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLCB2YWx1ZSBhcyBBYm9ydEhvbGRlcik7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCBwYXNzaW5nIHJldHVybiB2YWx1ZSB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIHJldHVybmVkIGBSZWFkYWJsZVN0cmVhbWAgaXMgcGlwZWQgdG8gdGhlIHNlcnZlclxuICAvLyBhZnRlciB0aGUgYm9keSBidXQgd2l0aGluIHRoZSBzYW1lIG9wIGZsdXNoLCBzbyBpdHMgZmlyc3QgY2h1bmsgY2FuIHJhY2VcbiAgLy8gYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoZSBzaW5rIHNvIHRoYXQgd3JpdGVcbiAgLy8gb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU3RyZWFtIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHBhc3NpbmcgYWNyb3NzIGV4ZWN1dGlvbiBib3VuZGFyeVxuICAgICAgaWYgKHZhbHVlLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdSZWFkYWJsZVN0cmVhbSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cgYm91bmRhcnkuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnUGFzcyB0aGUgc3RyZWFtIGJlZm9yZSBjYWxsaW5nIC5nZXRSZWFkZXIoKSAvIC5waXBlVGhyb3VnaCgpIC8gLnBpcGVUbygpLCBvciB0ZWUgaXQgd2l0aCAudGVlKCkgYW5kIHBhc3Mgb25lIG9mIHRoZSBicmFuY2hlcy4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBhbHJlYWR5IGhhcyB0aGUgbmFtZSBzeW1ib2wgc2V0LCBpbiB3aGljaCBjYXNlXG4gICAgICAvLyBpdCdzIGFscmVhZHkgYmVpbmcgc3VuayB0byB0aGUgc2VydmVyIGFuZCB3ZSBjYW4ganVzdCByZXR1cm4gdGhlXG4gICAgICAvLyBuYW1lIGFuZCB0eXBlLlxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgbGV0IHR5cGUgPSB2YWx1ZVtTVFJFQU1fVFlQRV9TWU1CT0xdO1xuICAgICAgLy8gVGhlIGZyYW1pbmcgc3ltYm9sIGlzIHNldCB3aGVuIGEgd29ya2Zsb3cgVk0gcmV2aXZlcyBhIHN0cmVhbVxuICAgICAgLy8gaGFuZGxlIGZyb20gYSBwcmV2aW91cyBzdGVwIChzZWUgYGdldFdvcmtmbG93UmV2aXZlcnNgKS4gV2hlblxuICAgICAgLy8gcHJlc2VudCB3ZSBtdXN0IHByb3BhZ2F0ZSB0aGUgc2FtZSBmcmFtaW5nIGNob2ljZSBvbiB0aGUgd2F5XG4gICAgICAvLyBiYWNrIG91dCwgc2luY2UgdGhlIGJ5dGVzIGFscmVhZHkgb24gdGhlIHNlcnZlcidzIHN0cmVhbSBhcmUgaW5cbiAgICAgIC8vIHRoYXQgZm9ybWF0IOKAlCBzd2l0Y2hpbmcgZm9ybWF0IG1pZC1zdHJlYW0gd291bGQgY29ycnVwdCB0aGVtLlxuICAgICAgbGV0IGZyYW1pbmc6IEJ5dGVTdHJlYW1GcmFtaW5nIHwgdW5kZWZpbmVkID0gdmFsdWVbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXTtcblxuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcbiAgICAgICAgZnJhbWluZyA9IHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMgPyAnZnJhbWVkLXYxJyA6IGZyYW1pbmc7XG5cbiAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgIGlmIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJykge1xuICAgICAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgICAgIHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXkpLFxuICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZVRvKHZhbHVlKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25SdW5JZCA9PT0gJ3N0cmluZycpIHMucnVuSWQgPSBmb3JlaWduUnVuSWQ7XG4gICAgICBjb25zdCBmb3JlaWduRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgIF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ2FuY2VsIGRhbmdsaW5nIGFib3J0LXN0cmVhbSByZWFkZXJzIG9uIGFueSBBYm9ydENvbnRyb2xsZXIgaW5zdGFuY2VzIGZvdW5kXG4gKiBpbiB0aGUgaHlkcmF0ZWQgc3RlcCBhcmd1bWVudHMuIENhbGxlZCBhZnRlciB0aGUgc3RlcCBmdW5jdGlvbiByZXR1cm5zXG4gKiAoc3VjY2VzcyBvciBmYWlsdXJlKSB0byBwcmV2ZW50IHJlYWRlciBwcm9taXNlcyBmcm9tIGtlZXBpbmcgdGhlIHNlcnZlcmxlc3NcbiAqIGZ1bmN0aW9uIGFsaXZlIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbEFib3J0UmVhZGVycyguLi52YWx1ZXM6IHVua25vd25bXSk6IHZvaWQge1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFdlYWtTZXQoKTtcbiAgZnVuY3Rpb24gY2FuY2VsSWZQcmVzZW50KHZhbDogQWJvcnRJbnRlcm5hbHMpOiB2b2lkIHtcbiAgICBjb25zdCBjYW5jZWwgPSB2YWxbQUJPUlRfUkVBREVSX0NBTkNFTF07XG4gICAgaWYgKGNhbmNlbCAmJiAhY2FuY2VsLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjYW5jZWwuYWJvcnQoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd2Fsayh2YWw6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICBpZiAodmlzaXRlZC5oYXModmFsIGFzIG9iamVjdCkpIHJldHVybjtcbiAgICB2aXNpdGVkLmFkZCh2YWwgYXMgb2JqZWN0KTtcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwuc2lnbmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWwpIHdhbGsoaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwudmFsdWVzKCkpIHdhbGsodik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwpIHdhbGsodik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJlcXVlc3QvUmVzcG9uc2UgZXhwb3NlIGBzaWduYWxgL2Bib2R5YCBhcyBwcm90b3R5cGUgZ2V0dGVycywgc29cbiAgICAvLyBPYmplY3QudmFsdWVzKCkgd29uJ3QgZmluZCB0aGVtLiBEZXNjZW5kIGV4cGxpY2l0bHkuXG4gICAgaWYgKHR5cGVvZiBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICB3YWxrKHZhbC5zaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyh2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB3YWxrKHYpO1xuICB9XG4gIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHdhbGsodik7XG59XG5cbi8qKlxuICogU2V0cyB1cCBhIHN0cmVhbSByZWFkZXIgb24gdGhlIGNvbnRyb2xsZXIgdGhhdCBsaXN0ZW5zIGZvciBhbiBhYm9ydCBwYWNrZXQuXG4gKiBSZXR1cm5zIHRoZSByZWFkZXJDYW5jZWwgY29udHJvbGxlciBzbyBpdCBjYW4gYmUgc3RvcmVkIG9uIGJvdGggdGhlXG4gKiBjb250cm9sbGVyIGFuZCBzaWduYWwgZm9yIGNsZWFudXAgYnkgY2FuY2VsQWJvcnRSZWFkZXJzLlxuICovXG5mdW5jdGlvbiBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IHJlYWRlckNhbmNlbCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBvcHMucHVzaChcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgIHJlYWRlci5yZWFkKCksXG4gICAgICAgICAgbmV3IFByb21pc2U8eyB2YWx1ZTogdW5kZWZpbmVkOyBkb25lOiB0cnVlIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVhZGVyQ2FuY2VsLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXJDYW5jZWwuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICdhYm9ydCcsXG4gICAgICAgICAgICAgICgpID0+IHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgLy8gQW4gYWJvcnQgcGFja2V0IGFycml2ZWQ6IHByb3BhZ2F0ZSBpdCBhcyBmYXN0IGFzIHBvc3NpYmxlLiBSZWxlYXNlXG4gICAgICAgICAgLy8gdGhlIGxvY2sgKHN5bmNocm9ub3VzKSByYXRoZXIgdGhhbiBjYW5jZWxsaW5nIGhlcmUg4oCUIG9uIGFcbiAgICAgICAgICAvLyBzZXJ2aWNlLWJhY2tlZCBXb3JsZCBgcmVhZGVyLmNhbmNlbCgpYCBjYW4gZG8gYSBuZXR3b3JrIHJvdW5kLXRyaXAsXG4gICAgICAgICAgLy8gYW5kIGF3YWl0aW5nIGl0IGJlZm9yZSBgY29udHJvbGxlci5hYm9ydCgpYCB3b3VsZCBkZWxheSAob3IsIGlmIGl0XG4gICAgICAgICAgLy8gaGFuZ3MsIGRyb3ApIHJlYWwtdGltZSBhYm9ydCBkZWxpdmVyeSB0byB0aGUgaW4tZmxpZ2h0IHN0ZXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gUmVhZGVyIG1heSBhbHJlYWR5IGJlIHJlbGVhc2VkOyBpZ25vcmUuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBIeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHdyaXRlciB1c2VkIHNvIHRoZSByZWFzb25cbiAgICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5LiBFbmNyeXB0aW9uIGtleSAoaWYgYW55KVxuICAgICAgICAgICAgLy8gY29tZXMgZnJvbSB0aGUgc3RlcCBjb250ZXh0IOKAlCBzZXQgdXAgYnkgdGhlIHN0ZXAgaGFuZGxlciBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoaXMgcmVhZGVyIHJ1bnMuIEZhbGxiYWNrIHRvIHVuZGVmaW5lZCBmb3IgZXh0ZXJuYWwtY29udGV4dFxuICAgICAgICAgICAgLy8gcmV2aXZlcyAodGhlIGh5ZHJhdGUgcGF0aCBpcyBlbmNyeXB0aW9uLWtleS10b2xlcmFudCkuXG4gICAgICAgICAgICBjb25zdCBjdHhGb3JLZXkgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgY3R4Rm9yS2V5Py5lbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZGF0YT8ucmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHN0ZXAgZmluaXNoZWQgKG9yIHRoZSByZWFkZXIgd2FzIGNhbmNlbGxlZCkgd2l0aG91dCBhbiBhYm9ydC5cbiAgICAgICAgICAvLyBDYW5jZWwg4oCUIG5vdCBqdXN0IHJlbGVhc2Ug4oCUIHNvIHRoZSB1bmRlcmx5aW5nIFdvcmxkIHN0cmVhbSBpcyB0b3JuXG4gICAgICAgICAgLy8gZG93bjogYSBwb2xsaW5nIFdvcmxkIChlLmcuIHdvcmxkLWxvY2FsKSBvdGhlcndpc2UgbGVha3MgYSB0YWlsXG4gICAgICAgICAgLy8gcmVhZGVyIChhIDEwMG1zIGZpbGVzeXN0ZW0gcG9sbCBwbHVzIGVtaXR0ZXIgbGlzdGVuZXJzKSBwZXIgc3RlcFxuICAgICAgICAgIC8vIGludm9jYXRpb24gZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzLCBzaW5jZSBhIHNpZ25hbC1iZWFyaW5nIHN0ZXBcbiAgICAgICAgICAvLyBvcGVucyBvbmUgb2YgdGhlc2Ugb24gZXZlcnkgcmV2aXZhbCBhbmQgdXN1YWxseSBuZXZlciBhYm9ydHMuIEZpcmVcbiAgICAgICAgICAvLyBhbmQgZm9yZ2V0OiBhIHNlcnZpY2UtYmFja2VkIFdvcmxkJ3MgY2FuY2VsIG1heSBoaXQgdGhlIG5ldHdvcmssXG4gICAgICAgICAgLy8gYW5kIHRoaXMgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgc3RlcCdzIG9wcy1zZXR0bGUgd2luZG93LlxuICAgICAgICAgIHZvaWQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0cmVhbSByZWFkIGZhaWxlZCDigJQgc2lnbmFsIHdvbid0IHByb3BhZ2F0ZSBpbiByZWFsLXRpbWUsXG4gICAgICAgIC8vIGJ1dCBob29rLWJhc2VkIHByb3BhZ2F0aW9uIG9uIG5leHQgcmVwbGF5IHByb3ZpZGVzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSkoKVxuICApO1xuXG4gIHJldHVybiByZWFkZXJDYW5jZWw7XG59XG5cbi8qKlxuICogU3RvcmVzIGFib3J0IHNlcmlhbGl6YXRpb24gc3ltYm9scyBhbmQgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyXG4gKiBvbiBib3RoIHRoZSBjb250cm9sbGVyIGFuZCBpdHMgc2lnbmFsLlxuICovXG5mdW5jdGlvbiB0YWdBYm9ydFBhaXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgdmFsdWU6IHsgc3RyZWFtTmFtZTogc3RyaW5nOyBob29rVG9rZW46IHN0cmluZyB9LFxuICByZWFkZXJDYW5jZWw/OiBBYm9ydENvbnRyb2xsZXJcbik6IHZvaWQge1xuICBjb25zdCB0YWdnZWRDb250cm9sbGVyID0gY29udHJvbGxlciBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscztcbiAgY29uc3QgdGFnZ2VkU2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscztcbiAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gdmFsdWUuc3RyZWFtTmFtZTtcbiAgdGFnZ2VkU2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICBpZiAocmVhZGVyQ2FuY2VsKSB7XG4gICAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgICB0YWdnZWRTaWduYWxbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSByZWFkZXJDYW5jZWw7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wYWdhdGUgYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBmcm9tIG9uZSBzaWduYWwgdG8gYW5vdGhlci4gVXNlZCBieSB0aGVcbiAqIFJlcXVlc3QgcmV2aXZlciBiZWNhdXNlIGBuZXcgUmVxdWVzdCh1cmwsIHsgc2lnbmFsIH0pYCBjb3BpZXMgdGhlIHNpZ25hbFxuICogaW50ZXJuYWxseSDigJQgdGhlIGNvbnN0cnVjdGVkIGByZXF1ZXN0LnNpZ25hbGAgaXMgYSBmcmVzaCBBYm9ydFNpZ25hbCB0aGF0XG4gKiBkb2Vzbid0IGNhcnJ5IHN5bWJvbHMgZnJvbSB0aGUgc291cmNlLlxuICovXG5mdW5jdGlvbiBjb3B5QWJvcnRJbnRlcm5hbHMoc3JjOiBBYm9ydFNpZ25hbCwgZGVzdDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNyYyBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCBkID0gZGVzdCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBpZiAoc1tBQk9SVF9TVFJFQU1fTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfU1RSRUFNX05BTUVdID0gc1tBQk9SVF9TVFJFQU1fTkFNRV07XG4gIH1cbiAgaWYgKHNbQUJPUlRfSE9PS19UT0tFTl0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfSE9PS19UT0tFTl0gPSBzW0FCT1JUX0hPT0tfVE9LRU5dO1xuICB9XG4gIGlmIChzW0FCT1JUX1JFQURFUl9DQU5DRUxdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gc1tBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWJvcnRDb250cm9sbGVyIHdpdGggc3RyZWFtLWJhY2tlZCBhYm9ydCBwcm9wYWdhdGlvbi5cbiAqIFVzZWQgYnkgc3RlcCBhbmQgZXh0ZXJuYWwgcmV2aXZlcnMgd2hlcmUgcmVhbCBhYm9ydCBzaWduYWwgYmVoYXZpb3IgaXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXJpYWxpemVkIGFib3J0IGNvbnRyb2xsZXIvc2lnbmFsIGRhdGFcbiAqIEBwYXJhbSBvcHMgLSBUaGUgb3BzIGFycmF5IGZvciB0cmFja2luZyBhc3luYyB3b3JrXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChmb3Igc3RyZWFtIHJlYWRzKVxuICogQHJldHVybnMgQSByZWFsIEFib3J0Q29udHJvbGxlciB3aXRoIHBhdGNoZWQgYWJvcnQoKSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRDb250cm9sbGVyKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRDb250cm9sbGVyJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGFib3J0KCkgdG8gYWxzbyB3cml0ZSBzdHJlYW0gKyByZXN1bWUgaG9vayAoZm9yIHN0ZXAtaW5pdGlhdGVkIGFib3J0KVxuICBjb25zdCBvcmlnaW5hbEFib3J0ID0gY29udHJvbGxlci5hYm9ydC5iaW5kKGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLmFib3J0ID0gKHJlYXNvbj86IHVua25vd24pID0+IHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsQWJvcnQocmVhc29uKTtcblxuICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4Lm9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgdGhyb3VnaCB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIGhvb2tcbiAgICAgICAgICAgIC8vIGV2ZW50IHVzZXMgc28gdGhlIGByZWFzb25gIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5XG4gICAgICAgICAgICAvLyAoRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzXG4gICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGtleSDigJQgc3ltbWV0cmljIHdpdGggd2hhdCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAvLyB3cml0ZXMgZm9yIHdvcmtmbG93LWluaXRpYXRlZCBhYm9ydHMuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfSxcbiAgICAgICAgICAgICAgY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5zdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUuaG9va1Rva2VuKSB7XG4gICAgICAgIC8vIFRoZSBkdXJhYmxlIGhvb2sgcmVzdW1lICh3aGljaCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCB0aGF0XG4gICAgICAgIC8vIHJlY29yZHMgdGhpcyBhYm9ydCBpbiB0aGUgd29ya2Zsb3cncyBldmVudCBsb2cpIG11c3QgYmUgY29tbWl0dGVkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgc3RlcCBjb21wbGV0ZXMuIE90aGVyd2lzZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uXG4gICAgICAgIC8vIGVucXVldWVkIGJ5IGBzdGVwX2NvbXBsZXRlZGAgY2FuIGFkdmFuY2UgcGFzdCB0aGUgYWJvcnQg4oCUIGRpc3BhdGNoaW5nXG4gICAgICAgIC8vIGEgbGF0ZXIgc3RlcCB3aXRoIGEgc3RhbGUsIG5vbi1hYm9ydGVkIGBzaWduYWxgIOKAlCBiZWZvcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIGV4aXN0cy4gUm91dGUgaXQgdG8gYHByZUNvbXBsZXRpb25PcHNgIChhd2FpdGVkIGlubGluZSBiZWZvcmVcbiAgICAgICAgLy8gY29tcGxldGlvbikgcmF0aGVyIHRoYW4gYG9wc2AgKGJlc3QtZWZmb3J0LCBiYWNrZ3JvdW5kKS4gVGhlIHN0cmVhbVxuICAgICAgICAvLyB3cml0ZSBhYm92ZSBzdGF5cyBpbiBgb3BzYDogaXQgbXVzdCBmaXJlIEFTQVAgdG8gcmVhY2ggYW4gaW4tZmxpZ2h0XG4gICAgICAgIC8vIHNpYmxpbmcgc3RlcCBhbmQgaXMgbm90IHRoZSBkdXJhYmxlIHJlY29yZC5cbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgaGVyZSBzbyB0aGUgcHJvbWlzZSBjYW4gb25seSBldmVyIGVuZm9yY2Ugb3JkZXJpbmdcbiAgICAgICAgLy8gd2hlbiBhd2FpdGVkIChzZWUgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKTsgYSBmYWlsZWQgcmVzdW1lIHJldHJpZXMgb24gbmV4dCByZXBsYXkuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VtZUhvb2s6IHJlc3VtZUhvb2tGbiB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2tGbih2YWx1ZS5ob29rVG9rZW4sIHtcbiAgICAgICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBob29rIHJlc3VtZSDigJQgcmV0cnkgb24gbmV4dCByZXBsYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGN0eC5wcmVDb21wbGV0aW9uT3BzLnB1c2goaG9va1Jlc3VtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIFJldml2ZXMganVzdCBhbiBBYm9ydFNpZ25hbCB3aXRob3V0IHRoZSBwYXRjaGVkIGFib3J0KCkgb3ZlcmhlYWQuXG4gKiBVc2VkIHdoZW4gb25seSBhIHNpZ25hbCAobm90IGEgY29udHJvbGxlcikgd2FzIHNlcmlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRTaWduYWwnXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBpZiAodmFsdWUuYWJvcnRlZCkge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgY29udHJvbGxlci5hYm9ydCh2YWx1ZS5yZWFzb24pO1xuICB9IGVsc2UgaWYgKHZhbHVlLnN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCByZWFkZXJDYW5jZWwgPSBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHJ1bklkLFxuICAgICAgdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgIG9wc1xuICAgICk7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlLCByZWFkZXJDYW5jZWwpO1xuICB9IGVsc2Uge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogQmFzZSByZXZpdmVycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBjb21tb24gcmV2aXZlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICpcbiAqIFRoaXMgaXMgZXhwb3J0ZWQgYmVjYXVzZSBzZXJpYWxpemF0aW9uLWZvcm1hdC50cyBhbmQgb3RoZXIgZmlsZXMgcmVmZXJlbmNlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcykge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAuLi5nZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUoZ2xvYmFsKSxcbiAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUGFydGlhbDxSZXZpdmVycz47XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZW5jcnlwdC1vbmx5IGtleSBuZWVkZWQgd2hlbiBhIGNoaWxkIHdyaXRlcyBpbnRvIGFub3RoZXIgcnVuJ3NcbiAqIHN0cmVhbS4gTmV3IGRlc2NyaXB0b3JzIGluY2x1ZGUgdGhlIG93bmVyJ3MgZGVwbG95bWVudCBJRDsgZGVzY3JpcHRvcnNcbiAqIGNyZWF0ZWQgYnkgb2xkZXIgU0RLIHZlcnNpb25zIGZhbGwgYmFjayB0byBsb2FkaW5nIHRoZSBvd25pbmcgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBpZiAoIXdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmF3S2V5ID0gZGVwbG95bWVudElkXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKHJ1bklkLCB7IGRlcGxveW1lbnRJZCB9KVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCkpO1xuICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSwgWydlbmNyeXB0J10pIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzIHRvIGNsaWVudHNcbiAgICBTdGVwRnVuY3Rpb246ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LiBTdGVwIGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzLicsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAnQSBzdGVwIGZ1bmN0aW9uIHJlZmVyZW5jZSByZWFjaGVkIHRoZSBjbGllbnQuIFJldHVybiBhIHNlcmlhbGl6YWJsZSB2YWx1ZSAoZS5nLiB0aGUgc3RlcCByZXN1bHQpIGluc3RlYWQgb2YgdGhlIHN0ZXAgaXRzZWxmLicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE5vdGU6IFJlc3BvbnNlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBzdGF0dXMsIHN0YXR1c1RleHQsIGFuZCBoZWFkZXJzXG4gICAgICAvLyBUaGUgdHlwZSwgdXJsLCBhbmQgcmVkaXJlY3RlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYW5kIHNldCBieSB0aGUgY29uc3RydWN0b3JcbiAgICAgIHJldHVybiBuZXcgZ2xvYmFsLlJlc3BvbnNlKHZhbHVlLmJvZHksIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyBoYXMgYm9keUluaXQsIGl0IGNhbWUgZnJvbSBhIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICAvLyBDb252ZXJ0IGl0IHRvIGEgUkVBTCBzdHJlYW0gbm93IHRoYXQgd2UncmUgb3V0c2lkZSB0aGUgd29ya2Zsb3dcbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWUuYm9keUluaXQ7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGNvbnZlcnQgQm9keUluaXQgdG8gUmVhZGFibGVTdHJlYW1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlJlc3BvbnNlKGJvZHlJbml0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXMg4oCUXG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBObyBhdXRvLXJlY29ubmVjdCBoZXJlIHlldDogcmF3IGJ5dGUgc3RyZWFtcyBoYXZlIG5vIHdpcmVcbiAgICAgICAgLy8gZnJhbWluZyB0byBjb3VudCBjb25zdW1lZCBjaHVua3Mgd2l0aC4gRnJhbWVkLXYxIGJ5dGUgc3RyZWFtc1xuICAgICAgICAvLyBtYWtlIGZyYW1lIGNvdW50aW5nIHBvc3NpYmxlLCBzbyBleHRlbmRpbmcgdGhlIHJlY29ubmVjdGluZ1xuICAgICAgICAvLyByZWFkZXIgdG8gdGhlbSBpcyBhIHNlcGFyYXRlIGZvbGxvdy11cC5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gaWRlbnRpdHkgKG9yIHVuZnJhbWluZykgdHJhbnNmb3JtIHRvIGdpdmUgdGhlIHVzZXIgYSByZWFkYWJsZVxuICAgICAgICBjb25zdCB7IHJlYWRhYmxlOiB1c2VyUmVhZGFibGUsIHdyaXRhYmxlIH0gPVxuICAgICAgICAgIHZhbHVlLmZyYW1pbmcgPT09ICdmcmFtZWQtdjEnXG4gICAgICAgICAgICA/IGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKVxuICAgICAgICAgICAgOiBuZXcgZ2xvYmFsLlRyYW5zZm9ybVN0cmVhbSgpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB3cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tYnl0ZSBzdHJlYW1zIGNhcnJ5IGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMsIHNvIHdlIGNhbiBjb3VudFxuICAgICAgICAvLyBjb21wbGV0ZWQgZnJhbWVzIGFuZCB0cmFuc3BhcmVudGx5IHJlY29ubmVjdCB3aGVuIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3Rpb24gdGltZXMgb3V0IG1pZC1ydW4uXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUgaGFuZGxpbmcgYXMgYGdldFN0ZXBSZXZpdmVycy5Xcml0YWJsZVN0cmVhbWAg4oCUIHNlZSBjb21tZW50c1xuICAgICAgLy8gdGhlcmUgZm9yIHRoZSBjcm9zcy1ydW4gY2FzZSAod3JpdGFibGUgY2FycmllcyBgcnVuSWRgIGZyb21cbiAgICAgIC8vIHBhcmVudCDihpIgY2hpbGQgZm9yd2FyZGluZyB2aWEgYHN0YXJ0KClgKS5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkodGFyZ2V0UnVuSWQsIHZhbHVlLmRlcGxveW1lbnRJZCk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgdGFyZ2V0UnVuSWQsIHRhcmdldEtleSksXG4gICAgICAgIHRhcmdldEtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICB2YWx1ZS5uYW1lXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgZmx1c2hhYmxlIHN0YXRlIGZvciB0aGlzIHN0cmVhbVxuICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgZmx1c2hhYmxlUGlwZShzZXJpYWxpemUucmVhZGFibGUsIHNlcnZlcldyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplLndyaXRhYmxlO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRDb250cm9sbGVyKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSwgb3BzLCBydW5JZCksXG4gIH07XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcmVjZWl2aW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBjbGllbnQgc2lkZSwgYW5kIHJldHVybiB2YWx1ZXNcbiAqIGZyb20gdGhlIHN0ZXBzLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1Jldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAvLyBTdGVwRnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dCAtIHVzZXMgdGhlIG1vZHVsYXIgcmV2aXZlclxuICAgIC8vIHdoaWNoIGNhbGxzIFdPUktGTE9XX1VTRV9TVEVQIGZyb20gZ2xvYmFsIHRvIHJlY29uc3RydWN0IHN0ZXAgcHJveGllc1xuICAgIC4uLmdldFN0ZXBGdW5jdGlvblJldml2ZXIoZ2xvYmFsKSxcbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih2YWx1ZSwgZ2xvYmFsLlJlcXVlc3QucHJvdG90eXBlKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRV0gPSByZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICBkZWxldGUgdmFsdWUucmVzcG9uc2VXcml0YWJsZTtcbiAgICAgICAgKHZhbHVlIGFzIGFueSkucmVzcG9uZFdpdGggPSAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdgcmVzcG9uZFdpdGgoKWAgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBzdGVwIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdNb3ZlIHRoZSBgcmVzcG9uZFdpdGgoLi4uKWAgY2FsbCBpbnNpZGUgYSBgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbiDigJQgaXQgY2Fubm90IGJlIGludm9rZWQgZnJvbSBhIHdvcmtmbG93IGNvbnRleHQuJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgLy8gV29ya2Zsb3cgZnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dCDigJQgcmV0dXJucyBhIGZ1bmN0aW9uLWxpa2VcbiAgICAvLyBvYmplY3Qgd2l0aCAud29ya2Zsb3dJZCB0aGF0IG1pbWljcyB3aGF0IHRoZSBTV0MgY29tcGlsZXIgcHJvZHVjZXMsXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih2YWx1ZSwgZ2xvYmFsLlJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgQm9keUluaXQgdGhhdCBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIGZha2Ugc3RyZWFtXG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBSZWNyZWF0ZSB0aGUgZmFrZSBzdHJlYW0gd2l0aCB0aGUgQm9keUluaXRcbiAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmJvZHlJbml0LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWd1bGFyIHN0cmVhbSBoYW5kbGluZ1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NUUkVBTV9UWVBFX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUudHlwZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIENhcnJ5IHRoZSB3aXJlLWZyYW1pbmcgZGVjaXNpb24gdGhyb3VnaCB0aGUgd29ya2Zsb3cgVk0gc29cbiAgICAgICAgLy8gdGhhdCB3aGVuIHRoZSBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCAod2hpY2ggcmVhZHNcbiAgICAgICAgLy8gdGhlIGFjdHVhbCBieXRlcyBmcm9tIHRoZSBzZXJ2ZXIpIHdlIGtub3cgd2hldGhlciB0byB1bmZyYW1lLlxuICAgICAgICAvLyBEZWZhdWx0cyB0byB1bmRlZmluZWQgZm9yIHN0cmVhbXMgd2hvc2Ugc2VyaWFsaXplZCByZWYgZGlkbid0XG4gICAgICAgIC8vIGNhcnJ5IHRoZSBmaWVsZCDigJQgdGhvc2UgYXJlIHRyZWF0ZWQgYXMgbGVnYWN5IHJhdyBieXRlcy5cbiAgICAgICAgW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZnJhbWluZyxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvck1hcCA9IHtcbiAgICAgICAgW1NUUkVBTV9OQU1FX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgLy8gUHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQsIGlmIHByZXNlbnQsIHNvIHRoYXQgd2hlbiB0aGVcbiAgICAgIC8vIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwIHRoZSB3b3JrZmxvdyByZWR1Y2VyIGNhblxuICAgICAgLy8gZm9yd2FyZCBpdCB0aHJvdWdoIHRvIHRoZSBzdGVwIHJldml2ZXIuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXNjcmlwdG9yW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLnJ1bklkLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXNjcmlwdG9yW1NUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xdID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucyDigJQgc2lsZW50IGNvcnJlY3RuZXNzIGJ1ZyBmb3IgbmF0dXJhbCBwYXR0ZXJuc1xuICAgIC8vIGxpa2UgYHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKWAgYWZ0ZXIgcmVjZWl2aW5nIGEgZGVzZXJpYWxpemVkXG4gICAgLy8gc2lnbmFsKS4gVGhlIHNpZ25hbCBkb2VzIG5vdCBvd24gYSBob29rIHN1YnNjcmlwdGlvbiBoZXJlIOKAlCBhYm9ydCBzdGF0ZVxuICAgIC8vIGlzIGRlbGl2ZXJlZCB2aWEgdGhlIGV4aXN0aW5nIHJlcGxheSBtYWNoaW5lcnkgb24gdGhlIHNvdXJjZSBzaWRlLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbCh2YWx1ZS5zdHJlYW1OYW1lLCB2YWx1ZS5ob29rVG9rZW4pO1xuICAgICAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW0FCT1JUX1NUUkVBTV9OQU1FXTogdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgICAgW0FCT1JUX0hPT0tfVE9LRU5dOiB2YWx1ZS5ob29rVG9rZW4sXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgYWJvcnQ6ICgpID0+IHt9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4gc2lnbmFsO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZGVwbG95bWVudElkPzogc3RyaW5nXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciBzdGVwIGNvbnRleHQgLSByZXR1cm5zIHJhdyBzdGVwIGZ1bmN0aW9uXG4gICAgLy8gd2l0aCBjbG9zdXJlIHZhcmlhYmxlIHN1cHBvcnQgdmlhIEFzeW5jTG9jYWxTdG9yYWdlLlxuICAgIC8vXG4gICAgLy8gSGFuZGxlcyBmb3VyIGluZGVwZW5kZW50IGZsYWdzIGZyb20gdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZDpcbiAgICAvLyAgIC0gYGNsb3N1cmVWYXJzYDogaW52b2tlIHRoZSBib2R5IGluc2lkZSBhbiBBc3luY0xvY2FsU3RvcmFnZSBmcmFtZVxuICAgIC8vICAgICBzbyB0aGUgU1dDLWVtaXR0ZWQgYFdPUktGTE9XX1NURVBfQ09OVEVYVF9TVE9SQUdFYCBJSUZFIGluIHRoZVxuICAgIC8vICAgICBob2lzdGVkIGJvZHkgY2FuIHB1bGwgdGhlIGNsb3N1cmUgdmFyaWFibGVzIGJhY2sgb3V0LlxuICAgIC8vICAgLSBgYm91bmRUaGlzYDogICBhIGB0aGlzYCB2YWx1ZSBjYXB0dXJlZCBieVxuICAgIC8vICAgICBgdXNlU3RlcCguLi4pLmJpbmQodGhpcylgIGluIHRoZSB3b3JrZmxvdyBidW5kbGUgKGxleGljYWwtYHRoaXNgXG4gICAgLy8gICAgIGFycm93IHN0ZXBzKS4gVGhlIHdyYXBwZXIgaW52b2tlcyB0aGUgYm9keSB2aWFcbiAgICAvLyAgICAgYHN0ZXBGbi5hcHBseShib3VuZFRoaXMsIGFyZ3MpYCBzbyB0aGUgYm9keSBzZWVzIHRoZSBzYW1lXG4gICAgLy8gICAgIGB0aGlzYCBpdCB3b3VsZCBoYXZlIGhhZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlLiBQcm9wZXJ0eVxuICAgIC8vICAgICBwcmVzZW5jZSDigJQgbm90IHRydXRoaW5lc3Mg4oCUIGlzIHNpZ25pZmljYW50IGJlY2F1c2VcbiAgICAvLyAgICAgYGJpbmQobnVsbClgIGFuZCBgYmluZCh1bmRlZmluZWQpYCBhcmUgYm90aCBsZWdhbCBhbmQgc2hvdWxkXG4gICAgLy8gICAgIHJvdW5kLXRyaXAgZmFpdGhmdWxseS5cbiAgICAvLyAgIC0gYGJvdW5kQXJnc2A6ICAgcHJlZmlsbGVkIGFyZ3MgZnJvbVxuICAgIC8vICAgICBgdXNlU3RlcCguLi4pLmJpbmQodGhpc0FyZywgeCwgeSlgLiBQcmVwZW5kZWQgdG8gdGhlIGNhbGwgYXJnc1xuICAgIC8vICAgICBzbyBwYXJ0aWFsIGFwcGxpY2F0aW9uIHN1cnZpdmVzIHNlcmlhbGl6YXRpb24uXG4gICAgU3RlcEZ1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IHZhbHVlLnN0ZXBJZDtcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gdmFsdWUuY2xvc3VyZVZhcnM7XG4gICAgICBjb25zdCBoYXNCb3VuZFRoaXMgPSAnYm91bmRUaGlzJyBpbiB2YWx1ZTtcbiAgICAgIGNvbnN0IGJvdW5kVGhpcyA9IGhhc0JvdW5kVGhpcyA/IHZhbHVlLmJvdW5kVGhpcyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJvdW5kQXJncyA9IEFycmF5LmlzQXJyYXkodmFsdWUuYm91bmRBcmdzKSA/IHZhbHVlLmJvdW5kQXJncyA6IFtdO1xuXG4gICAgICBjb25zdCBzdGVwRm4gPSBnZXRTdGVwRnVuY3Rpb24oc3RlcElkKTtcbiAgICAgIGlmICghc3RlcEZuKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFN0ZXAgZnVuY3Rpb24gXCIke3N0ZXBJZH1cIiBub3QgZm91bmQuIE1ha2Ugc3VyZSB0aGUgc3RlcCBmdW5jdGlvbiBpcyByZWdpc3RlcmVkLmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ01ha2Ugc3VyZSB0aGUgc3RlcCBmaWxlIGlzIGluY2x1ZGVkIGluIHlvdXIgYnVpbGQgKGkuZS4gaXQgaXMgbGlzdGVkIGluIHRoZSB3b3JrZmxvdyBtYW5pZmVzdCksIGFuZCB0aGF0IHRoZSBTV0MgcGx1Z2luIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBmaWxlLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGYXN0IHBhdGg6IG5vdGhpbmcgdG8gd3JhcC5cbiAgICAgIGlmICghY2xvc3VyZVZhcnMgJiYgIWhhc0JvdW5kVGhpcyAmJiBib3VuZEFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGVwRm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZWRTdGVwRm4gPSBmdW5jdGlvbiAodGhpczogdW5rbm93biwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3QgY2FsbFRoaXMgPSBoYXNCb3VuZFRoaXMgPyBib3VuZFRoaXMgOiB0aGlzO1xuICAgICAgICBjb25zdCBjYWxsQXJncyA9IGJvdW5kQXJncy5sZW5ndGggPiAwID8gWy4uLmJvdW5kQXJncywgLi4uYXJnc10gOiBhcmdzO1xuICAgICAgICBpZiAoY2xvc3VyZVZhcnMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAnQ2Fubm90IGNhbGwgc3RlcCBmdW5jdGlvbiB3aXRoIGNsb3N1cmUgdmFyaWFibGVzIG91dHNpZGUgc3RlcCBjb250ZXh0J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3Q29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRDb250ZXh0LFxuICAgICAgICAgICAgY2xvc3VyZVZhcnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gY29udGV4dFN0b3JhZ2UucnVuKG5ld0NvbnRleHQsICgpID0+XG4gICAgICAgICAgICBzdGVwRm4uYXBwbHkoY2FsbFRoaXMsIGNhbGxBcmdzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpO1xuICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIG9yaWdpbmFsIHN0ZXAgZnVuY3Rpb25cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHN0ZXBGbi5uYW1lLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZFN0ZXBGbiwgJ3N0ZXBJZCcsIHtcbiAgICAgICAgdmFsdWU6IHN0ZXBJZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHN0ZXBGbi5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd3JhcHBlZFN0ZXBGbi5tYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3cmFwcGVkU3RlcEZuO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHJlc3BvbnNlV3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHJlc3BvbnNlKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTm90ZTogUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIHN0YXR1cywgc3RhdHVzVGV4dCwgYW5kIGhlYWRlcnNcbiAgICAgIC8vIFRoZSB0eXBlLCB1cmwsIGFuZCByZWRpcmVjdGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBhbmQgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuIG5ldyBnbG9iYWwuUmVzcG9uc2UodmFsdWUuYm9keSwge1xuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIGhhcyBib2R5SW5pdCwgaXQgY2FtZSBmcm9tIGEgUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIC8vIENvbnZlcnQgaXQgdG8gYSBSRUFMIHN0cmVhbSBub3cgdGhhdCB3ZSdyZSBpbiB0aGUgc3RlcCBlbnZpcm9ubWVudFxuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgY29udmVydCBCb2R5SW5pdCB0byBSZWFkYWJsZVN0cmVhbVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBnbG9iYWwuUmVzcG9uc2UoYm9keUluaXQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgdmFsdWUubmFtZSk7XG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlciBzdGVwLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXMg4oCUXG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBpZGVudGl0eSAob3IgdW5mcmFtaW5nKSB0cmFuc2Zvcm0gdG8gZ2l2ZSB0aGUgdXNlciBhIHJlYWRhYmxlXG4gICAgICAgIGNvbnN0IHsgcmVhZGFibGU6IHVzZXJSZWFkYWJsZSwgd3JpdGFibGUgfSA9XG4gICAgICAgICAgdmFsdWUuZnJhbWluZyA9PT0gJ2ZyYW1lZC12MSdcbiAgICAgICAgICAgID8gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpXG4gICAgICAgICAgICA6IG5ldyBnbG9iYWwuVHJhbnNmb3JtU3RyZWFtKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHdyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSwgZGVwbG95bWVudElkKSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUtcnVuIGNhc2U6IHRoZSB3cml0YWJsZSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHJ1bi4gVXNlIHRoZVxuICAgICAgLy8gbG9jYWwgY3J5cHRvS2V5IGFuZCB3cml0ZSB0byB0aGUgbG9jYWwgcnVuSWQncyBzZXJ2ZXIgc3RyZWFtLlxuICAgICAgLy9cbiAgICAgIC8vIENyb3NzLXJ1biBjYXNlIChwYXJlbnQg4oaSIGNoaWxkIHZpYSBgc3RhcnQoKWApOiB0aGUgZGVzY3JpcHRvclxuICAgICAgLy8gY2FycmllcyB0aGUgb3JpZ2luYWwgYHJ1bklkYCBhbmQgYG5hbWVgLiBPcGVuIGEgc2VydmVyIHdyaXRhYmxlXG4gICAgICAvLyBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmUgVEhBVCBydW4ncyBrZXlcbiAgICAgIC8vIGZvciBlbmNyeXB0aW9uLiBUaGUgcmVzb2x1dGlvbiBpcyBhc3luYyBidXQgZG9lc24ndCBuZWVkIHRvXG4gICAgICAvLyBibG9jayByZXZpdmVyIHJldHVybiDigJQgYGdldFNlcmlhbGl6ZVN0cmVhbWAgYWNjZXB0cyB0aGVcbiAgICAgIC8vIGBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD5gIGRpcmVjdGx5IGFuZCBhd2FpdHMgaXQgbGF6aWx5XG4gICAgICAvLyBvbiB0aGUgZmlyc3QgY2h1bmsgd3JpdHRlbi4gVGhlIGtleSBpcyBpbXBvcnRlZCBlbmNyeXB0LW9ubHlcbiAgICAgIC8vIHNvIHRoZSByZWNlaXZpbmcgcnVuIGNhbiBuZXZlciBkZWNyeXB0IGFueXRoaW5nIGVsc2Ugb24gdGhlXG4gICAgICAvLyBvd25pbmcgcnVuJ3Mgc3RyZWFtIOKAlCBpdCBjYW4gb25seSBjb250cmlidXRlIG5ldyB3cml0ZXMuXG4gICAgICBjb25zdCB0YXJnZXRSdW5JZCA9IHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycgPyB2YWx1ZS5ydW5JZCA6IHJ1bklkO1xuICAgICAgY29uc3QgdGFyZ2V0RGVwbG95bWVudElkID1cbiAgICAgICAgdHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLmRlcGxveW1lbnRJZFxuICAgICAgICAgIDogdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgICA/IGRlcGxveW1lbnRJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkodGFyZ2V0UnVuSWQsIHRhcmdldERlcGxveW1lbnRJZCk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKGdsb2JhbCwgb3BzLCB0YXJnZXRSdW5JZCwgdGFyZ2V0S2V5KSxcbiAgICAgICAgdGFyZ2V0S2V5XG4gICAgICApO1xuICAgICAgY29uc3Qgc2VydmVyV3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgIHZhbHVlLm5hbWVcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBmbHVzaGFibGUgc3RhdGUgZm9yIHRoaXMgc3RyZWFtXG4gICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgIHBvbGxXcml0YWJsZUxvY2soc2VyaWFsaXplLndyaXRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgIC8vIFJlY29yZCB0aGUgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgc28gZG93bnN0cmVhbSByZWR1Y2VycyBjYW5cbiAgICAgIC8vIHJlY29nbml6ZSB0aGF0IHRoaXMgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbS4gV2hlbiBmb3J3YXJkZWQgYWNyb3NzIGBzdGFydCgpYCBhZ2FpbiDigJQgZS5nLlxuICAgICAgLy8gdGhlIGNoaWxkIHBhc3NlcyB0aGlzIHdyaXRhYmxlIG9uIHRvIGEgZ3JhbmRjaGlsZCDigJQgdGhlXG4gICAgICAvLyBleHRlcm5hbCByZWR1Y2VyIG5lZWRzIGJvdGggdG8gZW1pdCB0aGUgb3JpZ2luYWwgYHJ1bklkYCBpblxuICAgICAgLy8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0RGVwbG95bWVudElkKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHJldml2ZUFib3J0Q29udHJvbGxlcih2YWx1ZSwgb3BzLCBydW5JZCksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRTaWduYWwodmFsdWUsIG9wcywgcnVuSWQpLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmNyeXB0aW9uIEhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIGBlbmNyeXB0YC9gZGVjcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgXG4vLyBidXQgYXJlIGtlcHQgYXMgbmFtZWQgZXhwb3J0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb25zdW1lcnMuXG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIGlmIHRoZSB3b3JsZCBzdXBwb3J0cyBlbmNyeXB0aW9uLlxuICogUmV0dXJucyBvcmlnaW5hbCBkYXRhIGlmIGVuY3J5cHRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGVuY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVFbmNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiAoYXdhaXQgZW5jcnlwdChkYXRhLCBrZXkpKSBhcyBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSBpZiBpdCBoYXMgdGhlICdlbmNyJyBwcmVmaXguXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRGVjcnlwdChcbiAgZGF0YTogVWludDhBcnJheSB8IHVua25vd24sXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlaHlkcmF0ZSAvIEh5ZHJhdGUgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBtb2RlIG1vZHVsZXMgKHdvcmtmbG93LCBzdGVwLCBjbGllbnQpIHBhc3Npbmdcbi8vIG1vZGUtc3BlY2lmaWMgc3RyZWFtIGFuZCBSZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzL3Jldml2ZXJzIGFzIGV4dHJhIG9wdGlvbnMuXG4vLyBUaGUgdjFDb21wYXQgcGF0aCBpcyBoYW5kbGVkIGlubGluZSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgbW9kdWxlcy5cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgYHN0YXJ0KClgIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgd29ya2Zsb3cgYXJndW1lbnRzXG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGhlbiBoeWRyYXRlZCBmcm9tXG4gKiB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChyZXF1aXJlZCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0KVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHkg4oCUIHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgaW5mbGF0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUoaW5mbGF0ZWQsIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKGdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlaHlkcmF0ZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgZm9yIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiBhIHN0ZXAgaXMgYmVpbmcgY3JlYXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGFyZ3VtZW50cycsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHRvIGh5ZHJhdGUgdGhlIGFyZ3VtZW50cyBvZiBhIHN0ZXBcbiAqIGZyb20gdGhlIGRhdGFiYXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHdoZW4gYSBzdGVwIGhhcyBjb21wbGV0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eSDigJQgc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBvcmRlciB0aGUgZmlyc3QgY2h1bmsgb2YgYSByZXR1cm5lZCBzdHJlYW0gYWZ0ZXJcbiAgLy8gdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWRlZCBpbnRvIHRoZSBzdGVwIHJlZHVjZXJzJyBzdHJlYW1cbiAgLy8gc2luay4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnc3RlcCByZXR1cm4gdmFsdWUnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGhhbmRsZXIgd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gcmVqZWN0IHRoZSBzdGVwIHByb21pc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgLy8gVHJlYXRlZCBhcyBhIGRldmFsdWUgXCJmbGF0dGVuZWRcIiBhcnJheS4gSW4gcHJvZHVjdGlvbiB0aGlzIGJyYW5jaCBpc1xuICAgIC8vIGV4ZXJjaXNlZCBieSBsZWdhY3kgY29kZSBwYXRocyB0aGF0IGJ5cGFzc2VkIGBkZWh5ZHJhdGVTdGVwRXJyb3JgOyB0aGVcbiAgICAvLyBTREsgdmVyc2lvbiBpcyBwaW5uZWQgcGVyIHdvcmtmbG93IHJ1biB2aWEgc2tldyBwcm90ZWN0aW9uLCBzbyBhXG4gICAgLy8gY3VycmVudC12ZXJzaW9uIHByb2R1Y2VyIGFsd2F5cyBlbWl0cyBhIFVpbnQ4QXJyYXkgaGVyZS4gSWYgYVxuICAgIC8vIG1pc3NoYXBlbiB2YWx1ZSByZWFjaGVzIHVzLCBgdW5mbGF0dGVuYCB0aHJvd3Mg4oCUIHRoYXQncyBpbnRlbnRpb25hbDpcbiAgICAvLyB0aGUgaGlnaGVyLWxldmVsIGh5ZHJhdGlvbiBoZWxwZXJzIChgaHlkcmF0ZVN0ZXBJT2AsXG4gICAgLy8gYGh5ZHJhdGVSZXNvdXJjZUlPYCkgYWxyZWFkeSB3cmFwIHVzIGluIGEgdHJ5L2NhdGNoIHRoYXQgbGVhdmVzIHRoZVxuICAgIC8vIGZpZWxkIHVuLWh5ZHJhdGVkIGZvciBvMTF5IGRpc3BsYXksIGFuZCBzdXJmYWNpbmcgdGhlIHRocm93IHRvIGxvZ3NcbiAgICAvLyBpcyBtb3JlIGRlYnVnZ2FibGUgdGhhbiBzaWxlbnRseSBtYXNraW5nIHRoZSB1bnN1cHBvcnRlZCBzaGFwZS5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gdGhlIHdvcmtmbG93IGl0c2VsZiB0aHJvd3MuXG4gKiBEZWh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgcnVuX2ZhaWxlZGAgZXZlbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdydW4gZXJyb3InLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIChvciBvYnNlcnZhYmlsaXR5IHRvb2xzKSB0byBoeWRyYXRlIHRoZSBydW5cbiAqIGVycm9yIHZhbHVlIG9mIGEgZmFpbGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBjbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBtYXliZURlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2dcbiAqIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IGluZmxhdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBtYXliZURlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHdvcmtmbG93TW9kdWxlLmRlc2VyaWFsaXplKGluZmxhdGVkLCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhnZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICB9KTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIHRvIGV4dHJhY3Qgc3RyZWFtL1JlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMgYW5kIHJldml2ZXJzIC0tLS1cbi8vIFRoZSBtb2RlLXNwZWNpZmljIGdldCpSZWR1Y2Vycy9nZXQqUmV2aXZlcnMgZnVuY3Rpb25zIHJldHVybiBvYmplY3RzIHRoYXRcbi8vIGluY2x1ZGUgYm90aCBcImNvbW1vblwiIGVudHJpZXMgKERhdGUsIEVycm9yLCBNYXAsIGV0Yy4pIGFuZCBtb2RlLXNwZWNpZmljXG4vLyBlbnRyaWVzIChSZWFkYWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW0sIFJlcXVlc3QsIFJlc3BvbnNlLCBTdGVwRnVuY3Rpb24pLlxuLy8gVGhlIGNvbW1vbiBlbnRyaWVzIGFyZSBhbHJlYWR5IGNvbXBvc2VkIGJ5IHRoZSBjb2RlYy4gV2Ugb25seSBuZWVkIHRvXG4vLyBwYXNzIHRocm91Z2ggdGhlIG1vZGUtc3BlY2lmaWMgZW50cmllcyBhcyBleHRyYVJlZHVjZXJzL2V4dHJhUmV2aXZlcnMuXG5cbmNvbnN0IFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnV3JpdGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdTdGVwRnVuY3Rpb24nLFxuICAvLyBXaXJlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCB0aHJvdWdoIHRoZSBjbGllbnQgc2VyaWFsaXphdGlvbiBwYXRoIHNvXG4gIC8vIHNpZ25hbHMgcmVhY2hhYmxlIHZpYSBSZXF1ZXN0LnNpZ25hbCAob3IgYXMgZGlyZWN0IGFyZ3VtZW50cykgZ2V0IHRoZWlyXG4gIC8vIGRlZGljYXRlZCByZWR1Y2VyLiBXaXRob3V0IHRoaXMsIGRldmFsdWUgZmFsbHMgYmFjayB0byBpdHMgYXJiaXRyYXJ5LVBPSk9cbiAgLy8gcGF0aCBhbmQgZmFpbHMgZm9yIGFueSBzaWduYWwgdGhlIFJlcXVlc3QgcmVkdWNlciBmb3J3YXJkcy5cbiAgJ0Fib3J0Q29udHJvbGxlcicsXG4gICdBYm9ydFNpZ25hbCcsXG5dIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gIGFsbFJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmVkdWNlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgYWxsUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZXZpdmVycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJldml2ZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cbiJdfQ==
|
|
2591
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHlDQUF5QztBQUN6Qyw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLEVBRVAsT0FBTyxFQUNQLG9CQUFvQixHQUNyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3RCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGtCQUFr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cixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBkZWNyeXB0IGFzIGFlc0djbURlY3J5cHQsXG4gIGVuY3J5cHQgYXMgYWVzR2NtRW5jcnlwdCxcbiAgdHlwZSBDcnlwdG9LZXksXG4gIGltcG9ydEtleSxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZsdXNoYWJsZVN0YXRlLFxuICBmbHVzaGFibGVQaXBlLFxuICBwb2xsUmVhZGFibGVMb2NrLFxuICBwb2xsV3JpdGFibGVMb2NrLFxufSBmcm9tICcuL2ZsdXNoYWJsZS1zdHJlYW0uanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbi8vIFYyOiB1c2UgZ2V0V29ybGRMYXp5IGluIHN0ZXAtc2lkZSBjb2RlIHBhdGhzIHNvIFR1cmJvcGFjayBjYW4gc3RhdGljYWxseVxuLy8gcmVzb2x2ZSB0aGUgd29ybGQgYnJpZGdlIGZyb20gdGhlIHN0ZXAgYnVuZGxlIHdpdGhvdXQgZHJhZ2dpbmcgdGhlIGZ1bGxcbi8vIGhvc3Qgd29ybGQgbW9kdWxlIGludG8gdGhlIGZsb3cgcm91dGUuXG4vLyBTZWUgYHBhY2thZ2VzL2NvcmUvc3JjL3J1bnRpbWUvZ2V0LXdvcmxkLWxhenkudHNgIGFuZCB0aGVcbi8vIFwiVHVyYm9wYWNrIE5GVCBUcmFjaW5nIEVycm9ycyBpbiBWMiBDb21iaW5lZCBGbG93IFJvdXRlXCIgc2VjdGlvbiBvZlxuLy8gYGRvY3MvY29udGVudC9kb2NzL2NoYW5nZWxvZy9lYWdlci1wcm9jZXNzaW5nLm1keGAuXG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL3J1bnRpbWUvZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQsXG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxuICBlbmNyeXB0LFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yLFxuICByZXRocm93SWZSdW50aW1lRXJyb3IsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVjb2RlRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBpc0VuY3J5cHRlZCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Zvcm1hdC5qcyc7XG5pbXBvcnQge1xuICBnZXRDbGFzc1JlZHVjZXJzLFxuICBnZXRDbGFzc1Jldml2ZXJzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY2xhc3MuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q29tbW9uUmVkdWNlcnMsXG4gIGdldENvbW1vblJldml2ZXJzIGFzIGdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZSxcbiAgcmV2aXZlLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9zdGVwLWZ1bmN0aW9uLmpzJztcbmltcG9ydCAqIGFzIHN0ZXBNb2R1bGUgZnJvbSAnLi9zZXJpYWxpemF0aW9uL3N0ZXAuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuaW1wb3J0ICogYXMgd29ya2Zsb3dNb2R1bGUgZnJvbSAnLi9zZXJpYWxpemF0aW9uL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQge1xuICBBQk9SVF9IT09LX1RPS0VOLFxuICBBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRCxcbiAgQUJPUlRfUkVBREVSX0NBTkNFTCxcbiAgQUJPUlRfU1RSRUFNX05BTUUsXG4gIEJPRFlfSU5JVF9TWU1CT0wsXG4gIFNUQUJMRV9VTElELFxuICBTVFJFQU1fRlJBTUlOR19TWU1CT0wsXG4gIFNUUkVBTV9OQU1FX1NZTUJPTCxcbiAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLFxuICBTVFJFQU1fVFlQRV9TWU1CT0wsXG4gIFNUUkVBTV9XUklURV9CQVRDSF9TWU1CT0wsXG4gIFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFjdGl2ZVNwYW4sIGdldFNwYW5LaW5kLCByZWNvcmRFbGFwc2VkU3BhbiB9IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWQgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHsgV29ya2Zsb3dBYm9ydFNpZ25hbCB9IGZyb20gJy4vd29ya2Zsb3cvYWJvcnQtY29udHJvbGxlci5qcyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzXG4vLyBzbyBleGlzdGluZyBjb25zdW1lcnMgb2YgYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb25gIGtlZXAgd29ya2luZy5cbmV4cG9ydCB7XG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgZW5jb2RlV2l0aEZvcm1hdFByZWZpeCxcbiAgZGVjb2RlRm9ybWF0UHJlZml4LFxuICBwZWVrRm9ybWF0UHJlZml4LFxuICBpc0VuY3J5cHRlZCxcbiAgZW5jcnlwdCxcbiAgZGVjcnlwdCxcbiAgY29tcHJlc3MsXG4gIGRlY29tcHJlc3MsXG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxufTtcblxuLy8gUmUtZXhwb3J0IHRoZSBsZWdhY3kgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuLy8gTmV3IGNvZGUgc2hvdWxkIHVzZSBGb3JtYXRQcmVmaXggZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJy5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlID1cbiAgKHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0KVtrZXlvZiB0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdF07XG5cbi8qKlxuICogRGVmYXVsdCBVTElEIGdlbmVyYXRvciBmb3IgY29udGV4dHMgd2hlcmUgVk0ncyBzZWVkZWQgYHN0YWJsZVVsaWRgIGlzbid0IGF2YWlsYWJsZS5cbiAqIFVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIHNlcmlhbGl6aW5nIHN0cmVhbXMgb3V0c2lkZSB0aGUgd29ya2Zsb3cgVk0gY29udGV4dFxuICogKGUuZy4sIHdoZW4gc3RhcnRpbmcgYSB3b3JrZmxvdyBvciBoYW5kbGluZyBzdGVwIHJldHVybiB2YWx1ZXMpLlxuICovXG5jb25zdCBkZWZhdWx0VWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBEZXRlY3QgaWYgYSByZWFkYWJsZSBzdHJlYW0gaXMgYSBieXRlIHN0cmVhbS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtXG4gKiBAcmV0dXJucyBgXCJieXRlc1wiYCBpZiB0aGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0sIGB1bmRlZmluZWRgIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyZWFtVHlwZShzdHJlYW06IFJlYWRhYmxlU3RyZWFtKTogJ2J5dGVzJyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcih7IG1vZGU6ICdieW9iJyB9KTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICByZXR1cm4gJ2J5dGVzJztcbiAgfSBjYXRjaCB7fVxufVxuXG4vKipcbiAqIEZyYW1lIGZvcm1hdCBmb3Igc3RyZWFtIGNodW5rczpcbiAqICAgWzQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aF1bZm9ybWF0LXByZWZpeGVkIHBheWxvYWRdXG4gKlxuICogRWFjaCBjaHVuayBpcyBpbmRlcGVuZGVudGx5IGZyYW1lZCBzbyB0aGUgZGVzZXJpYWxpemVyIGNhbiBmaW5kXG4gKiBjaHVuayBib3VuZGFyaWVzIGV2ZW4gd2hlbiBtdWx0aXBsZSBjaHVua3MgYXJlIGNvbmNhdGVuYXRlZCBvclxuICogc3BsaXQgYWNyb3NzIHRyYW5zcG9ydCByZWFkcy5cbiAqL1xuY29uc3QgRlJBTUVfSEVBREVSX1NJWkUgPSA0O1xuXG4vKipcbiAqIFRoZSBtb2RlLXNwZWNpZmljIHNlcmlhbGl6ZXJzIChgLi9zZXJpYWxpemF0aW9uL3tjbGllbnQsc3RlcCx3b3JrZmxvd30udHNgKVxuICogYWxyZWFkeSB0aHJvdyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgIHdob3NlIGAuY2F1c2VgIGlzIHRoZSB1bmRlcmx5aW5nXG4gKiBkZXZhbHVlIC8gc2VyZGUgZmFpbHVyZS4gVGhlIG91dGVyIGRlaHlkcmF0ZS9oeWRyYXRlIHdyYXBwZXJzIHdhbnQgdG9cbiAqIHJlLWZyYW1lIHRoYXQgZXJyb3Igd2l0aCBhIG1vcmUgc3BlY2lmaWMgY29udGV4dCBsYWJlbCAoZS5nLiBcIndvcmtmbG93XG4gKiBhcmd1bWVudHNcIiBpbnN0ZWFkIG9mIGdlbmVyaWMgXCJ3b3JrZmxvdyB2YWx1ZVwiKSwgc28gdGhleSB1bndyYXAgdGhlXG4gKiBpbm5lciBTZXJpYWxpemF0aW9uRXJyb3IgYW5kIHJlZm9ybWF0IHdpdGggdGhlIG9yaWdpbmFsIGNhdXNlLiBFcnJvcnNcbiAqIHRoYXQgYXJlbid0IGFscmVhZHkgU2VyaWFsaXphdGlvbkVycm9yIGZsb3cgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKlxuICogYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGlzIGFuIGV4Y2VwdGlvbjogaXQgbXVzdCBrZWVwIGl0cyBpZGVudGl0eSAoYW5kXG4gKiBgY29udGV4dGApIHNvIHRoZSBydW4tZmFpbHVyZSBjbGFzc2lmaWVyIHJvdXRlcyBpdCB0byBgUlVOVElNRV9FUlJPUmAsXG4gKiBzbyB0aGlzIHJldGhyb3dzIGl0IHVuY2hhbmdlZCBiZWZvcmUgYW55IHVud3JhcHBpbmcuIE5vdGUgdGhpcyBndWFyZFxuICogbXVzdCBydW4gYmVmb3JlIHRoZSBnZW5lcmljIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgdW53cmFwIGJlbG93LCBzaW5jZVxuICogYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGV4dGVuZHMgYFdvcmtmbG93UnVudGltZUVycm9yYCBhbmQgY2FycmllcyBhXG4gKiBgY2F1c2VgICh0aGUgdW5kZXJseWluZyBET01FeGNlcHRpb24pIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHVud3JhcHBlZFxuICogYW5kIHJlZnJhbWVkIGFzIGEgYFNlcmlhbGl6YXRpb25FcnJvcmAuXG4gKi9cbmZ1bmN0aW9uIHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICByZXRocm93SWZSdW50aW1lRXJyb3IoZXJyb3IpO1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXJpYWxpemF0aW9uRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3JrZmxvd1J1bnRpbWVFcnJvciAmJiBlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuLyoqXG4gKiBFbWl0IGNvbXByZXNzaW9uIHRlbGVtZXRyeSBvbnRvIHRoZSBhY3RpdmUgc3BhbiBhZnRlciBhIChkZSlzZXJpYWxpemUuXG4gKlxuICogVGhlIGNvbXByZXNzaW9uIGxheWVyIHBvcHVsYXRlcyBgc3RhdHNgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSByYW4gKGJpbmFyeVxuICogZGF0YSBvbiBhIHNwZWMgPj0gNSBwYXRoKTsgbGVnYWN5IC8gdjFDb21wYXQgcGF0aHMgbGVhdmUgaXQgdW5yZWNvcmRlZCwgc29cbiAqIHRoaXMgbm8tb3BzIGZvciB0aGVtIGFuZCBhdm9pZHMgdGhlIGBnZXRBY3RpdmVTcGFuYCBsb29rdXAuIEF0dHJpYnV0ZXMgbGFuZFxuICogb24gd2hhdGV2ZXIgc3BhbiBpcyBhY3RpdmUg4oCUIHR5cGljYWxseSB0aGUgZGVkaWNhdGVkIGBzdGVwLmRlaHlkcmF0ZWAgL1xuICogYHN0ZXAuaHlkcmF0ZWAgc3Bhbiwgb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgcnVuL3N0YXJ0IHNwYW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZENvbXByZXNzaW9uKFxuICBzdGF0czogQ29tcHJlc3Npb25TdGF0cyxcbiAgb3BlcmF0aW9uOiAnc2VyaWFsaXplJyB8ICdkZXNlcmlhbGl6ZSdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXN0YXRzLnJlY29yZGVkKSByZXR1cm47XG4gIC8vIFRlbGVtZXRyeSBtdXN0IG5ldmVyIGJyZWFrIHRoZSBzZXJpYWxpemUvZGVzZXJpYWxpemUgZGF0YSBwYXRoIOKAlCBhXG4gIC8vIG1pc3NpbmcvZmFpbGluZyB0cmFjZXIgaXMgcHVyZWx5IGFuIG9ic2VydmFiaWxpdHkgbG9zcy5cbiAgdHJ5IHtcbiAgICBjb25zdCBzcGFuID0gYXdhaXQgZ2V0QWN0aXZlU3BhbigpO1xuICAgIGlmICghc3BhbikgcmV0dXJuO1xuICAgIGNvbnN0IHVuY29tcHJlc3NlZEJ5dGVzID0gc3RhdHMudW5jb21wcmVzc2VkQnl0ZXMgPz8gMDtcbiAgICBjb25zdCBzdG9yZWRCeXRlcyA9IHN0YXRzLnN0b3JlZEJ5dGVzID8/IDA7XG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbk9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3NlZChzdGF0cy5jb21wcmVzc2VkID8/IGZhbHNlKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvZGVjKHN0YXRzLmNvZGVjID8/ICdub25lJyksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25VbmNvbXByZXNzZWRCeXRlcyh1bmNvbXByZXNzZWRCeXRlcyksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25TdG9yZWRCeXRlcyhzdG9yZWRCeXRlcyksXG4gICAgICAuLi4oc3RhdHMuY29tcHJlc3NlZCAmJiB1bmNvbXByZXNzZWRCeXRlcyA+IDBcbiAgICAgICAgPyBBdHRyLlNlcmlhbGl6YXRpb25Db21wcmVzc2lvblJhdGlvKFxuICAgICAgICAgICAgMSAtIHN0b3JlZEJ5dGVzIC8gdW5jb21wcmVzc2VkQnl0ZXNcbiAgICAgICAgICApXG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgdGVsZW1ldHJ5IGZhaWx1cmVzXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgcmVkdWNlcnM6IFBhcnRpYWw8UmVkdWNlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4ge1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgLy8gTm90ZTogaWYgcmVzb2x2aW5nIGNyeXB0b0tleSByZWplY3RzIChlLmcuLCBuZXR3b3JrIGVycm9yIGZldGNoaW5nXG4gIC8vIHRoZSBkZXJpdmVkIGtleSksIHRoZSByZWplY3Rpb24gd29uJ3Qgc3VyZmFjZSB1bnRpbCB0aGUgZmlyc3QgY2h1bmtcbiAgLy8gaXMgcHJvY2Vzc2VkIOKAlCBub3QgYXQgc3RyZWFtIGNvbnN0cnVjdGlvbiB0aW1lLlxuICBjb25zdCBrZXlTdGF0ZSA9IHsgcmVzb2x2ZWQ6IGZhbHNlLCBrZXk6IHVuZGVmaW5lZCBhcyBDcnlwdG9LZXkgfCB1bmRlZmluZWQgfTtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc3RyaW5naWZ5KGNodW5rLCByZWR1Y2Vycyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShzZXJpYWxpemVkKTtcbiAgICAgICAgbGV0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICAgICAgcGF5bG9hZFxuICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgZnJhbWUgcGF5bG9hZCBpZiBhIGtleSBpcyBwcm92aWRlZC5cbiAgICAgICAgLy8gVGhlIGxlbmd0aCBoZWFkZXIgcmVtYWlucyBpbiB0aGUgY2xlYXIgc28gdGhlIGRlc2VyaWFsaXplciBjYW5cbiAgICAgICAgLy8gZmluZCBmcmFtZSBib3VuZGFyaWVzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICAgICAgICBpZiAoa2V5U3RhdGUua2V5KSB7XG4gICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgYWVzR2NtRW5jcnlwdChrZXlTdGF0ZS5rZXksIHByZWZpeGVkKTtcbiAgICAgICAgICBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCxcbiAgICAgICAgICAgIGVuY3J5cHRlZFxuICAgICAgICAgICkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZTogWzQtYnl0ZSBsZW5ndGhdW3ByZWZpeGVkIGRhdGFdXG4gICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBwcmVmaXhlZC5sZW5ndGgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgcHJlZml4ZWQubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgIGZyYW1lLnNldChwcmVmaXhlZCwgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRW5jcnlwdGlvbiBmYWlsdXJlcyBtdXN0IGtlZXAgdGhlaXIgUnVudGltZURlY3J5cHRpb25FcnJvclxuICAgICAgICAvLyBpZGVudGl0eSAoUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYmUgcmVmcmFtZWQgYXMgYVxuICAgICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgKFVTRVJfRVJST1IpLlxuICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ3N0cmVhbSBjaHVuaycsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgcmV2aXZlcnM6IFBhcnRpYWw8UmV2aXZlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICBjb25zdCBrZXlTdGF0ZSA9IHsgcmVzb2x2ZWQ6IGZhbHNlLCBrZXk6IHVuZGVmaW5lZCBhcyBDcnlwdG9LZXkgfCB1bmRlZmluZWQgfTtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXdCdWZmZXIuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV3QnVmZmVyLnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXdCdWZmZXI7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzKFxuICAgIGNvbnRyb2xsZXI6IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyPGFueT5cbiAgKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0XG4gICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBjb21wbGV0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzXG4gICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrOyAvLyBJbmNvbXBsZXRlIGZyYW1lLCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJhbWVEYXRhID0gYnVmZmVyLnNsaWNlKFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSxcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aFxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKTtcblxuICAgICAgbGV0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKTtcblxuICAgICAgLy8gSWYgdGhlIGZyYW1lIHBheWxvYWQgaXMgZW5jcnlwdGVkLCBkZWNyeXB0IGl0IGZpcnN0IHRvIHJldmVhbFxuICAgICAgLy8gdGhlIGlubmVyIGZvcm1hdC1wcmVmaXhlZCBkYXRhIChlLmcuLCAnZGV2bCcgKyBzZXJpYWxpemVkIHRleHQpLFxuICAgICAgLy8gdGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24gcGF0aC5cbiAgICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKSB7XG4gICAgICAgIGlmICgha2V5U3RhdGUua2V5KSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnRW5jcnlwdGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBlbmNyeXB0aW9uIGtleSBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICdFbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIG9yIG5vIGtleSB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgcnVuLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IHBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdFByZWZpeDogJ2VuY3InLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVjcnlwdGVkOiBVaW50OEFycmF5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY3J5cHRlZCA9IGF3YWl0IGFlc0djbURlY3J5cHQoa2V5U3RhdGUua2V5LCBwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgbG93LWxldmVsIEFFUyBsYXllciBvbmx5IHNlZXMgdGhlIHN0cmlwcGVkIHBheWxvYWQsIHNvIGl0XG4gICAgICAgICAgLy8gY2Fubm90IHJlY29yZCB0aGUgb3V0ZXIgZW52ZWxvcGUgcHJlZml4LiBXZSBwZWVrZWQgaXQgaGVyZVxuICAgICAgICAgIC8vIChgZW5jcmApLCBzbyBlbnJpY2ggdGhlIGRpYWdub3N0aWMgY29udGV4dCB3aXRoIHRoZSByZWFsIGZvcm1hdFxuICAgICAgICAgIC8vIHByZWZpeCBiZWZvcmUgcHJvcGFnYXRpbmcg4oCUIG1pcnJvcmluZyBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gICAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gZm9ybWF0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAoeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKHRleHQsIHJldml2ZXJzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIEZpcnN0LCB0cnkgdG8gZGV0ZWN0IGlmIHRoaXMgaXMgbGVuZ3RoLXByZWZpeGVkIGZyYW1lZCBkYXRhXG4gICAgICAvLyBieSBjaGVja2luZyBpZiB0aGUgZmlyc3QgNCBieXRlcyBmb3JtIGEgcGxhdXNpYmxlIGxlbmd0aC5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmIGNodW5rLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBwb3NzaWJsZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBjaHVuay5idWZmZXIsXG4gICAgICAgICAgY2h1bmsuYnl0ZU9mZnNldCxcbiAgICAgICAgICBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoIDwgMTAwXzAwMF8wMDAgLy8gc2FuaXR5IGNoZWNrOiA8IDEwME1CXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIExvb2tzIGxpa2UgZnJhbWVkIGRhdGFcbiAgICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQWxyZWFkeSBpbiBmcmFtZWQgbW9kZSAoaGF2ZSBidWZmZXJlZCBkYXRhKVxuICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGZvcm1hdDogbmV3bGluZS1kZWxpbWl0ZWQgZGV2YWx1ZSB0ZXh0IChubyBmcmFtaW5nKVxuICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKGNodW5rKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZShsaW5lLCByZXZpdmVycykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAvLyBQcm9jZXNzIGFueSByZW1haW5pbmcgZnJhbWVkIGRhdGFcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCeXRlLXN0cmVhbSB3aXJlIGZyYW1pbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBCeXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYCBSZWFkYWJsZVN0cmVhbXMgcGFzc2VkIGFjcm9zcyBib3VuZGFyaWVzKVxuLy8gYXJlIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgd29ybGQncyBzdHJlYW0gdHJhbnNwb3J0IG9uZSB1c2VyIGNodW5rIGF0XG4vLyBhIHRpbWUuIFdpdGhvdXQgYW4gaW4tYmFuZCBlbnZlbG9wZSwgdGhlIHJlYWRlciBzZWVzIGEgZmxhdCBzdHJlYW0gb2Zcbi8vIGJ5dGVzIOKAlCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGVyZSBvbmUgdXNlciBjaHVuayBlbmRzIGFuZCB0aGUgbmV4dFxuLy8gYmVnaW5zLCB3aGljaCBtYWtlcyBtaWQtc3RyZWFtIHJlY29ubmVjdCBpbXBvc3NpYmxlICh3ZSBkb24ndCBrbm93IGhvd1xuLy8gbWFueSBzZXJ2ZXItc2lkZSBjaHVua3MgaGF2ZSBiZWVuIGNvbnN1bWVkKS5cbi8vXG4vLyBUbyBlbmFibGUgdHJhbnNwYXJlbnQgcmVjb25uZWN0LCB0aGlzIFBSIGludHJvZHVjZXMgYW4gb3B0LWluIHdpcmVcbi8vIGVudmVsb3BlIHRoYXQgd3JhcHMgZWFjaCB1c2VyIGNodW5rIGluIGEgbGVuZ3RoLXByZWZpeDpcbi8vXG4vLyAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW3VzZXIgcGF5bG9hZCBieXRlc11cbi8vXG4vLyBUaGUgZW52ZWxvcGUgaXMgaWRlbnRpY2FsIGluIHNoYXBlIHRvIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3MgZnJhbWluZyxcbi8vIGJ1dCB0aGUgcGF5bG9hZCBoZXJlIGlzICpyYXcgdXNlciBieXRlcyog4oCUIHRoZXJlIGlzIG5vIGlubmVyXG4vLyBmb3JtYXQtcHJlZml4LCBubyBkZXZhbHVlLCBubyBlbmNyeXB0aW9uLiBBIGZyYW1lZCBieXRlIHN0cmVhbSBzdGF5c1xuLy8gc2VtYW50aWNhbGx5IGEgYnl0ZSBzdHJlYW0gZW5kLXRvLWVuZDsgdGhlIGZyYW1pbmcgaXMgcHVyZWx5IHRyYW5zcG9ydC5cbi8vXG4vLyBUaGUgZGVjaXNpb24gdG8gdXNlIGZyYW1pbmcgZm9yIGEgZ2l2ZW4gc3RyZWFtIGlzIHJlY29yZGVkIGluIHRoZVxuLy8gc2VyaWFsaXplZCBzdHJlYW0gcmVmIChgZnJhbWluZzogJ2ZyYW1lZC12MSdgKSwgc28gYm90aCBzaWRlcyBhZ3JlZSBvblxuLy8gdGhlIHdpcmUgZm9ybWF0IHdpdGhvdXQgcnVudGltZSBuZWdvdGlhdGlvbi4gUHJvZHVjZXJzIHRoYXQgdGFyZ2V0IGFcbi8vIHJ1biB3aG9zZSBkZXBsb3ltZW50IGRvZXNuJ3Qgc3VwcG9ydCBmcmFtaW5nIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2Bcbi8vIGluIGNhcGFiaWxpdGllcy50cykgZW1pdCByYXcgYnl0ZXMgYW5kIGEgcmVmIHdpdGhvdXQgdGhlIGZpZWxkIOKAlCB3aGljaFxuLy8gdGhlIHJlYWRlciB0cmVhdHMgYXMgbGVnYWN5IHJhdyBieXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cbi8qKlxuICogTWF4aW11bSBhbGxvd2VkIGJ5dGUtc3RyZWFtIGZyYW1lIHBheWxvYWQgc2l6ZSAoMTAwTUIpLiBTaGFyZWQgYnkgdGhlXG4gKiBmcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIHVzZXIgY2h1bmtzIGF0IHdyaXRlIHRpbWUsIHdoZXJlIHRoZSBlcnJvciBpc1xuICogYWN0aW9uYWJsZSkgYW5kIHRoZSB1bmZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgbGVuZ3RoIGhlYWRlcnMgYXQgcmVhZFxuICogdGltZSwgd2hpY2ggdXN1YWxseSBpbmRpY2F0ZSBhIG5vbi1mcmFtZWQgd2lyZSBiZWluZyByZWFkIGFzIGZyYW1lZCkuXG4gKiBLZWVwaW5nIGJvdGggc2lkZXMgb24gb25lIGNvbnN0YW50IGd1YXJhbnRlZXMgYW55IGNodW5rIHRoZSBmcmFtZXJcbiAqIGFjY2VwdHMgY2FuIGFsd2F5cyBiZSBkZWNvZGVkIGJ5IHRoZSB1bmZyYW1lci5cbiAqL1xuY29uc3QgTUFYX0ZSQU1FX1NJWkUgPSAxMDBfMDAwXzAwMDtcblxuLyoqXG4gKiBXcmFwcyBlYWNoIGNodW5rIG9mIGEgYnl0ZSBzdHJlYW0gaW4gYSA0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhcbiAqIHByZWZpeC4gVXNlZCBieSB0aGUgcHJvZHVjZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEVtcHR5IGNodW5rcyAobGVuZ3RoIDApIGFyZSBkcm9wcGVkIOKAlCB0aGUgcmVzdWx0aW5nIGBbMHgwMCAweDAwIDB4MDAgMHgwMF1gXG4gKiBmcmFtZSB3b3VsZCBiZSBhbWJpZ3VvdXMgd2l0aCB0aGUgbGVnYWN5IFwibG9va3MgZnJhbWVkXCIgZGV0ZWN0aW9uIGluXG4gKiBgZ2V0RGVzZXJpYWxpemVTdHJlYW1gLCBhbmQgaXQgY2FycmllcyBubyBpbmZvcm1hdGlvbi5cbiAqXG4gKiBMb2FkLWJlYXJpbmcgaW52YXJpYW50OiBlYWNoIHVzZXIgY2h1bmsgYmVjb21lcyBleGFjdGx5IG9uZSBmcmFtZSwgYW5kXG4gKiBlYWNoIGZyYW1lIGlzIGVucXVldWVkIGFzIGV4YWN0bHkgb25lIHRyYW5zcG9ydCBjaHVuayAodGhlIGRvd25zdHJlYW1cbiAqIHdyaXRhYmxlIHBlcmZvcm1zIG9uZSB3aXJlIHdyaXRlIHBlciBjaHVuaywgcHJlc2VydmluZyBib3VuZGFyaWVzKS4gVGhlXG4gKiBzZXJ2ZXIgdGhlcmVmb3JlIHN0b3JlcyBvbmUgZnJhbWUgcGVyIGNodW5rIGluZGV4LCB3aGljaCBpcyB3aGF0IGFsbG93c1xuICogYSBmdXR1cmUgcmVjb25uZWN0aW5nIHJlYWRlciB0byByZXN1bWUgYSBmcmFtZWQgYnl0ZSBzdHJlYW0gYXRcbiAqIGBzdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgIOKAlCB0aGUgc2FtZSBhcml0aG1ldGljXG4gKiBgY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtYCByZWxpZXMgb24gZm9yIG9iamVjdCBzdHJlYW1zLiBEbyBub3RcbiAqIGNvYWxlc2NlIG9yIHNwbGl0IGZyYW1lcyBoZXJlIHdpdGhvdXQgcmV2aXNpdGluZyB0aGF0IHJlc3VtZSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVGcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBjaHVuayBvZiAke2NodW5rLmxlbmd0aH0gYnl0ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSBgICtcbiAgICAgICAgICAgICAgYGZyYW1lZCBjaHVuayBzaXplICgke01BWF9GUkFNRV9TSVpFfSkuIFNwbGl0IHRoZSBkYXRhIGludG8gYCArXG4gICAgICAgICAgICAgIGBzbWFsbGVyIGNodW5rcyBiZWZvcmUgd3JpdGluZy5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBjaHVuay5sZW5ndGgpO1xuICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgZnJhbWUuc2V0KGNodW5rLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFVud3JhcHMgbGVuZ3RoLXByZWZpeGVkIGJ5dGUtc3RyZWFtIGZyYW1lcyBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHVzZXJcbiAqIGNodW5rcy4gVXNlZCBieSB0aGUgY29uc3VtZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEJ1ZmZlcnMgYWNyb3NzIHJlYWQgYm91bmRhcmllcyDigJQgdGhlIHRyYW5zcG9ydCBtYXkgc3BsaXQgYSBzaW5nbGVcbiAqIGZyYW1lIGFjcm9zcyBtdWx0aXBsZSByZWFkcyAoaGVhZGVyIGluIG9uZSBjaHVuaywgcGF5bG9hZCBpbiBhbm90aGVyKVxuICogb3IgY29hbGVzY2UgbXVsdGlwbGUgZnJhbWVzIGludG8gYSBzaW5nbGUgcmVhZC4gVGhlIHRyYW5zZm9ybSBlbWl0c1xuICogd2hvbGUgdXNlciBjaHVua3MgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gKlxuICogRXJyb3JzIHRoZSBzdHJlYW0gaWYgdGhlIGxlbmd0aCBoZWFkZXIgYWR2ZXJ0aXNlcyBhIGZyYW1lIGxhcmdlciB0aGFuXG4gKiBgTUFYX0ZSQU1FX1NJWkVgIGJ5dGVzLCBzaW5jZSB0aGF0IGFsbW9zdCBjZXJ0YWlubHkgaW5kaWNhdGVzIGFcbiAqIG1pc2ZyYW1lZCB3aXJlIChlLmcuIGEgcmF3IGJ5dGUgc3RyZWFtIGJlaW5nIGZlZCB0aHJvdWdoIHRoaXMgdHJhbnNmb3JtXG4gKiBieSBtaXN0YWtlKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbiBlbm9ybW91cyBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV4dC5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXh0LnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDApIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcblxuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGZyYW1lTGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZnJhbWUgbGVuZ3RoICR7ZnJhbWVMZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAoJHtNQVhfRlJBTUVfU0laRX0pLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyB1c3VhbGx5IG1lYW5zIGEgbm9uLWZyYW1lZCBieXRlIHN0cmVhbSBpcyBiZWluZyByZWFkIGFzIGZyYW1lZC5gLFxuICAgICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcblxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFLCB0b3RhbCkpO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGVuZGVkIHdpdGggJHtidWZmZXIubGVuZ3RofSBieXRlcyBvZiBpbmNvbXBsZXRlIGZyYW1lIGRhdGEuIGAgK1xuICAgICAgICAgICAgICBgVGhlIHN0cmVhbSB3YXMgdHJ1bmNhdGVkIG1pZC1mcmFtZS5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIGVuZC10by1lbmQgdGltZS10by1maXJzdC1jaHVuayBzcGFuIGZvciBhIGxpdmUgcmVhZDpcbiAqIHJlYWQgZGlzcGF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGluZyB0aGVcbiAqIHJlYWRlciwgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBjb25uZWN0TXM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50dGZjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgLi4uKHR5cGVvZiBjb25uZWN0TXMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb25uZWN0X21zJzogY29ubmVjdE1zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnN0YXJ0X2luZGV4Jzogc3RhcnRJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCByZWFkLWNvbXBsZXRpb24gc3BhbiB3aGVuIGEgc3RyZWFtIHJlYWQgZHJhaW5zOlxuICogYmFjay1kYXRlZCB0byB0aGUgcmVhZCBkaXNwYXRjaCwgc28gaXRzIGR1cmF0aW9uIGlzIHRoZSB0b3RhbCByZWFkLCB3aXRoXG4gKiBjaHVuay9ieXRlIGNvdW50cyBmb3IgdGhyb3VnaHB1dC4gQ2FuY2VsbGVkIHJlYWRzIGVtaXQgbm90aGluZy4gRmlyZS1hbmQtXG4gKiBmb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICByZWNvbm5lY3RzPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWRfY29tcGxldGUnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudG90YWxfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAuLi4odHlwZW9mIHJlY29ubmVjdHMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5yZWNvbm5lY3RzJzogcmVjb25uZWN0cyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCBjb25uZWN0IGR1cmF0aW9uOiB0aGUgd29ybGQuc3RyZWFtcy5nZXQgYXdhaXQgKHJlYWRcbiAgICAvLyBkaXNwYXRjaCAtPiBzdHJlYW0gaGFuZGxlIC8gcmVzcG9uc2UgaGVhZGVycykuIFN0YW1wZWQgb24gdGhlXG4gICAgLy8gd29ya2Zsb3cuc3RyZWFtLnJlYWQgc3BhbiBvbmNlIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzLlxuICAgIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBSZWFkLWNvbXBsZXRpb24gY291bnRlcnMgZm9yIHRoZSB3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZSBzcGFuXG4gICAgLy8gZW1pdHRlZCB3aGVuIHRoZSBzdHJlYW0gZHJhaW5zLlxuICAgIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICAgIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gICAgc3VwZXIoe1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzXG4gICAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy4jcmVhZGVyO1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgZmx1c2hlcyBhIGxlYWRpbmcgemVyby1sZW5ndGggY2h1bmsgKHYzKykgdG8gY29tbWl0XG4gICAgICAgICAgLy8gcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgYW55IGRhdGE7IHNraXAgZW1wdGllcyBzbyBUVEZDIG1lYXN1cmVzIHRvXG4gICAgICAgICAgLy8gdGhlIGZpcnN0IHJlYWwgY2h1bmsuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgICByZWFkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCArPSAxO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWwg4oCUIGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCDigJQgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQg4oCUIHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgc2lnbmFscyB0aGUgc3RyZWFtIGlzIHRydWx5XG4gKiBkb25lOyB3ZSBjbG9zZSB0aGUgd3JhcHBlciBhbmQgZG8gbm90IHJlY29ubmVjdC5cbiAqXG4gKiBOZWdhdGl2ZSBgc3RhcnRJbmRleGAgdmFsdWVzIChsYXN0LU4gc2VtYW50aWNzKSBza2lwIHRoZSByZWNvbm5lY3RcbiAqIG1hY2hpbmVyeSBiZWNhdXNlIHdlIGNhbm5vdCBjb21wdXRlIGFuIGFic29sdXRlIHJlc3VtZSBwb3NpdGlvbiB3aXRob3V0XG4gKiBhIHRhaWwtaW5kZXggbG9va3VwIOKAlCB0aGUgcmV0dXJuZWQgc3RyZWFtIGJlaGF2ZXMgYXMgYSBzaW5nbGUtc2hvdCByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXJcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVjb25uZWN0U3VwcG9ydGVkID0gc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0SW5kZXggPj0gMDtcbiAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gc3RhcnRJbmRleCA/PyAwO1xuICBsZXQgY29uc3VtZWRGcmFtZXMgPSAwO1xuICBsZXQgcmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgdG90YWxSZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZWFkIHRlbGVtZXRyeSAoc2FtZSBzZW1hbnRpY3MgYXMgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSk6XG4gIC8vIGRpc3BhdGNoIHRpbWUsIGZpcnN0LWNvbm5lY3QgZHVyYXRpb24sIGZpcnN0LWZyYW1lIGxhdGNoLCBhbmQgdG90YWxzLlxuICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgaWYgKGNvbm5lY3RNcyA9PT0gdW5kZWZpbmVkKSBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVhZGVyKSB7XG4gICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIHRoZSByZXN1bWUgcG9zaXRpb24gcGFzdCB0aGUgZnJhbWVzIGFscmVhZHkgZGVsaXZlcmVkLCB0aGVuXG4gICAgLy8gZHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlcyDigJQgdGhlIHJlb3BlbmVkIGNvbm5lY3Rpb24gcmUtc2VuZHMgZnJvbSBhXG4gICAgLy8gZnJhbWUgYm91bmRhcnkgYXQgdGhlIG5ldyBpbmRleC5cbiAgICBjdXJyZW50U3RhcnRJbmRleCArPSBjb25zdW1lZEZyYW1lcztcbiAgICBjb25zdW1lZEZyYW1lcyA9IDA7XG4gICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAvLyBSZXRyeSB0aGUgcmVvcGVuIGl0c2VsZiBhZ2FpbnN0IHRoZSByZWNvbm5lY3QgYnVkZ2V0LiBBIHRyYW5zaWVudFxuICAgIC8vIGZhaWx1cmUgb2YgY29ubmVjdCgpIOKAlCB0aGUgc2VydmVyIGJyaWVmbHkgdW5hdmFpbGFibGUgZHVyaW5nIHRoZVxuICAgIC8vIHJlY29ubmVjdCB3aW5kb3cg4oCUIGlzIHRoZSBleGFjdCBibGlwIHRoaXMgd3JhcHBlciBleGlzdHMgdG8gc3Vydml2ZSwgc29cbiAgICAvLyBjb3VudCBpdCBhZ2FpbnN0IHRoZSBidWRnZXQgYW5kIHRyeSBhZ2FpbiByYXRoZXIgdGhhbiB0cmVhdGluZyBpdCBhc1xuICAgIC8vIGZhdGFsLiBPbmx5IGJ1ZGdldCBleGhhdXN0aW9uIChhIHNlcnZlciB0aGF0IHN0YXlzIGRvd24pIHRlcm1pbmF0ZXMgdGhlXG4gICAgLy8gc3RyZWFtLlxuICAgIGNvbnN0IG1heFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzKCk7XG4gICAgY29uc3QgbWF4VG90YWxSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzKCk7XG4gICAgZm9yICg7Oykge1xuICAgICAgcmVjb25uZWN0Q291bnQrKztcbiAgICAgIHRvdGFsUmVjb25uZWN0Q291bnQrKztcbiAgICAgIGlmIChyZWNvbm5lY3RDb3VudCA+IG1heFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4UmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsUmVjb25uZWN0Q291bnQgPiBtYXhUb3RhbFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSB0b3RhbCByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4VG90YWxSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIExvb3AgdW50aWwgd2UgZW1pdCBzb21ldGhpbmcsIGhpdCBFT0YsIG9yIGZhdGFsbHkgZXJyb3IuIFJlYWRzIHRoYXRcbiAgICAgIC8vIG9ubHkgZXh0ZW5kIHRoZSBpbi1mbGlnaHQtZnJhbWUgYnVmZmVyIGRvbid0IGVucXVldWUgYW55dGhpbmcg4oCUIHdlXG4gICAgICAvLyBrZWVwIHJlYWRpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGVtcHR5LWhhbmRlZC5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHsgZG9uZTogYm9vbGVhbjsgdmFsdWU/OiBVaW50OEFycmF5IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBjb25uZWN0KCkgZ3VhcmFudGVlcyByZWFkZXJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkZXIhLnJlYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFyZWNvbm5lY3RTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSB8fCAhcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgLy8gQ2xlYW4gRU9GIOKAlCBzdHJlYW0gaXMgdHJ1bHkgY29tcGxldGUuIERyb3AgYW55IHBhcnRpYWwtZnJhbWVcbiAgICAgICAgICAvLyBieXRlcyAodGhlcmUgc2hvdWxkbid0IGJlIGFueTsgYSB3ZWxsLWZvcm1lZCBzdHJlYW0gZW5kcyBvbiBhXG4gICAgICAgICAgLy8gZnJhbWUgYm91bmRhcnkpLlxuICAgICAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgdG90YWxSZWNvbm5lY3RDb3VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGVuZCB0byBidWZmZXIgYW5kIGVtaXQgYWxsIGNvbXBsZXRlIGZyYW1lcy5cbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChpbmNvbWluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgaW5jb21pbmcubGVuZ3RoKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoYnVmZmVyLCAwKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoaW5jb21pbmcsIGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICAgIGJ1ZmZlciA9IGNvbWJpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcbiAgICAgICAgICAvLyBGb3J3YXJkIHRoZSBlbnRpcmUgZnJhbWVkIGNodW5rIChoZWFkZXIgKyBwYXlsb2FkKSB0byB0aGVcbiAgICAgICAgICAvLyBkb3duc3RyZWFtIGRlc2VyaWFsaXplciwgd2hpY2ggYWxyZWFkeSBleHBlY3RzIHRoaXMgbGF5b3V0LlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoMCwgdG90YWwpKTtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgICAgIGNvbnN1bWVkRnJhbWVzKys7XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkKys7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gdG90YWw7XG4gICAgICAgICAgaWYgKCFmaXJzdENodW5rUmVwb3J0ZWQgJiYgcmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpcnN0Q2h1bmtSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgY29ubmVjdE1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWl0dGVkKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uIOKAlCBjbGVhciB0aGVcbiAgICAgICAgICAvLyBjb25zZWN1dGl2ZS1mYWlsdXJlIGJ1ZGdldCBzbyBhIGxvbmcgc3RyZWFtIHRoYXQgcmVjb25uZWN0c1xuICAgICAgICAgIC8vIG1hbnkgdGltZXMgKGJ1dCBrZWVwcyBkZWxpdmVyaW5nKSBpcyBuZXZlciBmYWxzZWx5IGNhcHBlZC5cbiAgICAgICAgICByZWNvbm5lY3RDb3VudCA9IDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgcGFydGlhbCBieXRlcyDigJQgcmVhZCBtb3JlLlxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBjbG9zaW5nIFJlYWRhYmxlU3RyZWFtIHJlYWRlcjonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZmx1c2ggaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGZvciBidWZmZXJlZCBzdHJlYW0gd3JpdGVzLlxuICogQ2h1bmtzIGFyZSBhY2N1bXVsYXRlZCBhbmQgZmx1c2hlZCB0b2dldGhlciB0byByZWR1Y2UgbmV0d29yayBvdmVyaGVhZC5cbiAqL1xuY29uc3QgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TID0gMTA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlZmF1bHQgc3RyZWFtLWZsdXNoIGludGVydmFsIChhIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgXG4gKiBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlKS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLlxuICovXG5jb25zdCBnZXRTdHJlYW1GbHVzaEludGVydmFsTXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TJywgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHNwYW4gZm9yIG9uZSBmbHVzaGVkIGJhdGNoIG9mIHN0cmVhbSB3cml0ZXM6IGZpcnN0XG4gKiBgd3JpdGUoKWAgb2YgdGhlIGJhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBzZXJ2ZXIgd3JpdGUgc2V0dGxpbmcuIFRoZVxuICogc3BhbidzIGR1cmF0aW9uIGlzIHRoZXJlZm9yZSB0aGUgYXBwLXBlcmNlaXZlZCBsYXRlbmN5IG9mIHRoZSBiYXRjaFxuICogKGJ1ZmZlciBkd2VsbCArIGJhY2twcmVzc3VyZSArIFJQQyk7IGBidWZmZXJfZHdlbGxfbXNgIGlzb2xhdGVzIHRoZVxuICogcHJlLWRpc3BhdGNoIHNoYXJlIHNvIGNsaWVudC1zaWRlIGJhdGNoaW5nIGNvc3QgY2FuIGJlIHRvbGQgYXBhcnQgZnJvbVxuICogbmV0d29yay9zZXJ2ZXIgdGltZS4gTmFtZWQgYHdvcmtmbG93LnN0cmVhbS5mbHVzaGAg4oCUIHRoZSBwZXItcmVxdWVzdCBSUENcbiAqIGJlbmVhdGggaXQgaXMgd29ybGQtdmVyY2VsJ3MgYHdvcmtmbG93LnN0cmVhbS53cml0ZWAgc3BhbiAoY2h1bmtfcnR0KSwgYW5kXG4gKiB0aGUgdHdvIG11c3Qgc3RheSBkaXN0aW5ndWlzaGFibGUuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgZGlzcGF0Y2hFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgY2h1bmtDb3VudDogbnVtYmVyLFxuICBieXRlQ291bnQ6IG51bWJlcixcbiAgcnBjTXM6IG51bWJlclxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLmZsdXNoJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAnZmx1c2gnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmJ1ZmZlcl9kd2VsbF9tcyc6IGRpc3BhdGNoRXBvY2hNcyAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5jaHVua3MnOiBjaHVua0NvdW50LFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgV29ybGQgd3JpdGUgUlBDIGR1cmF0aW9uIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuXG4gICAgICAgIC8vIFNhbWUga2V5IGFzIHdvcmxkLXZlcmNlbCdzIHBlci1yZXF1ZXN0IHNwYW4gYXR0cmlidXRlIHNvIHF1ZXJpZXNcbiAgICAgICAgLy8gd29yayByZWdhcmRsZXNzIG9mIHdoaWNoIGxheWVyIGVtaXR0ZWQgaXQuXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ud3JpdGUuY2h1bmtfcnR0JzogcnBjTXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciB0aGUgc3RyZWFtLWNsb3NlIFJQQzogaXRzIGR1cmF0aW9uIGlzIHRoZVxuICogYHdvcmxkLnN0cmVhbXMuY2xvc2VgIHJvdW5kIHRyaXAgKG5ldHdvcmsgaG9wIGluY2x1ZGVkKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICogbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1DbG9zZShcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLmNsb3NlJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAnY2xvc2UnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmNsb3NlLnJwY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbSBleHRlbmRzIFdyaXRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgLyoqXG4gICAqIEBwYXJhbSBydW5SZWFkeUJhcnJpZXIgVHVyYm8gbW9kZSBvbmx5OiBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZVxuICAgKiBiYWNrZ3JvdW5kZWQgYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkLiBXaGVuIHRoZSBzdGVwIGJvZHkgcnVuc1xuICAgKiBvcHRpbWlzdGljYWxseSAoYmVmb3JlIGBydW5fc3RhcnRlZGAgaXMgZHVyYWJsZSksIHRoZSBmaXJzdCBjaHVuayB3cml0ZSB0b1xuICAgKiBhIGJyYW5kLW5ldyBzdHJlYW0gd291bGQgb3RoZXJ3aXNlIHJlYWNoIHRoZSBXb3JsZCBiZWZvcmUgdGhlIHJ1biBleGlzdHNcbiAgICogYW5kIGJlIHJlamVjdGVkIGFzIHJ1bi1ub3QtZm91bmQuIEF3YWl0aW5nIHRoaXMgb25jZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAqIGZsdXNoL2Nsb3NlIG9yZGVycyB0aGUgd3JpdGUgYWZ0ZXIgdGhlIHJ1bidzIGNyZWF0aW9uLiBgdW5kZWZpbmVkYCBvdXRzaWRlXG4gICAqIHR1cmJvIGFuZCBvbiB0aGUgYXdhaXQgcGF0aCwgd2hlcmUgdGhlIHJ1biB3YXMgYWxyZWFkeSBkdXJhYmxlLlxuICAgKi9cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+KSB7XG4gICAgaWYgKHR5cGVvZiBydW5JZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYFwicnVuSWRcIiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgXCIke3R5cGVvZiBydW5JZH1cImBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihgXCJuYW1lXCIgaXMgcmVxdWlyZWQsIGdvdCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICBjb25zdCB3b3JsZFByb21pc2UgPSBnZXRXb3JsZExhenkoKTtcblxuICAgIC8vIEhvbGQgdGhlIGZpcnN0IHNlcnZlciB3cml0ZSB1bnRpbCB0aGUgcnVuIGV4aXN0cyAodHVyYm8gb3B0aW1pc3RpY1xuICAgIC8vIHN0YXJ0KS4gQXdhaXRlZCBvbmNlLCB0aGVuIGNsZWFyZWQgc28gbGF0ZXIgZmx1c2hlcyBwYXkgbm90aGluZy4gVGhlXG4gICAgLy8gcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3Igb3JkZXJpbmcgb25seTogaWYgYHJ1bl9zdGFydGVkYCB0cnVseSBmYWlsZWRcbiAgICAvLyB0aGUgcnVuIGRvZXMgbm90IGV4aXN0LCBzbyB0aGUgd3JpdGUgYmVsb3cgc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IuXG4gICAgbGV0IHBlbmRpbmdSdW5SZWFkeTogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHJ1blJlYWR5QmFycmllcjtcbiAgICBjb25zdCBlbnN1cmVSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmIChwZW5kaW5nUnVuUmVhZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBwZW5kaW5nUnVuUmVhZHk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgfVxuICAgICAgICBwZW5kaW5nUnVuUmVhZHkgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEJ1ZmZlcmluZyBzdGF0ZSBmb3IgYmF0Y2hlZCB3cml0ZXNcbiAgICAvLyBFbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGUgZnJhbWluZyBsZXZlbCBieVxuICAgIC8vIGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbSwgbm90IGhlcmUuXG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGZsdXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCB3cml0ZS1iYXRjaCB0aW1pbmc6IHN0YW1wZWQgYXQgYHdyaXRlKClgIGVudHJ5IGZvciB0aGVcbiAgICAvLyBmaXJzdCBjaHVuayBvZiBhIGJhdGNoIOKAlCBiZWZvcmUgdGhlIGJhY2twcmVzc3VyZSB3YWl0IG9uIGFueSBpbi1mbGlnaHRcbiAgICAvLyBmbHVzaCDigJQgc28gdGhlIGVtaXR0ZWQgc3BhbiBjb3ZlcnMgdGhlIGZ1bGwgYXBwLXBlcmNlaXZlZCBsYXRlbmN5XG4gICAgLy8gKHF1ZXVlaW5nICsgZmx1c2gtdGltZXIgZHdlbGwgKyBSUEMpLiBDbGVhcmVkIHdoZW4gYSBmbHVzaCB0YWtlcyB0aGVcbiAgICAvLyBiYXRjaDsgcmVzdG9yZWQgb24gd3JpdGUgZmFpbHVyZSBzbyBhIHJldHJpZWQgYmF0Y2gga2VlcHMgaXRzIHRydWUgdDAuXG4gICAgbGV0IGJhdGNoU3RhcnRBdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZmx1c2ggPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBPcmRlciB0aGUgZmlyc3Qgc2VydmVyIHdyaXRlIGFmdGVyIHRoZSBydW4gZXhpc3RzICh0dXJibyBvcHRpbWlzdGljXG4gICAgICAvLyBzdGFydCk7IGEgbm8tb3Agb24gZXZlcnkgbGF0ZXIgZmx1c2ggYW5kIG91dHNpZGUgdHVyYm8uXG4gICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuXG4gICAgICAvLyBDb3B5IGNodW5rcyB0byBmbHVzaCwgYnV0IGRvbid0IGNsZWFyIGJ1ZmZlciB1bnRpbCB3cml0ZSBzdWNjZWVkc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBkYXRhIGxvc3MgaWYgdGhlIHdyaXRlIG9wZXJhdGlvbiBmYWlsc1xuICAgICAgY29uc3QgY2h1bmtzVG9GbHVzaCA9IGJ1ZmZlci5zbGljZSgpO1xuICAgICAgY29uc3QgYmF0Y2hTdGFydCA9IGJhdGNoU3RhcnRBdDtcbiAgICAgIGJhdGNoU3RhcnRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGRpc3BhdGNoQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgIC8vIENhY2hlIHRoZSBmbHVzaCBpbnRlcnZhbCBmcm9tIHRoZSB3b3JsZCBvbiBmaXJzdCB1c2VcbiAgICAgIGlmIChyZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID1cbiAgICAgICAgICB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXMgPz8gZ2V0U3RyZWFtRmx1c2hJbnRlcnZhbE1zKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBycGNTdGFydEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVzZSB3cml0ZU11bHRpIGlmIGF2YWlsYWJsZSBmb3IgYmF0Y2ggd3JpdGVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2Ygd29ybGQuc3RyZWFtcy53cml0ZU11bHRpID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgY2h1bmtzVG9GbHVzaC5sZW5ndGggPiAxXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgY2h1bmtzVG9GbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3NUb0ZsdXNoKSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgYmF0Y2ggc3RheXMgYnVmZmVyZWQgZm9yIHJldHJ5IOKAlCByZXN0b3JlIGl0cyBvcmlnaW5hbCB0MCAodGhlXG4gICAgICAgIC8vIG9sZGVzdCwgaWYgYSBuZXdlciB3cml0ZSBzdGFtcGVkIG9uZSBtZWFud2hpbGUpIHNvIHRoZSBldmVudHVhbGx5XG4gICAgICAgIC8vIHN1Y2Nlc3NmdWwgZmx1c2ggcmVwb3J0cyB0aGUgZnVsbCBkd2VsbC5cbiAgICAgICAgaWYgKGJhdGNoU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJhdGNoU3RhcnRBdCA9XG4gICAgICAgICAgICBiYXRjaFN0YXJ0QXQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IGJhdGNoU3RhcnRcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbihiYXRjaFN0YXJ0QXQsIGJhdGNoU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmF0Y2hTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlY29yZFN0cmVhbVdyaXRlRmx1c2goXG4gICAgICAgICAgYmF0Y2hTdGFydCxcbiAgICAgICAgICBkaXNwYXRjaEF0LFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2h1bmtzVG9GbHVzaC5sZW5ndGgsXG4gICAgICAgICAgY2h1bmtzVG9GbHVzaC5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgYy5ieXRlTGVuZ3RoLCAwKSxcbiAgICAgICAgICBEYXRlLm5vdygpIC0gcnBjU3RhcnRBdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGNsZWFyIGJ1ZmZlciBhZnRlciBzdWNjZXNzZnVsIHdyaXRlIHRvIHByZXZlbnQgZGF0YSBsb3NzXG4gICAgICBidWZmZXIgPSBbXTtcbiAgICB9O1xuXG4gICAgLyoqIFJlc29sdmVycy9yZWplY3RvcnMgd2FpdGluZyBmb3IgdGhlIGN1cnJlbnQgc2NoZWR1bGVkIGZsdXNoICovXG4gICAgbGV0IGZsdXNoV2FpdGVyczogQXJyYXk8e1xuICAgICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9PiA9IFtdO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVGbHVzaCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyKSByZXR1cm47IC8vIEFscmVhZHkgc2NoZWR1bGVkXG5cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXYWl0ZXJzID0gZmx1c2hXYWl0ZXJzO1xuICAgICAgICBmbHVzaFdhaXRlcnMgPSBbXTtcbiAgICAgICAgZmx1c2hQcm9taXNlID0gZmx1c2goKS50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBjdXJyZW50V2FpdGVycykgdy5yZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHcgb2YgY3VycmVudFdhaXRlcnMpIHcucmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSwgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPz8gZ2V0U3RyZWFtRmx1c2hJbnRlcnZhbE1zKCkpO1xuICAgIH07XG5cbiAgICBzdXBlcih7XG4gICAgICBhc3luYyB3cml0ZShjaHVuaykge1xuICAgICAgICAvLyBCYXRjaCB0MCBmb3IgdGhlIHdyaXRlLWZsdXNoIHNwYW46IGF0IGVudHJ5LCBiZWZvcmUgdGhlXG4gICAgICAgIC8vIGJhY2twcmVzc3VyZSB3YWl0IGJlbG93LCBzbyBxdWV1ZWluZyBiZWhpbmQgYW4gaW4tZmxpZ2h0IGZsdXNoXG4gICAgICAgIC8vIGNvdW50cyB0b3dhcmQgdGhlIGFwcC1wZXJjZWl2ZWQgZHdlbGwuXG4gICAgICAgIGlmIChiYXRjaFN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgYmF0Y2hTdGFydEF0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBXYWl0IGZvciBhbnkgaW4tcHJvZ3Jlc3MgZmx1c2ggdG8gY29tcGxldGUgYmVmb3JlIGFkZGluZyB0byBidWZmZXJcbiAgICAgICAgaWYgKGZsdXNoUHJvbWlzZSkge1xuICAgICAgICAgIGF3YWl0IGZsdXNoUHJvbWlzZTtcbiAgICAgICAgICBmbHVzaFByb21pc2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgICBzY2hlZHVsZUZsdXNoKCk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNjaGVkdWxlZCBmbHVzaCB0byBjb21wbGV0ZSBzbyB0aGF0IGNhbGxlcnNcbiAgICAgICAgLy8gKGxpa2UgZmx1c2hhYmxlUGlwZSkga25vdyBkYXRhIGhhcyByZWFjaGVkIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gYmVmb3JlIGRlY3JlbWVudGluZyBwZW5kaW5nT3BzLiBXaXRob3V0IHRoaXMsIHBlbmRpbmdPcHNcbiAgICAgICAgLy8gcmVhY2hlcyAwIHdoZW4gdGhlIGJ1ZmZlcmVkIHdyaXRlIHJldHVybnMgKGluc3RhbnQpLCBidXRcbiAgICAgICAgLy8gdGhlIDEwbXMgZmx1c2ggdGltZXIgaGFzbid0IGZpcmVkIHlldC5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGZsdXNoV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IGluLXByb2dyZXNzIGZsdXNoIHRvIGNvbXBsZXRlXG4gICAgICAgIGlmIChmbHVzaFByb21pc2UpIHtcbiAgICAgICAgICBhd2FpdCBmbHVzaFByb21pc2U7XG4gICAgICAgICAgZmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZsdXNoIGFueSByZW1haW5pbmcgYnVmZmVyZWQgY2h1bmtzXG4gICAgICAgIGF3YWl0IGZsdXNoKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyBmbHVzaCgpJ3Mgd3JpdGUgKGFuZCBpdHMgYmFycmllciksXG4gICAgICAgIC8vIGJ1dCBjYW4gaXRzZWxmIGJlIHRoZSBmaXJzdCB3cml0ZSB0byBhIGJyYW5kLW5ldyBzdHJlYW0g4oCUIGdhdGUgaXQgdG9vLlxuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgICBjb25zdCBjbG9zZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICAgIHJlY29yZFN0cmVhbUNsb3NlKGNsb3NlU3RhcnQsIHJ1bklkLCBuYW1lKTtcbiAgICAgIH0sXG4gICAgICBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGltZXIgdG8gcHJldmVudCBsZWFrc1xuICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNjYXJkIGJ1ZmZlcmVkIGNodW5rcyAtIHRoZXkgd29uJ3QgYmUgd3JpdHRlblxuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgLy8gUmVqZWN0IGFueSBwZW5kaW5nIGZsdXNoV2FpdGVycyBzbyB0aGUgd3JpdGUoKSBwcm9taXNlcyBzZXR0bGVcbiAgICAgICAgLy8gYW5kIGRvbid0IGxlYWsuIFdpdGhvdXQgdGhpcywgd3JpdGUoKSBoYW5ncyBmb3JldmVyIG9uIGFuXG4gICAgICAgIC8vIHVuc2V0dGxlZCBwcm9taXNlIGJlY2F1c2UgdGhlIGNsZWFyZWQgdGltZXIgd2lsbCBuZXZlciBmaXJlLlxuICAgICAgICBjb25zdCB3YWl0ZXJzID0gZmx1c2hXYWl0ZXJzO1xuICAgICAgICBmbHVzaFdhaXRlcnMgPSBbXTtcbiAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IHJlYXNvbiA/PyBuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkJyk7XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiB3YWl0ZXJzKSB3LnJlamVjdChhYm9ydEVycm9yKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBCYXRjaGVkLCBkdXJhYmxlIHdyaXRlIGVudHJ5IHBvaW50IHVzZWQgYnkgYGZsdXNoYWJsZVBpcGVgIHRvIGNvYWxlc2NlXG4gICAgLy8gY2h1bmtzIHRoYXQgYXJyaXZlIHdoaWxlIGEgcHJldmlvdXMgYmF0Y2ggaXMgc3RpbGwgaW4gZmxpZ2h0IGludG8gYVxuICAgIC8vIHNpbmdsZSBzZXJ2ZXIgd3JpdGUuIEl0IGJ1ZmZlcnMgZXZlcnkgY2h1bmsgYW5kIGF3YWl0cyBvbmUgYGZsdXNoKClgLFxuICAgIC8vIHNvIHRoZSB3aG9sZSBiYXRjaCBnb2VzIG91dCBhcyBvbmUgYHdyaXRlTXVsdGlgIGFuZCByZXNvbHZlcyBvbmx5IG9uY2VcbiAgICAvLyB0aGUgYmF0Y2ggaGFzIHJlYWNoZWQgdGhlIHNlcnZlci4gSXQgc2hhcmVzIHRoZSBidWZmZXIvZmx1c2ggbWFjaGluZXJ5XG4gICAgLy8gd2l0aCB0aGUgcGVyLWNodW5rIHNpbmsgYHdyaXRlKClgLCBidXQgdGhlIHR3byBhcmUgbmV2ZXIgdXNlZFxuICAgIC8vIGNvbmN1cnJlbnRseSBvbiB0aGUgc2FtZSBzdHJlYW06IGBmbHVzaGFibGVQaXBlYCB1c2VzIGVpdGhlciB0aGlzIHBhdGhcbiAgICAvLyBvciB0aGUgd3JpdGVyLCBuZXZlciBib3RoLiBPbiBmYWlsdXJlIGBmbHVzaCgpYCByZXRhaW5zIHRoZSBiYXRjaCBpbiB0aGVcbiAgICAvLyBidWZmZXIgYW5kIHJldGhyb3dzLCBzbyB0aGUgY2FsbGVyJ3MgZHVyYWJpbGl0eSB0cmFja2luZyBzdGF5cyBhY2N1cmF0ZS5cbiAgICAvL1xuICAgIC8vIE5vLWB3cml0ZU11bHRpYCBmYWxsYmFjazogd2hlbiB0aGUgd29ybGQgbGFja3MgYHdyaXRlTXVsdGlgLCBgZmx1c2goKWBcbiAgICAvLyBkZWdyYWRlcyB0byBzZXF1ZW50aWFsIGB3cml0ZWBzIGZvciB0aGUgYmF0Y2gncyBjaHVua3Mg4oCUIG9uZSByb3VuZCB0cmlwXG4gICAgLy8gZWFjaCwgd2l0aGluIHRoaXMgc2luZ2xlIGNhbGwsIHdoaWxlIGJhY2twcmVzc3VyZSBob2xkcyB0aGUgcHJvZHVjZXIuXG4gICAgLy8gYGZsdXNoYWJsZVBpcGVgIGJvdW5kcyB0aGF0IHN0YWxsIGJ5IGNhcHBpbmcgZWFjaCBjb2FsZXNjZWQgYmF0Y2ggKHNlZVxuICAgIC8vIGBNQVhfQ0hVTktTX1BFUl9CQVRDSGAgLyBgTUFYX0JZVEVTX1BFUl9CQVRDSGApLCBzbyB0aGUgZmFsbGJhY2sgY2FuJ3RcbiAgICAvLyB0dXJuIG9uZSBkcmFpbiBpbnRvIGFuIHVuYm91bmRlZCBzZXF1ZW50aWFsIHJ1bi5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RSRUFNX1dSSVRFX0JBVENIX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGFzeW5jIChjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBpZiAoYmF0Y2hTdGFydEF0ID09PSB1bmRlZmluZWQpIGJhdGNoU3RhcnRBdCA9IERhdGUubm93KCk7XG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSBidWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgIGF3YWl0IGZsdXNoKCk7XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgLy8gQ2xhc3MvSW5zdGFuY2UgTVVTVCBjb21lIGJlZm9yZSBFcnJvciBzbyB0aGF0IGN1c3RvbSBFcnJvciBzdWJjbGFzc2VzXG4gIC8vIHdpdGggV09SS0ZMT1dfU0VSSUFMSVpFIHRha2UgcHJlY2VkZW5jZSAoZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMpLlxuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgLi4uZ2V0Q29tbW9uUmVkdWNlcnMoZ2xvYmFsKSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSByZWR1Y2VycyBhcmUgbW9kZS1zcGVjaWZpYyBhbmQgYWRkZWQgYnlcbiAgICAvLyBnZXRFeHRlcm5hbFJlZHVjZXJzIC8gZ2V0V29ya2Zsb3dSZWR1Y2VycyAvIGdldFN0ZXBSZWR1Y2VycyBiZWxvdy5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlcXVlc3QpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXF1ZXN0J10gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICB1cmw6IHZhbHVlLnVybCxcbiAgICAgICAgaGVhZGVyczogdmFsdWUuaGVhZGVycyxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcndhcmQgdGhlIHNpZ25hbCBpbiB0d28gY2FzZXM6XG4gICAgICAvLyAgIDEuIEFscmVhZHkgYWJvcnRlZCDigJQgcHJlc2VydmUgYWJvcnRlZD10cnVlL3JlYXNvbiBzbyB0aGUgaHlkcmF0ZWRcbiAgICAgIC8vICAgICAgc3RlcCBzZWVzIHRoZSBjYW5jZWxsYXRpb24gdGhhdCBoYXBwZW5lZCBiZWZvcmUgc2VyaWFsaXplLlxuICAgICAgLy8gICAyLiBBbHJlYWR5IHRhZ2dlZCB3aXRoIHdvcmtmbG93IGluZnJhc3RydWN0dXJlIOKAlCBpLmUuIGEgc2lnbmFsXG4gICAgICAvLyAgICAgIGZyb20gYSB3b3JrZmxvdy1tYW5hZ2VkIEFib3J0Q29udHJvbGxlciwgd2hpY2ggaGFzIHN0cmVhbS9ob29rXG4gICAgICAvLyAgICAgIGJhY2tpbmcgZm9yIGNyb3NzLWJvdW5kYXJ5IHByb3BhZ2F0aW9uLlxuICAgICAgLy8gUGxhaW4gbm9uLWFib3J0ZWQgbmF0aXZlIHNpZ25hbHMgYXJlIGludGVudGlvbmFsbHkgZHJvcHBlZCAod291bGRcbiAgICAgIC8vIG1pbnQgc3RyZWFtIGluZnJhIGZvciBldmVyeSBSZXF1ZXN0LCBpbmNsdWRpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkXG4gICAgICAvLyBzaWduYWwgb24gYG5ldyBSZXF1ZXN0KHVybClgKS5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuc2lnbmFsICYmXG4gICAgICAgICh2YWx1ZS5zaWduYWwuYWJvcnRlZCB8fFxuICAgICAgICAgICh2YWx1ZS5zaWduYWwgYXMgQWJvcnRJbnRlcm5hbHMpW0FCT1JUX1NUUkVBTV9OQU1FXSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVzcG9uc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICB1cmw6IHZhbHVlLnVybCxcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIHJlZGlyZWN0ZWQ6IHZhbHVlLnJlZGlyZWN0ZWQsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIGFib3J0IHJlZHVjZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgQWJvcnRTZXJpYWxpemVkRGF0YSA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uOiB1bmtub3duO1xufTtcblxuLyoqXG4gKiBTeW1ib2wta2V5ZWQgaW50ZXJuYWwgZmllbGRzIHRhZ2dlZCBvbnRvIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbFxuICogaW5zdGFuY2VzIChhbmQgYGhvbGRlcmBzIGluIHJlZHVjZXIgaGVscGVycykuIEFsbCBvcHRpb25hbCDigJQgYSBwbGFpblxuICogbmF0aXZlIGluc3RhbmNlIGhhcyBub25lIG9mIHRoZW0gc2V0LlxuICovXG50eXBlIEFib3J0SW50ZXJuYWxzID0ge1xuICBbQUJPUlRfU1RSRUFNX05BTUVdPzogc3RyaW5nO1xuICBbQUJPUlRfSE9PS19UT0tFTl0/OiBzdHJpbmc7XG4gIFtBQk9SVF9SRUFERVJfQ0FOQ0VMXT86IEFib3J0Q29udHJvbGxlcjtcbn07XG5cbnR5cGUgQWJvcnRTaWduYWxMaWtlID0gQWJvcnRJbnRlcm5hbHMgJiB7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHVua25vd247XG4gIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgQWJvcnRIb2xkZXIgPSBBYm9ydEludGVybmFscyAmIHsgc2lnbmFsPzogQWJvcnRJbnRlcm5hbHMgfTtcblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiBleHRlcm5hbCBhbmQgc3RlcFxuICogY29udGV4dHMuIEFzc2lnbnMgc3RyZWFtL2hvb2sgbmFtZXMgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgb3B0aW9uYWxseVxuICogYXR0YWNoZXMgYW4gYWJvcnQgbGlzdGVuZXIgZm9yIHJlYWwtdGltZSBwcm9wYWdhdGlvbiwgYW5kIHJldHVybnMgdGhlXG4gKiBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbExpa2UsXG4gIGhvbGRlcjogQWJvcnRIb2xkZXIsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHtcbiAgbGV0IHN0cmVhbU5hbWUgPSBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdO1xuICBsZXQgaG9va1Rva2VuID0gaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCBpZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgIHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkKGlkKTtcbiAgICBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIGlmIChob2xkZXIuc2lnbmFsKSB7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZHVwZWQgdmlhIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVEIG1hcmtlciDigJQgc2VlIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlLlxuICBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgICBzaWduYWwgYXMgQWJvcnRTaWduYWwsXG4gICAgc3RyZWFtTmFtZSxcbiAgICBydW5JZCxcbiAgICBjcnlwdG9LZXksXG4gICAgb3BzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiB3b3JrZmxvdyBjb250ZXh0LlxuICogUmVhZHMgZXhpc3Rpbmcgc3RyZWFtL2hvb2sgbmFtZXMgZnJvbSBzeW1ib2xzIChtdXN0IGFscmVhZHkgYmUgc2V0KS5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRCeVN5bWJvbChcbiAgc2lnbmFsOiB7IGFib3J0ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHVua25vd24gfSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlclxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB8IGZhbHNlIHtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICBjb25zdCBob29rVG9rZW4gPVxuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHN0cmVhbSBuYW1lIGlzIG5vdCBzZXQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIHNpbmdsZSBhYm9ydCBsaXN0ZW5lciB0byBhIHNpZ25hbCwgZGVkdXBlZCBhY3Jvc3MgY2FsbHMuXG4gKlxuICogRWFjaCBzZXJpYWxpemF0aW9uIHBhc3MgZ29lcyB0aHJvdWdoIHRoZSByZWR1Y2VyLCBidXQgYSBjb250cm9sbGVyIHBhc3NlZFxuICogdG8gTiBzdGVwcyB3b3VsZCBvdGhlcndpc2UgYWNjdW11bGF0ZSBOIGxpc3RlbmVycyDigJQgZWFjaCB3cml0aW5nIHRoZSBzYW1lXG4gKiBzdHJlYW0gcGFja2V0IGFuZCBkb3VibGUtY2xvc2luZyB0aGUgc3RyZWFtIG9uIGFib3J0LiBUaGUgbWFya2VyIHN5bWJvbFxuICogZW5zdXJlcyB0aGUgc3RyZWFtLXdyaXRlIHNpZGUtZWZmZWN0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlciAoc2lnbmFsLCBydW5JZCkuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogdm9pZCB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICBpZiAoKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSkgcmV0dXJuO1xuICAoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdID0gdHJ1ZTtcblxuICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAnYWJvcnQnLFxuICAgICgpID0+IHtcbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgcmVhZGVyIHVzZXMgKGh5ZHJhdGVTdGVwQXJndW1lbnRzKVxuICAgICAgICAgICAgLy8gc28gdGhlIHJlYXNvbiByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eSAoRE9NRXhjZXB0aW9uLFxuICAgICAgICAgICAgLy8gRXJyb3JzLCBjdXN0b20gY2xhc3NlcywgZXRjLikgYW5kIHJlc3BlY3RzIHRoZSBydW4ncyBlbmNyeXB0aW9uIGtleS5cbiAgICAgICAgICAgIC8vIEEgYmFyZSBKU09OLnN0cmluZ2lmeSBoZXJlIHdvdWxkIHdyaXRlIGEgcGFja2V0IHRoZSByZWFkZXIgY2FuJ3RcbiAgICAgICAgICAgIC8vIGRlY29kZSBhbmQgdGhlIGxpc3RlbmVyLXNpZGUgYWJvcnQgd291bGQgcHJvcGFnYXRlIHdpdGggbm8gcmVhc29uLlxuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbjogc2lnbmFsLnJlYXNvbiB9LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfSxcbiAgICB7IG9uY2U6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLCBwYXNzaW5nIGFyZ3VtZW50c1xuICogdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcGFyYW0gY3J5cHRvS2V5XG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGVuIGB0cnVlYCwgYnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2ApXG4gKiAgIGFyZSB3cmFwcGVkIGluIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMgb24gdGhlIHdpcmUgc28gdGhlIGNvbnN1bWVyXG4gKiAgIGNhbiByZWNvbm5lY3Qgb24gdHJhbnNpZW50IGVycm9ycy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgcnVuJ3NcbiAqICAgY2FwYWJpbGl0eSDigJQgc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0c1xuICogICB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIG5lc3RlZCBgUmVhZGFibGVTdHJlYW1gIGZvdW5kIHdoaWxlIHNlcmlhbGl6aW5nXG4gIC8vIGlzIHBpcGVkIHRvIGl0cyBvd24gc2VydmVyIHN0cmVhbSBpbmRlcGVuZGVudGx5IG9mIHRoZSBvdXRlciBzaW5rLCBzbyBpdHNcbiAgLy8gZmlyc3QgY2h1bmsgY2FuIHJhY2UgYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoYXRcbiAgLy8gc2luayBzbyB0aGUgd3JpdGUgb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvXG4gIC8vIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU3RyZWFtIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHBhc3NpbmcgYWNyb3NzIGV4ZWN1dGlvbiBib3VuZGFyeVxuICAgICAgaWYgKHZhbHVlLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdSZWFkYWJsZVN0cmVhbSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cgYm91bmRhcnkuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnUGFzcyB0aGUgc3RyZWFtIGJlZm9yZSBjYWxsaW5nIC5nZXRSZWFkZXIoKSAvIC5waXBlVGhyb3VnaCgpIC8gLnBpcGVUbygpLCBvciB0ZWUgaXQgd2l0aCAudGVlKCkgYW5kIHBhc3Mgb25lIG9mIHRoZSBicmFuY2hlcy4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0U3RyZWFtVHlwZSh2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICk7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICBpZiAoZnJhbWVkQnl0ZVN0cmVhbXMpIHtcbiAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVGhyb3VnaChnZXRCeXRlRnJhbWluZ1N0cmVhbSgpKS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNyeXB0b0tleSxcbiAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcykgcy5mcmFtaW5nID0gJ2ZyYW1lZC12MSc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogd2hlbiB0aGUgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbSAoZS5nLiBpdCBjYW1lIGZyb20gYSBzdGVwLWNvbnRleHQgYGdldFdyaXRhYmxlKClgXG4gICAgICAvLyBvciB3YXMgaHlkcmF0ZWQgZnJvbSBhIHdvcmtmbG93IGlucHV0IGJ5IGBnZXRTdGVwUmV2aXZlcnNgKSxcbiAgICAgIC8vIGZvcndhcmQgaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHRvIHRoZSByZWNlaXZpbmcgcnVuLlxuICAgICAgLy8gVGhlIHJlY2VpdmluZyBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlcyB0aGF0IHJ1bidzXG4gICAgICAvLyBlbmNyeXB0aW9uIGtleSBkaXJlY3RseSwgc28gd3JpdGVzIGxhbmQgb24gdGhlIG9yaWdpbmFsIHN0cmVhbVxuICAgICAgLy8gZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSByZWNlaXZpbmcgcnVuIOKAlCBubyBpbi1wcm9jZXNzXG4gICAgICAvLyBicmlkZ2UgdGllZCB0byB0aGUgZGVoeWRyYXRpbmcgc3RlcCdzIGxpZmV0aW1lLlxuICAgICAgY29uc3QgZXhpc3RpbmdOYW1lID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdOYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdSdW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0ge1xuICAgICAgICAgIG5hbWU6IGV4aXN0aW5nTmFtZSxcbiAgICAgICAgICBydW5JZDogZXhpc3RpbmdSdW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdEZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdEZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5kZXBsb3ltZW50SWQgPSBleGlzdGluZ0RlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKTtcbiAgICAgIG9wcy5wdXNoKHJlYWRhYmxlLnBpcGVUbyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIGNsaWVudCBzaWRlIGFuZCBpbnRvIHN0ZXAgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1JlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgc2ltcGx5IFwiaGFuZGxlc1wiIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQgdG8gb3RoZXIgc3RlcHMuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmYWtlIHN0cmVhbSBzdG9yaW5nIEJvZHlJbml0IGZyb20gUmVxdWVzdC9SZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZVtCT0RZX0lOSVRfU1lNQk9MXTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZVtTVFJFQU1fVFlQRV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nOiBCeXRlU3RyZWFtRnJhbWluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHZhbHVlW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF07XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gdmFsdWVbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSB2YWx1ZVtTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0IOKAlCBqdXN0IHJlYWQgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5zaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHZhbHVlIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SG9sZGVyO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0Q29udHJvbGxlciA9XG4gICAgICAgIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgJiZcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyO1xuICAgICAgaWYgKCFoYXNBYm9ydFN5bWJvbCAmJiAhaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLnNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHZhbHVlIGFzIChBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0Fib3J0U3ltYm9sID0gc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydFNpZ25hbCA9XG4gICAgICAgIGdsb2JhbC5BYm9ydFNpZ25hbCAmJlxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsO1xuICAgICAgaWYgKCFoYXNBYm9ydFN5bWJvbCAmJiAhaXNOYXRpdmVBYm9ydFNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0QnlTeW1ib2wodmFsdWUsIHZhbHVlIGFzIEFib3J0SG9sZGVyKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0U3RlcFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgcmV0dXJuZWQgYFJlYWRhYmxlU3RyZWFtYCBpcyBwaXBlZCB0byB0aGUgc2VydmVyXG4gIC8vIGFmdGVyIHRoZSBib2R5IGJ1dCB3aXRoaW4gdGhlIHNhbWUgb3AgZmx1c2gsIHNvIGl0cyBmaXJzdCBjaHVuayBjYW4gcmFjZVxuICAvLyBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhlIHNpbmsgc28gdGhhdCB3cml0ZVxuICAvLyBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyZWFtIGFscmVhZHkgaGFzIHRoZSBuYW1lIHN5bWJvbCBzZXQsIGluIHdoaWNoIGNhc2VcbiAgICAgIC8vIGl0J3MgYWxyZWFkeSBiZWluZyBzdW5rIHRvIHRoZSBzZXJ2ZXIgYW5kIHdlIGNhbiBqdXN0IHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQg4oCUIHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8odmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZGFuZ2xpbmcgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb24gYW55IEFib3J0Q29udHJvbGxlciBpbnN0YW5jZXMgZm91bmRcbiAqIGluIHRoZSBoeWRyYXRlZCBzdGVwIGFyZ3VtZW50cy4gQ2FsbGVkIGFmdGVyIHRoZSBzdGVwIGZ1bmN0aW9uIHJldHVybnNcbiAqIChzdWNjZXNzIG9yIGZhaWx1cmUpIHRvIHByZXZlbnQgcmVhZGVyIHByb21pc2VzIGZyb20ga2VlcGluZyB0aGUgc2VydmVybGVzc1xuICogZnVuY3Rpb24gYWxpdmUgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsQWJvcnRSZWFkZXJzKC4uLnZhbHVlczogdW5rbm93bltdKTogdm9pZCB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuICBmdW5jdGlvbiBjYW5jZWxJZlByZXNlbnQodmFsOiBBYm9ydEludGVybmFscyk6IHZvaWQge1xuICAgIGNvbnN0IGNhbmNlbCA9IHZhbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgICBpZiAoY2FuY2VsICYmICFjYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNhbmNlbC5hYm9ydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3YWxrKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWwgYXMgb2JqZWN0KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWQuYWRkKHZhbCBhcyBvYmplY3QpO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbC5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2FsayhpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbC52YWx1ZXMoKSkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZSBleHBvc2UgYHNpZ25hbGAvYGJvZHlgIGFzIHByb3RvdHlwZSBnZXR0ZXJzLCBzb1xuICAgIC8vIE9iamVjdC52YWx1ZXMoKSB3b24ndCBmaW5kIHRoZW0uIERlc2NlbmQgZXhwbGljaXRseS5cbiAgICBpZiAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHdhbGsodmFsLnNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHdhbGsodik7XG4gIH1cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykgd2Fsayh2KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgc3RyZWFtIHJlYWRlciBvbiB0aGUgY29udHJvbGxlciB0aGF0IGxpc3RlbnMgZm9yIGFuIGFib3J0IHBhY2tldC5cbiAqIFJldHVybnMgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyIHNvIGl0IGNhbiBiZSBzdG9yZWQgb24gYm90aCB0aGVcbiAqIGNvbnRyb2xsZXIgYW5kIHNpZ25hbCBmb3IgY2xlYW51cCBieSBjYW5jZWxBYm9ydFJlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogQWJvcnRDb250cm9sbGVyIHtcbiAgY29uc3QgcmVhZGVyQ2FuY2VsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIG9wcy5wdXNoKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTx7IHZhbHVlOiB1bmRlZmluZWQ7IGRvbmU6IHRydWUgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFkZXJDYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlckNhbmNlbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBwYWNrZXQgYXJyaXZlZDogcHJvcGFnYXRlIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuIFJlbGVhc2VcbiAgICAgICAgICAvLyB0aGUgbG9jayAoc3luY2hyb25vdXMpIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcgaGVyZSDigJQgb24gYVxuICAgICAgICAgIC8vIHNlcnZpY2UtYmFja2VkIFdvcmxkIGByZWFkZXIuY2FuY2VsKClgIGNhbiBkbyBhIG5ldHdvcmsgcm91bmQtdHJpcCxcbiAgICAgICAgICAvLyBhbmQgYXdhaXRpbmcgaXQgYmVmb3JlIGBjb250cm9sbGVyLmFib3J0KClgIHdvdWxkIGRlbGF5IChvciwgaWYgaXRcbiAgICAgICAgICAvLyBoYW5ncywgZHJvcCkgcmVhbC10aW1lIGFib3J0IGRlbGl2ZXJ5IHRvIHRoZSBpbi1mbGlnaHQgc3RlcC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBSZWFkZXIgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQ7IGlnbm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgd3JpdGVyIHVzZWQgc28gdGhlIHJlYXNvblxuICAgICAgICAgICAgLy8gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIEVuY3J5cHRpb24ga2V5IChpZiBhbnkpXG4gICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBzdGVwIGNvbnRleHQg4oCUIHNldCB1cCBieSB0aGUgc3RlcCBoYW5kbGVyIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCDigJQgbm90IGp1c3QgcmVsZWFzZSDigJQgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkIOKAlCBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5IOKAlCB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5IOKAlCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCDigJQgZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGAg4oCUIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vazogcmVzdW1lSG9va0ZuIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgcmVzdW1lSG9va0ZuKHZhbHVlLmhvb2tUb2tlbiwge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGhvb2sgcmVzdW1lIOKAlCByZXRyeSBvbiBuZXh0IHJlcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY3R4LnByZUNvbXBsZXRpb25PcHMucHVzaChob29rUmVzdW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogUmV2aXZlcyBqdXN0IGFuIEFib3J0U2lnbmFsIHdpdGhvdXQgdGhlIHBhdGNoZWQgYWJvcnQoKSBvdmVyaGVhZC5cbiAqIFVzZWQgd2hlbiBvbmx5IGEgc2lnbmFsIChub3QgYSBjb250cm9sbGVyKSB3YXMgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRTaWduYWwoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydFNpZ25hbCddLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBCYXNlIHJldml2ZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIGNvbW1vbiByZXZpdmVycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKlxuICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24tZm9ybWF0LnRzIGFuZCBvdGhlciBmaWxlcyByZWZlcmVuY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgIC4uLmdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZShnbG9iYWwpLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBQYXJ0aWFsPFJldml2ZXJzPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlbmNyeXB0LW9ubHkga2V5IG5lZWRlZCB3aGVuIGEgY2hpbGQgd3JpdGVzIGludG8gYW5vdGhlciBydW4nc1xuICogc3RyZWFtLiBOZXcgZGVzY3JpcHRvcnMgaW5jbHVkZSB0aGUgb3duZXIncyBkZXBsb3ltZW50IElEOyBkZXNjcmlwdG9yc1xuICogY3JlYXRlZCBieSBvbGRlciBTREsgdmVyc2lvbnMgZmFsbCBiYWNrIHRvIGxvYWRpbmcgdGhlIG93bmluZyBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCByYXdLZXkgPSBkZXBsb3ltZW50SWRcbiAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4ocnVuSWQsIHsgZGVwbG95bWVudElkIH0pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5LCBbJ2VuY3J5cHQnXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSxcbiAqIHJlY2VpdmluZyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MgdG8gY2xpZW50c1xuICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgJ1N0ZXAgZnVuY3Rpb25zIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgaW4gY2xpZW50IGNvbnRleHQuIFN0ZXAgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MuJyxcbiAgICAgICAge1xuICAgICAgICAgIGhpbnQ6ICdBIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlIHJlYWNoZWQgdGhlIGNsaWVudC4gUmV0dXJuIGEgc2VyaWFsaXphYmxlIHZhbHVlIChlLmcuIHRoZSBzdGVwIHJlc3VsdCkgaW5zdGVhZCBvZiB0aGUgc3RlcCBpdHNlbGYuJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTm90ZTogUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIHN0YXR1cywgc3RhdHVzVGV4dCwgYW5kIGhlYWRlcnNcbiAgICAgIC8vIFRoZSB0eXBlLCB1cmwsIGFuZCByZWRpcmVjdGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBhbmQgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuIG5ldyBnbG9iYWwuUmVzcG9uc2UodmFsdWUuYm9keSwge1xuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIGhhcyBib2R5SW5pdCwgaXQgY2FtZSBmcm9tIGEgUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIC8vIENvbnZlcnQgaXQgdG8gYSBSRUFMIHN0cmVhbSBub3cgdGhhdCB3ZSdyZSBvdXRzaWRlIHRoZSB3b3JrZmxvd1xuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgY29udmVydCBCb2R5SW5pdCB0byBSZWFkYWJsZVN0cmVhbVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBnbG9iYWwuUmVzcG9uc2UoYm9keUluaXQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgLy8gRm9yIGJ5dGUgc3RyZWFtcywgdXNlIGZsdXNoYWJsZSBwaXBlIHdpdGggbG9jayBwb2xsaW5nLlxuICAgICAgICAvLyBJZiB0aGUgcHJvZHVjZXIgd3JvdGUgZnJhbWVkIGJ5dGVzIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJyksXG4gICAgICAgIC8vIHVud3JhcCB0aGUgbGVuZ3RoLXByZWZpeCBlbnZlbG9wZSBiZWZvcmUgaGFuZGluZyBjaHVua3MgdG9cbiAgICAgICAgLy8gdGhlIHVzZXIuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlcyDigJRcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vIGF1dG8tcmVjb25uZWN0IGhlcmUgeWV0OiByYXcgYnl0ZSBzdHJlYW1zIGhhdmUgbm8gd2lyZVxuICAgICAgICAvLyBmcmFtaW5nIHRvIGNvdW50IGNvbnN1bWVkIGNodW5rcyB3aXRoLiBGcmFtZWQtdjEgYnl0ZSBzdHJlYW1zXG4gICAgICAgIC8vIG1ha2UgZnJhbWUgY291bnRpbmcgcG9zc2libGUsIHNvIGV4dGVuZGluZyB0aGUgcmVjb25uZWN0aW5nXG4gICAgICAgIC8vIHJlYWRlciB0byB0aGVtIGlzIGEgc2VwYXJhdGUgZm9sbG93LXVwLlxuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBpZGVudGl0eSAob3IgdW5mcmFtaW5nKSB0cmFuc2Zvcm0gdG8gZ2l2ZSB0aGUgdXNlciBhIHJlYWRhYmxlXG4gICAgICAgIGNvbnN0IHsgcmVhZGFibGU6IHVzZXJSZWFkYWJsZSwgd3JpdGFibGUgfSA9XG4gICAgICAgICAgdmFsdWUuZnJhbWluZyA9PT0gJ2ZyYW1lZC12MSdcbiAgICAgICAgICAgID8gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpXG4gICAgICAgICAgICA6IG5ldyBnbG9iYWwuVHJhbnNmb3JtU3RyZWFtKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHdyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vbi1ieXRlIHN0cmVhbXMgY2FycnkgbGVuZ3RoLXByZWZpeGVkIGZyYW1lcywgc28gd2UgY2FuIGNvdW50XG4gICAgICAgIC8vIGNvbXBsZXRlZCBmcmFtZXMgYW5kIHRyYW5zcGFyZW50bHkgcmVjb25uZWN0IHdoZW4gdGhlIHNlcnZlclxuICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGlvbiB0aW1lcyBvdXQgbWlkLXJ1bi5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXkpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZSBoYW5kbGluZyBhcyBgZ2V0U3RlcFJldml2ZXJzLldyaXRhYmxlU3RyZWFtYCDigJQgc2VlIGNvbW1lbnRzXG4gICAgICAvLyB0aGVyZSBmb3IgdGhlIGNyb3NzLXJ1biBjYXNlICh3cml0YWJsZSBjYXJyaWVzIGBydW5JZGAgZnJvbVxuICAgICAgLy8gcGFyZW50IOKGkiBjaGlsZCBmb3J3YXJkaW5nIHZpYSBgc3RhcnQoKWApLlxuICAgICAgY29uc3QgdGFyZ2V0UnVuSWQgPSB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnID8gdmFsdWUucnVuSWQgOiBydW5JZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleSh0YXJnZXRSdW5JZCwgdmFsdWUuZGVwbG95bWVudElkKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCB0YXJnZXRSdW5JZCwgdGFyZ2V0S2V5KSxcbiAgICAgICAgdGFyZ2V0S2V5XG4gICAgICApO1xuICAgICAgY29uc3Qgc2VydmVyV3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgIHZhbHVlLm5hbWVcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBmbHVzaGFibGUgc3RhdGUgZm9yIHRoaXMgc3RyZWFtXG4gICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgIHBvbGxXcml0YWJsZUxvY2soc2VyaWFsaXplLndyaXRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IOKAlCByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkIOKAlCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcbiAgICB9LFxuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJldml2ZWQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTS4gVXNlIHRoZVxuICAgIC8vIHJlYWwgV29ya2Zsb3dBYm9ydFNpZ25hbCBjbGFzcyBzbyBhZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKSBhY3R1YWxseVxuICAgIC8vIGZpcmVzIHdoZW4gdGhlIHNpZ25hbCBhYm9ydHMgKHRoZSBwcmV2aW91cyBuby1vcCBzdHViIHNpbGVudGx5IGRyb3BwZWRcbiAgICAvLyBsaXN0ZW5lciByZWdpc3RyYXRpb25zIOKAlCBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmUg4oCUIGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlIOKAlCBub3QgdHJ1dGhpbmVzcyDigJQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlcyDigJRcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuIOKAlCBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW0g4oCUIGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleSh0YXJnZXRSdW5JZCwgdGFyZ2V0RGVwbG95bWVudElkKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIOKAlCBlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkIOKAlCB0aGVcbiAgICAgIC8vIGV4dGVybmFsIHJlZHVjZXIgbmVlZHMgYm90aCB0byBlbWl0IHRoZSBvcmlnaW5hbCBgcnVuSWRgIGluXG4gICAgICAvLyB0aGUgZGVzY3JpcHRvci5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0YXJnZXREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB0YXJnZXREZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplLndyaXRhYmxlO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRDb250cm9sbGVyKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSwgb3BzLCBydW5JZCksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuY3J5cHRpb24gSGVscGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlc2UgZGVsZWdhdGUgdG8gdGhlIG1vZHVsYXIgYGVuY3J5cHRgL2BkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2Bcbi8vIGJ1dCBhcmUga2VwdCBhcyBuYW1lZCBleHBvcnRzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbnN1bWVycy5cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgaWYgdGhlIHdvcmxkIHN1cHBvcnRzIGVuY3J5cHRpb24uXG4gKiBSZXR1cm5zIG9yaWdpbmFsIGRhdGEgaWYgZW5jcnlwdGlvbiBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZW5jcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXliZUVuY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgcmV0dXJuIGRlY3J5cHQoZGF0YSwga2V5KTtcbn1cblxuLyoqXG4gKiBSZXBsYXkgaHlkcmF0aW9uIGhhcyB0d28gc3RhZ2VzOlxuICpcbiAqIDEuIEhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBkZWNyeXB0cyBhbmQgZGVjb21wcmVzc2VzIHBlcnNpc3RlZCBkYXRhLiBUaGF0IHdvcmtcbiAqICAgIGlzIGluZGVwZW5kZW50IG9mIGEgd29ya2Zsb3cgVk0gYW5kIGNhbiBiZSBjYWNoZWQgYWNyb3NzIHJlcGxheSBWTXMuXG4gKiAyLiBEZXNlcmlhbGl6YXRpb24gcmV2aXZlcyB0aGUgcHJlcGFyZWQgcmVwcmVzZW50YXRpb24gYWdhaW5zdCB0aGUgY3VycmVudFxuICogICAgVk0ncyBnbG9iYWxzLiBJdCBtdXN0IHJ1biBhZ2FpbiBmb3IgZXZlcnkgVk0gdG8gcHJvZHVjZSBmcmVzaCBvYmplY3QgZ3JhcGhzXG4gKiAgICBhbmQgY29ycmVjdGx5IHNjb3BlZCBXb3JrZmxvdyBvYmplY3RzLlxuICpcbiAqIGBkYXRhYCBpcyB0aGUgYm91bmRhcnkgYmV0d2VlbiB0aG9zZSBzdGFnZXMuIEZvciBjdXJyZW50LWZvcm1hdCBwYXlsb2FkcyBpdFxuICogaXMgc3RpbGwgZm9ybWF0LXByZWZpeGVkIHNlcmlhbGl6ZWQgYnl0ZXMsIG5vdCBhIGxpdmUgSmF2YVNjcmlwdCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFJlcGxheVBheWxvYWQge1xuICByZWFkb25seSBkYXRhOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFN3YXBwYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaG9zdC1zaWRlIHByZXBhcmF0aW9uIHN0YWdlLiBTdXBwb3J0aW5nXG4gKiBib3RoIGRpcmVjdCBhbmQgcHJvbWlzZWQgcmVzdWx0cyBsZXRzIGEgZnV0dXJlIHN5bmNocm9ub3VzIE5vZGUgZGVjcnlwdG9yIHVzZVxuICogdGhlIHNhbWUgY2FjaGUgY29udHJhY3QgYXMgdG9kYXkncyBhc3luY2hyb25vdXMgV2ViIENyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbikgPT4gUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHwgUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+O1xuXG4vKipcbiAqIERlY3J5cHQgYW5kIGRlY29tcHJlc3MgcGVyc2lzdGVkIGRhdGEgd2l0aG91dCBwYXJzaW5nIGl0IGludG8gSmF2YVNjcmlwdC5cbiAqIExlZ2FjeSBub24tYmluYXJ5IHZhbHVlcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkIGZvciB0aGVpciBjb25zdW1lciB0byByZXZpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVwYXJlUmVwbGF5UGF5bG9hZDogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gYXN5bmMgKFxuICB2YWx1ZSxcbiAga2V5XG4pID0+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4geyBkYXRhOiBwcmVwYXJlZCB9O1xufTtcblxuLyoqXG4gKiBQYXJzZSBhIHByZXBhcmVkIHdvcmtmbG93IGFyZ3VtZW50IG9yIHN1Y2Nlc3NmdWwgc3RlcC9ob29rIHBheWxvYWQgdXNpbmcgdGhlXG4gKiBjdXJyZW50IHdvcmtmbG93IFZNJ3MgZ2xvYmFscyBhbmQgcmV2aXZlcnMuIEVhY2ggY2FsbCBpbnRlbnRpb25hbGx5IGNyZWF0ZXNcbiAqIGEgZnJlc2ggb2JqZWN0IGdyYXBoIHNvIG11dGF0aW9ucyBjYW5ub3QgbGVhayBhY3Jvc3MgcmVwbGF5IGl0ZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkUmVwbGF5UGF5bG9hZChcbiAgcHJlcGFyZWQ6IFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogYW55IHtcbiAgcmV0dXJuIHdvcmtmbG93TW9kdWxlLmRlc2VyaWFsaXplKHByZXBhcmVkLmRhdGEsIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKGdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgc3RlcCBlcnJvciB1c2luZyB0aGUgY3VycmVudCB3b3JrZmxvdyBWTSdzIGNsYXNzIHJldml2ZXJzLlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhyb3duLXZhbHVlIGlkZW50aXR5IHdpdGhvdXQgc2hhcmluZyBvYmplY3RzIGJldHdlZW4gVk1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVQcmVwYXJlZFN0ZXBFcnJvcihcbiAgcHJlcGFyZWQ6IFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogdW5rbm93biB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gcHJlcGFyZWQ7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4oZGF0YSBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlaHlkcmF0ZSAvIEh5ZHJhdGUgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBtb2RlIG1vZHVsZXMgKHdvcmtmbG93LCBzdGVwLCBjbGllbnQpIHBhc3Npbmdcbi8vIG1vZGUtc3BlY2lmaWMgc3RyZWFtIGFuZCBSZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzL3Jldml2ZXJzIGFzIGV4dHJhIG9wdGlvbnMuXG4vLyBUaGUgdjFDb21wYXQgcGF0aCBpcyBoYW5kbGVkIGlubGluZSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgbW9kdWxlcy5cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgYHN0YXJ0KClgIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgd29ya2Zsb3cgYXJndW1lbnRzXG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGhlbiBoeWRyYXRlZCBmcm9tXG4gKiB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChyZXF1aXJlZCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0KVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHkg4oCUIHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi4gQSBwcmVwYXJlZFxuICogcGF5bG9hZCBza2lwcyBob3N0LXNpZGUgZGVjcnlwdC9kZWNvbXByZXNzIGJ1dCBhbHdheXMgcGVyZm9ybXMgVk0gcmV2aXZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIERlaHlkcmF0ZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgZm9yIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiBhIHN0ZXAgaXMgYmVpbmcgY3JlYXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGFyZ3VtZW50cycsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHRvIGh5ZHJhdGUgdGhlIGFyZ3VtZW50cyBvZiBhIHN0ZXBcbiAqIGZyb20gdGhlIGRhdGFiYXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHdoZW4gYSBzdGVwIGhhcyBjb21wbGV0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eSDigJQgc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBvcmRlciB0aGUgZmlyc3QgY2h1bmsgb2YgYSByZXR1cm5lZCBzdHJlYW0gYWZ0ZXJcbiAgLy8gdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWRlZCBpbnRvIHRoZSBzdGVwIHJlZHVjZXJzJyBzdHJlYW1cbiAgLy8gc2luay4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnc3RlcCByZXR1cm4gdmFsdWUnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGhhbmRsZXIgd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHBhcmFtIHByZXBhcmVkIC0gT3B0aW9uYWwgY2FjaGVkIGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHRcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIHJlamVjdCB0aGUgc3RlcCBwcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgcHJlcGFyZWQ/OiBQcmVwYXJlZFJlcGxheVBheWxvYWRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFN0ZXBFcnJvcihcbiAgICBwcmVwYXJlZCA/PyAoYXdhaXQgcHJlcGFyZVJlcGxheVBheWxvYWQodmFsdWUsIGtleSkpLFxuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzXG4gICk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiB0aGUgd29ya2Zsb3cgaXRzZWxmIHRocm93cy5cbiAqIERlaHlkcmF0ZXMgdGhlIHRocm93biB2YWx1ZSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBydW5fZmFpbGVkYCBldmVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGhyb3duIHZhbHVlIHRvIHNlcmlhbGl6ZSAoY2FuIGJlIGFueSB0eXBlKVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZyDigJQgZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3J1biBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgKG9yIG9ic2VydmFiaWxpdHkgdG9vbHMpIHRvIGh5ZHJhdGUgdGhlIHJ1blxuICogZXJyb3IgdmFsdWUgb2YgYSBmYWlsZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IGRlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nXG4gKiBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgcHJlcGFyZWQ/OiBQcmVwYXJlZFJlcGxheVBheWxvYWRcbik6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkUmVwbGF5UGF5bG9hZChcbiAgICBwcmVwYXJlZCA/PyAoYXdhaXQgcHJlcGFyZVJlcGxheVBheWxvYWQodmFsdWUsIGtleSkpLFxuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzXG4gICk7XG59XG5cbi8vIC0tLS0gSGVscGVycyB0byBleHRyYWN0IHN0cmVhbS9SZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzIGFuZCByZXZpdmVycyAtLS0tXG4vLyBUaGUgbW9kZS1zcGVjaWZpYyBnZXQqUmVkdWNlcnMvZ2V0KlJldml2ZXJzIGZ1bmN0aW9ucyByZXR1cm4gb2JqZWN0cyB0aGF0XG4vLyBpbmNsdWRlIGJvdGggXCJjb21tb25cIiBlbnRyaWVzIChEYXRlLCBFcnJvciwgTWFwLCBldGMuKSBhbmQgbW9kZS1zcGVjaWZpY1xuLy8gZW50cmllcyAoUmVhZGFibGVTdHJlYW0sIFdyaXRhYmxlU3RyZWFtLCBSZXF1ZXN0LCBSZXNwb25zZSwgU3RlcEZ1bmN0aW9uKS5cbi8vIFRoZSBjb21tb24gZW50cmllcyBhcmUgYWxyZWFkeSBjb21wb3NlZCBieSB0aGUgY29kZWMuIFdlIG9ubHkgbmVlZCB0b1xuLy8gcGFzcyB0aHJvdWdoIHRoZSBtb2RlLXNwZWNpZmljIGVudHJpZXMgYXMgZXh0cmFSZWR1Y2Vycy9leHRyYVJldml2ZXJzLlxuXG5jb25zdCBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUyA9IFtcbiAgJ1JlYWRhYmxlU3RyZWFtJyxcbiAgJ1dyaXRhYmxlU3RyZWFtJyxcbiAgJ1JlcXVlc3QnLFxuICAnUmVzcG9uc2UnLFxuICAnU3RlcEZ1bmN0aW9uJyxcbiAgLy8gV2lyZSBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgdGhyb3VnaCB0aGUgY2xpZW50IHNlcmlhbGl6YXRpb24gcGF0aCBzb1xuICAvLyBzaWduYWxzIHJlYWNoYWJsZSB2aWEgUmVxdWVzdC5zaWduYWwgKG9yIGFzIGRpcmVjdCBhcmd1bWVudHMpIGdldCB0aGVpclxuICAvLyBkZWRpY2F0ZWQgcmVkdWNlci4gV2l0aG91dCB0aGlzLCBkZXZhbHVlIGZhbGxzIGJhY2sgdG8gaXRzIGFyYml0cmFyeS1QT0pPXG4gIC8vIHBhdGggYW5kIGZhaWxzIGZvciBhbnkgc2lnbmFsIHRoZSBSZXF1ZXN0IHJlZHVjZXIgZm9yd2FyZHMuXG4gICdBYm9ydENvbnRyb2xsZXInLFxuICAnQWJvcnRTaWduYWwnLFxuXSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICBhbGxSZWR1Y2VyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJlZHVjZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoXG4gIGFsbFJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmV2aXZlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZXZpdmVyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG4iXX0=
|