@workflow/world-local 5.0.0-beta.21 → 5.0.0-beta.23
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/fs.d.ts +17 -1
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +67 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -12
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +61 -20
- package/dist/storage/events-storage.d.ts +4 -1
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +113 -24
- package/dist/storage/hooks-storage.d.ts +2 -1
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +113 -5
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -1
- package/package.json +5 -5
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { EntityConflictError, HookNotFoundError, RunExpiredError, RunNotSupportedError, TooEarlyError, WorkflowRunNotFoundError, WorkflowWorldError, } from '@workflow/errors';
|
|
4
|
-
import { applyAttributeChanges, EventSchema, HookSchema, isLegacySpecVersion, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, ulidToDate, validateAttributeChanges, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
|
|
4
|
+
import { applyAttributeChanges, EventSchema, HookSchema, isLegacySpecVersion, isTerminalRunEventType, isTerminalStepStatus, isTerminalWorkflowRunStatus, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, ulidToDate, validateAttributeChanges, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
|
|
7
|
-
import { assertSafeEntityId, deleteJSON, jsonReplacer, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, resolveWithinBase, taggedPath, writeExclusive, writeJSON, } from '../fs.js';
|
|
7
|
+
import { assertSafeEntityId, deleteJSON, jsonReplacer, jsonReviver, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, resolveWithinBase, taggedPath, write, writeExclusive, writeJSON, } from '../fs.js';
|
|
8
8
|
import { stripEventDataRefs } from './filters.js';
|
|
9
9
|
import { getObjectCreatedAt, hashToken, hookRecoveryMarkerPath, monotonicUlid, } from './helpers.js';
|
|
10
|
-
import { deleteAllHooksForRun } from './hooks-storage.js';
|
|
10
|
+
import { deleteAllHooksForRun, rebuildLiveHookByTokenFromEventLog, } from './hooks-storage.js';
|
|
11
11
|
import { handleLegacyEvent } from './legacy.js';
|
|
12
12
|
import { withRunFileLock } from './runs-storage.js';
|
|
13
13
|
/**
|
|
@@ -170,7 +170,7 @@ async function repairHookEntityFromPersistedEvent(basedir, runId, hookId, persis
|
|
|
170
170
|
environment: 'local',
|
|
171
171
|
createdAt: persistedEvent.createdAt,
|
|
172
172
|
specVersion: persistedEvent.specVersion,
|
|
173
|
-
isWebhook: eventData.isWebhook ??
|
|
173
|
+
isWebhook: eventData.isWebhook ?? true,
|
|
174
174
|
isSystem: eventData.isSystem ?? false,
|
|
175
175
|
};
|
|
176
176
|
await writeExclusive(taggedPath(basedir, 'hooks', hookId, tag), JSON.stringify(hook, jsonReplacer, 2));
|
|
@@ -276,11 +276,87 @@ async function writeRunUnderLifecycleLock(basedir, runId, tag, proposed) {
|
|
|
276
276
|
return next;
|
|
277
277
|
});
|
|
278
278
|
}
|
|
279
|
-
/**
|
|
280
|
-
* Creates the events storage implementation using the filesystem.
|
|
281
|
-
* Implements the Storage['events'] interface with create, list, and listByCorrelationId operations.
|
|
282
|
-
*/
|
|
283
279
|
export function createEventsStorage(basedir, tag) {
|
|
280
|
+
// Events are append-only. Keep a bounded window of locally persisted events
|
|
281
|
+
// available to immediate replay without rereading JSON files. Payload bytes
|
|
282
|
+
// and entry count are both bounded so active/waiting runs cannot retain
|
|
283
|
+
// unbounded histories in a long-lived development server.
|
|
284
|
+
const maxCachedEventBytes = 4 * 1024 * 1024;
|
|
285
|
+
const maxCachedEventEntries = 1000;
|
|
286
|
+
const eventCache = new Map();
|
|
287
|
+
const cachedEventBytes = new Map();
|
|
288
|
+
const cachedPathsByRunId = new Map();
|
|
289
|
+
let totalCachedEventBytes = 0;
|
|
290
|
+
function deleteCachedEvent(eventPath) {
|
|
291
|
+
const event = eventCache.get(eventPath);
|
|
292
|
+
if (!event) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
eventCache.delete(eventPath);
|
|
296
|
+
totalCachedEventBytes -= cachedEventBytes.get(eventPath) ?? 0;
|
|
297
|
+
cachedEventBytes.delete(eventPath);
|
|
298
|
+
const cachedPaths = cachedPathsByRunId.get(event.runId);
|
|
299
|
+
cachedPaths?.delete(eventPath);
|
|
300
|
+
if (cachedPaths?.size === 0) {
|
|
301
|
+
cachedPathsByRunId.delete(event.runId);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function clearRunCache(runId) {
|
|
305
|
+
for (const cachedPath of cachedPathsByRunId.get(runId) ?? []) {
|
|
306
|
+
deleteCachedEvent(cachedPath);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function clearCache() {
|
|
310
|
+
eventCache.clear();
|
|
311
|
+
cachedEventBytes.clear();
|
|
312
|
+
cachedPathsByRunId.clear();
|
|
313
|
+
totalCachedEventBytes = 0;
|
|
314
|
+
}
|
|
315
|
+
function cacheEvent(eventPath, cachedEvent, serializedBytes) {
|
|
316
|
+
if (serializedBytes > maxCachedEventBytes) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
while (eventCache.size > 0 &&
|
|
320
|
+
(eventCache.size >= maxCachedEventEntries ||
|
|
321
|
+
totalCachedEventBytes + serializedBytes > maxCachedEventBytes)) {
|
|
322
|
+
const oldestPath = eventCache.keys().next().value;
|
|
323
|
+
deleteCachedEvent(oldestPath);
|
|
324
|
+
}
|
|
325
|
+
eventCache.set(eventPath, cachedEvent);
|
|
326
|
+
cachedEventBytes.set(eventPath, serializedBytes);
|
|
327
|
+
totalCachedEventBytes += serializedBytes;
|
|
328
|
+
const cachedPaths = cachedPathsByRunId.get(cachedEvent.runId) ?? new Set();
|
|
329
|
+
cachedPaths.add(eventPath);
|
|
330
|
+
cachedPathsByRunId.set(cachedEvent.runId, cachedPaths);
|
|
331
|
+
}
|
|
332
|
+
// Update the in-memory cache for an event that was just persisted at
|
|
333
|
+
// `eventPath`. `serializedEvent` must be the exact byte payload written
|
|
334
|
+
// to disk: decoding it (instead of the caller's `event`) both detaches
|
|
335
|
+
// caller-owned payloads and matches disk-read normalization. Callers
|
|
336
|
+
// must capture `serializedEvent` *before* the write's `await` so the
|
|
337
|
+
// cached snapshot can never observe a later mutation.
|
|
338
|
+
function rememberStoredEvent(event, eventPath, serializedEvent) {
|
|
339
|
+
// Terminal runs release their cached history so a long-lived dev
|
|
340
|
+
// server doesn't retain completed runs forever.
|
|
341
|
+
if (isTerminalRunEventType(event.eventType)) {
|
|
342
|
+
clearRunCache(event.runId);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const serializedBytes = Buffer.byteLength(serializedEvent);
|
|
346
|
+
if (serializedBytes > maxCachedEventBytes) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const cachedEvent = EventSchema.safeParse(JSON.parse(serializedEvent, jsonReviver));
|
|
350
|
+
if (cachedEvent.success) {
|
|
351
|
+
cacheEvent(eventPath, cachedEvent.data, serializedBytes);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async function storeEvent(event) {
|
|
355
|
+
const eventPath = taggedPath(basedir, 'events', `${event.runId}-${event.eventId}`, tag);
|
|
356
|
+
const serializedEvent = JSON.stringify(event, jsonReplacer, 2);
|
|
357
|
+
await write(eventPath, serializedEvent);
|
|
358
|
+
rememberStoredEvent(event, eventPath, serializedEvent);
|
|
359
|
+
}
|
|
284
360
|
// Per-instance in-process mutexes. Two storage instances sharing
|
|
285
361
|
// one data directory get independent lock maps, which makes them
|
|
286
362
|
// behave like two separate OS processes from the locking
|
|
@@ -300,6 +376,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
300
376
|
const stepLocks = new Map();
|
|
301
377
|
const hookLocks = new Map();
|
|
302
378
|
return {
|
|
379
|
+
clearCache,
|
|
303
380
|
async create(runId, data, params) {
|
|
304
381
|
// Validate request-supplied IDs before they're concatenated into
|
|
305
382
|
// filesystem paths. This is the primary defense against path traversal
|
|
@@ -378,10 +455,6 @@ export function createEventsStorage(basedir, tag) {
|
|
|
378
455
|
}
|
|
379
456
|
// specVersion is always sent by the runtime, but we provide a fallback for safety
|
|
380
457
|
const effectiveSpecVersion = data.specVersion ?? SPEC_VERSION_CURRENT;
|
|
381
|
-
// Helper to check if run is in terminal state
|
|
382
|
-
const isRunTerminal = (status) => ['completed', 'failed', 'cancelled'].includes(status);
|
|
383
|
-
// Helper to check if step is in terminal state
|
|
384
|
-
const isStepTerminal = (status) => ['completed', 'failed', 'cancelled'].includes(status);
|
|
385
458
|
// Get current run state for validation (if not creating a new run)
|
|
386
459
|
// Skip run validation for step_completed and step_retrying - they only operate
|
|
387
460
|
// on running steps, and running steps are always allowed to modify regardless
|
|
@@ -445,8 +518,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
445
518
|
allowReservedAttributes: runInputData.allowReservedAttributes,
|
|
446
519
|
},
|
|
447
520
|
};
|
|
448
|
-
|
|
449
|
-
await writeJSON(taggedPath(basedir, 'events', createdCompositeKey, tag), runCreatedEvent);
|
|
521
|
+
await storeEvent(runCreatedEvent);
|
|
450
522
|
currentRun = createdRun;
|
|
451
523
|
}
|
|
452
524
|
else {
|
|
@@ -498,7 +570,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
498
570
|
'string' &&
|
|
499
571
|
data.eventData.input !== undefined;
|
|
500
572
|
// Run terminal state validation
|
|
501
|
-
if (currentRun &&
|
|
573
|
+
if (currentRun && isTerminalWorkflowRunStatus(currentRun.status)) {
|
|
502
574
|
const runTerminalEvents = [
|
|
503
575
|
'run_started',
|
|
504
576
|
'run_completed',
|
|
@@ -515,8 +587,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
515
587
|
createdAt: now,
|
|
516
588
|
specVersion: effectiveSpecVersion,
|
|
517
589
|
};
|
|
518
|
-
|
|
519
|
-
await writeJSON(taggedPath(basedir, 'events', compositeKey, tag), event);
|
|
590
|
+
await storeEvent(event);
|
|
520
591
|
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
521
592
|
return {
|
|
522
593
|
event: stripEventDataRefs(event, resolveData),
|
|
@@ -580,11 +651,11 @@ export function createEventsStorage(basedir, tag) {
|
|
|
580
651
|
// the lazy-start path (no step yet) — there is nothing terminal to
|
|
581
652
|
// guard against in that case, so these checks are skipped.
|
|
582
653
|
if (validatedStep) {
|
|
583
|
-
if (
|
|
654
|
+
if (isTerminalStepStatus(validatedStep.status)) {
|
|
584
655
|
throw new EntityConflictError(`Cannot modify step in terminal state "${validatedStep.status}"`);
|
|
585
656
|
}
|
|
586
657
|
// On terminal runs: only allow completing/failing in-progress steps
|
|
587
|
-
if (currentRun &&
|
|
658
|
+
if (currentRun && isTerminalWorkflowRunStatus(currentRun.status)) {
|
|
588
659
|
if (validatedStep.status !== 'running') {
|
|
589
660
|
throw new RunExpiredError(`Cannot modify non-running step on run in terminal state "${currentRun.status}"`);
|
|
590
661
|
}
|
|
@@ -959,7 +1030,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
959
1030
|
// world uses SQL-level atomic guards for production).
|
|
960
1031
|
const stepCompositeKey = `${effectiveRunId}-${data.correlationId}`;
|
|
961
1032
|
const freshStep = await readJSONWithFallback(basedir, 'steps', stepCompositeKey, StepSchema, tag);
|
|
962
|
-
if (freshStep &&
|
|
1033
|
+
if (freshStep && isTerminalStepStatus(freshStep.status)) {
|
|
963
1034
|
throw new EntityConflictError(`Cannot modify step in terminal state "${freshStep.status}"`);
|
|
964
1035
|
}
|
|
965
1036
|
step = {
|
|
@@ -1053,6 +1124,11 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1053
1124
|
// Atomically claim the token using an exclusive-create constraint file.
|
|
1054
1125
|
// This avoids the TOCTOU race of the previous read-all-then-check approach.
|
|
1055
1126
|
const constraintPath = path.join(basedir, 'hooks', 'tokens', `${hashToken(hookData.token)}.json`);
|
|
1127
|
+
// When the claim is absent, the event log is the only durable source
|
|
1128
|
+
// that can distinguish a first hook from a crash-lost token cache.
|
|
1129
|
+
if (!(await readHookTokenClaim(constraintPath))) {
|
|
1130
|
+
await rebuildLiveHookByTokenFromEventLog(basedir, hookData.token, tag);
|
|
1131
|
+
}
|
|
1056
1132
|
// Persist `eventId` in the claim so concurrent / cross-
|
|
1057
1133
|
// process retries can converge on a single canonical
|
|
1058
1134
|
// `hook_created` event path. See the recovery comment
|
|
@@ -1203,8 +1279,10 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1203
1279
|
createdAt: now,
|
|
1204
1280
|
specVersion: effectiveSpecVersion,
|
|
1205
1281
|
};
|
|
1206
|
-
|
|
1207
|
-
|
|
1282
|
+
// Persist and cache the conflict event (create-only,
|
|
1283
|
+
// same path the read cache keys on) so an immediate
|
|
1284
|
+
// replay can serve it without rereading from disk.
|
|
1285
|
+
await storeEvent(conflictEvent);
|
|
1208
1286
|
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
1209
1287
|
const filteredEvent = stripEventDataRefs(conflictEvent, resolveData);
|
|
1210
1288
|
// Return EventResult with conflict event (no hook entity created)
|
|
@@ -1356,7 +1434,12 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1356
1434
|
// also the right surface — same shape as step_created's
|
|
1357
1435
|
// claim-file behavior.
|
|
1358
1436
|
const compositeKey = `${effectiveRunId}-${eventId}`;
|
|
1359
|
-
const
|
|
1437
|
+
const eventPath = taggedPath(basedir, 'events', compositeKey, tag);
|
|
1438
|
+
// Capture the serialized payload before the write's `await` so the
|
|
1439
|
+
// cached snapshot can't observe a later mutation (see
|
|
1440
|
+
// rememberStoredEvent).
|
|
1441
|
+
const serializedEvent = JSON.stringify(event, jsonReplacer, 2);
|
|
1442
|
+
const eventPublished = await writeExclusive(eventPath, serializedEvent);
|
|
1360
1443
|
if (!eventPublished) {
|
|
1361
1444
|
// For `hook_created`, losing the event publish means the
|
|
1362
1445
|
// event was already committed at this exact (canonical)
|
|
@@ -1374,6 +1457,9 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1374
1457
|
}
|
|
1375
1458
|
throw new EntityConflictError(`Event "${eventId}" already exists for run "${effectiveRunId}"`);
|
|
1376
1459
|
}
|
|
1460
|
+
// The event is now committed; cache it so an immediate sequential
|
|
1461
|
+
// replay can serve it without rereading from disk.
|
|
1462
|
+
rememberStoredEvent(event, eventPath, serializedEvent);
|
|
1377
1463
|
// Write the hook entity ONLY now that the event publish has
|
|
1378
1464
|
// committed. Doing this earlier (in the `hook_created`
|
|
1379
1465
|
// branch above) would mutate an already-committed hook
|
|
@@ -1396,6 +1482,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1396
1482
|
const allEvents = await paginatedFileSystemQuery({
|
|
1397
1483
|
directory: path.join(basedir, 'events'),
|
|
1398
1484
|
schema: EventSchema,
|
|
1485
|
+
cachedItems: eventCache,
|
|
1399
1486
|
filePrefix: `${effectiveRunId}-`,
|
|
1400
1487
|
sortOrder: 'asc',
|
|
1401
1488
|
limit: 1000,
|
|
@@ -1487,6 +1574,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1487
1574
|
const result = await paginatedFileSystemQuery({
|
|
1488
1575
|
directory: path.join(basedir, 'events'),
|
|
1489
1576
|
schema: EventSchema,
|
|
1577
|
+
cachedItems: eventCache,
|
|
1490
1578
|
filePrefix: `${runId}-`,
|
|
1491
1579
|
// Events in chronological order (oldest first) by default,
|
|
1492
1580
|
// different from the default for other list calls.
|
|
@@ -1512,6 +1600,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1512
1600
|
const result = await paginatedFileSystemQuery({
|
|
1513
1601
|
directory: path.join(basedir, 'events'),
|
|
1514
1602
|
schema: EventSchema,
|
|
1603
|
+
cachedItems: eventCache,
|
|
1515
1604
|
// No filePrefix - search all events
|
|
1516
1605
|
filter: (event) => event.correlationId === correlationId,
|
|
1517
1606
|
// Events in chronological order (oldest first) by default,
|
|
@@ -1533,4 +1622,4 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1533
1622
|
},
|
|
1534
1623
|
};
|
|
1535
1624
|
}
|
|
1536
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsYUFBYSxHQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFB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cGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgUnVuTm90U3VwcG9ydGVkRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBhcHBseUF0dHJpYnV0ZUNoYW5nZXMsXG4gIEV2ZW50U2NoZW1hLFxuICBIb29rU2NoZW1hLFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICByZXF1aXJlc05ld2VyV29ybGQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTdGVwU2NoZW1hLFxuICB1bGlkVG9EYXRlLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG4gIHZhbGlkYXRlVWxpZFRpbWVzdGFtcCxcbiAgV2FpdFNjaGVtYSxcbiAgV29ya2Zsb3dSdW5TY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiB9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBhc3NlcnRTYWZlRW50aXR5SWQsXG4gIGRlbGV0ZUpTT04sXG4gIGpzb25SZXBsYWNlcixcbiAgbGlzdEpTT05GaWxlcyxcbiAgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5LFxuICByZWFkSlNPTixcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHJlc29sdmVXaXRoaW5CYXNlLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZUV4Y2x1c2l2ZSxcbiAgd3JpdGVKU09OLFxufSBmcm9tICcuLi9mcy5qcyc7XG5pbXBvcnQgeyBzdHJpcEV2ZW50RGF0YVJlZnMgfSBmcm9tICcuL2ZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0T2JqZWN0Q3JlYXRlZEF0LFxuICBoYXNoVG9rZW4sXG4gIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgsXG4gIG1vbm90b25pY1VsaWQsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBkZWxldGVBbGxIb29rc0ZvclJ1biB9IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbi8vIGBzdGVwTG9ja3NgIGFuZCBgaG9va0xvY2tzYCBhcmUgbm93IGluc3RhbnRpYXRlZCBwZXJcbi8vIGBjcmVhdGVFdmVudHNTdG9yYWdlYCBjYWxsIChzZWUgaW5zaWRlIHRoZSBmdW5jdGlvbikgcmF0aGVyIHRoYW5cbi8vIGJlaW5nIG1vZHVsZS1sZXZlbC4gVGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIHJlbWFpblxuLy8gdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoIGFjcm9zcyBwcm9jZXNzZXM7IHRoZSBpbi1wcm9jZXNzXG4vLyBtdXRleCBpcyBhIHBlci1pbnN0YW5jZSBvcHRpbWl6YXRpb24gdGhhdCBjbG9zZXMgYSBzaG9ydCByYWNlXG4vLyB3aW5kb3cgaW4gdGhlIGRlZHVwLXJlY292ZXJ5IHBhdGguIFBlci1pbnN0YW5jZSBzY29waW5nIGxldHNcbi8vIHRlc3RzIHNpbXVsYXRlIGNyb3NzLXByb2Nlc3MgYmVoYXZpb3Igd2l0aCB0d28gc3RvcmFnZSBpbnN0YW5jZXNcbi8vIHNoYXJpbmcgb25lIGRhdGEgZGlyZWN0b3J5IChlYWNoIGluc3RhbmNlIGhhcyBpbmRlcGVuZGVudCBsb2Nrc1xuLy8gYnV0IGEgc2hhcmVkIGZpbGVzeXN0ZW0pLCBleGFjdGx5IG1hdGNoaW5nIHRoZSBjcm9zcy1wcm9jZXNzXG4vLyBzZW1hbnRpY3Mgd2l0aG91dCBzcGF3bmluZyBzdWJwcm9jZXNzZXMuXG5cbmNvbnN0IEhvb2tUb2tlbkNsYWltU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBUaGUgdG9rZW4tY2xhaW0gd3JpdGVyIGJlbG93IGhhcyBhbHdheXMgcGVyc2lzdGVkIGBob29rSWRgLCBidXRcbiAgLy8gdGhpcyByZWFkIHNjaGVtYSBwcmV2aW91c2x5IG9taXR0ZWQgaXQsIHdoaWNoIGlzIHRoZSBidWcgZml4ZWRcbiAgLy8gYnkgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMjI4My4gYG9wdGlvbmFsKClgXG4gIC8vIGlzIGRlZmVuc2l2ZTogYW55IGNsYWltIGZpbGUgdGhhdCBzb21laG93IGxhY2tzIHRoZSBmaWVsZCBzdGlsbFxuICAvLyBwYXJzZXMgKHlpZWxkaW5nIGB1bmRlZmluZWRgKSBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgY3Jvc3MtXG4gIC8vIGhvb2sgY29uZmxpY3QgYnJhbmNoLCBtYXRjaGluZyBwcmUtZml4IGJlaGF2aW9yLlxuICBob29rSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG4gIC8vIGBldmVudElkYCBpcyB0aGUgY2Fub25pY2FsIGhvb2tfY3JlYXRlZCBldmVudCBJRCB0aGUgY2xhaW1pbmdcbiAgLy8gd29ya2VyIGNvbW1pdHRlZCB0byBwdWJsaXNoaW5nLiBQZXJzaXN0aW5nIGl0IGhlcmUgdHVybnMgdGhlXG4gIC8vIGNsYWltIGZpbGUgaW50byBhIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IGZvciBjcm9zcy13b3JrZXIgL1xuICAvLyBjcm9zcy1wcm9jZXNzIHJldHJpZXMgKHNlZSBjb21tZW50IG9uIHRoZSBob29rX2NyZWF0ZWQgYnJhbmNoKS5cbiAgLy8gYG9wdGlvbmFsKClgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGxlZ2FjeSBjbGFpbSBmaWxlXG4gIC8vIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeS1cbiAgLy8gbWFya2VyIHVwZ3JhZGUgcGF0aCwgd2hpY2ggYXRvbWljYWxseSBwaW5zIGEgY2Fub25pY2FsIGV2ZW50SWRcbiAgLy8gdmlhIGEgc2lkZWNhciBtYXJrZXIgKGFsc28gYSBgd3JpdGVFeGNsdXNpdmVgKS5cbiAgZXZlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogU2lkZWNhciByZWNvdmVyeSBtYXJrZXIgdGhhdCBwaW5zIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgXG4gKiBldmVudElkIGZvciBhIGxlZ2FjeSB0b2tlbiBjbGFpbSDigJQgb25lIHdyaXR0ZW4gYnkgYSB2ZXJzaW9uIG9mXG4gKiB0aGlzIHN0b3JhZ2UgdGhhdCBkaWQgbm90IHlldCBwZXJzaXN0IGBldmVudElkYCBpbmxpbmUgaW4gdGhlXG4gKiBjbGFpbSBmaWxlLiBXaXRob3V0IHRoaXMgbWFya2VyLCB0d28gY3Jvc3MtcHJvY2VzcyByZXRyaWVzXG4gKiByZWFkaW5nIGEgbGVnYWN5IGNsYWltIGVhY2ggZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmRcbiAqIHRoZWlyIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnQgcGF0aHMsIGFuZFxuICogYXBwZW5kIHR3byBgaG9va19jcmVhdGVkYCBldmVudHMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLlxuICpcbiAqIFRoZSBtYXJrZXIgaXMgd3JpdHRlbiB2aWEgYHdyaXRlRXhjbHVzaXZlYCDigJQgdGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBsYW5kIGl0IHBpbnMgaXRzIGNhbmRpZGF0ZSBldmVudElkIGFzIGNhbm9uaWNhbCwgYW5kIGV2ZXJ5XG4gKiBzdWJzZXF1ZW50IHJldHJ5IHJlYWRzIGFuZCBhZG9wdHMgdGhhdCBldmVudElkIGJlZm9yZSB0aGUgY29tbW9uXG4gKiBldmVudCBwdWJsaXNoLiBTY2hlbWEgaXMganVzdCBgeyBldmVudElkIH1gIGJlY2F1c2UgaWRlbnRpdHkgaXNcbiAqIGFscmVhZHkgZW5jb2RlZCBpbiB0aGUgbWFya2VyJ3MgZmlsZW5hbWUgaGFzaCwgc28gZGlmZmVyZW50IHRva2VuXG4gKiBsaWZldGltZXMgY2FuIG5ldmVyIHNoYXJlIG9uZSBtYXJrZXIgKHNlZVxuICogYGhvb2tSZWNvdmVyeU1hcmtlclBhdGhgKS5cbiAqL1xuY29uc3QgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudElkOiB6LnN0cmluZygpLFxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rVG9rZW5DbGFpbShcbiAgY29uc3RyYWludFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKGNvbnN0cmFpbnRQYXRoLCBIb29rVG9rZW5DbGFpbVNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihcbiAgbWFya2VyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKG1hcmtlclBhdGgsIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgcnVuJ3MgZXZlbnQgbG9nIGZvciBhbiBleGlzdGluZyBgaG9va19jcmVhdGVkYCBldmVudFxuICogd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb25JZC4gVXNlZCBieSB0aGUgbGVnYWN5LWNsYWltIHJlY292ZXJ5XG4gKiBwYXRoIHRvIGRldGVjdCBcImFscmVhZHkgcHVibGlzaGVkIGJ5IGEgcHJlLXVwZ3JhZGUgd3JpdGVcIiBiZWZvcmVcbiAqIHBpbm5pbmcgYSBjYW5vbmljYWwgZXZlbnRJZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBhIHBvc3QtdXBncmFkZVxuICogcmV0cnkgZW5jb3VudGVyaW5nIGEgbGVnYWN5IGNsYWltIHdob3NlIGBob29rX2NyZWF0ZWRgIHdhc1xuICogYWxyZWFkeSB3cml0dGVuICh3aXRoIHRoZSBwcmUtdXBncmFkZSB3cml0ZXIncyBvd24gZXZlbnRJZCkgd291bGRcbiAqIHBpbiBhICpkaWZmZXJlbnQqIGV2ZW50SWQgdmlhIHRoZSBtYXJrZXIgYW5kIHB1Ymxpc2ggYSBkdXBsaWNhdGVcbiAqIGV2ZW50IGF0IHRoZSBtYXJrZXIncyBwYXRoLlxuICpcbiAqIFRoZSBpbmxpbmUtYGV2ZW50SWRgIGZhc3QgcGF0aCBkb2VzIE5PVCBuZWVkIHRoaXMgcHJvYmU6IHRoZVxuICogY2Fub25pY2FsIGV2ZW50SWQgaXMgZHVyYWJsZSBpbiB0aGUgY2xhaW0gZmlsZSwgc28gdGhlIGV4aXN0aW5nXG4gKiBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApIHdpbGwgZmFpbCBpZmYgdGhlIGV2ZW50XG4gKiBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGV4YWN0IHBhdGgg4oCUIHdoaWNoIGlzIHRoZSBjb3JyZWN0XG4gKiBcImFscmVhZHktcHVibGlzaGVkXCIgc2VtYW50aWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgIGZpbHRlcjogKGV2ZW50KSA9PlxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICBsaW1pdDogMSxcbiAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0LmRhdGFbMF0/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYW4gXCJldmVudC1maXJzdCBvcnBoYW5cIjogdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkXG4gKiB1bnRpbCBhZnRlciB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgcHVibGlzaCBjb21taXRzIChzbyBhIGZhaWxlZFxuICogcHVibGlzaCBjYW5ub3QgbXV0YXRlIGFscmVhZHktY29tbWl0dGVkIHN0YXRlIOKAlCBzZWUgdGhlIGNvbW1lbnQgb25cbiAqIHRoZSBkZWZlcnJlZCB3cml0ZSksIHdoaWNoIG9wZW5zIHRoZSBpbnZlcnNlIGNyYXNoIHdpbmRvdyDigJQgYVxuICogY3Jhc2ggQUZURVIgdGhlIGV2ZW50IHB1Ymxpc2ggYnV0IEJFRk9SRSB0aGUgZGVmZXJyZWQgZW50aXR5IHdyaXRlXG4gKiBsZWF2ZXMgdGhlIGV2ZW50IGluIHRoZSBsb2cgd2l0aCB0aGUgaG9vayBlbnRpdHkgbWlzc2luZy4gQSByZXRyeVxuICogdGhlbiBjb2xsaWRlcyBhdCB0aGUgZXZlbnQgcHVibGlzaCBhbmQgdGhyb3dzXG4gKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKGNvcnJlY3Qg4oCUIHRoZSBldmVudCBJUyBjb21taXR0ZWQpLCBidXRcbiAqIHdpdGhvdXQgdGhpcyByZXBhaXIgdGhlIGVudGl0eSB3b3VsZCBzdGF5IG1pc3NpbmcgZm9yZXZlciBhbmQgdGhlXG4gKiBob29rIHdvdWxkIGJlIHVucmVzb2x2YWJsZS5cbiAqXG4gKiBUaGUgZW50aXR5IE1VU1QgYmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwZXJzaXN0ZWQgY2Fub25pY2FsXG4gKiBldmVudCdzIHBheWxvYWQg4oCUIE5PVCB0aGUgcmV0cnkncyBgZXZlbnREYXRhYCDigJQgb3RoZXJ3aXNlIGEgcmV0cnlcbiAqIGNhcnJ5aW5nIGRpZmZlcmVudCBgbWV0YWRhdGFgIC8gYGlzV2ViaG9va2Agd291bGQgc2lsZW50bHkgY2hhbmdlXG4gKiBjb21taXR0ZWQgc3RhdGUuIFRoZSB3cml0ZSB1c2VzIGB3cml0ZUV4Y2x1c2l2ZWAgKGNyZWF0ZS1pZi1hYnNlbnQpXG4gKiBzbyBhIGNvbmN1cnJlbnQgd3JpdGVyIHJhY2luZyB0aGlzIHJlcGFpciBjYW5ub3QgYmUgb3ZlcndyaXR0ZW47XG4gKiB3aGljaGV2ZXIgd3JpdGUgbGFuZHMgZmlyc3QsIHRoZSBjb250ZW50IGlzIGlkZW50aWNhbCBiZWNhdXNlIGJvdGhcbiAqIGRlcml2ZSBmcm9tIHRoZSBzYW1lIHBlcnNpc3RlZCBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgcGVyc2lzdGVkRXZlbnRJZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke3BlcnNpc3RlZEV2ZW50SWR9YDtcbiAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdldmVudHMnLFxuICAgIGNvbXBvc2l0ZUtleSxcbiAgICBFdmVudFNjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKFxuICAgICFwZXJzaXN0ZWRFdmVudCB8fFxuICAgIHBlcnNpc3RlZEV2ZW50LmV2ZW50VHlwZSAhPT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5jb3JyZWxhdGlvbklkICE9PSBob29rSWRcbiAgKSB7XG4gICAgLy8gTm90aGluZyB0cnVzdHdvcnRoeSB0byByZXBhaXIgZnJvbS5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnaG9va3MnLFxuICAgIGhvb2tJZCxcbiAgICBIb29rU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgLy8gRW50aXR5IGFscmVhZHkgcHJlc2VudCDigJQgbm90IGFuIG9ycGhhbiwgbGVhdmUgaXQgdW50b3VjaGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBldmVudERhdGEgPSAocGVyc2lzdGVkRXZlbnQuZXZlbnREYXRhID8/IHt9KSBhcyB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBTZXJpYWxpemVkRGF0YTtcbiAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgfTtcbiAgaWYgKHR5cGVvZiBldmVudERhdGEudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhvb2s6IEhvb2sgPSB7XG4gICAgcnVuSWQsXG4gICAgaG9va0lkLFxuICAgIHRva2VuOiBldmVudERhdGEudG9rZW4sXG4gICAgbWV0YWRhdGE6IGV2ZW50RGF0YS5tZXRhZGF0YSxcbiAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBwZXJzaXN0ZWRFdmVudC5zcGVjVmVyc2lvbixcbiAgICBpc1dlYmhvb2s6IGV2ZW50RGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgaXNTeXN0ZW06IGV2ZW50RGF0YS5pc1N5c3RlbSA/PyBmYWxzZSxcbiAgfTtcbiAgYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rSWQsIHRhZyksXG4gICAgSlNPTi5zdHJpbmdpZnkoaG9vaywganNvblJlcGxhY2VyLCAyKVxuICApO1xufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcGluIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgIGV2ZW50SWQgZm9yIGEgbGVnYWN5XG4gKiBjbGFpbSAob25lIHdpdGhvdXQgYW4gaW5saW5lIGBldmVudElkYCkuIFRoZSBmaXJzdCByZXRyeSB0b1xuICogYHdyaXRlRXhjbHVzaXZlYCB0aGUgcmVjb3ZlcnkgbWFya2VyIHdpbnM7IGl0cyBgY2FuZGlkYXRlRXZlbnRJZGBcbiAqIGJlY29tZXMgY2Fub25pY2FsLiBTdWJzZXF1ZW50IHJldHJpZXMgcmVhZCB0aGUgbWFya2VyIGFuZCBhZG9wdFxuICogaXRzIGBldmVudElkYC4gVG9nZXRoZXIgd2l0aCB0aGUgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGluXG4gKiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCwgdGhpcyBnaXZlcyB0aGUgbGVnYWN5LWZhbGxiYWNrIHBhdGggdGhlXG4gKiBzYW1lIHNpbmdsZS1ldmVudCBjb252ZXJnZW5jZSBndWFyYW50ZWUgYXMgdGhlIGlubGluZS1gZXZlbnRJZGBcbiAqIGZhc3QgcGF0aC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIGNhbGxlciB0byBhZG9wdCwgb3IgYG51bGxgXG4gKiBpZiB3ZSBsb3N0IHRoZSBtYXJrZXIgcmFjZSBBTkQgdGhlIHJlc3VsdGluZyBtYXJrZXIgZmlsZSBpc1xuICogdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS4gQ2FsbGVycyB0cmVhdCBgbnVsbGBcbiAqIGFzIFwiZ2l2ZSB1cCwgdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgXCIgc28gdGhlIHJ1bnRpbWUnc1xuICogY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzIGF0dGVtcHQgYW5kIGxldHNcbiAqIGFub3RoZXIgb25lIHRocm91Z2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlRXZlbnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgbWFya2VyUGF0aCA9IGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoYmFzZWRpciwgdG9rZW4sIHJ1bklkLCBob29rSWQpO1xuICBjb25zdCBtYXJrZXJDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoeyBldmVudElkOiBjYW5kaWRhdGVFdmVudElkIH0pO1xuICBjb25zdCB3b24gPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShtYXJrZXJQYXRoLCBtYXJrZXJDb250ZW50KTtcbiAgaWYgKHdvbikge1xuICAgIHJldHVybiBjYW5kaWRhdGVFdmVudElkO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihtYXJrZXJQYXRoKTtcbiAgcmV0dXJuIGV4aXN0aW5nPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogSW4tcHJvY2VzcyBwZXIta2V5IGFzeW5jIG11dGV4IGJhY2tlZCBieSBhIGNhbGxlci1zdXBwbGllZCBgTWFwYC5cbiAqIFVzZWQgYnkgYGNyZWF0ZUV2ZW50c1N0b3JhZ2VgIHRvIHNlcmlhbGl6ZSBzYW1lLWtleSBldmVudCB3cml0ZXNcbiAqIChgc3RlcF8qYCBmb3IgdGhlIHNhbWUgc3RlcCwgYGhvb2tfY3JlYXRlZGAgZm9yIHRoZSBzYW1lIGhvb2spLlxuICogVGhlIG1hcCBpcyBpbnN0YW50aWF0ZWQgcGVyLXN0b3JhZ2UtaW5zdGFuY2Ug4oCUIGRpZmZlcmVudFxuICogaW5zdGFuY2VzIGRvIE5PVCBzaGFyZSBsb2Nrcywgc28gdHdvIGluc3RhbmNlcyBzaGFyaW5nIG9uZSBkYXRhXG4gKiBkaXJlY3RvcnkgYmVoYXZlIGV4YWN0bHkgbGlrZSB0d28gc2VwYXJhdGUgT1MgcHJvY2Vzc2VzIGZyb20gdGhlXG4gKiBsb2NraW5nIHN0YW5kcG9pbnQuIENyb3NzLWluc3RhbmNlIC8gY3Jvc3MtcHJvY2VzcyBhcmJpdHJhdGlvblxuICogcmVsaWVzIG9uIHRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiB3aXRoSW5Qcm9jZXNzTG9jazxUPihcbiAgbG9ja3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+LFxuICBrZXk6IHN0cmluZyxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gbG9ja3MuZ2V0KGtleSk7XG4gIGNvbnN0IHRhc2tCb3g6IHsgdGFzaz86IFByb21pc2U8VD4gfSA9IHt9O1xuICBjb25zdCB0YXNrID0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAocHJldikge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHRhc2sgdG8gc2V0dGxlOyBkb24ndCBpbmhlcml0IGl0cyBlcnJvcnMuXG4gICAgICBhd2FpdCBwcmV2LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSB0YXNrQm94LnRhc2spIHtcbiAgICAgICAgbG9ja3MuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICB0YXNrQm94LnRhc2sgPSB0YXNrO1xuICBsb2Nrcy5zZXQoa2V5LCB0YXNrKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgd2FpdHMgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBbGxXYWl0c0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd2FpdHNEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3dhaXRzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyh3YWl0c0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgLy8gZmlsZUlkcyBtYXkgY29udGFpbiB0YWcgc3VmZml4ZXMgKGUuZy4sIFwid3J1bl9BQkMtY29ycklkLnZpdGVzdC0wXCIpXG4gICAgLy8gYnV0IHN0YXJ0c1dpdGggc3RpbGwgbWF0Y2hlcyBjb3JyZWN0bHkgc2luY2UgdGhlIHRhZyBpcyBhIHN1ZmZpeC5cbiAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3J1bklkfS1gKSkge1xuICAgICAgY29uc3Qgd2FpdFBhdGggPSBwYXRoLmpvaW4od2FpdHNEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04od2FpdFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgYSBsaWZlY3ljbGUtZHJpdmVuIHJ1biB1cGRhdGUgKHJ1bl9zdGFydGVkIC8gcnVuX2NvbXBsZXRlZCAvXG4gKiBydW5fZmFpbGVkIC8gcnVuX2NhbmNlbGxlZCkgdW5kZXIgdGhlIHNoYXJlZCBwZXItcnVuIGZpbGUgbG9jayxcbiAqIHJlLXJlYWRpbmcgdGhlIG9uLWRpc2sgcnVuIGluc2lkZSB0aGUgbG9jayBzbyBhbnkgYXR0cmlidXRlIHdyaXRlc1xuICogdGhhdCBsYW5kZWQgYmV0d2VlbiB0aGUgcHJlLXZhbGlkYXRpb24gYGN1cnJlbnRSdW5gIHJlYWQgYW5kIHRoaXNcbiAqIHdyaXRlIGFyZSBwcmVzZXJ2ZWQuIFdpdGhvdXQgdGhlIHJlLXJlYWQsIGFuIGBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzYFxuICogY2FsbCBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIGxpZmVjeWNsZSByZWFkIGFuZCB3cml0ZSB3b3VsZCBiZVxuICogc2lsZW50bHkgb3ZlcndyaXR0ZW4gYnkgdGhlIGxpZmVjeWNsZSB3cml0ZSdzIHN0YWxlIGF0dHJpYnV0ZSBzbmFwc2hvdC5cbiAqXG4gKiBgcHJvcG9zZWRgIGlzIHRoZSBmdWxseS1jb25zdHJ1Y3RlZCBydW4gcm93IHRoZSBjYWxsZXIgd2FudHMgdG9cbiAqIHdyaXRlICh3aXRoIHRoZSBjb3JyZWN0IGRpc2NyaW1pbmF0ZWQtdW5pb24gc3RhdHVzIGJyYW5jaCkuIE9ubHkgdGhlXG4gKiBgYXR0cmlidXRlc2AgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZnJlc2hlc3QgdmVyc2lvbiBpbnNpZGUgdGhlXG4gKiBsb2NrLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jazxUIGV4dGVuZHMgV29ya2Zsb3dSdW4+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwcm9wb3NlZDogVFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB3aXRoUnVuRmlsZUxvY2socnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLFxuICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICApO1xuICAgIGNvbnN0IG5leHQ6IFQgPSB7XG4gICAgICAuLi5wcm9wb3NlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGZyZXNoPy5hdHRyaWJ1dGVzID8/IHByb3Bvc2VkLmF0dHJpYnV0ZXMsXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUpTT04odGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLCBuZXh0LCB7XG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGV2ZW50cyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnZXZlbnRzJ10gaW50ZXJmYWNlIHdpdGggY3JlYXRlLCBsaXN0LCBhbmQgbGlzdEJ5Q29ycmVsYXRpb25JZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2V2ZW50cyddIHtcbiAgLy8gUGVyLWluc3RhbmNlIGluLXByb2Nlc3MgbXV0ZXhlcy4gVHdvIHN0b3JhZ2UgaW5zdGFuY2VzIHNoYXJpbmdcbiAgLy8gb25lIGRhdGEgZGlyZWN0b3J5IGdldCBpbmRlcGVuZGVudCBsb2NrIG1hcHMsIHdoaWNoIG1ha2VzIHRoZW1cbiAgLy8gYmVoYXZlIGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZSBsb2NraW5nXG4gIC8vIHN0YW5kcG9pbnQg4oCUIGNyb3NzLWluc3RhbmNlIGFyYml0cmF0aW9uIHJlbGllcyBvbiB0aGUgb24tZGlza1xuICAvLyBgd3JpdGVFeGNsdXNpdmVgIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLiBUZXN0cyB1c2VcbiAgLy8gdGhpcyB0byBleGVyY2lzZSBjcm9zcy1wcm9jZXNzIGNvbnZlcmdlbmNlIHdpdGhvdXQgc3Bhd25pbmdcbiAgLy8gc3VicHJvY2Vzc2VzLlxuICAvL1xuICAvLyBgc3RlcExvY2tzYCBzZXJpYWxpemVzIHN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKTogc2VlIGNvbW1lbnQgZnVydGhlciBkb3duIGluIHRoZVxuICAvLyBgaXNTdGVwRXZlbnRgIGJyYW5jaC5cbiAgLy9cbiAgLy8gYGhvb2tMb2Nrc2Agc2VyaWFsaXplcyBgaG9va19jcmVhdGVkYCBjYWxscyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBzbyB0aGUgXCJjbGFpbSB0b2tlbiwgdGhlbiB3cml0ZSBob29rXG4gIC8vIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgcnVucyB0byBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyXG4gIC8vIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlIGRlZHVwIGJyYW5jaC5cbiAgY29uc3Qgc3RlcExvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIGNvbnN0IGhvb2tMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY3JlYXRlKHJ1bklkLCBkYXRhLCBwYXJhbXMpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAvLyBWYWxpZGF0ZSByZXF1ZXN0LXN1cHBsaWVkIElEcyBiZWZvcmUgdGhleSdyZSBjb25jYXRlbmF0ZWQgaW50b1xuICAgICAgLy8gZmlsZXN5c3RlbSBwYXRocy4gVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aCB0cmF2ZXJzYWxcbiAgICAgIC8vIGF0dGFja3Mgd2hlcmUgYSBjbGllbnQgc3VwcGxpZXMgcnVuSWQgLyBjb3JyZWxhdGlvbklkIHZhbHVlcyBsaWtlXG4gICAgICAvLyBcIi4uLy4uLy4uL3BhY2thZ2VcIiB0byByZWFkIG9yIHdyaXRlIGZpbGVzIG91dHNpZGUgdGhlIHN0b3JhZ2Ugcm9vdC5cbiAgICAgIC8vIFJ1biBiZWZvcmUgdGFraW5nIHRoZSBwZXItc3RlcCBtdXRleCBzbyBtYWxmb3JtZWQgaW5wdXRzIGZhaWwgZmFzdC5cbiAgICAgIC8vXG4gICAgICAvLyBFbXB0eSBgY29ycmVsYXRpb25JZGAgdmFsdWVzIGFyZSBhbHNvIHJlamVjdGVkIGhlcmU6IHRoZSBldmVudFxuICAgICAgLy8gc2NoZW1hcyBvbmx5IHJlcXVpcmUgYHouc3RyaW5nKClgLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gd2FpdF9jcmVhdGVkIHJlcXVlc3Qgd2l0aFxuICAgICAgLy8gYGNvcnJlbGF0aW9uSWQ6ICcnYCB3b3VsZCBzaWxlbnRseSBiZSB3cml0dGVuIHVuZGVyIGEgbWFsZm9ybWVkXG4gICAgICAvLyBjb21wb3NpdGUga2V5IGxpa2UgYCR7cnVuSWR9LWAuXG4gICAgICBpZiAocnVuSWQgIT0gbnVsbCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIH1cbiAgICAgIGlmICgnY29ycmVsYXRpb25JZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5jb3JyZWxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIHNlcmlhbGl6ZWQgcGVyLXN0ZXAgdmlhIGFuIGluLXByb2Nlc3MgbXV0ZXhcbiAgICAgIC8vIHNvIHRoYXQgdGhlIFwiY2hlY2sgc3RhdGUsIHRoZW4gd3JpdGVcIiBzZXF1ZW5jZSBpbiBzdGVwX3N0YXJ0ZWQgL1xuICAgICAgLy8gc3RlcF9jb21wbGV0ZWQgLyBzdGVwX2ZhaWxlZCAvIHN0ZXBfcmV0cnlpbmcgaXMgYXRvbWljLiBzdGVwX2NyZWF0ZWRcbiAgICAgIC8vIGlzIGFsc28gc2VyaWFsaXplZCBzbyBkdXBsaWNhdGUtY3JlYXRlIHJhY2VzIGRvbid0IGxlYXZlIGV4dHJhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGluIHRoZSBsb2cuXG4gICAgICBjb25zdCBpc1N0ZXBFdmVudCA9XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJztcbiAgICAgIGlmIChpc1N0ZXBFdmVudCAmJiBydW5JZCAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgbG9ja0tleSA9IHRhZ1xuICAgICAgICAgID8gYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKHN0ZXBMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGlzIHNlcmlhbGl6ZWQgcGVyLShydW5JZCwgaG9va0lkKSBzbyB0aGVcbiAgICAgIC8vIFwiY2xhaW0gdG9rZW4sIHdyaXRlIGhvb2sgZW50aXR5LCB3cml0ZSBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG9cbiAgICAgIC8vIGNvbXBsZXRpb24gYmVmb3JlIGFub3RoZXIgaW4tcHJvY2VzcyBpbnZvY2F0aW9uIGVudGVycyB0aGVcbiAgICAgIC8vIHNhbWUtaG9vayBkZWR1cCBicmFuY2guIFdpdGhvdXQgdGhpcywgdHdvIHNhbWUtdGljayBjb25jdXJyZW50XG4gICAgICAvLyBjYWxsZXJzIGNhbiByYWNlIGJldHdlZW4gdGhlIHdpbm5lcidzIGB3cml0ZUV4Y2x1c2l2ZShjbGFpbSlgXG4gICAgICAvLyBhbmQgYHdyaXRlSlNPTihob29rKWAsIG1ha2luZyB0aGUgc2Vjb25kIGNhbGxlciBtb21lbnRhcmlseVxuICAgICAgLy8gb2JzZXJ2ZSBhIGNsYWltIHdpdGggbm8gbWF0Y2hpbmcgaG9vayBlbnRpdHkg4oCUIHdoaWNoIHRoZVxuICAgICAgLy8gY3Jhc2gtcmVjb3ZlcnkgcGF0aCBiZWxvdyB3b3VsZCBtaXNpbnRlcnByZXQgYXMgYSBwcmlvciBjcmFzaFxuICAgICAgLy8gYW5kIGluY29ycmVjdGx5IGZhbGwgdGhyb3VnaCB0byBhIHNlY29uZCBob29rIGVudGl0eSB3cml0ZS5cbiAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uaG9vay4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2tgO1xuICAgICAgICByZXR1cm4gd2l0aEluUHJvY2Vzc0xvY2soaG9va0xvY2tzLCBsb2NrS2V5LCAoKSA9PiBjcmVhdGVJbXBsKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZUltcGwoKTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSW1wbCgpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAgIC8vIE1vc3QgcGF0aHMgdXNlIHRoZSBmcmVzaGx5LWdlbmVyYXRlZCBjYW5kaWRhdGUgZXZlbnRJZC4gVGhlXG4gICAgICAgIC8vIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBwYXRoIGJlbG93IG1heSByZWFzc2lnbiBpdCB0b1xuICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgcGVyc2lzdGVkIGluIHRoZSBkdXJhYmxlIHRva2VuIGNsYWltXG4gICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgY29udmVyZ2Ugb24gYSBzaW5nbGVcbiAgICAgICAgLy8gZXZlbnQgaW4gdGhlIGxvZy5cbiAgICAgICAgbGV0IGV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIEZvciBydW5fY3JlYXRlZCBldmVudHMsIHVzZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgb3IgZ2VuZXJhdGUgb25lIHNlcnZlci1zaWRlXG4gICAgICAgIGxldCBlZmZlY3RpdmVSdW5JZDogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgKCFydW5JZCB8fCBydW5JZCA9PT0gJycpKSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBgd3J1bl8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKCFydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncnVuSWQgaXMgcmVxdWlyZWQgZm9yIG5vbi1ydW5fY3JlYXRlZCBldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IHJ1bklkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY2xpZW50LXByb3ZpZGVkIHJ1bklkIHRpbWVzdGFtcCBpcyB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGRcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmIHJ1bklkICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRlVWxpZFRpbWVzdGFtcChcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgJ3dydW5fJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNWZXJzaW9uIGlzIGFsd2F5cyBzZW50IGJ5IHRoZSBydW50aW1lLCBidXQgd2UgcHJvdmlkZSBhIGZhbGxiYWNrIGZvciBzYWZldHlcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU3BlY1ZlcnNpb24gPSBkYXRhLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5UO1xuXG4gICAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBydW4gaXMgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgICAgY29uc3QgaXNSdW5UZXJtaW5hbCA9IChzdGF0dXM6IHN0cmluZykgPT5cbiAgICAgICAgICBbJ2NvbXBsZXRlZCcsICdmYWlsZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXMoc3RhdHVzKTtcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgc3RlcCBpcyBpbiB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICBjb25zdCBpc1N0ZXBUZXJtaW5hbCA9IChzdGF0dXM6IHN0cmluZykgPT5cbiAgICAgICAgICBbJ2NvbXBsZXRlZCcsICdmYWlsZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXMoc3RhdHVzKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBydW4gc3RhdGUgZm9yIHZhbGlkYXRpb24gKGlmIG5vdCBjcmVhdGluZyBhIG5ldyBydW4pXG4gICAgICAgIC8vIFNraXAgcnVuIHZhbGlkYXRpb24gZm9yIHN0ZXBfY29tcGxldGVkIGFuZCBzdGVwX3JldHJ5aW5nIC0gdGhleSBvbmx5IG9wZXJhdGVcbiAgICAgICAgLy8gb24gcnVubmluZyBzdGVwcywgYW5kIHJ1bm5pbmcgc3RlcHMgYXJlIGFsd2F5cyBhbGxvd2VkIHRvIG1vZGlmeSByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIHJ1biBzdGF0ZS4gVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgZmlsZXN5c3RlbSByZWFkcyBwZXIgc3RlcCBldmVudC5cbiAgICAgICAgbGV0IGN1cnJlbnRSdW46IFdvcmtmbG93UnVuIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNraXBSdW5WYWxpZGF0aW9uRXZlbnRzID0gWydzdGVwX2NvbXBsZXRlZCcsICdzdGVwX3JldHJ5aW5nJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSAhPT0gJ3J1bl9jcmVhdGVkJyAmJlxuICAgICAgICAgICFza2lwUnVuVmFsaWRhdGlvbkV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0YXJ0OiBydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuIHdpdGggZXZlbnREYXRhXG4gICAgICAgICAgLy8gY3JlYXRlcyB0aGUgcnVuIGZpcnN0LCBzbyB0aGUgcXVldWUgY2FuIGJvb3RzdHJhcCBhIHJ1biB0aGF0XG4gICAgICAgICAgLy8gZmFpbGVkIHRvIGNyZWF0ZSBkdXJpbmcgc3RhcnQoKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRSdW4gJiZcbiAgICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBydW5JbnB1dERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICBpbnB1dD86IGFueTtcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuZGVwbG95bWVudElkICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcChcbiAgICAgICAgICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBBdG9taWNhbGx5IHRyeSB0byBwdWJsaXNoIHRoZSBydW4gZW50aXR5IHNvIG9ubHkgdGhlIGZpcnN0XG4gICAgICAgICAgICAgIC8vIHdyaXRlciB3aW5zLCBwcmV2ZW50aW5nIGEgVE9DVE9VIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9jcmVhdGVkIGZyb20gc3RhcnQoKSBjb3VsZCBvdmVyd3JpdGUgYSBydW4gdGhhdCB3YXNcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gJ3J1bm5pbmcnLlxuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUnVuOiBXb3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNyZWF0ZWRSdW4sIGpzb25SZXBsYWNlcilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZWQgdGhlIHJ1biDigJQgYWxzbyB3cml0ZSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkOiBydW5DcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7cnVuQ3JlYXRlZEV2ZW50SWR9YDtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjcmVhdGVkQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gY3JlYXRlZFJ1bjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBleGlzdHMgKGNvbmN1cnJlbnQgcnVuX2NyZWF0ZWQgd29uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJhY2UpLiBSZS1yZWFkIGl0IHNvIGRvd25zdHJlYW0gbG9naWMgc2VlcyB0aGUgcmVhbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW5fZmFpbGVkIG9uIGEgbm9uLWV4aXN0ZW50IHJ1biBpcyByZWplY3RlZCB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gcG9zdGdyZXMgYW5kIHZlcmNlbCB3b3JsZHMsIHdoaWNoIGJvdGggc3VyZmFjZSB0aGlzIGFzIGFcbiAgICAgICAgLy8gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHJhdGhlciB0aGFuIHNpbGVudGx5IHBlcnNpc3RpbmcgYW5cbiAgICAgICAgLy8gZXZlbnQgZm9yIGEgcnVuIHRoYXQgd2FzIG5ldmVyIGNyZWF0ZWQuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkVSU0lPTiBDT01QQVRJQklMSVRZOiBDaGVjayBydW4gc3BlYyB2ZXJzaW9uXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGb3IgZXZlbnRzIHRoYXQgaGF2ZSBmZXRjaGVkIHRoZSBydW4sIGNoZWNrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy8gU2tpcCBmb3IgcnVuX2NyZWF0ZWQgKG5vIGV4aXN0aW5nIHJ1bikgYW5kIHJ1bnRpbWUgZXZlbnRzIChzdGVwX2NvbXBsZXRlZCwgc3RlcF9yZXRyeWluZykuXG4gICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcnVuIHJlcXVpcmVzIGEgbmV3ZXIgd29ybGQgdmVyc2lvblxuICAgICAgICAgIGlmIChyZXF1aXJlc05ld2VyV29ybGQoY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5Ob3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgICAgY3VycmVudFJ1bi5zcGVjVmVyc2lvbiEsXG4gICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9DVVJSRU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJvdXRlIHRvIGxlZ2FjeSBoYW5kbGVyIGZvciBwcmUtZXZlbnQtc291cmNpbmcgcnVuc1xuICAgICAgICAgIGlmIChpc0xlZ2FjeVNwZWNWZXJzaW9uKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlTGVnYWN5RXZlbnQoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLFxuICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZBTElEQVRJT046IFRlcm1pbmFsIHN0YXRlIGFuZCBldmVudCBvcmRlcmluZyBjaGVja3NcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBhIHN0ZXBfc3RhcnRlZCBjYXJyeWluZyBzdGVwLWNyZWF0aW9uIGRhdGFcbiAgICAgICAgLy8gKHN0ZXBOYW1lICsgaW5wdXQpIGlzIGFsbG93ZWQgdG8gYXJyaXZlIHdpdGggbm8gcHJpb3Igc3RlcF9jcmVhdGVkXG4gICAgICAgIC8vIOKAlCBpdCBjcmVhdGVzIHRoZSBzdGVwIG9uIHRoZSBmbHkgKHNlZSB0aGUgbWF0ZXJpYWxpemF0aW9uIGJsb2NrXG4gICAgICAgIC8vIGJlbG93KS4gVGhpcyBtaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aC4gRGV0ZWN0IGl0IGhlcmVcbiAgICAgICAgLy8gc28gdGhlIGVudGl0eS1jcmVhdGlvbiB0ZXJtaW5hbC1ydW4gZ3VhcmQgdHJlYXRzIGl0IGxpa2UgYSBjcmVhdGlvblxuICAgICAgICAvLyBhbmQgdGhlIFwic3RlcCBtdXN0IGV4aXN0XCIgb3JkZXJpbmcgZ3VhcmQgZG9lc24ndCByZWplY3QgaXQuXG4gICAgICAgIGNvbnN0IGxhenlTdGVwU3RhcnQgPVxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAhIWRhdGEuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIChkYXRhLmV2ZW50RGF0YSBhcyB7IHN0ZXBOYW1lPzogdW5rbm93biB9KS5zdGVwTmFtZSA9PT1cbiAgICAgICAgICAgICdzdHJpbmcnICYmXG4gICAgICAgICAgKGRhdGEuZXZlbnREYXRhIGFzIHsgaW5wdXQ/OiB1bmtub3duIH0pLmlucHV0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUnVuIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCBydW5UZXJtaW5hbEV2ZW50cyA9IFtcbiAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIElkZW1wb3RlbnQgb3BlcmF0aW9uOiBydW5fY2FuY2VsbGVkIG9uIGFscmVhZHkgY2FuY2VsbGVkIHJ1biBpcyBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJyAmJlxuICAgICAgICAgICAgY3VycmVudFJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgc3RhdGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgZXZlbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpLFxuICAgICAgICAgICAgICBydW46IGN1cnJlbnRSdW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciBydW5fc3RhcnRlZCBvbiB0ZXJtaW5hbCBydW5zLCB1c2UgUnVuRXhwaXJlZEVycm9yIHNvIHRoZVxuICAgICAgICAgIC8vIHJ1bnRpbWUga25vd3MgdG8gZXhpdCB3aXRob3V0IHJldHJ5aW5nLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgaXMgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE90aGVyIHJ1biBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgbm90IGFsbG93ZWQgb24gdGVybWluYWwgcnVuc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJ1blRlcm1pbmFsRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgdHJhbnNpdGlvbiBydW4gZnJvbSB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0aW5nIG5ldyBlbnRpdGllcyBvbiB0ZXJtaW5hbCBydW5zIGlzIG5vdCBhbGxvd2VkLiBBIGxhenlcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgY3JlYXRlcyBhIHN0ZXAsIHNvIGl0IGlzIHJlamVjdGVkIGhlcmUgdG9vIOKAlCBhIGJhcmVcbiAgICAgICAgICAvLyAobm9uLWxhenkpIHN0ZXBfc3RhcnRlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBzdGVwLXZhbGlkYXRpb25cbiAgICAgICAgICAvLyBibG9jayBiZWxvdywgd2hpY2ggdXNlcyBSdW5FeHBpcmVkRXJyb3IgZm9yIHRlcm1pbmFsIHJ1bnMuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgbGF6eVN0ZXBTdGFydFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgY3JlYXRlIG5ldyBlbnRpdGllcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHNldCBhdHRyaWJ1dGVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAtcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZyBhbmQgdGVybWluYWwgc3RhdGUpXG4gICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nU3RlcCBzbyB3ZSBjYW4gcmV1c2UgaXQgbGF0ZXIgKGF2b2lkIGRvdWJsZSByZWFkKVxuICAgICAgICBsZXQgdmFsaWRhdGVkU3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBzdGVwRXZlbnRzID0gW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzdGVwRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFdmVudCBvcmRlcmluZzogc3RlcCBtdXN0IGV4aXN0IGJlZm9yZSB0aGVzZSBldmVudHMg4oCUIGV4Y2VwdCBvblxuICAgICAgICAgIC8vIHRoZSBsYXp5LXN0YXJ0IHBhdGgsIHdoZXJlIHN0ZXBfc3RhcnRlZCBjcmVhdGVzIHRoZSBzdGVwIGl0c2VsZi5cbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXAgJiYgIWxhenlTdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMYXp5IHN0YXJ0IGV4YWN0bHktb25jZSBnYXRlOiBhIGxhenkgc3RlcF9zdGFydGVkIGFsd2F5cyBDUkVBVEVTXG4gICAgICAgICAgLy8gdGhlIHN0ZXAgKHRoZSBvd25lZC1pbmxpbmUgcGF0aCBvbmx5IHNlbmRzIG9uZSBmb3IgYSBzdGVwIHdob3NlXG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGl0IGRlZmVycmVkKS4gSWYgdGhlIHN0ZXAgYWxyZWFkeSBleGlzdHMsIGEgY29uY3VycmVudFxuICAgICAgICAgIC8vIGhhbmRsZXIgd29uIHRoZSBjcmVhdGUg4oCUIHRoaXMgY2FsbGVyIGlzIGEgbG9zZXIgYW5kIG11c3Qgbm90IHN0YXJ0XG4gICAgICAgICAgLy8gb3IgcnVuIHRoZSBzdGVwLiBUaHJvdyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGVjdXRlU3RlcCBtYXBzIGl0IHRvIGBza2lwcGVkYC4gVGhpcyBpcyBjcml0aWNhbDogdGhlIHBsYWluIHN0YXJ0XG4gICAgICAgICAgLy8gdHJhbnNpdGlvbiBiZWxvdyBwZXJtaXRzIHJlLXN0YXJ0aW5nIGEgbm9uLXRlcm1pbmFsIHN0ZXAgKHJldHJpZXNcbiAgICAgICAgICAvLyByZWx5IG9uIHRoYXQpLCBzbyB3aXRob3V0IHRoaXMgZ2F0ZSBhIGxvc2VyIHdvdWxkIHJlLXN0YXJ0IGFcbiAgICAgICAgICAvLyBydW5uaW5nIHN0ZXAgYW5kIHJ1biB0aGUgYm9keSBhIHNlY29uZCB0aW1lLlxuICAgICAgICAgIGlmIChsYXp5U3RlcFN0YXJ0ICYmIHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uLiB2YWxpZGF0ZWRTdGVwIGNhbiBiZSBudWxsIG9ubHkgb25cbiAgICAgICAgICAvLyB0aGUgbGF6eS1zdGFydCBwYXRoIChubyBzdGVwIHlldCkg4oCUIHRoZXJlIGlzIG5vdGhpbmcgdGVybWluYWwgdG9cbiAgICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGluIHRoYXQgY2FzZSwgc28gdGhlc2UgY2hlY2tzIGFyZSBza2lwcGVkLlxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBpZiAoaXNTdGVwVGVybWluYWwodmFsaWRhdGVkU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXAuc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgbm9uLXJ1bm5pbmcgc3RlcCBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBgZXZlbnRgIG1heSBiZSByZWFzc2lnbmVkIGxhdGVyIGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBkZWR1cC1yZWNvdmVyeSBicmFuY2ggdG8gc3dhcCBpbiBhIGNhbm9uaWNhbCBldmVudElkIC9cbiAgICAgICAgLy8gY3JlYXRlZEF0IHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbSBzb1xuICAgICAgICAvLyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIGV2ZW50RGF0YSBmcm9tIHJ1bl9zdGFydGVkIOKAlCBpdCBiZWxvbmdzIG9uIHJ1bl9jcmVhdGVkIG9ubHkuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiAnZXZlbnREYXRhJyBpbiBldmVudCkge1xuICAgICAgICAgIGRlbGV0ZSAoZXZlbnQgYXMgYW55KS5ldmVudERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RyaXAgb25seSB0aGUgc3RlcCBgaW5wdXRgIGZyb20gdGhlIGxhenkgc3RlcF9zdGFydGVkIGV2ZW50IHJvdyDigJRcbiAgICAgICAgLy8gaXQgYmVsb25ncyBvbiB0aGUgc3ludGhldGljIHN0ZXBfY3JlYXRlZCB3cml0dGVuIGFib3ZlLiBzdGVwTmFtZSBpc1xuICAgICAgICAvLyBwcmVzZXJ2ZWQgZm9yIHRoZSBjbGllbnQgcmVwbGF5IGNvbnN1bWVyJ3Mgc3RlcC1uYW1lIGRpdmVyZ2VuY2VcbiAgICAgICAgLy8gY2hlY2sgKHBhY2thZ2VzL2NvcmUvc3JjL3N0ZXAudHMpLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgbGF6eVN0ZXBTdGFydCAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmXG4gICAgICAgICAgKGV2ZW50IGFzIHsgZXZlbnREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZXZlbnREYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgaW5wdXQ6IF9zdHJpcHBlZElucHV0LCAuLi5yZXN0IH0gPSAoXG4gICAgICAgICAgICBldmVudCBhcyB7IGV2ZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuICAgICAgICAgICkuZXZlbnREYXRhO1xuICAgICAgICAgIChldmVudCBhcyB7IGV2ZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZXZlbnREYXRhID0gcmVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIGVudGl0eSBjcmVhdGVkL3VwZGF0ZWQgZm9yIEV2ZW50UmVzdWx0XG4gICAgICAgIGxldCBydW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RlcDogU3RlcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2sgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB3YWl0OiBXYWl0IHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBMYXp5IHN0ZXAgc3RhcnQ6IHNldCB0cnVlIHdoZW4gdGhpcyBzdGVwX3N0YXJ0ZWQgYXRvbWljYWxseSBjcmVhdGVkXG4gICAgICAgIC8vIHRoZSBzdGVwICh0aGUgY2FsbGVyIHdvbiB0aGUgY3JlYXRlLWNsYWltKS4gU3VyZmFjZWQgb24gRXZlbnRSZXN1bHRcbiAgICAgICAgLy8gYXMgdGhlIHJ1bnRpbWUncyBleGFjdGx5LW9uY2Ugb3duZXJzaGlwIHNpZ25hbC5cbiAgICAgICAgbGV0IHN0ZXBDcmVhdGVkTGF6aWx5ID0gZmFsc2U7XG4gICAgICAgIC8vIEZvciBgaG9va19jcmVhdGVkYCwgdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkIHVudGlsXG4gICAgICAgIC8vIEFGVEVSIHRoZSBvdXRlciBldmVudCBwdWJsaXNoIHN1Y2NlZWRzLCBzbyBhIHJldHJ5IHRoYXRcbiAgICAgICAgLy8gY29sbGlkZXMgd2l0aCBhbiBhbHJlYWR5LXB1Ymxpc2hlZCBgaG9va19jcmVhdGVkYCBkb2VzIG5vdFxuICAgICAgICAvLyBtdXRhdGUgdGhlIGR1cmFibGUgaG9vayBlbnRpdHkgd2l0aCB0aGUgcmV0cnkncyBwYXlsb2FkLlxuICAgICAgICAvLyBgaG9va0VudGl0eVdyaXRlT3B0aW9uc2AgY2FycmllcyB0aGUgYHsgb3ZlcndyaXRlIH1gIG1vZGVcbiAgICAgICAgLy8gY2hvc2VuIGJ5IHRoZSBkZWR1cC1yZWNvdmVyeSBicmFuY2ggYWJvdmUgKHVuZGVmaW5lZCBmb3JcbiAgICAgICAgLy8gZmlyc3Qgd3JpdGVycywgYHsgb3ZlcndyaXRlOiB0cnVlIH1gIGZvciByZXRyaWVzIHRoYXQgbWF5XG4gICAgICAgIC8vIGJlIHJlcGFpcmluZyBhbiBvcnBoYW5lZCBwYXJ0aWFsIHdyaXRlKS5cbiAgICAgICAgbGV0IGhvb2tFbnRpdHlXcml0ZU9wdGlvbnM6IHsgb3ZlcndyaXRlOiBib29sZWFuIH0gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQ3JlYXRlL3VwZGF0ZSBlbnRpdHkgYmFzZWQgb24gZXZlbnQgdHlwZSAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAgIC8vIFJ1biBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgcnVuRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHJ1bkRhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW4gPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bkRhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bkRhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBydW4gZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5EYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICBpbnB1dDogcnVuRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bkRhdGEuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBBdG9taWNhbGx5IHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgZmlsZSB3aXRob3V0IG92ZXJ3cml0aW5nIGFuXG4gICAgICAgICAgLy8gZXhpc3Rpbmcgd2lubmVyLiBUaGlzIHByZXZlbnRzIGEgVE9DVE9VIHJhY2Ugd2l0aCB0aGUgcmVzaWxpZW50XG4gICAgICAgICAgLy8gc3RhcnQgcGF0aCAocnVuX3N0YXJ0ZWQgb24gbm9uLWV4aXN0ZW50IHJ1bikgdGhhdCBjb3VsZCByZXN1bHQgaW5cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgcnVuX2NyZWF0ZWQgZXZlbnRzIGluIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocnVuLCBqc29uUmVwbGFjZXIsIDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gSWYgYWxyZWFkeSBydW5uaW5nLCByZXR1cm4gdGhlIHJ1biB3aXRob3V0IGluc2VydGluZyBhXG4gICAgICAgICAgICAvLyBkdXBsaWNhdGUgZXZlbnQuICBUaGlzIG1ha2VzIHJ1bl9zdGFydGVkIGlkZW1wb3RlbnQgZm9yXG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGludm9jYXRpb25zLiAgV2Ugb21pdCBwcmVsb2FkZWQgZXZlbnRzIGhlcmVcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcyBpcyBhIHJhcmUgcmFjZS1jb25kaXRpb24gcGF0aCDigJQgdGhlIHJ1bnRpbWVcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gbG9hZFdvcmtmbG93UnVuRXZlbnRzKCkuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJ1bi5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4geyBydW46IGN1cnJlbnRSdW4gfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyBvdXRwdXQ/OiBhbnkgfTtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IGNvbXBsZXRlZERhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIGVycm9yQ29kZT86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVJ1bkVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlUnVuRXJyb3IgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmYWlsZWREYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBmYWlsZWREYXRhLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJykge1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmIGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICBydW4gPSBhd2FpdCB3aXRoUnVuRmlsZUxvY2soZWZmZWN0aXZlUnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyZXNoID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWZyZXNoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKGRhdGEuZXZlbnREYXRhLmNoYW5nZXMsIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdLZXlzOiBPYmplY3Qua2V5cyhmcmVzaC5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENsYWltIHRoZSBjb3JyZWxhdGlvbiBkZWR1cCBsb2NrIG9ubHkgYWZ0ZXIgdmFsaWRhdGlvbjogYVxuICAgICAgICAgICAgLy8gdmFsaWRhdGlvbiBmYWlsdXJlIG11c3QgbGVhdmUgdGhlIGNvcnJlbGF0aW9uSWQgdW5jbGFpbWVkIHNvXG4gICAgICAgICAgICAvLyB0aGUgcnVudGltZSdzIHJldHJ5IG9mIHRoZSBzYW1lIGV2ZW50IGlzIG5vdCBtaXNyZXBvcnRlZCBhc1xuICAgICAgICAgICAgLy8gXCJhbHJlYWR5IGV4aXN0c1wiIHdoaWxlIHRoZSBldmVudCB3YXMgbmV2ZXIgd3JpdHRlbiAodGhlXG4gICAgICAgICAgICAvLyBkaXNwYXRjaGVyIHdvdWxkIHRoZW4gd2FpdCBmb3JldmVyIGZvciBhbiBldmVudCB0aGF0IGlzIG5vdFxuICAgICAgICAgICAgLy8gaW4gdGhlIGxvZykuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCAmJlxuICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS53cml0ZXIudHlwZSA9PT0gJ3dvcmtmbG93J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgICAgIGF0dHJMb2NrTmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBhdHRyQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGF0dHJMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgICBpZiAoIWF0dHJDbGFpbWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQXR0cmlidXRlIGV2ZW50IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHtcbiAgICAgICAgICAgICAgLi4uZnJlc2gsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGFwcGx5QXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICBmcmVzaC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLmNoYW5nZXNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9IGFzIFdvcmtmbG93UnVuO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyksXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBTdGVwIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZDogQ3JlYXRlcyBzdGVwIGVudGl0eSB3aXRoIHN0YXR1cyAncGVuZGluZycsIGF0dGVtcHQ9MCwgY3JlYXRlZEF0IHNldC5cbiAgICAgICAgICAvLyBUd28gY29uY3VycmVudCBpbnZvY2F0aW9ucyB3aXRoIGlkZW50aWNhbCBjb3JyZWxhdGlvbklkcyAoZS5nLiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBydW50aW1lJ3MgZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkcyBhY3Jvc3MgcmVwbGF5cylcbiAgICAgICAgICAvLyBtdXN0IGJlIGRlZHVwZWQg4oCUIG90aGVyd2lzZSBib3RoIHdyaXRlcyBzdWNjZWVkIGFuZCB0aGUgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gZW5kcyB1cCB3aXRoIGR1cGxpY2F0ZSBzdGVwX2NyZWF0ZWQgZW50cmllcy4gVGhlIG91dGVyXG4gICAgICAgICAgLy8gd2l0aFN0ZXBMb2NrIG11dGV4IHNlcmlhbGl6ZXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3M7IHRoaXNcbiAgICAgICAgICAvLyBUaGUgZXhjbHVzaXZlIGNvbnN0cmFpbnQgZmlsZSBhZGRpdGlvbmFsbHkgcHJvdGVjdHMgYWdhaW5zdFxuICAgICAgICAgIC8vIGNyb3NzLXByb2Nlc3MgcmFjZXMgKHR3byBwbnBtIHdvcmtlcnMsIHJlZGVsaXZlcmVkIHF1ZXVlIG1lc3NhZ2VzLFxuICAgICAgICAgIC8vIGV0Yy4pLiBUaGUgbG9zZXIgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3Igc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgIC8vIGV4aXN0aW5nIGNhdGNoIHBhdGggY2FuIHN3YWxsb3cgaXQgYW5kIGF2b2lkIGRvdWJsZS1xdWV1aW5nIHRoZVxuICAgICAgICAgIC8vIHN0ZXAuXG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFzdGVwQ3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN0ZXBEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBhbnk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgc3RlcElkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBzdGVwTmFtZTogc3RlcERhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIGlucHV0OiBzdGVwRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dGVtcHQ6IDAsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBzdGVwIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHN0ZXBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZDogSW5jcmVtZW50cyBhdHRlbXB0LCBzZXRzIHN0YXR1cyB0byAncnVubmluZydcbiAgICAgICAgICAvLyBTZXRzIHN0YXJ0ZWRBdCBvbmx5IG9uIHRoZSBmaXJzdCBzdGFydCAobm90IHVwZGF0ZWQgb24gcmV0cmllcylcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuXG4gICAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBubyBwcmlvciBzdGVwX2NyZWF0ZWQg4oCUIGNyZWF0ZSB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAvLyBhbmQgYSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IG5vdywgdGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgICAgICAgLy8gc3RhcnQgdHJhbnNpdGlvbiBiZWxvdy4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHJ1bl9zdGFydGVkIHBhdGg6XG4gICAgICAgICAgLy8gdGhlIHN0ZXAgZW50aXR5IGlzIGNsYWltZWQgYXRvbWljYWxseSAoZmlyc3Qgd3JpdGVyIHdpbnMpIGFuZCB0aGVcbiAgICAgICAgICAvLyBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IGtlZXBzIHJlcGxheSBjb3JyZWN0ICh0aGUgY2xpZW50IHN0ZXBcbiAgICAgICAgICAvLyBjb25zdW1lciBtYXJrcyBoYXNDcmVhdGVkRXZlbnQgb25seSB3aGVuIGl0IG9ic2VydmVzIHRoYXQgZXZlbnQpLlxuICAgICAgICAgIGlmICghdmFsaWRhdGVkU3RlcCAmJiBsYXp5U3RlcFN0YXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBsYXp5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIGFscmVhZHkgY2xhaW1lZCB0aGUgY3JlYXRlIGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIHN0ZXAuIFRoZSBhdG9taWMgY2xhaW0gaXMgdGhlIGV4YWN0bHktb25jZSBvd25lcnNoaXAgZ2F0ZTpcbiAgICAgICAgICAgICAgLy8gb25seSB0aGUgd2lubmVyIHJ1bnMgdGhlIHN0ZXAgYm9keSBpbmxpbmUuIFRocm93XG4gICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oCUIHRoZSBydW50aW1lJ3MgZXhlY3V0ZVN0ZXAgbWFwcyB0aGlzIHRvXG4gICAgICAgICAgICAgIC8vIGBza2lwcGVkYCwgc28gdGhlIGxvc2VyIGRvZXMgbm90IHN0YXJ0IG9yIHJ1biB0aGUgc3RlcC4gVGhpc1xuICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZXMgdGhlIHNhbWUgXCJleGFjdGx5IG9uZSBoYW5kbGVyIG93bnMgZWFjaCBzdGVwXCJcbiAgICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoZSBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgY2xhaW0gcHJvdmlkZXMgdG9kYXkuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFN0ZXA6IFN0ZXAgPSB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogbGF6eURhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICAgICAgYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdGVwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IHNvIHJlcGxheSBvYnNlcnZlcyBpdFxuICAgICAgICAgICAgICAvLyAodGhlIGNsaWVudCBzdGVwIGNvbnN1bWVyIHNldHMgaGFzQ3JlYXRlZEV2ZW50IG9ubHkgb24gYVxuICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnQpLiBJdHMgZXZlbnRJZCBpcyBhIGZyZXNoIG1vbm90b25pYyBVTElELlxuICAgICAgICAgICAgICAvLyBPcmRlcmluZyB2cy4gdGhlIHN0ZXBfc3RhcnRlZCBldmVudCByb3cgZG9lcyBub3QgYWZmZWN0XG4gICAgICAgICAgICAgIC8vIGNvcnJlY3RuZXNzOiB0aGUgc3RlcF9zdGFydGVkIGNvbnN1bWVyIGlzIGEgbm8tb3AgYW5kIG9ubHlcbiAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGZsaXBzIGhhc0NyZWF0ZWRFdmVudCwgc28gdGhlIGVuZCBzdGF0ZSBpcyB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB3aGljaGV2ZXIgc29ydHMgZmlyc3Qg4oCUIHRoaXMgbWF0Y2hlcyB0aGUgcmVzaWxpZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIOKGkiBydW5fY3JlYXRlZCBwcmVjZWRlbnQgaW4gdGhpcyBmaWxlLlxuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkOiBzdGVwQ3JlYXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBsYXp5RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgICAgICAgICAgIGAke2VmZmVjdGl2ZVJ1bklkfS0ke3N0ZXBDcmVhdGVkRXZlbnRJZH1gLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBjcmVhdGVkU3RlcDtcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMYXppbHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXNuJ3QgYmVlbiByZWFjaGVkIHlldFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSA+IERhdGUubm93KClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vRWFybHlFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHN0YXJ0IHN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIjogcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXRyeUFmdGVyOiBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgZ3VhcmQ6IHJlLXJlYWQgdGhlIHN0ZXAgZW50aXR5IHRvIGNoZWNrIGlmIGl0XG4gICAgICAgICAgICAvLyByZWFjaGVkIHRlcm1pbmFsIHN0YXRlIGJldHdlZW4gdGhlIHZhbGlkYXRpb24gcmVhZCBhbmQgbm93LlxuICAgICAgICAgICAgLy8gVGhpcyBuYXJyb3dzIHRoZSBUT0NUT1Ugd2luZG93IGJ1dCBkb2VzIG5vdCBmdWxseSBlbGltaW5hdGUgaXRcbiAgICAgICAgICAgIC8vICh0aGUgbG9jYWwgd29ybGQgaXMgc2luZ2xlLXByb2Nlc3MgLyBkZXYtb25seTsgdGhlIHBvc3RncmVzXG4gICAgICAgICAgICAvLyB3b3JsZCB1c2VzIFNRTC1sZXZlbCBhdG9taWMgZ3VhcmRzIGZvciBwcm9kdWN0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGZyZXNoU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgICBTdGVwU2NoZW1hLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJlc2hTdGVwICYmIGlzU3RlcFRlcm1pbmFsKGZyZXNoU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke2ZyZXNoU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAvLyBPbmx5IHNldCBzdGFydGVkQXQgb24gdGhlIGZpcnN0IHN0YXJ0XG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdmFsaWRhdGVkU3RlcC5zdGFydGVkQXQgPz8gbm93LFxuICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgYXR0ZW1wdCBjb3VudGVyIG9uIGV2ZXJ5IHN0YXJ0XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IHZhbGlkYXRlZFN0ZXAuYXR0ZW1wdCArIDEsXG4gICAgICAgICAgICAgIC8vIENsZWFyIHJldHJ5QWZ0ZXIgbm93IHRoYXQgdGhlIHN0ZXAgaGFzIHN0YXJ0ZWRcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfY29tcGxldGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIG91dHB1dFxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHsgcmVzdWx0OiBhbnkgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICBvdXRwdXQ6IGNvbXBsZXRlZERhdGEucmVzdWx0LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfZmFpbGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIGVycm9yXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBmYWlsaW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBmYWlsZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgU2VyaWFsaXplZERhdGEgKFVpbnQ4QXJyYXkpIHByb2R1Y2VkIGJ5XG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVTdGVwRXJyb3IgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgIGVycm9yOiBmYWlsZWREYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX3JldHJ5aW5nOiBTZXRzIHN0YXR1cyBiYWNrIHRvICdwZW5kaW5nJywgcmVjb3JkcyBlcnJvclxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgY29uc3QgcmV0cnlEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgZXJyb3I6IHJldHJ5RGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiByZXRyeURhdGEucmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIEhvb2sgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaG9va0RhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICAgICAgbWV0YWRhdGE/OiBhbnk7XG4gICAgICAgICAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgICAgICAgICAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBBdG9taWNhbGx5IGNsYWltIHRoZSB0b2tlbiB1c2luZyBhbiBleGNsdXNpdmUtY3JlYXRlIGNvbnN0cmFpbnQgZmlsZS5cbiAgICAgICAgICAvLyBUaGlzIGF2b2lkcyB0aGUgVE9DVE9VIHJhY2Ugb2YgdGhlIHByZXZpb3VzIHJlYWQtYWxsLXRoZW4tY2hlY2sgYXBwcm9hY2guXG4gICAgICAgICAgY29uc3QgY29uc3RyYWludFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICd0b2tlbnMnLFxuICAgICAgICAgICAgYCR7aGFzaFRva2VuKGhvb2tEYXRhLnRva2VuKX0uanNvbmBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFBlcnNpc3QgYGV2ZW50SWRgIGluIHRoZSBjbGFpbSBzbyBjb25jdXJyZW50IC8gY3Jvc3MtXG4gICAgICAgICAgLy8gcHJvY2VzcyByZXRyaWVzIGNhbiBjb252ZXJnZSBvbiBhIHNpbmdsZSBjYW5vbmljYWxcbiAgICAgICAgICAvLyBgaG9va19jcmVhdGVkYCBldmVudCBwYXRoLiBTZWUgdGhlIHJlY292ZXJ5IGNvbW1lbnRcbiAgICAgICAgICAvLyBiZWxvdy5cbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZWNvdmVyeSBzaGFwZTogdGhlIGR1cmFibGUgcmVjb3JkIG9mIGEgc3VjY2Vzc2Z1bCBob29rXG4gICAgICAgICAgLy8gY3JlYXRpb24gaXMgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgYW5kIGhvb2sgZW50aXR5IGFyZSB3cml0dGVuIGJlZm9yZSB0aGUgZXZlbnQsXG4gICAgICAgICAgLy8gYW5kIHRoZSB0aHJlZSB3cml0ZXMgYXJlIE5PVCBhdG9taWMsIHNvIGEgY3Jhc2ggYXQgYW55XG4gICAgICAgICAgLy8gcG9pbnQgY2FuIGxlYXZlIG9uZSBvciB0d28gb2YgdGhlbSBvbiBkaXNrIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gZXZlbnQuIFRyZWF0aW5nIHRob3NlIGFzIFwiY29tcGxldGVkXCIgd291bGQgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgc3dhbGxvdyB0aGUgcmV0cnkgYW5kIHBlcm1hbmVudGx5IGxvc2VcbiAgICAgICAgICAvLyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZnJvbSB0aGUgbG9nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGUgZGVkdXAgYnJhbmNoIGZpcmVzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYCxcbiAgICAgICAgICAvLyB3ZSBjb252ZXJnZSBvbiB0aGUgY2Fub25pY2FsIGBldmVudElkYCBwZXJzaXN0ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBieSB0aGUgb3JpZ2luYWwgKHdpbm5pbmcpIGB3cml0ZUV4Y2x1c2l2ZWAuIEJ5XG4gICAgICAgICAgLy8gYWRvcHRpbmcgdGhhdCBldmVudElkIGZvciB0aGlzIHJldHJ5J3MgZXZlbnQgd3JpdGUg4oCUIGFuZFxuICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG91dGVyIG5vLW92ZXJ3cml0ZSBgd3JpdGVKU09OYCBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgIG9uIGNvbGxpc2lvbiDigJQgY29uY3VycmVudCAvXG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGVpdGhlcjpcbiAgICAgICAgICAvLyAgIC0gcHVibGlzaCB0aGUgc2FtZSBldmVudCBhdCB0aGUgc2FtZSBwYXRoIGV4YWN0bHkgb25jZVxuICAgICAgICAgIC8vICAgICAodGhlIGxvc2VyJ3MgYHdyaXRlSlNPTmAgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gICAgICAgICAgLy8gICAgIHdoaWNoIHRoZSBydW50aW1lJ3MgZXhpc3RpbmcgY29uY3VycmVudC1yZXBsYXkgY2F0Y2hcbiAgICAgICAgICAvLyAgICAgcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyIHN3YWxsb3dzKSwgb3JcbiAgICAgICAgICAvLyAgIC0gY29udmVyZ2Ugb24gYSBzaW5nbGUgcmVjb3Zlcnkgd3JpdGUgd2hlbiB0aGUgcHJpb3JcbiAgICAgICAgICAvLyAgICAgY2xhaW0gd2FzIG9ycGhhbmVkIGJ5IGEgY3Jhc2ggYmVmb3JlIHRoZSBldmVudCBsYW5kZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgbGVnYWN5IGZhbGxiYWNrIChgZXhpc3RpbmdDbGFpbS5ldmVudElkYCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gaXMgZm9yIGNsYWltIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgd2FzIGFkZGVkIOKAlFxuICAgICAgICAgIC8vIHRob3NlIHByb2JlIHRoZSBldmVudCBsb2cgZGlyZWN0bHkgYW5kIGZhbGwgdGhyb3VnaCB0byBhXG4gICAgICAgICAgLy8gZnJlc2gtZXZlbnRJZCByZWNvdmVyeSB3cml0ZS4gVGhlIGxlZ2FjeSBwYXRoIGRvZXMgbm90XG4gICAgICAgICAgLy8gY29udmVyZ2UgYWNyb3NzIHdvcmtlcnMgYnV0IGNhbm5vdCByZWdyZXNzIGJlaGF2aW9yIGZvclxuICAgICAgICAgIC8vIGZyZXNobHktd3JpdHRlbiBjbGFpbXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgYHdpdGhIb29rTG9ja2AgaW4tcHJvY2VzcyBtdXRleCBhYm92ZSBrZWVwcyB0d28gc2FtZS1cbiAgICAgICAgICAvLyB0aWNrIGluLXByb2Nlc3MgY2FsbGVycyBmcm9tIHJhY2luZyBpbnRvIHRoaXMgYnJhbmNoIHdpdGhcbiAgICAgICAgICAvLyB0aGUgd2lubmVyIG1pZC13cml0ZSwgYnV0IGlzIG5vdCBzdWZmaWNpZW50IGFjcm9zc1xuICAgICAgICAgIC8vIHByb2Nlc3NlcyDigJQgdGhlIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IChgY2xhaW0uZXZlbnRJZGApXG4gICAgICAgICAgLy8gaXMgd2hhdCBjbG9zZXMgdGhlIGNyb3NzLXByb2Nlc3MgcmFjZS5cbiAgICAgICAgICBsZXQgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0/LnJ1bklkID09PSBlZmZlY3RpdmVSdW5JZCAmJlxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZCA9PT0gZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRvcHQgYSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIHJlY292ZXJ5IHdyaXRlLiBUaGVcbiAgICAgICAgICAgICAgLy8gb3V0ZXIgZXZlbnQgcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKVxuICAgICAgICAgICAgICAvLyBlaXRoZXIgc3VjY2VlZHMgKHdlIHB1Ymxpc2ggdGhlIGNhbm9uaWNhbCBldmVudCxcbiAgICAgICAgICAgICAgLy8gcmVwYWlyaW5nIGEgcGFydGlhbCB3cml0ZSBsZWZ0IGJ5IHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAvLyBjbGFpbWFudCkgb3IgcmV0dXJucyBgZmFsc2VgIGFuZCB3ZSB0aHJvd1xuICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKHRoZSBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAvLyBwdWJsaXNoZWQg4oCUIGEgcmVhbCBkdXBsaWNhdGUpLiBFaXRoZXIgd2F5IHRoZSBsb2dcbiAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIGV4YWN0bHkgb25lIGBob29rX2NyZWF0ZWRgIGV2ZW50IGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIGAocnVuSWQsIGhvb2tJZClgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGV2ZW50SWQgY29tZXMgZnJvbSBvbmUgb2YgdHdvIHBsYWNlczpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIGZvciBjbGFpbXMgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyB2ZXJzaW9uICh0aGUgd3JpdGVyIGFib3ZlIHBlcnNpc3RzIHRoZVxuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXRvbWljYWxseSB3aXRoIHRoZSBjbGFpbSkuXG4gICAgICAgICAgICAgIC8vICAgICBUaGUgZXZlbnRJZCBpcyBkdXJhYmxlLCBzbyB0aGUgb3V0ZXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBhbG9uZSBpcyBlbm91Z2ggdG9cbiAgICAgICAgICAgICAgLy8gICAgIGFyYml0cmF0ZSBwdWJsaWNhdGlvbjogaXQgZmFpbHMgaWZmIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2FzIGFscmVhZHkgcHVibGlzaGVkIGF0IHRoYXQgZXhhY3QgcGF0aC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIFRoZSByZWNvdmVyeS1tYXJrZXIgc2lkZWNhciBmb3IgbGVnYWN5IGNsYWltc1xuICAgICAgICAgICAgICAvLyAgICAgd3JpdHRlbiBiZWZvcmUgYGV2ZW50SWRgIHdhcyBwZXJzaXN0ZWQgaW5saW5lXG4gICAgICAgICAgICAgIC8vICAgICBpbiB0aGUgY2xhaW0uIFRoZSBtYXJrZXIgaXMgaXRzZWxmIGFcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZWAsIHNvIHRoZSBmaXJzdCByZXRyeSBwaW5zIGl0c1xuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXMgY2Fub25pY2FsIGFuZCBzdWJzZXF1ZW50XG4gICAgICAgICAgICAgIC8vICAgICByZXRyaWVzIGFkb3B0IGl0LiBXaXRob3V0IHRoaXMsIHR3byBwcm9jZXNzZXNcbiAgICAgICAgICAgICAgLy8gICAgIGJvdGggcmVhZGluZyB0aGUgc2FtZSBsZWdhY3kgY2xhaW0gd291bGQgZWFjaFxuICAgICAgICAgICAgICAvLyAgICAgZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmQgdGhlaXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHBhdGhzLCBhbmQgYXBwZW5kIHR3byBldmVudHMuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgICBGb3IgbGVnYWN5IGNsYWltcyB3ZSBhbHNvIG11c3QgcHJvYmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICBsb2cgZm9yIGFuIGV4aXN0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50IEJFRk9SRVxuICAgICAgICAgICAgICAvLyAgICAgcGlubmluZyBhIGNhbm9uaWNhbCBldmVudElkOiB0aGUgcHJlLXVwZ3JhZGVcbiAgICAgICAgICAgICAgLy8gICAgIHdyaXRlciBtYXkgaGF2ZSBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHdpdGggaXRzIG93biBldmVudElkLCBhbmQgdGhlIG1hcmtlciBoYXMgbm8gd2F5XG4gICAgICAgICAgICAgIC8vICAgICBvZiBrbm93aW5nIHRoYXQgZXZlbnRJZCBhZnRlciB0aGUgZmFjdC4gV2l0aG91dFxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwcm9iZSwgYSBwb3N0LXVwZ3JhZGUgcmV0cnkgd291bGQgcGluIGFcbiAgICAgICAgICAgICAgLy8gICAgIGRpZmZlcmVudCBldmVudElkLCB3cml0ZSBhIGhvb2sgZW50aXR5LCBhbmRcbiAgICAgICAgICAgICAgLy8gICAgIHB1Ymxpc2ggYSBkdXBsaWNhdGUgZXZlbnQgYXQgdGhlIG1hcmtlcidzIHBhdGguXG4gICAgICAgICAgICAgIGxldCBjYW5vbmljYWxFdmVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZ0NsYWltLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxFdmVudElkID0gZXhpc3RpbmdDbGFpbS5ldmVudElkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWRFdmVudElkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmUtdXBncmFkZSB3cml0ZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgZXZlbnQgcHVibGlzaCBhbmQgaXRzIGhvb2sgZW50aXR5IHdyaXRlIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgIC8vIHBheWxvYWQgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduIGR1cGxpY2F0ZS5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlQdWJsaXNoZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChwaW5uZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExvc3QgdGhlIG1hcmtlciByYWNlIGFuZCB0aGUgbWFya2VyIGZpbGUgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuXG4gICAgICAgICAgICAgICAgICAvLyBUcmVhdCBhcyBhIHJlYWwgZHVwbGljYXRlIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCBpbnN0ZWFkIG9mIHJpc2tpbmcgZGl2ZXJnZW50XG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBwaW5uZWQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWJ1aWxkIGBldmVudGAgd2l0aCB0aGUgY2Fub25pY2FsIGV2ZW50SWQgYW5kIGFcbiAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBgY3JlYXRlZEF0YCBkZXJpdmVkIGZyb20gdGhlIGV2ZW50SWRcbiAgICAgICAgICAgICAgLy8gKGEgVUxJRCkgc28gdHdvIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBldmVudFxuICAgICAgICAgICAgICAvLyBwcm9kdWNlIGJ5dGUtaWRlbnRpY2FsIGNvbnRlbnQuXG4gICAgICAgICAgICAgIGV2ZW50SWQgPSBjYW5vbmljYWxFdmVudElkO1xuICAgICAgICAgICAgICBjb25zdCBjYW5vbmljYWxDcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAgIHVsaWRUb0RhdGUoZXZlbnRJZC5yZXBsYWNlKC9eZXZudF8vLCAnJykpID8/IG5vdztcbiAgICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGNhbm9uaWNhbENyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3Jvc3MtaG9vayAvIGNyb3NzLXJ1biBjb25mbGljdDogYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gKHJ1bklkLCBob29rSWQpIGhvbGRzIHRoaXMgdG9rZW4uIENyZWF0ZSBhXG4gICAgICAgICAgICAgIC8vIGhvb2tfY29uZmxpY3QgZXZlbnQgc28gdGhlIHdvcmtmbG93IGNhbiBmYWlsXG4gICAgICAgICAgICAgIC8vIGdyYWNlZnVsbHkgd2hlbiB0aGUgaG9vayBpcyBhd2FpdGVkLlxuICAgICAgICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdDbGFpbVxuICAgICAgICAgICAgICAgICAgICA/IHsgY29uZmxpY3RpbmdSdW5JZDogZXhpc3RpbmdDbGFpbS5ydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgICBjb25mbGljdEV2ZW50XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBjb25mbGljdCBldmVudCAobm8gaG9vayBlbnRpdHkgY3JlYXRlZClcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgICBob29rOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaG9vayBlbnRpdHkgbm93LCBidXQgZGVmZXIgaXRzIHdyaXRlIHVudGlsXG4gICAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggYXQgdGhlIGJvdHRvbSBvZiB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gY29tbWl0cy4gVGhlIHJldHJ5IHBhdGggY2FuIHJlYWNoIHRoaXMgYnJhbmNoXG4gICAgICAgICAgLy8gZm9yIGEgaG9vayB3aG9zZSBgaG9va19jcmVhdGVkYCBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkgKGFuIFwiYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAvLyBkdXBsaWNhdGVcIik7IGluIHRoYXQgY2FzZSB0aGUgb3V0ZXIgYHdyaXRlRXhjbHVzaXZlYFxuICAgICAgICAgIC8vIGZvciB0aGUgZXZlbnQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIHdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAuIFdyaXRpbmcgdGhlIGhvb2sgZW50aXR5IGhlcmVcbiAgICAgICAgICAvLyBmaXJzdCB3b3VsZCBtdXRhdGUgYWxyZWFkeS1jb21taXR0ZWQgZHVyYWJsZSBzdGF0ZSB3aXRoXG4gICAgICAgICAgLy8gdGhlIHJldHJ5J3MgcGF5bG9hZCAoZS5nLiBkaWZmZXJlbnQgYG1ldGFkYXRhYCBvclxuICAgICAgICAgIC8vIGBpc1dlYmhvb2tgKSBiZWZvcmUgdGhlIGV2ZW50IHB1Ymxpc2ggcHJvdmVkIHdoaWNoXG4gICAgICAgICAgLy8gb3V0Y29tZSB3ZSBhcmUgaW4g4oCUIGxlYXZpbmcgdGhlIGVudGl0eSBhbmQgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gaW5jb25zaXN0ZW50LiBCeSBkZWZlcnJpbmcsIHRoZSBlbnRpdHkgaXMgb25seSB3cml0dGVuXG4gICAgICAgICAgLy8gd2hlbiB0aGUgcHVibGlzaCBhY3R1YWxseSBzdWNjZWVkcyAoZmlyc3Qgd3JpdGVyIG9yXG4gICAgICAgICAgLy8gb3JwaGFuIHJlY292ZXJ5KS4gU2VlIHByYW5heWdwJ3MgcmV2aWV3IG9uIFBSICMyMjk1IGZvclxuICAgICAgICAgIC8vIHRoZSBrYXJ0aGlrc2NhbGUzIHJlcHJvLlxuICAgICAgICAgIGhvb2sgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBob29rRGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgICAgICAgICAgLy8gVXNlIHRoZSAocG9zc2libHkgY2Fub25pY2FsKSBldmVudCdzIGNyZWF0ZWRBdCBzbyB0d29cbiAgICAgICAgICAgIC8vIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBob29rIGVudGl0eSBwcm9kdWNlIGJ5dGUtXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgY29udGVudCBkdXJpbmcgY29udmVyZ2VuY2UuXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgaG9vayBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGlzV2ViaG9vazogaG9va0RhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgICAgICAgICAgaXNTeXN0ZW06IGhvb2tEYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9ucyA9IHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGVcbiAgICAgICAgICAgID8geyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIC8vIGhvb2tfZGlzcG9zZWQ6IERlbGV0ZXMgaG9vayBlbnRpdHksIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGRpc3Bvc2luZyB0aGUgc2FtZSBob29rIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgaG9va0xvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGhvb2tMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGRpc3Bvc2VkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVhZCB0aGUgaG9vayB0byBnZXQgaXRzIHRva2VuIGJlZm9yZSBkZWxldGluZ1xuICAgICAgICAgIGNvbnN0IGhvb2tQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbiBjb25zdHJhaW50IGZpbGUgdG8gZnJlZSB1cCB0aGUgdG9rZW5cbiAgICAgICAgICAgIC8vIGZvciByZXVzZSwgYW5kIGRlbGV0ZSB0aGlzIGhvb2sncyByZWNvdmVyeSBtYXJrZXIgKGlmXG4gICAgICAgICAgICAvLyBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc28gZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBsaWZldGltZXMgbmV2ZXIgY29sbGlkZSwgYnV0IGNsZWFuaW5nIHVwIHJlZHVjZXMgZGlza1xuICAgICAgICAgICAgLy8gbGVhayBmb3IgaG9va3MgdGhhdCBnbyB0aHJvdWdoIHRoZSByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgd3JpdGVFeGNsdXNpdmVgIChPX0NSRUFUfE9fRVhDTCB2aWEgdGVtcC1maWxlICsgaGFyZC1saW5rKVxuICAgICAgICAvLyBpcyB0aGUgY3Jvc3MtcHJvY2VzcyBhdG9taWMgcHVibGlzaCBwcmltaXRpdmU6IGlmIHRoZSBmaWxlXG4gICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLCByZXR1cm5zIGZhbHNlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcuIFRoaXNcbiAgICAgICAgLy8gaXMgY3JpdGljYWwgZm9yIHRoZSBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgY29udmVyZ2VuY2VcbiAgICAgICAgLy8gKGFib3ZlKSDigJQgdHdvIHdvcmtlcnMgdGhhdCBhZG9wdCB0aGUgc2FtZSBjYW5vbmljYWwgZXZlbnRJZFxuICAgICAgICAvLyByYWNlIGhlcmU7IHdob2V2ZXIgbGlua3MgdGhlIGZpbGUgZmlyc3Qgd2lucywgdGhlIGxvc2VyXG4gICAgICAgIC8vIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yLCBhbmQgdGhlIHJ1bnRpbWUncyBleGlzdGluZ1xuICAgICAgICAvLyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDJcbiAgICAgICAgLy8gc3dhbGxvd3MgaXQuIEZvciBhbGwgb3RoZXIgZXZlbnQgdHlwZXMsIGV2ZW50SWRzIGFyZVxuICAgICAgICAvLyBtb25vdG9uaWMgVUxJRHMgKGdsb2JhbGx5IHVuaXF1ZSBieSBjb25zdHJ1Y3Rpb24pIHNvIGFcbiAgICAgICAgLy8gY29sbGlzaW9uIGluZGljYXRlcyBhIHJlYWwgYnVnIGFuZCBFbnRpdHlDb25mbGljdEVycm9yIGlzXG4gICAgICAgIC8vIGFsc28gdGhlIHJpZ2h0IHN1cmZhY2Ug4oCUIHNhbWUgc2hhcGUgYXMgc3RlcF9jcmVhdGVkJ3NcbiAgICAgICAgLy8gY2xhaW0tZmlsZSBiZWhhdmlvci5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFB1Ymxpc2hlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWV2ZW50UHVibGlzaGVkKSB7XG4gICAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCBsb3NpbmcgdGhlIGV2ZW50IHB1Ymxpc2ggbWVhbnMgdGhlXG4gICAgICAgICAgLy8gZXZlbnQgd2FzIGFscmVhZHkgY29tbWl0dGVkIGF0IHRoaXMgZXhhY3QgKGNhbm9uaWNhbClcbiAgICAgICAgICAvLyBwYXRoLiBUaGUgb3JpZ2luYWwgcHVibGlzaGVyIG1heSBoYXZlIGNyYXNoZWQgYmV0d2VlblxuICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgZGVmZXJyZWQgaG9vay1lbnRpdHkgd3JpdGVcbiAgICAgICAgICAvLyAodGhlIGludmVyc2Ugb2YgdGhlIGNyYXNoIHdpbmRvdyB0aGUgZGVmZXJyYWwgY2xvc2VzKSxcbiAgICAgICAgICAvLyBsZWF2aW5nIGFuIGV2ZW50LWZpcnN0IG9ycGhhbjogdGhlIGV2ZW50IGlzIGluIHRoZSBsb2dcbiAgICAgICAgICAvLyBidXQgdGhlIGVudGl0eSBpcyBtaXNzaW5nIGFuZCB0aGUgaG9vayBpcyB1bnJlc29sdmFibGUuXG4gICAgICAgICAgLy8gUmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgUEVSU0lTVEVEIGV2ZW50J3MgcGF5bG9hZFxuICAgICAgICAgIC8vIChuZXZlciB0aGUgcmV0cnkncyDigJQgZGlmZmVyZW50IHJldHJ5IG1ldGFkYXRhIG11c3Qgbm90XG4gICAgICAgICAgLy8gY2hhbmdlIGNvbW1pdHRlZCBzdGF0ZSkgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduXG4gICAgICAgICAgLy8gZHVwbGljYXRlIHRvIHRoZSBydW50aW1lJ3MgY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aC5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgIGBFdmVudCBcIiR7ZXZlbnRJZH1cIiBhbHJlYWR5IGV4aXN0cyBmb3IgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGhvb2sgZW50aXR5IE9OTFkgbm93IHRoYXQgdGhlIGV2ZW50IHB1Ymxpc2ggaGFzXG4gICAgICAgIC8vIGNvbW1pdHRlZC4gRG9pbmcgdGhpcyBlYXJsaWVyIChpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gYnJhbmNoIGFib3ZlKSB3b3VsZCBtdXRhdGUgYW4gYWxyZWFkeS1jb21taXR0ZWQgaG9va1xuICAgICAgICAvLyBlbnRpdHkgd2l0aCB0aGUgcmV0cnkncyBwYXlsb2FkIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaFxuICAgICAgICAvLyBwcm92ZWQgd2hldGhlciB0aGlzIGF0dGVtcHQgd2FzIHJlcGFpcmluZyBhIG1pc3NpbmcgZXZlbnRcbiAgICAgICAgLy8gb3IganVzdCBjb2xsaWRpbmcgd2l0aCBhbiBhbHJlYWR5LXB1Ymxpc2hlZCBgaG9va19jcmVhdGVkYC5cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBzZXRzIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBpZmYgdGhpcyBldmVudFxuICAgICAgICAvLyB0eXBlIHdyaXRlcyBhbiBlbnRpdHkuXG4gICAgICAgIGlmIChob29rICYmIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgaG9vay5ob29rSWQsIHRhZyksXG4gICAgICAgICAgICBob29rLFxuICAgICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG5cbiAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkOiBwcmVsb2FkIG9uZSBwYWdlIG9mIGV2ZW50cyBzbyB0aGUgcnVudGltZSBjYW4gc2tpcFxuICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIHdoZW4gaGFzTW9yZSBpcyBmYWxzZS5cbiAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhhc01vcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiBydW4pIHtcbiAgICAgICAgICBjb25zdCBhbGxFdmVudHMgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9IGFsbEV2ZW50cy5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGFsbEV2ZW50cy5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGFsbEV2ZW50cy5oYXNNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogb24gYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHRoZSBpbmxpbmVcbiAgICAgICAgLy8gcnVudGltZSBsb29wIGNhbiBwYXNzIGBzaW5jZUN1cnNvcmAgKHRoZSBjdXJzb3IgZnJvbSBiZWZvcmUgaXRcbiAgICAgICAgLy8gYmVnYW4gd3JpdGluZyB0aGlzIHN0ZXAncyBldmVudHMpLiBXZSByZXR1cm4gdGhlIGRlbHRhIG9mXG4gICAgICAgIC8vIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXQgY3Vyc29yIOKAlCBleGFjdGx5IHdoYXQgYW5cbiAgICAgICAgLy8gYGV2ZW50cy5saXN0KHsgY3Vyc29yOiBzaW5jZUN1cnNvciwgc29ydE9yZGVyOiAnYXNjJyB9KWAgd291bGRcbiAgICAgICAgLy8gcmV0dXJuIHJpZ2h0IG5vdyDigJQgc28gdGhlIGxvb3AgY2FuIHNraXAgYSByZWR1bmRhbnQgcm91bmQtdHJpcC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBpcyBjb21wdXRlZCBhZ2FpbnN0IHRoZSBzYW1lIG9uLWRpc2sgbG9nIHRoZSBsaXN0IHBhdGhcbiAgICAgICAgLy8gcmVhZHMsIHNvIGl0IGNhcHR1cmVzIGV2ZXJ5dGhpbmcgdGhlIGZldGNoIHdvdWxkOiB0aGlzIHN0ZXAnc1xuICAgICAgICAvLyBzdGVwX2NyZWF0ZWQvc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXBcbiAgICAgICAgLy8gYm9keSB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCkgYW5vdGhlciB3cml0ZXIgYXBwZW5kZWQgc2luY2UgdGhlIGN1cnNvci4gVGhhdFxuICAgICAgICAvLyBlcXVpdmFsZW5jZSBpcyB3aGF0IG1ha2VzIHNraXBwaW5nIHRoZSBmZXRjaCBzYWZlIOKAlCBhIG1pc3NlZFxuICAgICAgICAvLyBpbi1iYW5kIGV2ZW50IGNhbm5vdCBkaXZlcmdlIHJlcGxheSBiZWNhdXNlIHRoZSBkZWx0YSBpcyB0aGVcbiAgICAgICAgLy8gZmV0Y2guXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9ubHkgc3RlcC10ZXJtaW5hbCBldmVudHMgcXVhbGlmeTogc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZCBhcmVcbiAgICAgICAgLy8gbm90IGxvb3AgYm91bmRhcmllcyAodGhlIGxvb3AgZmV0Y2hlcyBhZnRlciBzdGVwX2NvbXBsZXRlZCAvXG4gICAgICAgIC8vIHN0ZXBfZmFpbGVkKSwgYW5kIHJ1bi10ZXJtaW5hbCBldmVudHMgZW5kIHRoZSBsb29wLiBgcmVzb2x2ZURhdGFgXG4gICAgICAgIC8vIG1hdGNoZXMgdGhlIGxpc3QgcGF0aCBzbyBldmVudERhdGEgcmVmcyBhcmUgaGFuZGxlZCBpZGVudGljYWxseS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpICYmXG4gICAgICAgICAgdHlwZW9mIHBhcmFtcz8uc2luY2VDdXJzb3IgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbm8gYGxpbWl0YDogdGhpcyByZXR1cm5zIGEgc2luZ2xlIGRlZmF1bHQtc2l6ZSBwYWdlLFxuICAgICAgICAgIC8vIHVubGlrZSB0aGUgYGV2ZW50cy5saXN0YCBwYXRoIHdoaWNoIGxvb3BzIGB3aGlsZSAoaGFzTW9yZSlgIHRvXG4gICAgICAgICAgLy8gZXhoYXVzdGlvbi4gVGhhdCBpcyBzYWZlIOKAlCBhbmQgbXVzdCBOT1QgYmUgXCJmaXhlZFwiIGJ5IHBhZ2luYXRpbmdcbiAgICAgICAgICAvLyBoZXJlIOKAlCBiZWNhdXNlIHRoZSBjb250cmFjdCBpcyBzaW5nbGUtcGFnZS1vci1mYWxsYmFjaywgbm90XG4gICAgICAgICAgLy8gY29tcGxldGUtZGVsdGEuIFdoZW4gdGhlIGRlbHRhIG92ZXJmbG93cyBvbmUgcGFnZSxcbiAgICAgICAgICAvLyBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkgc2V0cyBgaGFzTW9yZTogdHJ1ZWAgYW5kIHNsaWNlcyBgZGF0YWAgdG9cbiAgICAgICAgICAvLyB0aGUgcGFnZSAoc2VlIGZzLnRzKSwgd2hpY2ggd2UgZm9yd2FyZCB2ZXJiYXRpbSBiZWxvdy4gVGhlIFNES1xuICAgICAgICAgIC8vIGNvbnN1bWUgc2lkZSAocnVudGltZS50cykgb25seSBzdGFzaGVzIHRoZSBkZWx0YSB3aGVuIGAhaGFzTW9yZWBcbiAgICAgICAgICAvLyBhbmQgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIGV4aGF1c3RpdmUgYGV2ZW50cy5saXN0YCBsb29wLCBzbyBhXG4gICAgICAgICAgLy8gdHJ1bmNhdGVkIHBhZ2UgaXMgbmV2ZXIgY29uc3VtZWQgYXMgaWYgaXQgd2VyZSB0aGUgZnVsbCBkZWx0YS5cbiAgICAgICAgICBjb25zdCBkZWx0YSA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgY3Vyc29yOiBwYXJhbXMuc2luY2VDdXJzb3IsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID1cbiAgICAgICAgICAgIHJlc29sdmVEYXRhID09PSAnbm9uZSdcbiAgICAgICAgICAgICAgPyBkZWx0YS5kYXRhLm1hcCgoZSkgPT4gc3RyaXBFdmVudERhdGFSZWZzKGUsIHJlc29sdmVEYXRhKSlcbiAgICAgICAgICAgICAgOiBkZWx0YS5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGRlbHRhLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gZGVsdGEuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGV2ZW50IGFuZCBhbnkgY3JlYXRlZC91cGRhdGVkIGVudGl0eVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgIHJ1bixcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgd2FpdCxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgLi4uKHN0ZXBDcmVhdGVkTGF6aWx5ID8geyBzdGVwQ3JlYXRlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
1625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsS0FBSyxFQUNMLGNBQWMsRUFDZCxTQUFTLEdBQ1YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsU0FBUyxFQUNULHNCQUFzQixFQUN0QixhQUFhLEdBQ2QsTUFBTSxjQUFjLENBQUM7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QWUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLDJCQUEyQixDQUFDO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLE1BQU0sd0JBQXdCLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsb0NBQW9DO2dCQUNwQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtnQkFDeEQsMkRBQTJEO2dCQUMzRCxtREFBbUQ7Z0JBQ25ELFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxLQUFLO2dCQUNoRCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLO2dCQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNO2dCQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPO2FBQ2hDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBSdW5Ob3RTdXBwb3J0ZWRFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhvb2ssXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGVwLFxuICBTdG9yYWdlLFxuICBXYWl0LFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlQ2hhbmdlcyxcbiAgRXZlbnRTY2hlbWEsXG4gIEhvb2tTY2hlbWEsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIGlzVGVybWluYWxTdGVwU3RhdHVzLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHJlcXVpcmVzTmV3ZXJXb3JsZCxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFN0ZXBTY2hlbWEsXG4gIHVsaWRUb0RhdGUsXG4gIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyxcbiAgdmFsaWRhdGVVbGlkVGltZXN0YW1wLFxuICBXYWl0U2NoZW1hLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAganNvblJlcGxhY2VyLFxuICBqc29uUmV2aXZlcixcbiAgbGlzdEpTT05GaWxlcyxcbiAgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5LFxuICByZWFkSlNPTixcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHJlc29sdmVXaXRoaW5CYXNlLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZSxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7XG4gIGdldE9iamVjdENyZWF0ZWRBdCxcbiAgaGFzaFRva2VuLFxuICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoLFxuICBtb25vdG9uaWNVbGlkLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlQWxsSG9va3NGb3JSdW4sXG4gIHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2csXG59IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbi8vIGBzdGVwTG9ja3NgIGFuZCBgaG9va0xvY2tzYCBhcmUgbm93IGluc3RhbnRpYXRlZCBwZXJcbi8vIGBjcmVhdGVFdmVudHNTdG9yYWdlYCBjYWxsIChzZWUgaW5zaWRlIHRoZSBmdW5jdGlvbikgcmF0aGVyIHRoYW5cbi8vIGJlaW5nIG1vZHVsZS1sZXZlbC4gVGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIHJlbWFpblxuLy8gdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoIGFjcm9zcyBwcm9jZXNzZXM7IHRoZSBpbi1wcm9jZXNzXG4vLyBtdXRleCBpcyBhIHBlci1pbnN0YW5jZSBvcHRpbWl6YXRpb24gdGhhdCBjbG9zZXMgYSBzaG9ydCByYWNlXG4vLyB3aW5kb3cgaW4gdGhlIGRlZHVwLXJlY292ZXJ5IHBhdGguIFBlci1pbnN0YW5jZSBzY29waW5nIGxldHNcbi8vIHRlc3RzIHNpbXVsYXRlIGNyb3NzLXByb2Nlc3MgYmVoYXZpb3Igd2l0aCB0d28gc3RvcmFnZSBpbnN0YW5jZXNcbi8vIHNoYXJpbmcgb25lIGRhdGEgZGlyZWN0b3J5IChlYWNoIGluc3RhbmNlIGhhcyBpbmRlcGVuZGVudCBsb2Nrc1xuLy8gYnV0IGEgc2hhcmVkIGZpbGVzeXN0ZW0pLCBleGFjdGx5IG1hdGNoaW5nIHRoZSBjcm9zcy1wcm9jZXNzXG4vLyBzZW1hbnRpY3Mgd2l0aG91dCBzcGF3bmluZyBzdWJwcm9jZXNzZXMuXG5cbmNvbnN0IEhvb2tUb2tlbkNsYWltU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBUaGUgdG9rZW4tY2xhaW0gd3JpdGVyIGJlbG93IGhhcyBhbHdheXMgcGVyc2lzdGVkIGBob29rSWRgLCBidXRcbiAgLy8gdGhpcyByZWFkIHNjaGVtYSBwcmV2aW91c2x5IG9taXR0ZWQgaXQsIHdoaWNoIGlzIHRoZSBidWcgZml4ZWRcbiAgLy8gYnkgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMjI4My4gYG9wdGlvbmFsKClgXG4gIC8vIGlzIGRlZmVuc2l2ZTogYW55IGNsYWltIGZpbGUgdGhhdCBzb21laG93IGxhY2tzIHRoZSBmaWVsZCBzdGlsbFxuICAvLyBwYXJzZXMgKHlpZWxkaW5nIGB1bmRlZmluZWRgKSBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgY3Jvc3MtXG4gIC8vIGhvb2sgY29uZmxpY3QgYnJhbmNoLCBtYXRjaGluZyBwcmUtZml4IGJlaGF2aW9yLlxuICBob29rSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG4gIC8vIGBldmVudElkYCBpcyB0aGUgY2Fub25pY2FsIGhvb2tfY3JlYXRlZCBldmVudCBJRCB0aGUgY2xhaW1pbmdcbiAgLy8gd29ya2VyIGNvbW1pdHRlZCB0byBwdWJsaXNoaW5nLiBQZXJzaXN0aW5nIGl0IGhlcmUgdHVybnMgdGhlXG4gIC8vIGNsYWltIGZpbGUgaW50byBhIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IGZvciBjcm9zcy13b3JrZXIgL1xuICAvLyBjcm9zcy1wcm9jZXNzIHJldHJpZXMgKHNlZSBjb21tZW50IG9uIHRoZSBob29rX2NyZWF0ZWQgYnJhbmNoKS5cbiAgLy8gYG9wdGlvbmFsKClgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGxlZ2FjeSBjbGFpbSBmaWxlXG4gIC8vIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeS1cbiAgLy8gbWFya2VyIHVwZ3JhZGUgcGF0aCwgd2hpY2ggYXRvbWljYWxseSBwaW5zIGEgY2Fub25pY2FsIGV2ZW50SWRcbiAgLy8gdmlhIGEgc2lkZWNhciBtYXJrZXIgKGFsc28gYSBgd3JpdGVFeGNsdXNpdmVgKS5cbiAgZXZlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogU2lkZWNhciByZWNvdmVyeSBtYXJrZXIgdGhhdCBwaW5zIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgXG4gKiBldmVudElkIGZvciBhIGxlZ2FjeSB0b2tlbiBjbGFpbSDigJQgb25lIHdyaXR0ZW4gYnkgYSB2ZXJzaW9uIG9mXG4gKiB0aGlzIHN0b3JhZ2UgdGhhdCBkaWQgbm90IHlldCBwZXJzaXN0IGBldmVudElkYCBpbmxpbmUgaW4gdGhlXG4gKiBjbGFpbSBmaWxlLiBXaXRob3V0IHRoaXMgbWFya2VyLCB0d28gY3Jvc3MtcHJvY2VzcyByZXRyaWVzXG4gKiByZWFkaW5nIGEgbGVnYWN5IGNsYWltIGVhY2ggZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmRcbiAqIHRoZWlyIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnQgcGF0aHMsIGFuZFxuICogYXBwZW5kIHR3byBgaG9va19jcmVhdGVkYCBldmVudHMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLlxuICpcbiAqIFRoZSBtYXJrZXIgaXMgd3JpdHRlbiB2aWEgYHdyaXRlRXhjbHVzaXZlYCDigJQgdGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBsYW5kIGl0IHBpbnMgaXRzIGNhbmRpZGF0ZSBldmVudElkIGFzIGNhbm9uaWNhbCwgYW5kIGV2ZXJ5XG4gKiBzdWJzZXF1ZW50IHJldHJ5IHJlYWRzIGFuZCBhZG9wdHMgdGhhdCBldmVudElkIGJlZm9yZSB0aGUgY29tbW9uXG4gKiBldmVudCBwdWJsaXNoLiBTY2hlbWEgaXMganVzdCBgeyBldmVudElkIH1gIGJlY2F1c2UgaWRlbnRpdHkgaXNcbiAqIGFscmVhZHkgZW5jb2RlZCBpbiB0aGUgbWFya2VyJ3MgZmlsZW5hbWUgaGFzaCwgc28gZGlmZmVyZW50IHRva2VuXG4gKiBsaWZldGltZXMgY2FuIG5ldmVyIHNoYXJlIG9uZSBtYXJrZXIgKHNlZVxuICogYGhvb2tSZWNvdmVyeU1hcmtlclBhdGhgKS5cbiAqL1xuY29uc3QgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudElkOiB6LnN0cmluZygpLFxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rVG9rZW5DbGFpbShcbiAgY29uc3RyYWludFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKGNvbnN0cmFpbnRQYXRoLCBIb29rVG9rZW5DbGFpbVNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihcbiAgbWFya2VyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKG1hcmtlclBhdGgsIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgcnVuJ3MgZXZlbnQgbG9nIGZvciBhbiBleGlzdGluZyBgaG9va19jcmVhdGVkYCBldmVudFxuICogd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb25JZC4gVXNlZCBieSB0aGUgbGVnYWN5LWNsYWltIHJlY292ZXJ5XG4gKiBwYXRoIHRvIGRldGVjdCBcImFscmVhZHkgcHVibGlzaGVkIGJ5IGEgcHJlLXVwZ3JhZGUgd3JpdGVcIiBiZWZvcmVcbiAqIHBpbm5pbmcgYSBjYW5vbmljYWwgZXZlbnRJZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBhIHBvc3QtdXBncmFkZVxuICogcmV0cnkgZW5jb3VudGVyaW5nIGEgbGVnYWN5IGNsYWltIHdob3NlIGBob29rX2NyZWF0ZWRgIHdhc1xuICogYWxyZWFkeSB3cml0dGVuICh3aXRoIHRoZSBwcmUtdXBncmFkZSB3cml0ZXIncyBvd24gZXZlbnRJZCkgd291bGRcbiAqIHBpbiBhICpkaWZmZXJlbnQqIGV2ZW50SWQgdmlhIHRoZSBtYXJrZXIgYW5kIHB1Ymxpc2ggYSBkdXBsaWNhdGVcbiAqIGV2ZW50IGF0IHRoZSBtYXJrZXIncyBwYXRoLlxuICpcbiAqIFRoZSBpbmxpbmUtYGV2ZW50SWRgIGZhc3QgcGF0aCBkb2VzIE5PVCBuZWVkIHRoaXMgcHJvYmU6IHRoZVxuICogY2Fub25pY2FsIGV2ZW50SWQgaXMgZHVyYWJsZSBpbiB0aGUgY2xhaW0gZmlsZSwgc28gdGhlIGV4aXN0aW5nXG4gKiBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApIHdpbGwgZmFpbCBpZmYgdGhlIGV2ZW50XG4gKiBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGV4YWN0IHBhdGgg4oCUIHdoaWNoIGlzIHRoZSBjb3JyZWN0XG4gKiBcImFscmVhZHktcHVibGlzaGVkXCIgc2VtYW50aWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgIGZpbHRlcjogKGV2ZW50KSA9PlxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICBsaW1pdDogMSxcbiAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0LmRhdGFbMF0/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYW4gXCJldmVudC1maXJzdCBvcnBoYW5cIjogdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkXG4gKiB1bnRpbCBhZnRlciB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgcHVibGlzaCBjb21taXRzIChzbyBhIGZhaWxlZFxuICogcHVibGlzaCBjYW5ub3QgbXV0YXRlIGFscmVhZHktY29tbWl0dGVkIHN0YXRlIOKAlCBzZWUgdGhlIGNvbW1lbnQgb25cbiAqIHRoZSBkZWZlcnJlZCB3cml0ZSksIHdoaWNoIG9wZW5zIHRoZSBpbnZlcnNlIGNyYXNoIHdpbmRvdyDigJQgYVxuICogY3Jhc2ggQUZURVIgdGhlIGV2ZW50IHB1Ymxpc2ggYnV0IEJFRk9SRSB0aGUgZGVmZXJyZWQgZW50aXR5IHdyaXRlXG4gKiBsZWF2ZXMgdGhlIGV2ZW50IGluIHRoZSBsb2cgd2l0aCB0aGUgaG9vayBlbnRpdHkgbWlzc2luZy4gQSByZXRyeVxuICogdGhlbiBjb2xsaWRlcyBhdCB0aGUgZXZlbnQgcHVibGlzaCBhbmQgdGhyb3dzXG4gKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKGNvcnJlY3Qg4oCUIHRoZSBldmVudCBJUyBjb21taXR0ZWQpLCBidXRcbiAqIHdpdGhvdXQgdGhpcyByZXBhaXIgdGhlIGVudGl0eSB3b3VsZCBzdGF5IG1pc3NpbmcgZm9yZXZlciBhbmQgdGhlXG4gKiBob29rIHdvdWxkIGJlIHVucmVzb2x2YWJsZS5cbiAqXG4gKiBUaGUgZW50aXR5IE1VU1QgYmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwZXJzaXN0ZWQgY2Fub25pY2FsXG4gKiBldmVudCdzIHBheWxvYWQg4oCUIE5PVCB0aGUgcmV0cnkncyBgZXZlbnREYXRhYCDigJQgb3RoZXJ3aXNlIGEgcmV0cnlcbiAqIGNhcnJ5aW5nIGRpZmZlcmVudCBgbWV0YWRhdGFgIC8gYGlzV2ViaG9va2Agd291bGQgc2lsZW50bHkgY2hhbmdlXG4gKiBjb21taXR0ZWQgc3RhdGUuIFRoZSB3cml0ZSB1c2VzIGB3cml0ZUV4Y2x1c2l2ZWAgKGNyZWF0ZS1pZi1hYnNlbnQpXG4gKiBzbyBhIGNvbmN1cnJlbnQgd3JpdGVyIHJhY2luZyB0aGlzIHJlcGFpciBjYW5ub3QgYmUgb3ZlcndyaXR0ZW47XG4gKiB3aGljaGV2ZXIgd3JpdGUgbGFuZHMgZmlyc3QsIHRoZSBjb250ZW50IGlzIGlkZW50aWNhbCBiZWNhdXNlIGJvdGhcbiAqIGRlcml2ZSBmcm9tIHRoZSBzYW1lIHBlcnNpc3RlZCBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgcGVyc2lzdGVkRXZlbnRJZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke3BlcnNpc3RlZEV2ZW50SWR9YDtcbiAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdldmVudHMnLFxuICAgIGNvbXBvc2l0ZUtleSxcbiAgICBFdmVudFNjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKFxuICAgICFwZXJzaXN0ZWRFdmVudCB8fFxuICAgIHBlcnNpc3RlZEV2ZW50LmV2ZW50VHlwZSAhPT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5jb3JyZWxhdGlvbklkICE9PSBob29rSWRcbiAgKSB7XG4gICAgLy8gTm90aGluZyB0cnVzdHdvcnRoeSB0byByZXBhaXIgZnJvbS5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnaG9va3MnLFxuICAgIGhvb2tJZCxcbiAgICBIb29rU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgLy8gRW50aXR5IGFscmVhZHkgcHJlc2VudCDigJQgbm90IGFuIG9ycGhhbiwgbGVhdmUgaXQgdW50b3VjaGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBldmVudERhdGEgPSAocGVyc2lzdGVkRXZlbnQuZXZlbnREYXRhID8/IHt9KSBhcyB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBTZXJpYWxpemVkRGF0YTtcbiAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgfTtcbiAgaWYgKHR5cGVvZiBldmVudERhdGEudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhvb2s6IEhvb2sgPSB7XG4gICAgcnVuSWQsXG4gICAgaG9va0lkLFxuICAgIHRva2VuOiBldmVudERhdGEudG9rZW4sXG4gICAgbWV0YWRhdGE6IGV2ZW50RGF0YS5tZXRhZGF0YSxcbiAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBwZXJzaXN0ZWRFdmVudC5zcGVjVmVyc2lvbixcbiAgICBpc1dlYmhvb2s6IGV2ZW50RGF0YS5pc1dlYmhvb2sgPz8gdHJ1ZSxcbiAgICBpc1N5c3RlbTogZXZlbnREYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICB9O1xuICBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdob29rcycsIGhvb2tJZCwgdGFnKSxcbiAgICBKU09OLnN0cmluZ2lmeShob29rLCBqc29uUmVwbGFjZXIsIDIpXG4gICk7XG59XG5cbi8qKlxuICogQXRvbWljYWxseSBwaW4gYSBjYW5vbmljYWwgYGhvb2tfY3JlYXRlZGAgZXZlbnRJZCBmb3IgYSBsZWdhY3lcbiAqIGNsYWltIChvbmUgd2l0aG91dCBhbiBpbmxpbmUgYGV2ZW50SWRgKS4gVGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBgd3JpdGVFeGNsdXNpdmVgIHRoZSByZWNvdmVyeSBtYXJrZXIgd2luczsgaXRzIGBjYW5kaWRhdGVFdmVudElkYFxuICogYmVjb21lcyBjYW5vbmljYWwuIFN1YnNlcXVlbnQgcmV0cmllcyByZWFkIHRoZSBtYXJrZXIgYW5kIGFkb3B0XG4gKiBpdHMgYGV2ZW50SWRgLiBUb2dldGhlciB3aXRoIHRoZSBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgaW5cbiAqIHRoZSBvdXRlciBldmVudCBwdWJsaXNoLCB0aGlzIGdpdmVzIHRoZSBsZWdhY3ktZmFsbGJhY2sgcGF0aCB0aGVcbiAqIHNhbWUgc2luZ2xlLWV2ZW50IGNvbnZlcmdlbmNlIGd1YXJhbnRlZSBhcyB0aGUgaW5saW5lLWBldmVudElkYFxuICogZmFzdCBwYXRoLlxuICpcbiAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBldmVudElkIGZvciB0aGUgY2FsbGVyIHRvIGFkb3B0LCBvciBgbnVsbGBcbiAqIGlmIHdlIGxvc3QgdGhlIG1hcmtlciByYWNlIEFORCB0aGUgcmVzdWx0aW5nIG1hcmtlciBmaWxlIGlzXG4gKiB1bnJlYWRhYmxlIChleHRyZW1lbHkgcmFyZTsgY29ycnVwdGVkIGRpc2spLiBDYWxsZXJzIHRyZWF0IGBudWxsYFxuICogYXMgXCJnaXZlIHVwLCB0aHJvdyBgRW50aXR5Q29uZmxpY3RFcnJvcmBcIiBzbyB0aGUgcnVudGltZSdzXG4gKiBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIHN3YWxsb3dzIHRoaXMgYXR0ZW1wdCBhbmQgbGV0c1xuICogYW5vdGhlciBvbmUgdGhyb3VnaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGluQ2Fub25pY2FsRXZlbnRJZEZvckxlZ2FjeUNsYWltKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nLFxuICBjYW5kaWRhdGVFdmVudElkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBtYXJrZXJQYXRoID0gaG9va1JlY292ZXJ5TWFya2VyUGF0aChiYXNlZGlyLCB0b2tlbiwgcnVuSWQsIGhvb2tJZCk7XG4gIGNvbnN0IG1hcmtlckNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7IGV2ZW50SWQ6IGNhbmRpZGF0ZUV2ZW50SWQgfSk7XG4gIGNvbnN0IHdvbiA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKG1hcmtlclBhdGgsIG1hcmtlckNvbnRlbnQpO1xuICBpZiAod29uKSB7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZUV2ZW50SWQ7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSG9va1JlY292ZXJ5TWFya2VyKG1hcmtlclBhdGgpO1xuICByZXR1cm4gZXhpc3Rpbmc/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBJbi1wcm9jZXNzIHBlci1rZXkgYXN5bmMgbXV0ZXggYmFja2VkIGJ5IGEgY2FsbGVyLXN1cHBsaWVkIGBNYXBgLlxuICogVXNlZCBieSBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgdG8gc2VyaWFsaXplIHNhbWUta2V5IGV2ZW50IHdyaXRlc1xuICogKGBzdGVwXypgIGZvciB0aGUgc2FtZSBzdGVwLCBgaG9va19jcmVhdGVkYCBmb3IgdGhlIHNhbWUgaG9vaykuXG4gKiBUaGUgbWFwIGlzIGluc3RhbnRpYXRlZCBwZXItc3RvcmFnZS1pbnN0YW5jZSDigJQgZGlmZmVyZW50XG4gKiBpbnN0YW5jZXMgZG8gTk9UIHNoYXJlIGxvY2tzLCBzbyB0d28gaW5zdGFuY2VzIHNoYXJpbmcgb25lIGRhdGFcbiAqIGRpcmVjdG9yeSBiZWhhdmUgZXhhY3RseSBsaWtlIHR3byBzZXBhcmF0ZSBPUyBwcm9jZXNzZXMgZnJvbSB0aGVcbiAqIGxvY2tpbmcgc3RhbmRwb2ludC4gQ3Jvc3MtaW5zdGFuY2UgLyBjcm9zcy1wcm9jZXNzIGFyYml0cmF0aW9uXG4gKiByZWxpZXMgb24gdGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhJblByb2Nlc3NMb2NrPFQ+KFxuICBsb2NrczogTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4sXG4gIGtleTogc3RyaW5nLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHByZXYgPSBsb2Nrcy5nZXQoa2V5KTtcbiAgY29uc3QgdGFza0JveDogeyB0YXNrPzogUHJvbWlzZTxUPiB9ID0ge307XG4gIGNvbnN0IHRhc2sgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgdGFzayB0byBzZXR0bGU7IGRvbid0IGluaGVyaXQgaXRzIGVycm9ycy5cbiAgICAgIGF3YWl0IHByZXYuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAobG9ja3MuZ2V0KGtleSkgPT09IHRhc2tCb3gudGFzaykge1xuICAgICAgICBsb2Nrcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIHRhc2tCb3gudGFzayA9IHRhc2s7XG4gIGxvY2tzLnNldChrZXksIHRhc2spO1xuICByZXR1cm4gdGFzaztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCB3YWl0cyBhc3NvY2lhdGVkIHdpdGggYSB3b3JrZmxvdyBydW4uXG4gKiBDYWxsZWQgd2hlbiBhIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3YWl0c0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnd2FpdHMnKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKHdhaXRzRGlyKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAvLyBmaWxlSWRzIG1heSBjb250YWluIHRhZyBzdWZmaXhlcyAoZS5nLiwgXCJ3cnVuX0FCQy1jb3JySWQudml0ZXN0LTBcIilcbiAgICAvLyBidXQgc3RhcnRzV2l0aCBzdGlsbCBtYXRjaGVzIGNvcnJlY3RseSBzaW5jZSB0aGUgdGFnIGlzIGEgc3VmZml4LlxuICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoYCR7cnVuSWR9LWApKSB7XG4gICAgICBjb25zdCB3YWl0UGF0aCA9IHBhdGguam9pbih3YWl0c0RpciwgYCR7ZmlsZX0uanNvbmApO1xuICAgICAgYXdhaXQgZGVsZXRlSlNPTih3YWl0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIGxpZmVjeWNsZS1kcml2ZW4gcnVuIHVwZGF0ZSAocnVuX3N0YXJ0ZWQgLyBydW5fY29tcGxldGVkIC9cbiAqIHJ1bl9mYWlsZWQgLyBydW5fY2FuY2VsbGVkKSB1bmRlciB0aGUgc2hhcmVkIHBlci1ydW4gZmlsZSBsb2NrLFxuICogcmUtcmVhZGluZyB0aGUgb24tZGlzayBydW4gaW5zaWRlIHRoZSBsb2NrIHNvIGFueSBhdHRyaWJ1dGUgd3JpdGVzXG4gKiB0aGF0IGxhbmRlZCBiZXR3ZWVuIHRoZSBwcmUtdmFsaWRhdGlvbiBgY3VycmVudFJ1bmAgcmVhZCBhbmQgdGhpc1xuICogd3JpdGUgYXJlIHByZXNlcnZlZC4gV2l0aG91dCB0aGUgcmUtcmVhZCwgYW4gYGV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNgXG4gKiBjYWxsIHNhbmR3aWNoZWQgYmV0d2VlbiB0aGUgbGlmZWN5Y2xlIHJlYWQgYW5kIHdyaXRlIHdvdWxkIGJlXG4gKiBzaWxlbnRseSBvdmVyd3JpdHRlbiBieSB0aGUgbGlmZWN5Y2xlIHdyaXRlJ3Mgc3RhbGUgYXR0cmlidXRlIHNuYXBzaG90LlxuICpcbiAqIGBwcm9wb3NlZGAgaXMgdGhlIGZ1bGx5LWNvbnN0cnVjdGVkIHJ1biByb3cgdGhlIGNhbGxlciB3YW50cyB0b1xuICogd3JpdGUgKHdpdGggdGhlIGNvcnJlY3QgZGlzY3JpbWluYXRlZC11bmlvbiBzdGF0dXMgYnJhbmNoKS4gT25seSB0aGVcbiAqIGBhdHRyaWJ1dGVzYCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmcmVzaGVzdCB2ZXJzaW9uIGluc2lkZSB0aGVcbiAqIGxvY2suXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrPFQgZXh0ZW5kcyBXb3JrZmxvd1J1bj4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHByb3Bvc2VkOiBUXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHdpdGhSdW5GaWxlTG9jayhydW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZyZXNoID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksXG4gICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICk7XG4gICAgY29uc3QgbmV4dDogVCA9IHtcbiAgICAgIC4uLnByb3Bvc2VkLFxuICAgICAgYXR0cmlidXRlczogZnJlc2g/LmF0dHJpYnV0ZXMgPz8gcHJvcG9zZWQuYXR0cmlidXRlcyxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlSlNPTih0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksIG5leHQsIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZXZlbnRzIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGZpbGVzeXN0ZW0uXG4gKiBJbXBsZW1lbnRzIHRoZSBTdG9yYWdlWydldmVudHMnXSBpbnRlcmZhY2Ugd2l0aCBjcmVhdGUsIGxpc3QsIGFuZCBsaXN0QnlDb3JyZWxhdGlvbklkIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsRXZlbnRzU3RvcmFnZSA9IFN0b3JhZ2VbJ2V2ZW50cyddICYge1xuICBjbGVhckNhY2hlKCk6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IExvY2FsRXZlbnRzU3RvcmFnZSB7XG4gIC8vIEV2ZW50cyBhcmUgYXBwZW5kLW9ubHkuIEtlZXAgYSBib3VuZGVkIHdpbmRvdyBvZiBsb2NhbGx5IHBlcnNpc3RlZCBldmVudHNcbiAgLy8gYXZhaWxhYmxlIHRvIGltbWVkaWF0ZSByZXBsYXkgd2l0aG91dCByZXJlYWRpbmcgSlNPTiBmaWxlcy4gUGF5bG9hZCBieXRlc1xuICAvLyBhbmQgZW50cnkgY291bnQgYXJlIGJvdGggYm91bmRlZCBzbyBhY3RpdmUvd2FpdGluZyBydW5zIGNhbm5vdCByZXRhaW5cbiAgLy8gdW5ib3VuZGVkIGhpc3RvcmllcyBpbiBhIGxvbmctbGl2ZWQgZGV2ZWxvcG1lbnQgc2VydmVyLlxuICBjb25zdCBtYXhDYWNoZWRFdmVudEJ5dGVzID0gNCAqIDEwMjQgKiAxMDI0O1xuICBjb25zdCBtYXhDYWNoZWRFdmVudEVudHJpZXMgPSAxMDAwO1xuICBjb25zdCBldmVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50PigpO1xuICBjb25zdCBjYWNoZWRFdmVudEJ5dGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgY2FjaGVkUGF0aHNCeVJ1bklkID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBsZXQgdG90YWxDYWNoZWRFdmVudEJ5dGVzID0gMDtcblxuICBmdW5jdGlvbiBkZWxldGVDYWNoZWRFdmVudChldmVudFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRDYWNoZS5nZXQoZXZlbnRQYXRoKTtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50Q2FjaGUuZGVsZXRlKGV2ZW50UGF0aCk7XG4gICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzIC09IGNhY2hlZEV2ZW50Qnl0ZXMuZ2V0KGV2ZW50UGF0aCkgPz8gMDtcbiAgICBjYWNoZWRFdmVudEJ5dGVzLmRlbGV0ZShldmVudFBhdGgpO1xuICAgIGNvbnN0IGNhY2hlZFBhdGhzID0gY2FjaGVkUGF0aHNCeVJ1bklkLmdldChldmVudC5ydW5JZCk7XG4gICAgY2FjaGVkUGF0aHM/LmRlbGV0ZShldmVudFBhdGgpO1xuICAgIGlmIChjYWNoZWRQYXRocz8uc2l6ZSA9PT0gMCkge1xuICAgICAgY2FjaGVkUGF0aHNCeVJ1bklkLmRlbGV0ZShldmVudC5ydW5JZCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJSdW5DYWNoZShydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWNoZWRQYXRoIG9mIGNhY2hlZFBhdGhzQnlSdW5JZC5nZXQocnVuSWQpID8/IFtdKSB7XG4gICAgICBkZWxldGVDYWNoZWRFdmVudChjYWNoZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIGV2ZW50Q2FjaGUuY2xlYXIoKTtcbiAgICBjYWNoZWRFdmVudEJ5dGVzLmNsZWFyKCk7XG4gICAgY2FjaGVkUGF0aHNCeVJ1bklkLmNsZWFyKCk7XG4gICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzID0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhY2hlRXZlbnQoXG4gICAgZXZlbnRQYXRoOiBzdHJpbmcsXG4gICAgY2FjaGVkRXZlbnQ6IEV2ZW50LFxuICAgIHNlcmlhbGl6ZWRCeXRlczogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGlmIChzZXJpYWxpemVkQnl0ZXMgPiBtYXhDYWNoZWRFdmVudEJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKFxuICAgICAgZXZlbnRDYWNoZS5zaXplID4gMCAmJlxuICAgICAgKGV2ZW50Q2FjaGUuc2l6ZSA+PSBtYXhDYWNoZWRFdmVudEVudHJpZXMgfHxcbiAgICAgICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzICsgc2VyaWFsaXplZEJ5dGVzID4gbWF4Q2FjaGVkRXZlbnRCeXRlcylcbiAgICApIHtcbiAgICAgIGNvbnN0IG9sZGVzdFBhdGggPSBldmVudENhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgZGVsZXRlQ2FjaGVkRXZlbnQob2xkZXN0UGF0aCk7XG4gICAgfVxuXG4gICAgZXZlbnRDYWNoZS5zZXQoZXZlbnRQYXRoLCBjYWNoZWRFdmVudCk7XG4gICAgY2FjaGVkRXZlbnRCeXRlcy5zZXQoZXZlbnRQYXRoLCBzZXJpYWxpemVkQnl0ZXMpO1xuICAgIHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyArPSBzZXJpYWxpemVkQnl0ZXM7XG4gICAgY29uc3QgY2FjaGVkUGF0aHMgPVxuICAgICAgY2FjaGVkUGF0aHNCeVJ1bklkLmdldChjYWNoZWRFdmVudC5ydW5JZCkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY2FjaGVkUGF0aHMuYWRkKGV2ZW50UGF0aCk7XG4gICAgY2FjaGVkUGF0aHNCeVJ1bklkLnNldChjYWNoZWRFdmVudC5ydW5JZCwgY2FjaGVkUGF0aHMpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBpbi1tZW1vcnkgY2FjaGUgZm9yIGFuIGV2ZW50IHRoYXQgd2FzIGp1c3QgcGVyc2lzdGVkIGF0XG4gIC8vIGBldmVudFBhdGhgLiBgc2VyaWFsaXplZEV2ZW50YCBtdXN0IGJlIHRoZSBleGFjdCBieXRlIHBheWxvYWQgd3JpdHRlblxuICAvLyB0byBkaXNrOiBkZWNvZGluZyBpdCAoaW5zdGVhZCBvZiB0aGUgY2FsbGVyJ3MgYGV2ZW50YCkgYm90aCBkZXRhY2hlc1xuICAvLyBjYWxsZXItb3duZWQgcGF5bG9hZHMgYW5kIG1hdGNoZXMgZGlzay1yZWFkIG5vcm1hbGl6YXRpb24uIENhbGxlcnNcbiAgLy8gbXVzdCBjYXB0dXJlIGBzZXJpYWxpemVkRXZlbnRgICpiZWZvcmUqIHRoZSB3cml0ZSdzIGBhd2FpdGAgc28gdGhlXG4gIC8vIGNhY2hlZCBzbmFwc2hvdCBjYW4gbmV2ZXIgb2JzZXJ2ZSBhIGxhdGVyIG11dGF0aW9uLlxuICBmdW5jdGlvbiByZW1lbWJlclN0b3JlZEV2ZW50KFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBldmVudFBhdGg6IHN0cmluZyxcbiAgICBzZXJpYWxpemVkRXZlbnQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICAvLyBUZXJtaW5hbCBydW5zIHJlbGVhc2UgdGhlaXIgY2FjaGVkIGhpc3Rvcnkgc28gYSBsb25nLWxpdmVkIGRldlxuICAgIC8vIHNlcnZlciBkb2Vzbid0IHJldGFpbiBjb21wbGV0ZWQgcnVucyBmb3JldmVyLlxuICAgIGlmIChpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIGNsZWFyUnVuQ2FjaGUoZXZlbnQucnVuSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgaWYgKHNlcmlhbGl6ZWRCeXRlcyA+IG1heENhY2hlZEV2ZW50Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZWRFdmVudCA9IEV2ZW50U2NoZW1hLnNhZmVQYXJzZShcbiAgICAgIEpTT04ucGFyc2Uoc2VyaWFsaXplZEV2ZW50LCBqc29uUmV2aXZlcilcbiAgICApO1xuICAgIGlmIChjYWNoZWRFdmVudC5zdWNjZXNzKSB7XG4gICAgICBjYWNoZUV2ZW50KGV2ZW50UGF0aCwgY2FjaGVkRXZlbnQuZGF0YSwgc2VyaWFsaXplZEJ5dGVzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdG9yZUV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50UGF0aCA9IHRhZ2dlZFBhdGgoXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ2V2ZW50cycsXG4gICAgICBgJHtldmVudC5ydW5JZH0tJHtldmVudC5ldmVudElkfWAsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRFdmVudCA9IEpTT04uc3RyaW5naWZ5KGV2ZW50LCBqc29uUmVwbGFjZXIsIDIpO1xuICAgIGF3YWl0IHdyaXRlKGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcbiAgICByZW1lbWJlclN0b3JlZEV2ZW50KGV2ZW50LCBldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgaW4tcHJvY2VzcyBtdXRleGVzLiBUd28gc3RvcmFnZSBpbnN0YW5jZXMgc2hhcmluZ1xuICAvLyBvbmUgZGF0YSBkaXJlY3RvcnkgZ2V0IGluZGVwZW5kZW50IGxvY2sgbWFwcywgd2hpY2ggbWFrZXMgdGhlbVxuICAvLyBiZWhhdmUgbGlrZSB0d28gc2VwYXJhdGUgT1MgcHJvY2Vzc2VzIGZyb20gdGhlIGxvY2tpbmdcbiAgLy8gc3RhbmRwb2ludCDigJQgY3Jvc3MtaW5zdGFuY2UgYXJiaXRyYXRpb24gcmVsaWVzIG9uIHRoZSBvbi1kaXNrXG4gIC8vIGB3cml0ZUV4Y2x1c2l2ZWAgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIGluc3RlYWQuIFRlc3RzIHVzZVxuICAvLyB0aGlzIHRvIGV4ZXJjaXNlIGNyb3NzLXByb2Nlc3MgY29udmVyZ2VuY2Ugd2l0aG91dCBzcGF3bmluZ1xuICAvLyBzdWJwcm9jZXNzZXMuXG4gIC8vXG4gIC8vIGBzdGVwTG9ja3NgIHNlcmlhbGl6ZXMgc3RlcCBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGUgc2FtZVxuICAvLyAocnVuSWQsIGNvcnJlbGF0aW9uSWQpOiBzZWUgY29tbWVudCBmdXJ0aGVyIGRvd24gaW4gdGhlXG4gIC8vIGBpc1N0ZXBFdmVudGAgYnJhbmNoLlxuICAvL1xuICAvLyBgaG9va0xvY2tzYCBzZXJpYWxpemVzIGBob29rX2NyZWF0ZWRgIGNhbGxzIGZvciB0aGUgc2FtZVxuICAvLyAocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHNvIHRoZSBcImNsYWltIHRva2VuLCB0aGVuIHdyaXRlIGhvb2tcbiAgLy8gZW50aXR5ICsgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvIGNvbXBsZXRpb24gYmVmb3JlIGFub3RoZXJcbiAgLy8gaW4tcHJvY2VzcyBpbnZvY2F0aW9uIGVudGVycyB0aGUgZGVkdXAgYnJhbmNoLlxuICBjb25zdCBzdGVwTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcbiAgY29uc3QgaG9va0xvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhckNhY2hlLFxuICAgIGFzeW5jIGNyZWF0ZShydW5JZCwgZGF0YSwgcGFyYW1zKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWVzdC1zdXBwbGllZCBJRHMgYmVmb3JlIHRoZXkncmUgY29uY2F0ZW5hdGVkIGludG9cbiAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBhdHRhY2tzIHdoZXJlIGEgY2xpZW50IHN1cHBsaWVzIHJ1bklkIC8gY29ycmVsYXRpb25JZCB2YWx1ZXMgbGlrZVxuICAgICAgLy8gXCIuLi8uLi8uLi9wYWNrYWdlXCIgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gICAgICAvLyBSdW4gYmVmb3JlIHRha2luZyB0aGUgcGVyLXN0ZXAgbXV0ZXggc28gbWFsZm9ybWVkIGlucHV0cyBmYWlsIGZhc3QuXG4gICAgICAvL1xuICAgICAgLy8gRW1wdHkgYGNvcnJlbGF0aW9uSWRgIHZhbHVlcyBhcmUgYWxzbyByZWplY3RlZCBoZXJlOiB0aGUgZXZlbnRcbiAgICAgIC8vIHNjaGVtYXMgb25seSByZXF1aXJlIGB6LnN0cmluZygpYCwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCByZXF1ZXN0IHdpdGhcbiAgICAgIC8vIGBjb3JyZWxhdGlvbklkOiAnJ2Agd291bGQgc2lsZW50bHkgYmUgd3JpdHRlbiB1bmRlciBhIG1hbGZvcm1lZFxuICAgICAgLy8gY29tcG9zaXRlIGtleSBsaWtlIGAke3J1bklkfS1gLlxuICAgICAgaWYgKHJ1bklkICE9IG51bGwgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBpZiAoJ2NvcnJlbGF0aW9uSWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBzZXJpYWxpemVkIHBlci1zdGVwIHZpYSBhbiBpbi1wcm9jZXNzIG11dGV4XG4gICAgICAvLyBzbyB0aGF0IHRoZSBcImNoZWNrIHN0YXRlLCB0aGVuIHdyaXRlXCIgc2VxdWVuY2UgaW4gc3RlcF9zdGFydGVkIC9cbiAgICAgIC8vIHN0ZXBfY29tcGxldGVkIC8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIGlzIGF0b21pYy4gc3RlcF9jcmVhdGVkXG4gICAgICAvLyBpcyBhbHNvIHNlcmlhbGl6ZWQgc28gZHVwbGljYXRlLWNyZWF0ZSByYWNlcyBkb24ndCBsZWF2ZSBleHRyYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgbG9nLlxuICAgICAgY29uc3QgaXNTdGVwRXZlbnQgPVxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZyc7XG4gICAgICBpZiAoaXNTdGVwRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgIHJldHVybiB3aXRoSW5Qcm9jZXNzTG9jayhzdGVwTG9ja3MsIGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICAvLyBgaG9va19jcmVhdGVkYCBpcyBzZXJpYWxpemVkIHBlci0ocnVuSWQsIGhvb2tJZCkgc28gdGhlXG4gICAgICAvLyBcImNsYWltIHRva2VuLCB3cml0ZSBob29rIGVudGl0eSwgd3JpdGUgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvXG4gICAgICAvLyBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlXG4gICAgICAvLyBzYW1lLWhvb2sgZGVkdXAgYnJhbmNoLiBXaXRob3V0IHRoaXMsIHR3byBzYW1lLXRpY2sgY29uY3VycmVudFxuICAgICAgLy8gY2FsbGVycyBjYW4gcmFjZSBiZXR3ZWVuIHRoZSB3aW5uZXIncyBgd3JpdGVFeGNsdXNpdmUoY2xhaW0pYFxuICAgICAgLy8gYW5kIGB3cml0ZUpTT04oaG9vaylgLCBtYWtpbmcgdGhlIHNlY29uZCBjYWxsZXIgbW9tZW50YXJpbHlcbiAgICAgIC8vIG9ic2VydmUgYSBjbGFpbSB3aXRoIG5vIG1hdGNoaW5nIGhvb2sgZW50aXR5IOKAlCB3aGljaCB0aGVcbiAgICAgIC8vIGNyYXNoLXJlY292ZXJ5IHBhdGggYmVsb3cgd291bGQgbWlzaW50ZXJwcmV0IGFzIGEgcHJpb3IgY3Jhc2hcbiAgICAgIC8vIGFuZCBpbmNvcnJlY3RseSBmYWxsIHRocm91Z2ggdG8gYSBzZWNvbmQgaG9vayBlbnRpdHkgd3JpdGUuXG4gICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2suJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5ob29rYDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKGhvb2tMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbXBsKCk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltcGwoKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgICAvLyBNb3N0IHBhdGhzIHVzZSB0aGUgZnJlc2hseS1nZW5lcmF0ZWQgY2FuZGlkYXRlIGV2ZW50SWQuIFRoZVxuICAgICAgICAvLyBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgcGF0aCBiZWxvdyBtYXkgcmVhc3NpZ24gaXQgdG9cbiAgICAgICAgLy8gdGhlIGNhbm9uaWNhbCBldmVudElkIHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbVxuICAgICAgICAvLyBzbyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAvLyBGb3IgcnVuX2NyZWF0ZWQgZXZlbnRzLCB1c2UgY2xpZW50LXByb3ZpZGVkIHJ1bklkIG9yIGdlbmVyYXRlIG9uZSBzZXJ2ZXItc2lkZVxuICAgICAgICBsZXQgZWZmZWN0aXZlUnVuSWQ6IHN0cmluZztcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICghcnVuSWQgfHwgcnVuSWQgPT09ICcnKSkge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gYHdydW5fJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J1bklkIGlzIHJlcXVpcmVkIGZvciBub24tcnVuX2NyZWF0ZWQgZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBydW5JZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNsaWVudC1wcm92aWRlZCBydW5JZCB0aW1lc3RhbXAgaXMgd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiBydW5JZCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAoXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICd3cnVuXydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjVmVyc2lvbiBpcyBhbHdheXMgc2VudCBieSB0aGUgcnVudGltZSwgYnV0IHdlIHByb3ZpZGUgYSBmYWxsYmFjayBmb3Igc2FmZXR5XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNwZWNWZXJzaW9uID0gZGF0YS5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVDtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBydW4gc3RhdGUgZm9yIHZhbGlkYXRpb24gKGlmIG5vdCBjcmVhdGluZyBhIG5ldyBydW4pXG4gICAgICAgIC8vIFNraXAgcnVuIHZhbGlkYXRpb24gZm9yIHN0ZXBfY29tcGxldGVkIGFuZCBzdGVwX3JldHJ5aW5nIC0gdGhleSBvbmx5IG9wZXJhdGVcbiAgICAgICAgLy8gb24gcnVubmluZyBzdGVwcywgYW5kIHJ1bm5pbmcgc3RlcHMgYXJlIGFsd2F5cyBhbGxvd2VkIHRvIG1vZGlmeSByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIHJ1biBzdGF0ZS4gVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgZmlsZXN5c3RlbSByZWFkcyBwZXIgc3RlcCBldmVudC5cbiAgICAgICAgbGV0IGN1cnJlbnRSdW46IFdvcmtmbG93UnVuIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNraXBSdW5WYWxpZGF0aW9uRXZlbnRzID0gWydzdGVwX2NvbXBsZXRlZCcsICdzdGVwX3JldHJ5aW5nJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSAhPT0gJ3J1bl9jcmVhdGVkJyAmJlxuICAgICAgICAgICFza2lwUnVuVmFsaWRhdGlvbkV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0YXJ0OiBydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuIHdpdGggZXZlbnREYXRhXG4gICAgICAgICAgLy8gY3JlYXRlcyB0aGUgcnVuIGZpcnN0LCBzbyB0aGUgcXVldWUgY2FuIGJvb3RzdHJhcCBhIHJ1biB0aGF0XG4gICAgICAgICAgLy8gZmFpbGVkIHRvIGNyZWF0ZSBkdXJpbmcgc3RhcnQoKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRSdW4gJiZcbiAgICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBydW5JbnB1dERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICBpbnB1dD86IGFueTtcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuZGVwbG95bWVudElkICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcChcbiAgICAgICAgICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBBdG9taWNhbGx5IHRyeSB0byBwdWJsaXNoIHRoZSBydW4gZW50aXR5IHNvIG9ubHkgdGhlIGZpcnN0XG4gICAgICAgICAgICAgIC8vIHdyaXRlciB3aW5zLCBwcmV2ZW50aW5nIGEgVE9DVE9VIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9jcmVhdGVkIGZyb20gc3RhcnQoKSBjb3VsZCBvdmVyd3JpdGUgYSBydW4gdGhhdCB3YXNcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gJ3J1bm5pbmcnLlxuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUnVuOiBXb3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNyZWF0ZWRSdW4sIGpzb25SZXBsYWNlcilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZWQgdGhlIHJ1biDigJQgYWxzbyB3cml0ZSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkOiBydW5DcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdG9yZUV2ZW50KHJ1bkNyZWF0ZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGNyZWF0ZWRSdW47XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZXhpc3RzIChjb25jdXJyZW50IHJ1bl9jcmVhdGVkIHdvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyByYWNlKS4gUmUtcmVhZCBpdCBzbyBkb3duc3RyZWFtIGxvZ2ljIHNlZXMgdGhlIHJlYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcnVuX2ZhaWxlZCBvbiBhIG5vbi1leGlzdGVudCBydW4gaXMgcmVqZWN0ZWQgdG8gbWF0Y2ggdGhlXG4gICAgICAgIC8vIHBvc3RncmVzIGFuZCB2ZXJjZWwgd29ybGRzLCB3aGljaCBib3RoIHN1cmZhY2UgdGhpcyBhcyBhXG4gICAgICAgIC8vIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciByYXRoZXIgdGhhbiBzaWxlbnRseSBwZXJzaXN0aW5nIGFuXG4gICAgICAgIC8vIGV2ZW50IGZvciBhIHJ1biB0aGF0IHdhcyBuZXZlciBjcmVhdGVkLlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZFUlNJT04gQ09NUEFUSUJJTElUWTogQ2hlY2sgcnVuIHNwZWMgdmVyc2lvblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRm9yIGV2ZW50cyB0aGF0IGhhdmUgZmV0Y2hlZCB0aGUgcnVuLCBjaGVjayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vIFNraXAgZm9yIHJ1bl9jcmVhdGVkIChubyBleGlzdGluZyBydW4pIGFuZCBydW50aW1lIGV2ZW50cyAoc3RlcF9jb21wbGV0ZWQsIHN0ZXBfcmV0cnlpbmcpLlxuICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJ1biByZXF1aXJlcyBhIG5ld2VyIHdvcmxkIHZlcnNpb25cbiAgICAgICAgICBpZiAocmVxdWlyZXNOZXdlcldvcmxkKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuTm90U3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24hLFxuICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fQ1VSUkVOVFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSb3V0ZSB0byBsZWdhY3kgaGFuZGxlciBmb3IgcHJlLWV2ZW50LXNvdXJjaW5nIHJ1bnNcbiAgICAgICAgICBpZiAoaXNMZWdhY3lTcGVjVmVyc2lvbihjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUxlZ2FjeUV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY3VycmVudFJ1bixcbiAgICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWQUxJREFUSU9OOiBUZXJtaW5hbCBzdGF0ZSBhbmQgZXZlbnQgb3JkZXJpbmcgY2hlY2tzXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogYSBzdGVwX3N0YXJ0ZWQgY2Fycnlpbmcgc3RlcC1jcmVhdGlvbiBkYXRhXG4gICAgICAgIC8vIChzdGVwTmFtZSArIGlucHV0KSBpcyBhbGxvd2VkIHRvIGFycml2ZSB3aXRoIG5vIHByaW9yIHN0ZXBfY3JlYXRlZFxuICAgICAgICAvLyDigJQgaXQgY3JlYXRlcyB0aGUgc3RlcCBvbiB0aGUgZmx5IChzZWUgdGhlIG1hdGVyaWFsaXphdGlvbiBibG9ja1xuICAgICAgICAvLyBiZWxvdykuIFRoaXMgbWlycm9ycyB0aGUgcmVzaWxpZW50IHJ1bl9zdGFydGVkIHBhdGguIERldGVjdCBpdCBoZXJlXG4gICAgICAgIC8vIHNvIHRoZSBlbnRpdHktY3JlYXRpb24gdGVybWluYWwtcnVuIGd1YXJkIHRyZWF0cyBpdCBsaWtlIGEgY3JlYXRpb25cbiAgICAgICAgLy8gYW5kIHRoZSBcInN0ZXAgbXVzdCBleGlzdFwiIG9yZGVyaW5nIGd1YXJkIGRvZXNuJ3QgcmVqZWN0IGl0LlxuICAgICAgICBjb25zdCBsYXp5U3RlcFN0YXJ0ID1cbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhICYmXG4gICAgICAgICAgISFkYXRhLmV2ZW50RGF0YSAmJlxuICAgICAgICAgIHR5cGVvZiAoZGF0YS5ldmVudERhdGEgYXMgeyBzdGVwTmFtZT86IHVua25vd24gfSkuc3RlcE5hbWUgPT09XG4gICAgICAgICAgICAnc3RyaW5nJyAmJlxuICAgICAgICAgIChkYXRhLmV2ZW50RGF0YSBhcyB7IGlucHV0PzogdW5rbm93biB9KS5pbnB1dCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFJ1biB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCBydW5UZXJtaW5hbEV2ZW50cyA9IFtcbiAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIElkZW1wb3RlbnQgb3BlcmF0aW9uOiBydW5fY2FuY2VsbGVkIG9uIGFscmVhZHkgY2FuY2VsbGVkIHJ1biBpcyBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJyAmJlxuICAgICAgICAgICAgY3VycmVudFJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgc3RhdGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCBzdG9yZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID1cbiAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBldmVudDogc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSksXG4gICAgICAgICAgICAgIHJ1bjogY3VycmVudFJ1bixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkIG9uIHRlcm1pbmFsIHJ1bnMsIHVzZSBSdW5FeHBpcmVkRXJyb3Igc28gdGhlXG4gICAgICAgICAgLy8gcnVudGltZSBrbm93cyB0byBleGl0IHdpdGhvdXQgcmV0cnlpbmcuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBpcyBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXIgcnVuIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiB0ZXJtaW5hbCBydW5zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcnVuVGVybWluYWxFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCB0cmFuc2l0aW9uIHJ1biBmcm9tIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRpbmcgbmV3IGVudGl0aWVzIG9uIHRlcm1pbmFsIHJ1bnMgaXMgbm90IGFsbG93ZWQuIEEgbGF6eVxuICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBjcmVhdGVzIGEgc3RlcCwgc28gaXQgaXMgcmVqZWN0ZWQgaGVyZSB0b28g4oCUIGEgYmFyZVxuICAgICAgICAgIC8vIChub24tbGF6eSkgc3RlcF9zdGFydGVkIGZhbGxzIHRocm91Z2ggdG8gdGhlIHN0ZXAtdmFsaWRhdGlvblxuICAgICAgICAgIC8vIGJsb2NrIGJlbG93LCB3aGljaCB1c2VzIFJ1bkV4cGlyZWRFcnJvciBmb3IgdGVybWluYWwgcnVucy5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBsYXp5U3RlcFN0YXJ0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgbmV3IGVudGl0aWVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3Qgc2V0IGF0dHJpYnV0ZXMgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcC1yZWxhdGVkIGV2ZW50IHZhbGlkYXRpb24gKG9yZGVyaW5nIGFuZCB0ZXJtaW5hbCBzdGF0ZSlcbiAgICAgICAgLy8gU3RvcmUgZXhpc3RpbmdTdGVwIHNvIHdlIGNhbiByZXVzZSBpdCBsYXRlciAoYXZvaWQgZG91YmxlIHJlYWQpXG4gICAgICAgIGxldCB2YWxpZGF0ZWRTdGVwOiBTdGVwIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudHMgPSBbXG4gICAgICAgICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHN0ZXBFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICB2YWxpZGF0ZWRTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBTdGVwU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEV2ZW50IG9yZGVyaW5nOiBzdGVwIG11c3QgZXhpc3QgYmVmb3JlIHRoZXNlIGV2ZW50cyDigJQgZXhjZXB0IG9uXG4gICAgICAgICAgLy8gdGhlIGxhenktc3RhcnQgcGF0aCwgd2hlcmUgc3RlcF9zdGFydGVkIGNyZWF0ZXMgdGhlIHN0ZXAgaXRzZWxmLlxuICAgICAgICAgIGlmICghdmFsaWRhdGVkU3RlcCAmJiAhbGF6eVN0ZXBTdGFydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBub3QgZm91bmRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIExhenkgc3RhcnQgZXhhY3RseS1vbmNlIGdhdGU6IGEgbGF6eSBzdGVwX3N0YXJ0ZWQgYWx3YXlzIENSRUFURVNcbiAgICAgICAgICAvLyB0aGUgc3RlcCAodGhlIG93bmVkLWlubGluZSBwYXRoIG9ubHkgc2VuZHMgb25lIGZvciBhIHN0ZXAgd2hvc2VcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgaXQgZGVmZXJyZWQpLiBJZiB0aGUgc3RlcCBhbHJlYWR5IGV4aXN0cywgYSBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaGFuZGxlciB3b24gdGhlIGNyZWF0ZSDigJQgdGhpcyBjYWxsZXIgaXMgYSBsb3NlciBhbmQgbXVzdCBub3Qgc3RhcnRcbiAgICAgICAgICAvLyBvciBydW4gdGhlIHN0ZXAuIFRocm93IEVudGl0eUNvbmZsaWN0RXJyb3Igc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwIG1hcHMgaXQgdG8gYHNraXBwZWRgLiBUaGlzIGlzIGNyaXRpY2FsOiB0aGUgcGxhaW4gc3RhcnRcbiAgICAgICAgICAvLyB0cmFuc2l0aW9uIGJlbG93IHBlcm1pdHMgcmUtc3RhcnRpbmcgYSBub24tdGVybWluYWwgc3RlcCAocmV0cmllc1xuICAgICAgICAgIC8vIHJlbHkgb24gdGhhdCksIHNvIHdpdGhvdXQgdGhpcyBnYXRlIGEgbG9zZXIgd291bGQgcmUtc3RhcnQgYVxuICAgICAgICAgIC8vIHJ1bm5pbmcgc3RlcCBhbmQgcnVuIHRoZSBib2R5IGEgc2Vjb25kIHRpbWUuXG4gICAgICAgICAgaWYgKGxhenlTdGVwU3RhcnQgJiYgdmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGVwIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb24uIHZhbGlkYXRlZFN0ZXAgY2FuIGJlIG51bGwgb25seSBvblxuICAgICAgICAgIC8vIHRoZSBsYXp5LXN0YXJ0IHBhdGggKG5vIHN0ZXAgeWV0KSDigJQgdGhlcmUgaXMgbm90aGluZyB0ZXJtaW5hbCB0b1xuICAgICAgICAgIC8vIGd1YXJkIGFnYWluc3QgaW4gdGhhdCBjYXNlLCBzbyB0aGVzZSBjaGVja3MgYXJlIHNraXBwZWQuXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGlmIChpc1Rlcm1pbmFsU3RlcFN0YXR1cyh2YWxpZGF0ZWRTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7dmFsaWRhdGVkU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIHRlcm1pbmFsIHJ1bnM6IG9ubHkgYWxsb3cgY29tcGxldGluZy9mYWlsaW5nIGluLXByb2dyZXNzIHN0ZXBzXG4gICAgICAgICAgICBpZiAoY3VycmVudFJ1biAmJiBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IG5vbi1ydW5uaW5nIHN0ZXAgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSG9vay1yZWxhdGVkIGV2ZW50IHZhbGlkYXRpb24gKG9yZGVyaW5nKVxuICAgICAgICBjb25zdCBob29rRXZlbnRzUmVxdWlyaW5nRXhpc3RlbmNlID0gWydob29rX2Rpc3Bvc2VkJywgJ2hvb2tfcmVjZWl2ZWQnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpICYmXG4gICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYGV2ZW50YCBtYXkgYmUgcmVhc3NpZ25lZCBsYXRlciBpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gZGVkdXAtcmVjb3ZlcnkgYnJhbmNoIHRvIHN3YXAgaW4gYSBjYW5vbmljYWwgZXZlbnRJZCAvXG4gICAgICAgIC8vIGNyZWF0ZWRBdCBwZXJzaXN0ZWQgaW4gdGhlIGR1cmFibGUgdG9rZW4gY2xhaW0gc29cbiAgICAgICAgLy8gY29uY3VycmVudCAvIGNyb3NzLXByb2Nlc3Mgd29ya2VycyBjb252ZXJnZSBvbiBhIHNpbmdsZVxuICAgICAgICAvLyBldmVudCBpbiB0aGUgbG9nLlxuICAgICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICB9O1xuICAgICAgICAvLyBTdHJpcCBldmVudERhdGEgZnJvbSBydW5fc3RhcnRlZCDigJQgaXQgYmVsb25ncyBvbiBydW5fY3JlYXRlZCBvbmx5LlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZXZlbnQpIHtcbiAgICAgICAgICBkZWxldGUgKGV2ZW50IGFzIGFueSkuZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmlwIG9ubHkgdGhlIHN0ZXAgYGlucHV0YCBmcm9tIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZCBldmVudCByb3cg4oCUXG4gICAgICAgIC8vIGl0IGJlbG9uZ3Mgb24gdGhlIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgd3JpdHRlbiBhYm92ZS4gc3RlcE5hbWUgaXNcbiAgICAgICAgLy8gcHJlc2VydmVkIGZvciB0aGUgY2xpZW50IHJlcGxheSBjb25zdW1lcidzIHN0ZXAtbmFtZSBkaXZlcmdlbmNlXG4gICAgICAgIC8vIGNoZWNrIChwYWNrYWdlcy9jb3JlL3NyYy9zdGVwLnRzKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhenlTdGVwU3RhcnQgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJlxuICAgICAgICAgIChldmVudCBhcyB7IGV2ZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLmV2ZW50RGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IGlucHV0OiBfc3RyaXBwZWRJbnB1dCwgLi4ucmVzdCB9ID0gKFxuICAgICAgICAgICAgZXZlbnQgYXMgeyBldmVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1cbiAgICAgICAgICApLmV2ZW50RGF0YTtcbiAgICAgICAgICAoZXZlbnQgYXMgeyBldmVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLmV2ZW50RGF0YSA9IHJlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBlbnRpdHkgY3JlYXRlZC91cGRhdGVkIGZvciBFdmVudFJlc3VsdFxuICAgICAgICBsZXQgcnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0ZXA6IFN0ZXAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob29rOiBIb29rIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd2FpdDogV2FpdCB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBzZXQgdHJ1ZSB3aGVuIHRoaXMgc3RlcF9zdGFydGVkIGF0b21pY2FsbHkgY3JlYXRlZFxuICAgICAgICAvLyB0aGUgc3RlcCAodGhlIGNhbGxlciB3b24gdGhlIGNyZWF0ZS1jbGFpbSkuIFN1cmZhY2VkIG9uIEV2ZW50UmVzdWx0XG4gICAgICAgIC8vIGFzIHRoZSBydW50aW1lJ3MgZXhhY3RseS1vbmNlIG93bmVyc2hpcCBzaWduYWwuXG4gICAgICAgIGxldCBzdGVwQ3JlYXRlZExhemlseSA9IGZhbHNlO1xuICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZCB1bnRpbFxuICAgICAgICAvLyBBRlRFUiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCBzdWNjZWVkcywgc28gYSByZXRyeSB0aGF0XG4gICAgICAgIC8vIGNvbGxpZGVzIHdpdGggYW4gYWxyZWFkeS1wdWJsaXNoZWQgYGhvb2tfY3JlYXRlZGAgZG9lcyBub3RcbiAgICAgICAgLy8gbXV0YXRlIHRoZSBkdXJhYmxlIGhvb2sgZW50aXR5IHdpdGggdGhlIHJldHJ5J3MgcGF5bG9hZC5cbiAgICAgICAgLy8gYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGNhcnJpZXMgdGhlIGB7IG92ZXJ3cml0ZSB9YCBtb2RlXG4gICAgICAgIC8vIGNob3NlbiBieSB0aGUgZGVkdXAtcmVjb3ZlcnkgYnJhbmNoIGFib3ZlICh1bmRlZmluZWQgZm9yXG4gICAgICAgIC8vIGZpcnN0IHdyaXRlcnMsIGB7IG92ZXJ3cml0ZTogdHJ1ZSB9YCBmb3IgcmV0cmllcyB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZXBhaXJpbmcgYW4gb3JwaGFuZWQgcGFydGlhbCB3cml0ZSkuXG4gICAgICAgIGxldCBob29rRW50aXR5V3JpdGVPcHRpb25zOiB7IG92ZXJ3cml0ZTogYm9vbGVhbiB9IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENyZWF0ZS91cGRhdGUgZW50aXR5IGJhc2VkIG9uIGV2ZW50IHR5cGUgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAvLyBSdW4gbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogdHJ1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bkRhdGEuYXR0cmlidXRlcyA/PyB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiBydW5EYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5EYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5EYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgcnVuIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuRGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgaW5wdXQ6IHJ1bkRhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gQXRvbWljYWxseSBwdWJsaXNoIHRoZSBydW4gZW50aXR5IGZpbGUgd2l0aG91dCBvdmVyd3JpdGluZyBhblxuICAgICAgICAgIC8vIGV4aXN0aW5nIHdpbm5lci4gVGhpcyBwcmV2ZW50cyBhIFRPQ1RPVSByYWNlIHdpdGggdGhlIHJlc2lsaWVudFxuICAgICAgICAgIC8vIHN0YXJ0IHBhdGggKHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4pIHRoYXQgY291bGQgcmVzdWx0IGluXG4gICAgICAgICAgLy8gZHVwbGljYXRlIHJ1bl9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgcnVuUGF0aCxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJ1biwganNvblJlcGxhY2VyLCAyKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIC8vIElmIGFscmVhZHkgcnVubmluZywgcmV0dXJuIHRoZSBydW4gd2l0aG91dCBpbnNlcnRpbmcgYVxuICAgICAgICAgICAgLy8gZHVwbGljYXRlIGV2ZW50LiAgVGhpcyBtYWtlcyBydW5fc3RhcnRlZCBpZGVtcG90ZW50IGZvclxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBpbnZvY2F0aW9ucy4gIFdlIG9taXQgcHJlbG9hZGVkIGV2ZW50cyBoZXJlXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoaXMgaXMgYSByYXJlIHJhY2UtY29uZGl0aW9uIHBhdGgg4oCUIHRoZSBydW50aW1lXG4gICAgICAgICAgICAvLyBmYWxscyBiYWNrIHRvIGxvYWRXb3JrZmxvd1J1bkV2ZW50cygpLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW4uc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcnVuOiBjdXJyZW50UnVuIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQgPz8gbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHsgb3V0cHV0PzogYW55IH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLm91dHB1dCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBmYWlsZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgU2VyaWFsaXplZERhdGEgKFVpbnQ4QXJyYXkpIHByb2R1Y2VkIGJ5XG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVSdW5FcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVJ1bkVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIGVycm9yQ29kZTogZmFpbGVkRGF0YS5lcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiBjdXJyZW50UnVuKSB7XG4gICAgICAgICAgcnVuID0gYXdhaXQgd2l0aFJ1bkZpbGVMb2NrKGVmZmVjdGl2ZVJ1bklkLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyksXG4gICAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFmcmVzaCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yKGVmZmVjdGl2ZVJ1bklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhkYXRhLmV2ZW50RGF0YS5jaGFuZ2VzLCB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nS2V5czogT2JqZWN0LmtleXMoZnJlc2guYXR0cmlidXRlcyksXG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbGFpbSB0aGUgY29ycmVsYXRpb24gZGVkdXAgbG9jayBvbmx5IGFmdGVyIHZhbGlkYXRpb246IGFcbiAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gZmFpbHVyZSBtdXN0IGxlYXZlIHRoZSBjb3JyZWxhdGlvbklkIHVuY2xhaW1lZCBzb1xuICAgICAgICAgICAgLy8gdGhlIHJ1bnRpbWUncyByZXRyeSBvZiB0aGUgc2FtZSBldmVudCBpcyBub3QgbWlzcmVwb3J0ZWQgYXNcbiAgICAgICAgICAgIC8vIFwiYWxyZWFkeSBleGlzdHNcIiB3aGlsZSB0aGUgZXZlbnQgd2FzIG5ldmVyIHdyaXR0ZW4gKHRoZVxuICAgICAgICAgICAgLy8gZGlzcGF0Y2hlciB3b3VsZCB0aGVuIHdhaXQgZm9yZXZlciBmb3IgYW4gZXZlbnQgdGhhdCBpcyBub3RcbiAgICAgICAgICAgIC8vIGluIHRoZSBsb2cpLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEud3JpdGVyLnR5cGUgPT09ICd3b3JrZmxvdydcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBhdHRyTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgICAgICBjb25zdCBhdHRyTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzJyxcbiAgICAgICAgICAgICAgICBhdHRyTG9ja05hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShhdHRyTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgICAgaWYgKCFhdHRyQ2xhaW1lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgYEF0dHJpYnV0ZSBldmVudCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB7XG4gICAgICAgICAgICAgIC4uLmZyZXNoLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhcHBseUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgZnJlc2guYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5jaGFuZ2VzXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfSBhcyBXb3JrZmxvd1J1bjtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQ6IENyZWF0ZXMgc3RlcCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3BlbmRpbmcnLCBhdHRlbXB0PTAsIGNyZWF0ZWRBdCBzZXQuXG4gICAgICAgICAgLy8gVHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgd2l0aCBpZGVudGljYWwgY29ycmVsYXRpb25JZHMgKGUuZy4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgcnVudGltZSdzIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHMgYWNyb3NzIHJlcGxheXMpXG4gICAgICAgICAgLy8gbXVzdCBiZSBkZWR1cGVkIOKAlCBvdGhlcndpc2UgYm90aCB3cml0ZXMgc3VjY2VlZCBhbmQgdGhlIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGVuZHMgdXAgd2l0aCBkdXBsaWNhdGUgc3RlcF9jcmVhdGVkIGVudHJpZXMuIFRoZSBvdXRlclxuICAgICAgICAgIC8vIHdpdGhTdGVwTG9jayBtdXRleCBzZXJpYWxpemVzIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzOyB0aGlzXG4gICAgICAgICAgLy8gVGhlIGV4Y2x1c2l2ZSBjb25zdHJhaW50IGZpbGUgYWRkaXRpb25hbGx5IHByb3RlY3RzIGFnYWluc3RcbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHJhY2VzICh0d28gcG5wbSB3b3JrZXJzLCByZWRlbGl2ZXJlZCBxdWV1ZSBtZXNzYWdlcyxcbiAgICAgICAgICAvLyBldGMuKS4gVGhlIGxvc2VyIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGlzdGluZyBjYXRjaCBwYXRoIGNhbiBzd2FsbG93IGl0IGFuZCBhdm9pZCBkb3VibGUtcXVldWluZyB0aGVcbiAgICAgICAgICAvLyBzdGVwLlxuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdGVwRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICAgIH07XG4gICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXBEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICBpbnB1dDogc3RlcERhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQ6IEluY3JlbWVudHMgYXR0ZW1wdCwgc2V0cyBzdGF0dXMgdG8gJ3J1bm5pbmcnXG4gICAgICAgICAgLy8gU2V0cyBzdGFydGVkQXQgb25seSBvbiB0aGUgZmlyc3Qgc3RhcnQgKG5vdCB1cGRhdGVkIG9uIHJldHJpZXMpXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcblxuICAgICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogbm8gcHJpb3Igc3RlcF9jcmVhdGVkIOKAlCBjcmVhdGUgdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgLy8gYW5kIGEgc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBub3csIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgICAgICAgIC8vIHN0YXJ0IHRyYW5zaXRpb24gYmVsb3cuIE1pcnJvcnMgdGhlIHJlc2lsaWVudCBydW5fc3RhcnRlZCBwYXRoOlxuICAgICAgICAgIC8vIHRoZSBzdGVwIGVudGl0eSBpcyBjbGFpbWVkIGF0b21pY2FsbHkgKGZpcnN0IHdyaXRlciB3aW5zKSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBrZWVwcyByZXBsYXkgY29ycmVjdCAodGhlIGNsaWVudCBzdGVwXG4gICAgICAgICAgLy8gY29uc3VtZXIgbWFya3MgaGFzQ3JlYXRlZEV2ZW50IG9ubHkgd2hlbiBpdCBvYnNlcnZlcyB0aGF0IGV2ZW50KS5cbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXAgJiYgbGF6eVN0ZXBTdGFydCkge1xuICAgICAgICAgICAgY29uc3QgbGF6eURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBhbHJlYWR5IGNsYWltZWQgdGhlIGNyZWF0ZSBmb3IgdGhpc1xuICAgICAgICAgICAgICAvLyBzdGVwLiBUaGUgYXRvbWljIGNsYWltIGlzIHRoZSBleGFjdGx5LW9uY2Ugb3duZXJzaGlwIGdhdGU6XG4gICAgICAgICAgICAgIC8vIG9ubHkgdGhlIHdpbm5lciBydW5zIHRoZSBzdGVwIGJvZHkgaW5saW5lLiBUaHJvd1xuICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKAlCB0aGUgcnVudGltZSdzIGV4ZWN1dGVTdGVwIG1hcHMgdGhpcyB0b1xuICAgICAgICAgICAgICAvLyBgc2tpcHBlZGAsIHNvIHRoZSBsb3NlciBkb2VzIG5vdCBzdGFydCBvciBydW4gdGhlIHN0ZXAuIFRoaXNcbiAgICAgICAgICAgICAgLy8gcHJlc2VydmVzIHRoZSBzYW1lIFwiZXhhY3RseSBvbmUgaGFuZGxlciBvd25zIGVhY2ggc3RlcFwiXG4gICAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGUgc2VwYXJhdGUgc3RlcF9jcmVhdGVkIGNsYWltIHByb3ZpZGVzIHRvZGF5LlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRTdGVwOiBTdGVwID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogbGF6eURhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGxhenlEYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgICAgIGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkU3RlcFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBzbyByZXBsYXkgb2JzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgLy8gKHRoZSBjbGllbnQgc3RlcCBjb25zdW1lciBzZXRzIGhhc0NyZWF0ZWRFdmVudCBvbmx5IG9uIGFcbiAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KS4gSXRzIGV2ZW50SWQgaXMgYSBmcmVzaCBtb25vdG9uaWMgVUxJRC5cbiAgICAgICAgICAgICAgLy8gT3JkZXJpbmcgdnMuIHRoZSBzdGVwX3N0YXJ0ZWQgZXZlbnQgcm93IGRvZXMgbm90IGFmZmVjdFxuICAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzczogdGhlIHN0ZXBfc3RhcnRlZCBjb25zdW1lciBpcyBhIG5vLW9wIGFuZCBvbmx5XG4gICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBmbGlwcyBoYXNDcmVhdGVkRXZlbnQsIHNvIHRoZSBlbmQgc3RhdGUgaXMgdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgd2hpY2hldmVyIHNvcnRzIGZpcnN0IOKAlCB0aGlzIG1hdGNoZXMgdGhlIHJlc2lsaWVudFxuICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCDihpIgcnVuX2NyZWF0ZWQgcHJlY2VkZW50IGluIHRoaXMgZmlsZS5cbiAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRFdmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZDogc3RlcENyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogbGF6eURhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogbGF6eURhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgICAgICAgICBgJHtlZmZlY3RpdmVSdW5JZH0tJHtzdGVwQ3JlYXRlZEV2ZW50SWR9YCxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRFdmVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwID0gY3JlYXRlZFN0ZXA7XG4gICAgICAgICAgICAgIHN0ZXBDcmVhdGVkTGF6aWx5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzbid0IGJlZW4gcmVhY2hlZCB5ZXRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgPiBEYXRlLm5vdygpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb0Vhcmx5RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBzdGFydCBzdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCI6IHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldGAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGd1YXJkOiByZS1yZWFkIHRoZSBzdGVwIGVudGl0eSB0byBjaGVjayBpZiBpdFxuICAgICAgICAgICAgLy8gcmVhY2hlZCB0ZXJtaW5hbCBzdGF0ZSBiZXR3ZWVuIHRoZSB2YWxpZGF0aW9uIHJlYWQgYW5kIG5vdy5cbiAgICAgICAgICAgIC8vIFRoaXMgbmFycm93cyB0aGUgVE9DVE9VIHdpbmRvdyBidXQgZG9lcyBub3QgZnVsbHkgZWxpbWluYXRlIGl0XG4gICAgICAgICAgICAvLyAodGhlIGxvY2FsIHdvcmxkIGlzIHNpbmdsZS1wcm9jZXNzIC8gZGV2LW9ubHk7IHRoZSBwb3N0Z3Jlc1xuICAgICAgICAgICAgLy8gd29ybGQgdXNlcyBTUUwtbGV2ZWwgYXRvbWljIGd1YXJkcyBmb3IgcHJvZHVjdGlvbikuXG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBmcmVzaFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZyZXNoU3RlcCAmJiBpc1Rlcm1pbmFsU3RlcFN0YXR1cyhmcmVzaFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtmcmVzaFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgLy8gT25seSBzZXQgc3RhcnRlZEF0IG9uIHRoZSBmaXJzdCBzdGFydFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IHZhbGlkYXRlZFN0ZXAuc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGF0dGVtcHQgY291bnRlciBvbiBldmVyeSBzdGFydFxuICAgICAgICAgICAgICBhdHRlbXB0OiB2YWxpZGF0ZWRTdGVwLmF0dGVtcHQgKyAxLFxuICAgICAgICAgICAgICAvLyBDbGVhciByZXRyeUFmdGVyIG5vdyB0aGF0IHRoZSBzdGVwIGhhcyBzdGFydGVkXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZDogVGVybWluYWwgc3RhdGUgd2l0aCBvdXRwdXRcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IHJlc3VsdDogYW55IH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLnJlc3VsdCxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2ZhaWxlZDogVGVybWluYWwgc3RhdGUgd2l0aCBlcnJvclxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZmFpbGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlU3RlcEVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9yZXRyeWluZzogU2V0cyBzdGF0dXMgYmFjayB0byAncGVuZGluZycsIHJlY29yZHMgZXJyb3JcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGNvbnN0IHJldHJ5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgcmV0cnlBZnRlcj86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgIGVycm9yOiByZXRyeURhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlEYXRhLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBIb29rIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgICAgIG1ldGFkYXRhPzogYW55O1xuICAgICAgICAgICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICAgICAgICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXRvbWljYWxseSBjbGFpbSB0aGUgdG9rZW4gdXNpbmcgYW4gZXhjbHVzaXZlLWNyZWF0ZSBjb25zdHJhaW50IGZpbGUuXG4gICAgICAgICAgLy8gVGhpcyBhdm9pZHMgdGhlIFRPQ1RPVSByYWNlIG9mIHRoZSBwcmV2aW91cyByZWFkLWFsbC10aGVuLWNoZWNrIGFwcHJvYWNoLlxuICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgIGAke2hhc2hUb2tlbihob29rRGF0YS50b2tlbil9Lmpzb25gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBXaGVuIHRoZSBjbGFpbSBpcyBhYnNlbnQsIHRoZSBldmVudCBsb2cgaXMgdGhlIG9ubHkgZHVyYWJsZSBzb3VyY2VcbiAgICAgICAgICAvLyB0aGF0IGNhbiBkaXN0aW5ndWlzaCBhIGZpcnN0IGhvb2sgZnJvbSBhIGNyYXNoLWxvc3QgdG9rZW4gY2FjaGUuXG4gICAgICAgICAgaWYgKCEoYXdhaXQgcmVhZEhvb2tUb2tlbkNsYWltKGNvbnN0cmFpbnRQYXRoKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2coXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBlcnNpc3QgYGV2ZW50SWRgIGluIHRoZSBjbGFpbSBzbyBjb25jdXJyZW50IC8gY3Jvc3MtXG4gICAgICAgICAgLy8gcHJvY2VzcyByZXRyaWVzIGNhbiBjb252ZXJnZSBvbiBhIHNpbmdsZSBjYW5vbmljYWxcbiAgICAgICAgICAvLyBgaG9va19jcmVhdGVkYCBldmVudCBwYXRoLiBTZWUgdGhlIHJlY292ZXJ5IGNvbW1lbnRcbiAgICAgICAgICAvLyBiZWxvdy5cbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZWNvdmVyeSBzaGFwZTogdGhlIGR1cmFibGUgcmVjb3JkIG9mIGEgc3VjY2Vzc2Z1bCBob29rXG4gICAgICAgICAgLy8gY3JlYXRpb24gaXMgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgYW5kIGhvb2sgZW50aXR5IGFyZSB3cml0dGVuIGJlZm9yZSB0aGUgZXZlbnQsXG4gICAgICAgICAgLy8gYW5kIHRoZSB0aHJlZSB3cml0ZXMgYXJlIE5PVCBhdG9taWMsIHNvIGEgY3Jhc2ggYXQgYW55XG4gICAgICAgICAgLy8gcG9pbnQgY2FuIGxlYXZlIG9uZSBvciB0d28gb2YgdGhlbSBvbiBkaXNrIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gZXZlbnQuIFRyZWF0aW5nIHRob3NlIGFzIFwiY29tcGxldGVkXCIgd291bGQgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgc3dhbGxvdyB0aGUgcmV0cnkgYW5kIHBlcm1hbmVudGx5IGxvc2VcbiAgICAgICAgICAvLyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZnJvbSB0aGUgbG9nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGUgZGVkdXAgYnJhbmNoIGZpcmVzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYCxcbiAgICAgICAgICAvLyB3ZSBjb252ZXJnZSBvbiB0aGUgY2Fub25pY2FsIGBldmVudElkYCBwZXJzaXN0ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBieSB0aGUgb3JpZ2luYWwgKHdpbm5pbmcpIGB3cml0ZUV4Y2x1c2l2ZWAuIEJ5XG4gICAgICAgICAgLy8gYWRvcHRpbmcgdGhhdCBldmVudElkIGZvciB0aGlzIHJldHJ5J3MgZXZlbnQgd3JpdGUg4oCUIGFuZFxuICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG91dGVyIG5vLW92ZXJ3cml0ZSBgd3JpdGVKU09OYCBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgIG9uIGNvbGxpc2lvbiDigJQgY29uY3VycmVudCAvXG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGVpdGhlcjpcbiAgICAgICAgICAvLyAgIC0gcHVibGlzaCB0aGUgc2FtZSBldmVudCBhdCB0aGUgc2FtZSBwYXRoIGV4YWN0bHkgb25jZVxuICAgICAgICAgIC8vICAgICAodGhlIGxvc2VyJ3MgYHdyaXRlSlNPTmAgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gICAgICAgICAgLy8gICAgIHdoaWNoIHRoZSBydW50aW1lJ3MgZXhpc3RpbmcgY29uY3VycmVudC1yZXBsYXkgY2F0Y2hcbiAgICAgICAgICAvLyAgICAgcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyIHN3YWxsb3dzKSwgb3JcbiAgICAgICAgICAvLyAgIC0gY29udmVyZ2Ugb24gYSBzaW5nbGUgcmVjb3Zlcnkgd3JpdGUgd2hlbiB0aGUgcHJpb3JcbiAgICAgICAgICAvLyAgICAgY2xhaW0gd2FzIG9ycGhhbmVkIGJ5IGEgY3Jhc2ggYmVmb3JlIHRoZSBldmVudCBsYW5kZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgbGVnYWN5IGZhbGxiYWNrIChgZXhpc3RpbmdDbGFpbS5ldmVudElkYCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gaXMgZm9yIGNsYWltIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgd2FzIGFkZGVkIOKAlFxuICAgICAgICAgIC8vIHRob3NlIHByb2JlIHRoZSBldmVudCBsb2cgZGlyZWN0bHkgYW5kIGZhbGwgdGhyb3VnaCB0byBhXG4gICAgICAgICAgLy8gZnJlc2gtZXZlbnRJZCByZWNvdmVyeSB3cml0ZS4gVGhlIGxlZ2FjeSBwYXRoIGRvZXMgbm90XG4gICAgICAgICAgLy8gY29udmVyZ2UgYWNyb3NzIHdvcmtlcnMgYnV0IGNhbm5vdCByZWdyZXNzIGJlaGF2aW9yIGZvclxuICAgICAgICAgIC8vIGZyZXNobHktd3JpdHRlbiBjbGFpbXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgYHdpdGhIb29rTG9ja2AgaW4tcHJvY2VzcyBtdXRleCBhYm92ZSBrZWVwcyB0d28gc2FtZS1cbiAgICAgICAgICAvLyB0aWNrIGluLXByb2Nlc3MgY2FsbGVycyBmcm9tIHJhY2luZyBpbnRvIHRoaXMgYnJhbmNoIHdpdGhcbiAgICAgICAgICAvLyB0aGUgd2lubmVyIG1pZC13cml0ZSwgYnV0IGlzIG5vdCBzdWZmaWNpZW50IGFjcm9zc1xuICAgICAgICAgIC8vIHByb2Nlc3NlcyDigJQgdGhlIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IChgY2xhaW0uZXZlbnRJZGApXG4gICAgICAgICAgLy8gaXMgd2hhdCBjbG9zZXMgdGhlIGNyb3NzLXByb2Nlc3MgcmFjZS5cbiAgICAgICAgICBsZXQgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0/LnJ1bklkID09PSBlZmZlY3RpdmVSdW5JZCAmJlxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZCA9PT0gZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRvcHQgYSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIHJlY292ZXJ5IHdyaXRlLiBUaGVcbiAgICAgICAgICAgICAgLy8gb3V0ZXIgZXZlbnQgcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKVxuICAgICAgICAgICAgICAvLyBlaXRoZXIgc3VjY2VlZHMgKHdlIHB1Ymxpc2ggdGhlIGNhbm9uaWNhbCBldmVudCxcbiAgICAgICAgICAgICAgLy8gcmVwYWlyaW5nIGEgcGFydGlhbCB3cml0ZSBsZWZ0IGJ5IHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAvLyBjbGFpbWFudCkgb3IgcmV0dXJucyBgZmFsc2VgIGFuZCB3ZSB0aHJvd1xuICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKHRoZSBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAvLyBwdWJsaXNoZWQg4oCUIGEgcmVhbCBkdXBsaWNhdGUpLiBFaXRoZXIgd2F5IHRoZSBsb2dcbiAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIGV4YWN0bHkgb25lIGBob29rX2NyZWF0ZWRgIGV2ZW50IGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIGAocnVuSWQsIGhvb2tJZClgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGV2ZW50SWQgY29tZXMgZnJvbSBvbmUgb2YgdHdvIHBsYWNlczpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIGZvciBjbGFpbXMgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyB2ZXJzaW9uICh0aGUgd3JpdGVyIGFib3ZlIHBlcnNpc3RzIHRoZVxuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXRvbWljYWxseSB3aXRoIHRoZSBjbGFpbSkuXG4gICAgICAgICAgICAgIC8vICAgICBUaGUgZXZlbnRJZCBpcyBkdXJhYmxlLCBzbyB0aGUgb3V0ZXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBhbG9uZSBpcyBlbm91Z2ggdG9cbiAgICAgICAgICAgICAgLy8gICAgIGFyYml0cmF0ZSBwdWJsaWNhdGlvbjogaXQgZmFpbHMgaWZmIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2FzIGFscmVhZHkgcHVibGlzaGVkIGF0IHRoYXQgZXhhY3QgcGF0aC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIFRoZSByZWNvdmVyeS1tYXJrZXIgc2lkZWNhciBmb3IgbGVnYWN5IGNsYWltc1xuICAgICAgICAgICAgICAvLyAgICAgd3JpdHRlbiBiZWZvcmUgYGV2ZW50SWRgIHdhcyBwZXJzaXN0ZWQgaW5saW5lXG4gICAgICAgICAgICAgIC8vICAgICBpbiB0aGUgY2xhaW0uIFRoZSBtYXJrZXIgaXMgaXRzZWxmIGFcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZWAsIHNvIHRoZSBmaXJzdCByZXRyeSBwaW5zIGl0c1xuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXMgY2Fub25pY2FsIGFuZCBzdWJzZXF1ZW50XG4gICAgICAgICAgICAgIC8vICAgICByZXRyaWVzIGFkb3B0IGl0LiBXaXRob3V0IHRoaXMsIHR3byBwcm9jZXNzZXNcbiAgICAgICAgICAgICAgLy8gICAgIGJvdGggcmVhZGluZyB0aGUgc2FtZSBsZWdhY3kgY2xhaW0gd291bGQgZWFjaFxuICAgICAgICAgICAgICAvLyAgICAgZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmQgdGhlaXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHBhdGhzLCBhbmQgYXBwZW5kIHR3byBldmVudHMuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgICBGb3IgbGVnYWN5IGNsYWltcyB3ZSBhbHNvIG11c3QgcHJvYmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICBsb2cgZm9yIGFuIGV4aXN0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50IEJFRk9SRVxuICAgICAgICAgICAgICAvLyAgICAgcGlubmluZyBhIGNhbm9uaWNhbCBldmVudElkOiB0aGUgcHJlLXVwZ3JhZGVcbiAgICAgICAgICAgICAgLy8gICAgIHdyaXRlciBtYXkgaGF2ZSBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHdpdGggaXRzIG93biBldmVudElkLCBhbmQgdGhlIG1hcmtlciBoYXMgbm8gd2F5XG4gICAgICAgICAgICAgIC8vICAgICBvZiBrbm93aW5nIHRoYXQgZXZlbnRJZCBhZnRlciB0aGUgZmFjdC4gV2l0aG91dFxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwcm9iZSwgYSBwb3N0LXVwZ3JhZGUgcmV0cnkgd291bGQgcGluIGFcbiAgICAgICAgICAgICAgLy8gICAgIGRpZmZlcmVudCBldmVudElkLCB3cml0ZSBhIGhvb2sgZW50aXR5LCBhbmRcbiAgICAgICAgICAgICAgLy8gICAgIHB1Ymxpc2ggYSBkdXBsaWNhdGUgZXZlbnQgYXQgdGhlIG1hcmtlcidzIHBhdGguXG4gICAgICAgICAgICAgIGxldCBjYW5vbmljYWxFdmVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZ0NsYWltLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxFdmVudElkID0gZXhpc3RpbmdDbGFpbS5ldmVudElkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWRFdmVudElkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmUtdXBncmFkZSB3cml0ZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgZXZlbnQgcHVibGlzaCBhbmQgaXRzIGhvb2sgZW50aXR5IHdyaXRlIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgIC8vIHBheWxvYWQgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduIGR1cGxpY2F0ZS5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlQdWJsaXNoZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChwaW5uZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExvc3QgdGhlIG1hcmtlciByYWNlIGFuZCB0aGUgbWFya2VyIGZpbGUgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuXG4gICAgICAgICAgICAgICAgICAvLyBUcmVhdCBhcyBhIHJlYWwgZHVwbGljYXRlIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCBpbnN0ZWFkIG9mIHJpc2tpbmcgZGl2ZXJnZW50XG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBwaW5uZWQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWJ1aWxkIGBldmVudGAgd2l0aCB0aGUgY2Fub25pY2FsIGV2ZW50SWQgYW5kIGFcbiAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBgY3JlYXRlZEF0YCBkZXJpdmVkIGZyb20gdGhlIGV2ZW50SWRcbiAgICAgICAgICAgICAgLy8gKGEgVUxJRCkgc28gdHdvIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBldmVudFxuICAgICAgICAgICAgICAvLyBwcm9kdWNlIGJ5dGUtaWRlbnRpY2FsIGNvbnRlbnQuXG4gICAgICAgICAgICAgIGV2ZW50SWQgPSBjYW5vbmljYWxFdmVudElkO1xuICAgICAgICAgICAgICBjb25zdCBjYW5vbmljYWxDcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAgIHVsaWRUb0RhdGUoZXZlbnRJZC5yZXBsYWNlKC9eZXZudF8vLCAnJykpID8/IG5vdztcbiAgICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGNhbm9uaWNhbENyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3Jvc3MtaG9vayAvIGNyb3NzLXJ1biBjb25mbGljdDogYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gKHJ1bklkLCBob29rSWQpIGhvbGRzIHRoaXMgdG9rZW4uIENyZWF0ZSBhXG4gICAgICAgICAgICAgIC8vIGhvb2tfY29uZmxpY3QgZXZlbnQgc28gdGhlIHdvcmtmbG93IGNhbiBmYWlsXG4gICAgICAgICAgICAgIC8vIGdyYWNlZnVsbHkgd2hlbiB0aGUgaG9vayBpcyBhd2FpdGVkLlxuICAgICAgICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdDbGFpbVxuICAgICAgICAgICAgICAgICAgICA/IHsgY29uZmxpY3RpbmdSdW5JZDogZXhpc3RpbmdDbGFpbS5ydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIC8vIFBlcnNpc3QgYW5kIGNhY2hlIHRoZSBjb25mbGljdCBldmVudCAoY3JlYXRlLW9ubHksXG4gICAgICAgICAgICAgIC8vIHNhbWUgcGF0aCB0aGUgcmVhZCBjYWNoZSBrZXlzIG9uKSBzbyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgICAgICAgIGF3YWl0IHN0b3JlRXZlbnQoY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBjb25mbGljdCBldmVudCAobm8gaG9vayBlbnRpdHkgY3JlYXRlZClcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgICBob29rOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaG9vayBlbnRpdHkgbm93LCBidXQgZGVmZXIgaXRzIHdyaXRlIHVudGlsXG4gICAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggYXQgdGhlIGJvdHRvbSBvZiB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gY29tbWl0cy4gVGhlIHJldHJ5IHBhdGggY2FuIHJlYWNoIHRoaXMgYnJhbmNoXG4gICAgICAgICAgLy8gZm9yIGEgaG9vayB3aG9zZSBgaG9va19jcmVhdGVkYCBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkgKGFuIFwiYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAvLyBkdXBsaWNhdGVcIik7IGluIHRoYXQgY2FzZSB0aGUgb3V0ZXIgYHdyaXRlRXhjbHVzaXZlYFxuICAgICAgICAgIC8vIGZvciB0aGUgZXZlbnQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIHdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAuIFdyaXRpbmcgdGhlIGhvb2sgZW50aXR5IGhlcmVcbiAgICAgICAgICAvLyBmaXJzdCB3b3VsZCBtdXRhdGUgYWxyZWFkeS1jb21taXR0ZWQgZHVyYWJsZSBzdGF0ZSB3aXRoXG4gICAgICAgICAgLy8gdGhlIHJldHJ5J3MgcGF5bG9hZCAoZS5nLiBkaWZmZXJlbnQgYG1ldGFkYXRhYCBvclxuICAgICAgICAgIC8vIGBpc1dlYmhvb2tgKSBiZWZvcmUgdGhlIGV2ZW50IHB1Ymxpc2ggcHJvdmVkIHdoaWNoXG4gICAgICAgICAgLy8gb3V0Y29tZSB3ZSBhcmUgaW4g4oCUIGxlYXZpbmcgdGhlIGVudGl0eSBhbmQgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gaW5jb25zaXN0ZW50LiBCeSBkZWZlcnJpbmcsIHRoZSBlbnRpdHkgaXMgb25seSB3cml0dGVuXG4gICAgICAgICAgLy8gd2hlbiB0aGUgcHVibGlzaCBhY3R1YWxseSBzdWNjZWVkcyAoZmlyc3Qgd3JpdGVyIG9yXG4gICAgICAgICAgLy8gb3JwaGFuIHJlY292ZXJ5KS4gU2VlIHByYW5heWdwJ3MgcmV2aWV3IG9uIFBSICMyMjk1IGZvclxuICAgICAgICAgIC8vIHRoZSBrYXJ0aGlrc2NhbGUzIHJlcHJvLlxuICAgICAgICAgIGhvb2sgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBob29rRGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgICAgICAgICAgLy8gVXNlIHRoZSAocG9zc2libHkgY2Fub25pY2FsKSBldmVudCdzIGNyZWF0ZWRBdCBzbyB0d29cbiAgICAgICAgICAgIC8vIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBob29rIGVudGl0eSBwcm9kdWNlIGJ5dGUtXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgY29udGVudCBkdXJpbmcgY29udmVyZ2VuY2UuXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgaG9vayBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGlzV2ViaG9vazogaG9va0RhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgICAgICAgICAgaXNTeXN0ZW06IGhvb2tEYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9ucyA9IHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGVcbiAgICAgICAgICAgID8geyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIC8vIGhvb2tfZGlzcG9zZWQ6IERlbGV0ZXMgaG9vayBlbnRpdHksIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGRpc3Bvc2luZyB0aGUgc2FtZSBob29rIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgaG9va0xvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGhvb2tMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGRpc3Bvc2VkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVhZCB0aGUgaG9vayB0byBnZXQgaXRzIHRva2VuIGJlZm9yZSBkZWxldGluZ1xuICAgICAgICAgIGNvbnN0IGhvb2tQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbiBjb25zdHJhaW50IGZpbGUgdG8gZnJlZSB1cCB0aGUgdG9rZW5cbiAgICAgICAgICAgIC8vIGZvciByZXVzZSwgYW5kIGRlbGV0ZSB0aGlzIGhvb2sncyByZWNvdmVyeSBtYXJrZXIgKGlmXG4gICAgICAgICAgICAvLyBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc28gZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBsaWZldGltZXMgbmV2ZXIgY29sbGlkZSwgYnV0IGNsZWFuaW5nIHVwIHJlZHVjZXMgZGlza1xuICAgICAgICAgICAgLy8gbGVhayBmb3IgaG9va3MgdGhhdCBnbyB0aHJvdWdoIHRoZSByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgd3JpdGVFeGNsdXNpdmVgIChPX0NSRUFUfE9fRVhDTCB2aWEgdGVtcC1maWxlICsgaGFyZC1saW5rKVxuICAgICAgICAvLyBpcyB0aGUgY3Jvc3MtcHJvY2VzcyBhdG9taWMgcHVibGlzaCBwcmltaXRpdmU6IGlmIHRoZSBmaWxlXG4gICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLCByZXR1cm5zIGZhbHNlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcuIFRoaXNcbiAgICAgICAgLy8gaXMgY3JpdGljYWwgZm9yIHRoZSBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgY29udmVyZ2VuY2VcbiAgICAgICAgLy8gKGFib3ZlKSDigJQgdHdvIHdvcmtlcnMgdGhhdCBhZG9wdCB0aGUgc2FtZSBjYW5vbmljYWwgZXZlbnRJZFxuICAgICAgICAvLyByYWNlIGhlcmU7IHdob2V2ZXIgbGlua3MgdGhlIGZpbGUgZmlyc3Qgd2lucywgdGhlIGxvc2VyXG4gICAgICAgIC8vIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yLCBhbmQgdGhlIHJ1bnRpbWUncyBleGlzdGluZ1xuICAgICAgICAvLyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDJcbiAgICAgICAgLy8gc3dhbGxvd3MgaXQuIEZvciBhbGwgb3RoZXIgZXZlbnQgdHlwZXMsIGV2ZW50SWRzIGFyZVxuICAgICAgICAvLyBtb25vdG9uaWMgVUxJRHMgKGdsb2JhbGx5IHVuaXF1ZSBieSBjb25zdHJ1Y3Rpb24pIHNvIGFcbiAgICAgICAgLy8gY29sbGlzaW9uIGluZGljYXRlcyBhIHJlYWwgYnVnIGFuZCBFbnRpdHlDb25mbGljdEVycm9yIGlzXG4gICAgICAgIC8vIGFsc28gdGhlIHJpZ2h0IHN1cmZhY2Ug4oCUIHNhbWUgc2hhcGUgYXMgc3RlcF9jcmVhdGVkJ3NcbiAgICAgICAgLy8gY2xhaW0tZmlsZSBiZWhhdmlvci5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyk7XG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBiZWZvcmUgdGhlIHdyaXRlJ3MgYGF3YWl0YCBzbyB0aGVcbiAgICAgICAgLy8gY2FjaGVkIHNuYXBzaG90IGNhbid0IG9ic2VydmUgYSBsYXRlciBtdXRhdGlvbiAoc2VlXG4gICAgICAgIC8vIHJlbWVtYmVyU3RvcmVkRXZlbnQpLlxuICAgICAgICBjb25zdCBzZXJpYWxpemVkRXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKTtcbiAgICAgICAgY29uc3QgZXZlbnRQdWJsaXNoZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZXZlbnQgaXMgbm93IGNvbW1pdHRlZDsgY2FjaGUgaXQgc28gYW4gaW1tZWRpYXRlIHNlcXVlbnRpYWxcbiAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgIHJlbWVtYmVyU3RvcmVkRXZlbnQoZXZlbnQsIGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgICAgICBmaWxlUHJlZml4OiBgJHtlZmZlY3RpdmVSdW5JZH0tYCxcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgICAgICBnZXRJZDogKGUpID0+IGUuZXZlbnRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudHMgPSBhbGxFdmVudHMuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBhbGxFdmVudHMuY3Vyc29yO1xuICAgICAgICAgIGhhc01vcmUgPSBhbGxFdmVudHMuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IG9uIGEgc3RlcC10ZXJtaW5hbCB3cml0ZSB0aGUgaW5saW5lXG4gICAgICAgIC8vIHJ1bnRpbWUgbG9vcCBjYW4gcGFzcyBgc2luY2VDdXJzb3JgICh0aGUgY3Vyc29yIGZyb20gYmVmb3JlIGl0XG4gICAgICAgIC8vIGJlZ2FuIHdyaXRpbmcgdGhpcyBzdGVwJ3MgZXZlbnRzKS4gV2UgcmV0dXJuIHRoZSBkZWx0YSBvZlxuICAgICAgICAvLyBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0IGN1cnNvciDigJQgZXhhY3RseSB3aGF0IGFuXG4gICAgICAgIC8vIGBldmVudHMubGlzdCh7IGN1cnNvcjogc2luY2VDdXJzb3IsIHNvcnRPcmRlcjogJ2FzYycgfSlgIHdvdWxkXG4gICAgICAgIC8vIHJldHVybiByaWdodCBub3cg4oCUIHNvIHRoZSBsb29wIGNhbiBza2lwIGEgcmVkdW5kYW50IHJvdW5kLXRyaXAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgaXMgY29tcHV0ZWQgYWdhaW5zdCB0aGUgc2FtZSBvbi1kaXNrIGxvZyB0aGUgbGlzdCBwYXRoXG4gICAgICAgIC8vIHJlYWRzLCBzbyBpdCBjYXB0dXJlcyBldmVyeXRoaW5nIHRoZSBmZXRjaCB3b3VsZDogdGhpcyBzdGVwJ3NcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCwgYW55IGF0dHJfc2V0IHRoZSBzdGVwXG4gICAgICAgIC8vIGJvZHkgd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZSBjdXJzb3IuIFRoYXRcbiAgICAgICAgLy8gZXF1aXZhbGVuY2UgaXMgd2hhdCBtYWtlcyBza2lwcGluZyB0aGUgZmV0Y2ggc2FmZSDigJQgYSBtaXNzZWRcbiAgICAgICAgLy8gaW4tYmFuZCBldmVudCBjYW5ub3QgZGl2ZXJnZSByZXBsYXkgYmVjYXVzZSB0aGUgZGVsdGEgaXMgdGhlXG4gICAgICAgIC8vIGZldGNoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmx5IHN0ZXAtdGVybWluYWwgZXZlbnRzIHF1YWxpZnk6IHN0ZXBfY3JlYXRlZC9zdGVwX3N0YXJ0ZWQgYXJlXG4gICAgICAgIC8vIG5vdCBsb29wIGJvdW5kYXJpZXMgKHRoZSBsb29wIGZldGNoZXMgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgL1xuICAgICAgICAvLyBzdGVwX2ZhaWxlZCksIGFuZCBydW4tdGVybWluYWwgZXZlbnRzIGVuZCB0aGUgbG9vcC4gYHJlc29sdmVEYXRhYFxuICAgICAgICAvLyBtYXRjaGVzIHRoZSBsaXN0IHBhdGggc28gZXZlbnREYXRhIHJlZnMgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICAgIHR5cGVvZiBwYXJhbXM/LnNpbmNlQ3Vyc29yID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vIGBsaW1pdGA6IHRoaXMgcmV0dXJucyBhIHNpbmdsZSBkZWZhdWx0LXNpemUgcGFnZSxcbiAgICAgICAgICAvLyB1bmxpa2UgdGhlIGBldmVudHMubGlzdGAgcGF0aCB3aGljaCBsb29wcyBgd2hpbGUgKGhhc01vcmUpYCB0b1xuICAgICAgICAgIC8vIGV4aGF1c3Rpb24uIFRoYXQgaXMgc2FmZSDigJQgYW5kIG11c3QgTk9UIGJlIFwiZml4ZWRcIiBieSBwYWdpbmF0aW5nXG4gICAgICAgICAgLy8gaGVyZSDigJQgYmVjYXVzZSB0aGUgY29udHJhY3QgaXMgc2luZ2xlLXBhZ2Utb3ItZmFsbGJhY2ssIG5vdFxuICAgICAgICAgIC8vIGNvbXBsZXRlLWRlbHRhLiBXaGVuIHRoZSBkZWx0YSBvdmVyZmxvd3Mgb25lIHBhZ2UsXG4gICAgICAgICAgLy8gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5IHNldHMgYGhhc01vcmU6IHRydWVgIGFuZCBzbGljZXMgYGRhdGFgIHRvXG4gICAgICAgICAgLy8gdGhlIHBhZ2UgKHNlZSBmcy50cyksIHdoaWNoIHdlIGZvcndhcmQgdmVyYmF0aW0gYmVsb3cuIFRoZSBTREtcbiAgICAgICAgICAvLyBjb25zdW1lIHNpZGUgKHJ1bnRpbWUudHMpIG9ubHkgc3Rhc2hlcyB0aGUgZGVsdGEgd2hlbiBgIWhhc01vcmVgXG4gICAgICAgICAgLy8gYW5kIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHRoZSBleGhhdXN0aXZlIGBldmVudHMubGlzdGAgbG9vcCwgc28gYVxuICAgICAgICAgIC8vIHRydW5jYXRlZCBwYWdlIGlzIG5ldmVyIGNvbnN1bWVkIGFzIGlmIGl0IHdlcmUgdGhlIGZ1bGwgZGVsdGEuXG4gICAgICAgICAgY29uc3QgZGVsdGEgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogcGFyYW1zLnNpbmNlQ3Vyc29yLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9XG4gICAgICAgICAgICByZXNvbHZlRGF0YSA9PT0gJ25vbmUnXG4gICAgICAgICAgICAgID8gZGVsdGEuZGF0YS5tYXAoKGUpID0+IHN0cmlwRXZlbnREYXRhUmVmcyhlLCByZXNvbHZlRGF0YSkpXG4gICAgICAgICAgICAgIDogZGVsdGEuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBkZWx0YS5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGRlbHRhLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIC4uLihzdGVwQ3JlYXRlZExhemlseSA/IHsgc3RlcENyZWF0ZWQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZW5kIGNyZWF0ZUltcGxcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KHJ1bklkLCBldmVudElkLCBwYXJhbXMpIHtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2V2ZW50SWQnLCBldmVudElkKTtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgIGJhc2VkaXIsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICBjb21wb3NpdGVLZXksXG4gICAgICAgIEV2ZW50U2NoZW1hLFxuICAgICAgICB0YWdcbiAgICAgICk7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtldmVudElkfSBpbiBydW4gJHtydW5JZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgcmV0dXJuIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0KHBhcmFtcykge1xuICAgICAgY29uc3QgeyBydW5JZCB9ID0gcGFyYW1zO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgICAgICAvLyBFdmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAob2xkZXN0IGZpcnN0KSBieSBkZWZhdWx0LFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBmb3Igb3RoZXIgbGlzdCBjYWxscy5cbiAgICAgICAgc29ydE9yZGVyOiBwYXJhbXMucGFnaW5hdGlvbj8uc29ydE9yZGVyID8/ICdhc2MnLFxuICAgICAgICBsaW1pdDogcGFyYW1zLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICBjdXJzb3I6IHBhcmFtcy5wYWdpbmF0aW9uPy5jdXJzb3IsXG4gICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgcmVzb2x2ZURhdGEgaXMgXCJub25lXCIsIHJlbW92ZSBldmVudERhdGEgZnJvbSBldmVudHNcbiAgICAgIGlmIChyZXNvbHZlRGF0YSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgICBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RCeUNvcnJlbGF0aW9uSWQocGFyYW1zKSB7XG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcGFyYW1zLmNvcnJlbGF0aW9uSWQ7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|