@workflow/core 5.0.0-beta.50 → 5.0.0-beta.51
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/README.md +5 -0
- package/dist/events-consumer.d.ts +26 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +28 -1
- package/dist/flushable-stream.d.ts +41 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +169 -1
- package/dist/log-format.js +13 -6
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/runtime/helpers.d.ts +75 -1
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +129 -2
- package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +209 -32
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/step-executor.d.ts +2 -21
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +85 -80
- package/dist/runtime/suspension-handler.d.ts +0 -22
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +126 -75
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +262 -91
- package/dist/serialization.d.ts +2 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +16 -13
- package/dist/step/context-storage.d.ts +2 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +14 -10
- package/dist/telemetry/semantic-conventions.d.ts +36 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +23 -1
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +8 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +8 -3
- package/docs/foundations/streaming.mdx +1 -1
- package/docs/how-it-works/event-sourcing.mdx +27 -0
- package/package.json +6 -6
|
@@ -9,7 +9,7 @@ import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
|
9
9
|
import { getAbortStreamIdFromToken } from '../util.js';
|
|
10
10
|
import { COMPUTE_INSTANCE_ID } from './compute-instance.js';
|
|
11
11
|
import { getMaxInlineSteps, isBatchTransitionsEnabled, isResilientStepDispatchEnabled, MAX_BATCH_FANOUT_EVENTS, MAX_RESILIENT_STEP_INPUT_BYTES, } from './constants.js';
|
|
12
|
-
import { absorbSkippedSlotReport, appendEventLog, maxEventSlot, queueMessage, slotSnapshotParams, stepDispatchIdempotencyKey, } from './helpers.js';
|
|
12
|
+
import { absorbSkippedSlotReport, appendEventLog, maxEventSlot, queueMessage, queueMessages, runDispatchContext, slotSnapshotParams, stepDispatchIdempotencyKey, } from './helpers.js';
|
|
13
13
|
import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
|
|
14
14
|
import { unserializableStepInputPlaceholder } from './unserializable-step.js';
|
|
15
15
|
async function createHookEvent({ runId, hookEvent, queueItem, requestId, sinceCursor, createEvent, }) {
|
|
@@ -527,7 +527,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
527
527
|
failedStepCorrelationIds.add(queueItem.correlationId);
|
|
528
528
|
// Release the inline slot bookkeeping: the step never runs, so it must
|
|
529
529
|
// not appear in the rebuilt `lazyInlineSteps`. (Its slot in the first-N
|
|
530
|
-
// selection and in `inlinePairFoldEligible`'s
|
|
530
|
+
// selection and in `inlinePairFoldEligible`'s count was consumed
|
|
531
531
|
// before dehydration could reveal the failure, inherent to selecting
|
|
532
532
|
// before serializing, and bounded to one wasted slot on a pass that
|
|
533
533
|
// ends in a forced replay anyway.)
|
|
@@ -604,27 +604,27 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
604
604
|
const batchPreps = [];
|
|
605
605
|
// Pre-claimed inline pairs: fold each lazy-inline step's deferred
|
|
606
606
|
// `step_created` (carrying its input) AND its `step_started` claim (bare,
|
|
607
|
-
// ownership-stamped) into the batch, so the
|
|
608
|
-
//
|
|
607
|
+
// ownership-stamped) into the batch, so the inline steps' claims commit in
|
|
608
|
+
// one durable write (the pair chunk, see the flush below) and the caller
|
|
609
609
|
// starts the bodies straight off that commit instead of posting one claim
|
|
610
|
-
// per inline step.
|
|
611
|
-
//
|
|
612
|
-
//
|
|
613
|
-
//
|
|
614
|
-
//
|
|
615
|
-
//
|
|
616
|
-
//
|
|
617
|
-
|
|
610
|
+
// per inline step. Requires TWO or more inline steps, and nothing else:
|
|
611
|
+
// the pairs commit in a chunk of their own, so plain creates alongside
|
|
612
|
+
// them share no round trip with the pairs and cannot make a lone pair
|
|
613
|
+
// worth folding. A lone inline step is better served by the lazy
|
|
614
|
+
// `step_started`: one row instead of two, optimistic-start capable (the
|
|
615
|
+
// claim overlaps the body), with the slot-snapshot params and
|
|
616
|
+
// bump-and-report `createGuarded` provides, all of which a pair-only
|
|
617
|
+
// batch of one pair gives up for the same round trip. Two or more inline
|
|
618
|
+
// steps become ONE pair chunk instead of N parallel lazy claims, which is
|
|
619
|
+
// the saving. A lone inline step alongside eager creates therefore takes
|
|
620
|
+
// the lazy path while the creates still batch. Also requires the caller's
|
|
621
|
+
// `ownerMessageId`: the started row must stamp ownership exactly like the
|
|
622
|
+
// lazy claim it replaces (and a caller that does not inline-execute never
|
|
623
|
+
// provides one).
|
|
618
624
|
const inlinePairFoldEligible = batchFanoutEligible &&
|
|
619
625
|
ownerMessageId !== undefined &&
|
|
620
|
-
lazyInlineCorrelationIds.size
|
|
621
|
-
(lazyInlineCorrelationIds.size >= 2 ||
|
|
622
|
-
stepsNeedingCreation.size -
|
|
623
|
-
lazyInlineCorrelationIds.size +
|
|
624
|
-
uncreatedWaitCount >=
|
|
625
|
-
1);
|
|
626
|
+
lazyInlineCorrelationIds.size >= 2;
|
|
626
627
|
const inlineClaims = new Map();
|
|
627
|
-
let batchCommittedSlotCeiling;
|
|
628
628
|
// The trace carrier for resilient step dispatches, resolved at most once per
|
|
629
629
|
// suspension (the per-step ops run concurrently and share it).
|
|
630
630
|
let stepDispatchTraceCarrier;
|
|
@@ -645,8 +645,9 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
645
645
|
// Deterministic position in the batched fold (assigned in stepItems
|
|
646
646
|
// order, before the concurrent dehydration runs). A pair-folded inline
|
|
647
647
|
// step occupies two consecutive positions (created row then started
|
|
648
|
-
// row), which the flush keeps adjacent
|
|
649
|
-
//
|
|
648
|
+
// row), which the flush keeps adjacent, never splits across chunks,
|
|
649
|
+
// and commits in a pair-only chunk ahead of the plain creates, so a
|
|
650
|
+
// World can fold them into one born-running create.
|
|
650
651
|
const pairFolded = inlinePairFoldEligible &&
|
|
651
652
|
lazyInlineCorrelationIds.has(queueItem.correlationId);
|
|
652
653
|
const stepOrder = batchOrderCounter;
|
|
@@ -769,6 +770,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
769
770
|
traceCarrier,
|
|
770
771
|
requestedAt: new Date(),
|
|
771
772
|
stepInput: { input: dehydratedInput },
|
|
773
|
+
runContext: runDispatchContext(run),
|
|
772
774
|
},
|
|
773
775
|
// Same key as the caller's dispatch pass and any concurrent
|
|
774
776
|
// handler's, so redundant publishes for this step dedupe. The
|
|
@@ -921,7 +923,9 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
921
923
|
// delivery the way a single-path rejection would.
|
|
922
924
|
//
|
|
923
925
|
// Latency shape: only the chunk carrying the pre-claimed inline pairs
|
|
924
|
-
// gates the handler's return (the caller starts bodies off its claims)
|
|
926
|
+
// gates the handler's return (the caller starts bodies off its claims),
|
|
927
|
+
// and that chunk carries NOTHING else, so its commit is as small as the
|
|
928
|
+
// inline slice (see the chunking below).
|
|
925
929
|
// Every other chunk's commit (and every chunk's step-message publishes,
|
|
926
930
|
// which fire the moment ITS creates are durable) rides
|
|
927
931
|
// `deferredBatchWork` when the caller opted in, joined before ack. A slow
|
|
@@ -941,13 +945,18 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
941
945
|
}
|
|
942
946
|
const entries = [...batchQueue].sort((a, b) => a.order - b.order);
|
|
943
947
|
await ensureRunReady();
|
|
944
|
-
//
|
|
945
|
-
//
|
|
946
|
-
//
|
|
947
|
-
//
|
|
948
|
-
//
|
|
949
|
-
|
|
950
|
-
|
|
948
|
+
// The ordinary single path for a lone plain entry: a batch of ONE
|
|
949
|
+
// gains nothing over the single write (same round trip) and loses
|
|
950
|
+
// the slot-snapshot params + bump-and-report that createGuarded
|
|
951
|
+
// provides, so a lone eager event is written the way it would have
|
|
952
|
+
// been without the fold, with the same conflict tolerance and
|
|
953
|
+
// ownership bookkeeping. Used when the whole fold is one entry
|
|
954
|
+
// (below) and when the plain partition beside the pairs is one
|
|
955
|
+
// entry (the chunking further down). Beside a pair chunk it commits
|
|
956
|
+
// concurrently with the handler's return, like a trailing chunk; the
|
|
957
|
+
// inline bodies do not depend on it (executor writes carry no slot
|
|
958
|
+
// snapshot, so there is no position for it to move).
|
|
959
|
+
const commitSingle = async (entry) => {
|
|
951
960
|
try {
|
|
952
961
|
await createGuarded(entry.event, { requestId });
|
|
953
962
|
if (entry.kind === 'step') {
|
|
@@ -968,6 +977,9 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
968
977
|
throw err;
|
|
969
978
|
}
|
|
970
979
|
}
|
|
980
|
+
};
|
|
981
|
+
if (entries.length === 1) {
|
|
982
|
+
await commitSingle(entries[0]);
|
|
971
983
|
return;
|
|
972
984
|
}
|
|
973
985
|
// Seed for the foreign-interleaving diagnostic below. With chunks
|
|
@@ -980,24 +992,39 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
980
992
|
const expectedFirstSlot = eventLog
|
|
981
993
|
? (maxEventSlot(eventLog.events) ?? 0) + 1
|
|
982
994
|
: undefined;
|
|
983
|
-
// Pair-aware chunking
|
|
984
|
-
//
|
|
985
|
-
//
|
|
986
|
-
//
|
|
987
|
-
//
|
|
988
|
-
|
|
989
|
-
|
|
995
|
+
// Pair-aware chunking. Two rules:
|
|
996
|
+
//
|
|
997
|
+
// 1. A pre-claimed pair's two rows must land in the same createBatch
|
|
998
|
+
// call (adjacent, so a World can fold them into one born-running
|
|
999
|
+
// create) and never straddle a chunk boundary, which would turn
|
|
1000
|
+
// the started row into a standalone claim racing its own
|
|
1001
|
+
// create's commit.
|
|
1002
|
+
// 2. The pairs commit in chunk(s) of THEIR OWN, ahead of the plain
|
|
1003
|
+
// `step`/`wait` creates, which fill the subsequent chunks. The
|
|
1004
|
+
// pair chunk is the one commit the inline bodies wait for (see
|
|
1005
|
+
// `pairCommits` below), and on the Vercel backend its latency
|
|
1006
|
+
// scales with the transaction's item count: measured on 32-branch
|
|
1007
|
+
// fan-outs, batches of <=8 events commit in ~56 ms p50 server-side
|
|
1008
|
+
// where batches of 24-32 events take ~110 ms. Padding the pair
|
|
1009
|
+
// chunk with plain creates up to the cap therefore held the
|
|
1010
|
+
// bodies for the plain creates' commit, which nothing else
|
|
1011
|
+
// needed: a plain create gates only its own queue publish, and
|
|
1012
|
+
// that fires off whichever sibling chunk carries it. Splitting
|
|
1013
|
+
// them keeps the pair chunk small (two rows per inline step) and
|
|
1014
|
+
// lets the plain creates commit concurrently beside it.
|
|
1015
|
+
const chunkEntries = (list) => {
|
|
1016
|
+
const out = [];
|
|
990
1017
|
let current = [];
|
|
991
|
-
for (let index = 0; index <
|
|
992
|
-
const entry =
|
|
993
|
-
const next =
|
|
1018
|
+
for (let index = 0; index < list.length; index++) {
|
|
1019
|
+
const entry = list[index];
|
|
1020
|
+
const next = list[index + 1];
|
|
994
1021
|
const pairLead = entry.kind === 'inline-created' &&
|
|
995
1022
|
next?.kind === 'inline-started' &&
|
|
996
1023
|
next.correlationId === entry.correlationId;
|
|
997
1024
|
const take = pairLead ? 2 : 1;
|
|
998
1025
|
if (current.length > 0 &&
|
|
999
1026
|
current.length + take > MAX_BATCH_FANOUT_EVENTS) {
|
|
1000
|
-
|
|
1027
|
+
out.push(current);
|
|
1001
1028
|
current = [];
|
|
1002
1029
|
}
|
|
1003
1030
|
current.push(entry);
|
|
@@ -1007,8 +1034,27 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1007
1034
|
}
|
|
1008
1035
|
}
|
|
1009
1036
|
if (current.length > 0)
|
|
1010
|
-
|
|
1011
|
-
|
|
1037
|
+
out.push(current);
|
|
1038
|
+
return out;
|
|
1039
|
+
};
|
|
1040
|
+
// Both partitions keep `entries`' order, so a pair's two rows
|
|
1041
|
+
// (consecutive `order` values, enqueued together) stay adjacent in
|
|
1042
|
+
// the pair partition.
|
|
1043
|
+
const isPairRow = (entry) => entry.kind === 'inline-created' || entry.kind === 'inline-started';
|
|
1044
|
+
const pairChunks = chunkEntries(entries.filter((entry) => isPairRow(entry)));
|
|
1045
|
+
const plainEntries = entries.filter((entry) => !isPairRow(entry));
|
|
1046
|
+
// A plain partition of exactly ONE entry is the batch-of-one case
|
|
1047
|
+
// again, now that the pairs no longer share its chunk: it takes the
|
|
1048
|
+
// single path (`commitSingle`) rather than a one-row createBatch,
|
|
1049
|
+
// and is carried as a one-entry chunk so the per-chunk publish and
|
|
1050
|
+
// settle machinery below treats it like any sibling. (A one-row
|
|
1051
|
+
// remainder of a LARGER plain partition still batches: it is the
|
|
1052
|
+
// pre-split behavior, unchanged here.)
|
|
1053
|
+
const plainChunks = plainEntries.length === 1
|
|
1054
|
+
? [plainEntries]
|
|
1055
|
+
: chunkEntries(plainEntries);
|
|
1056
|
+
const singleChunk = plainEntries.length === 1 ? plainChunks[0] : undefined;
|
|
1057
|
+
const chunks = [...pairChunks, ...plainChunks];
|
|
1012
1058
|
// Steps whose queue messages THIS FLUSH will publish (the eager
|
|
1013
1059
|
// creates), recorded before any chunk settles so the caller's
|
|
1014
1060
|
// dispatch pass (which runs off the handler's return) skips them.
|
|
@@ -1139,16 +1185,9 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1139
1185
|
throw new WorkflowWorldError(`batched ${entry.event.eventType} for ${entry.correlationId} ` +
|
|
1140
1186
|
`failed: ${item.error}: ${item.message}`, { status: item.status });
|
|
1141
1187
|
}
|
|
1142
|
-
// Highest slot this chunk committed:
|
|
1143
|
-
//
|
|
1144
|
-
// SuspensionHandlerResult.batchCommittedSlotCeiling) and one input
|
|
1145
|
-
// of the interleaving diagnostic.
|
|
1188
|
+
// Highest slot this chunk committed: one input of the interleaving
|
|
1189
|
+
// diagnostic.
|
|
1146
1190
|
const chunkMaxSlot = maxEventSlot(results.flatMap((item) => item.error === undefined && item.event ? [item.event] : []));
|
|
1147
|
-
if (chunkMaxSlot !== undefined &&
|
|
1148
|
-
(batchCommittedSlotCeiling === undefined ||
|
|
1149
|
-
chunkMaxSlot > batchCommittedSlotCeiling)) {
|
|
1150
|
-
batchCommittedSlotCeiling = chunkMaxSlot;
|
|
1151
|
-
}
|
|
1152
1191
|
committedCount += results.filter((item) => item.error === undefined).length;
|
|
1153
1192
|
if (chunkMaxSlot !== undefined &&
|
|
1154
1193
|
(maxCommittedSlot === undefined || chunkMaxSlot > maxCommittedSlot)) {
|
|
@@ -1166,26 +1205,39 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1166
1205
|
if (stepEntries.length === 0)
|
|
1167
1206
|
return;
|
|
1168
1207
|
const traceCarrier = await getStepDispatchTraceCarrier();
|
|
1169
|
-
|
|
1208
|
+
// One batched publish per chunk instead of one round trip per step.
|
|
1209
|
+
// The publishes are the fan-out's serialization point: they ride the
|
|
1210
|
+
// shared 8-connection HTTP/1.1 agent (see `getQueueDispatcher` in
|
|
1211
|
+
// world-vercel), and the caller awaits all of them before running
|
|
1212
|
+
// the first inline step body, so N round trips land directly on
|
|
1213
|
+
// time-to-first-step. `queueMessages` falls back to concurrent
|
|
1214
|
+
// single sends on a World with no batch support.
|
|
1215
|
+
await queueMessages(world,
|
|
1170
1216
|
// biome-ignore lint/style/noNonNullAssertion: publishEagerSteps implies presence
|
|
1171
|
-
stepDispatch.queueName, {
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1217
|
+
stepDispatch.queueName, stepEntries.map((entry) => ({
|
|
1218
|
+
message: {
|
|
1219
|
+
runId,
|
|
1220
|
+
stepId: entry.correlationId,
|
|
1221
|
+
// biome-ignore lint/style/noNonNullAssertion: set on every 'step' entry at enqueue
|
|
1222
|
+
stepName: entry.stepName,
|
|
1223
|
+
traceCarrier,
|
|
1224
|
+
requestedAt: new Date(),
|
|
1225
|
+
runContext: runDispatchContext(run),
|
|
1226
|
+
},
|
|
1227
|
+
opts: {
|
|
1228
|
+
idempotencyKey: stepDispatchIdempotencyKey(entry.correlationId,
|
|
1229
|
+
// biome-ignore lint/style/noNonNullAssertion: set on every 'step' entry at enqueue
|
|
1230
|
+
entry.stepName),
|
|
1231
|
+
},
|
|
1182
1232
|
})));
|
|
1183
1233
|
};
|
|
1184
|
-
// Launch every chunk's POST now
|
|
1185
|
-
//
|
|
1186
|
-
//
|
|
1187
|
-
//
|
|
1188
|
-
|
|
1234
|
+
// Launch every chunk's POST now (the lone plain entry's guarded
|
|
1235
|
+
// single create included); chain each chunk's publishes on its OWN
|
|
1236
|
+
// commit, so publish-after-create holds for the single too. A chunk
|
|
1237
|
+
// whose commit rejected keeps its messages unsent (the rejection
|
|
1238
|
+
// fails the delivery; redelivery re-creates and re-dispatches,
|
|
1239
|
+
// deduped by the idempotency keys).
|
|
1240
|
+
const commits = chunks.map((chunk) => chunk === singleChunk ? commitSingle(chunk[0]) : commitChunk(chunk));
|
|
1189
1241
|
const publishes = chunks.map(async (chunk, index) => {
|
|
1190
1242
|
await commits[index];
|
|
1191
1243
|
await publishChunkSteps(chunk);
|
|
@@ -1224,11 +1276,11 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1224
1276
|
// a pair whose commit the caller has not seen yields no
|
|
1225
1277
|
// `inlineClaims` entry, so the caller falls back to a lazy
|
|
1226
1278
|
// `step_started` that would race this same fold's still-in-flight
|
|
1227
|
-
// pair for the same step.
|
|
1228
|
-
// (
|
|
1229
|
-
// chunk, pinned by constants.test.ts),
|
|
1230
|
-
// commit; the filter is what keeps the
|
|
1231
|
-
// moves.
|
|
1279
|
+
// pair for the same step. The pairs occupy their own leading
|
|
1280
|
+
// chunk(s), and today that is exactly ONE chunk (two rows per
|
|
1281
|
+
// inline step fit inside one chunk, pinned by constants.test.ts),
|
|
1282
|
+
// so this is at most one commit; the filter is what keeps the
|
|
1283
|
+
// property true if either cap moves.
|
|
1232
1284
|
const pairCommits = chunks.flatMap((chunk, index) => chunk.some((entry) => entry.kind === 'inline-started')
|
|
1233
1285
|
? [commits[index]]
|
|
1234
1286
|
: []);
|
|
@@ -1365,7 +1417,6 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1365
1417
|
queuedStepCorrelationIds,
|
|
1366
1418
|
lazyInlineSteps,
|
|
1367
1419
|
inlineClaims,
|
|
1368
|
-
batchCommittedSlotCeiling,
|
|
1369
1420
|
deferredBatchWork,
|
|
1370
1421
|
// On hook conflict the caller advances the workflow over the conflict
|
|
1371
1422
|
// before scheduling anything and never reads the wait timeout, so don't
|
|
@@ -1404,4 +1455,4 @@ function isWorldValidationFailure(err) {
|
|
|
1404
1455
|
}
|
|
1405
1456
|
return WorkflowWorldError.is(err) && err.status === 400;
|
|
1406
1457
|
}
|
|
1407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBS3hCLG9CQUFvQixFQUNwQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1DQUFtQyxHQU1wQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIseUJBQXlCLEVBQ3pCLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixjQUFjLEVBR2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsMEJBQTBCLEdBQzNCLE1BQU0s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RUFDVCwwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDakUsZUFBZSxFQUFFLDBCQUEwQixDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3RELDBCQUEwQjtRQUMxQixzQkFBc0IsRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUM1RCx5QkFBeUI7UUFDekIsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSxrREFBa0Q7UUFDbEQsc0JBQXNCLEVBQUUsYUFBYSxJQUFJLGFBQWEsS0FBSyxDQUFDO1FBQzVELGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUM3QyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDOUMsY0FBYztRQUNkLHlCQUF5QjtRQUN6QixxQkFBcUI7UUFDckIsa0JBQWtCLEVBQUUsY0FBYztLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxHQUFZO0lBQzVDLElBQUksR0FBRyxZQUFZLHdCQUF3QjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pELElBQUksR0FBRyxZQUFZLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLDBCQUEwQixFQUFFLENBQUM7UUFDcEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgdHlwZSBTZXJpYWxpemVkRGF0YSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbiAgdHlwZSBTdGFydGVkU3RlcCxcbiAgdHlwZSBUcmFjZUNhcnJpZXIsXG4gIHR5cGUgVmFsaWRRdWV1ZU5hbWUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQsXG4gIHR5cGUgR3Vlc3RDb2RlRXhlY3V0aW9uLFxuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4gfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMsXG4gIE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIGFwcGVuZEV2ZW50TG9nLFxuICB0eXBlIEV2ZW50Q3JlYXRvcixcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbWF4RXZlbnRTbG90LFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHNsb3RTbmFwc2hvdFBhcmFtcyxcbiAgc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXksXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQcmVjbGFpbWVkSW5saW5lU3RhcnQgfSBmcm9tICcuL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgdW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlciB9IGZyb20gJy4vdW5zZXJpYWxpemFibGUtc3RlcC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMge1xuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb247XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuOiBXb3JrZmxvd1J1bjtcbiAgc3Bhbj86IFNwYW47XG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50IGxvZy4gRXZlcnkgZXZlbnQgY3JlYXRpb24gdGhpcyBzdXNwZW5zaW9uIG1ha2VzXG4gICAqIG5hbWVzIHRoZSBwb3NpdGlvbiBpdCB3YXMgZGVyaXZlZCBmcm9tLCBzbyBhIGJhY2tlbmQgdGhhdCBoYXMgcmVjb3JkZWRcbiAgICogZXZlbnRzIHRoZSByZXBsYXkgZGlkIG5vdCBzZWUgY2FuIHJlcG9ydCB0aGVtIGJhY2sgb24gdGhlIHdyaXRlLCBvciwgaWZcbiAgICogaXQgd291bGQgcmF0aGVyIHJlZnVzZSB0aGFuIHJlcG9ydCwgcmVqZWN0IGl0IHdpdGggYSA0MTIuIEEgcmVqZWN0aW9uIGlzXG4gICAqIG5vdCByZXRyaWVkIGhlcmU6IHRoZSBldmVudCdzIGNvcnJlbGF0aW9uIGlkIHdhcyBtaW50ZWQgYnkgKnRoaXMqIHJlcGxheSdzXG4gICAqIHNlZWRlZCBzZXF1ZW5jZSwgc28gcmUtY29tbWl0dGluZyBpdCBhZ2FpbnN0IGEgY29ycmVjdGVkIGxvZyB3b3VsZCBwZXJzaXN0XG4gICAqIGFuIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IHByb2R1Y2VzLiBUaGUgY2FsbGVyIHJlc3RhcnRzIHRoZSByZXBsYXlcbiAgICogaW5zdGVhZC5cbiAgICpcbiAgICogRXh0ZW5kZWQgaW4gcGxhY2UgYnkgd2hhdCB0aG9zZSB3cml0ZXMgcmVwb3J0IGJhY2sg4oCUIHRoZSBldmVudHMgb24gc2xvdHNcbiAgICogdGhleSBza2lwcGVkIG92ZXIsIGFuZCAob24gdGhlIGhvb2sgY3JlYXRlKSB0aGUgaW5saW5lIGRlbHRhIHNpbmNlIGl0c1xuICAgKiBjdXJzb3IuIFdoZXRoZXIgdGhlIGxvZyBpcyBjb21wbGV0ZSBhZnRlcndhcmRzIGlzIGFuc3dlcmVkIGJ5XG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5ldmVudExvZ0NhcnJpZWRGb3J3YXJkfS5cbiAgICovXG4gIGV2ZW50TG9nPzogTG9hZGVkRXZlbnRMb2c7XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKHRoZSBydW4gZXhpc3RzKS4gV2hlbiBwcmVzZW50LCBldmVyeSB3b3JsZCB3cml0ZVxuICAgKiB0aGlzIHN1c3BlbnNpb24gcGVyZm9ybXMgKGBob29rX2NyZWF0ZWRgLCBgd2FpdF9jcmVhdGVkYCwgZWFnZXIgb3ZlcmZsb3dcbiAgICogYHN0ZXBfY3JlYXRlZGAsIOKApikgaXMgZ2F0ZWQgb24gaXQgc28gdGhlIHdyaXRlIG5ldmVyIHJhY2VzIGFoZWFkIG9mIHRoZVxuICAgKiBydW4ncyBjcmVhdGlvbi4gVGhlIHB1cmUgaW5saW5lIGhvdCBwYXRoIGRlZmVycyBhbGwgb2YgaXRzIHN0ZXBzIGFuZCB3cml0ZXNcbiAgICogbm90aGluZyBoZXJlLCBzbyBpdCBuZXZlciBhd2FpdHMgdGhpcyBiYXJyaWVyLiBgdW5kZWZpbmVkYCBvdXRzaWRlIHR1cmJvLFxuICAgKiB3aGVyZSBgcnVuX3N0YXJ0ZWRgIHdhcyBhbHJlYWR5IGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICAvKiogT25lLXNob3QgdGVsZW1ldHJ5IHJlcG9ydGVyLCBhY3RpdmF0ZWQgb25seSBhZnRlciByZXBsYXkgaGFzIHJlY292ZXJlZC4gKi9cbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcj86IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXI7XG4gIC8qKlxuICAgKiBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogd2hlbiBwcm92aWRlZCAoYW5kIHRoZSBwZXItc3RlcCBlbGlnaWJpbGl0eSBnYXRlc1xuICAgKiBwYXNzLCBzZWUgdGhlIHN0ZXAgb3BzIGJlbG93KSwgZWFjaCBuZXdseSBjcmVhdGVkIG5vbi1pbmxpbmUgc3RlcCdzXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIGlzIHBhcmFsbGVsaXplZCB3aXRoIGl0cyBzdGVwLWV4ZWN1dGlvbiBxdWV1ZVxuICAgKiBwdWJsaXNoLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UgY2FycmllcyB0aGUgc2VyaWFsaXplZCBzdGVwIGlucHV0XG4gICAqIChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhbiBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGVcbiAgICogZGlyZWN0IHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseS4gU3RlcHMgcXVldWVkIHRoaXMgd2F5IGFyZSByZXBvcnRlZCBpblxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzfSBzbyB0aGUgY2FsbGVyXG4gICAqIHNraXBzIHRoZW0gaW4gaXRzIG93biBkaXNwYXRjaCBwYXNzLiBPbWl0dGVkIGJ5IGNhbGxlcnMgdGhhdCBtdXN0IG5vdFxuICAgKiBxdWV1ZSAodGVybWluYWwgZHJhaW4sIHRlc3RzKTsgY3JlYXRlcyB0aGVuIGJlaGF2ZSBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICovXG4gIHN0ZXBEaXNwYXRjaD86IHtcbiAgICAvKiogVGhlIHVuaWZpZWQgd29ya2Zsb3cgcXVldWUgdGhpcyBydW4ncyBzdGVwIG1lc3NhZ2VzIGFyZSBwdWJsaXNoZWQgdG8uICovXG4gICAgcXVldWVOYW1lOiBWYWxpZFF1ZXVlTmFtZTtcbiAgICAvKipcbiAgICAgKiBMYXppbHkgcmVzb2x2ZXMgdGhlIHRyYWNlIGNhcnJpZXIgdG8gc3RhbXAgb24gdGhlIHN0ZXAgbWVzc2FnZXMuXG4gICAgICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgc3VzcGVuc2lvbiAobWVtb2l6ZWQgaGVyZSkuXG4gICAgICovXG4gICAgZ2V0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFRyYWNlQ2Fycmllcj47XG4gIH07XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogc3VzcGVuc2lvbiBydW5zIGluICh0aGUgcXVldWUgaGFuZGxlcidzIG1ldGEpLiBXaGVuIHByZXNlbnQgQU5EIHRoZVxuICAgKiBiYXRjaGVkIGZhbi1vdXQgZW5nYWdlcywgdGhlIGxhenktaW5saW5lIHN0ZXBzJyBkZWZlcnJlZCB3cml0ZXMgYXJlXG4gICAqIGZvbGRlZCBpbnRvIHRoZSBiYXRjaCBhcyBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXJzICh0aGVcbiAgICogc3RhcnRlZCByb3cgc3RhbXBlZCB3aXRoIHRoaXMgSUQsIGV4YWN0bHkgbGlrZSB0aGUgbGF6eSBjbGFpbSBpdFxuICAgKiByZXBsYWNlcyksIHByZS1jbGFpbWluZyB0aGUgc3RlcHMgdGhlIGNhbGxlciBpcyBhYm91dCB0byBydW4gaW5saW5lLiBTZWVcbiAgICoge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmlubGluZUNsYWltc30uIENhbGxlcnMgdGhhdCBuZXZlclxuICAgKiBpbmxpbmUtZXhlY3V0ZSAodGVybWluYWwgZHJhaW4pIG9taXQgaXQsIGtlZXBpbmcgdGhlaXIgbGF6eSBzdGVwcyBvbiB0aGVcbiAgICogcGxhaW4gZGVmZXJyZWQgcGF0aC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogTGV0cyB0aGUgYmF0Y2hlZCBmYW4tb3V0IHJldHVybiBiZWZvcmUgZXZlcnkgY2h1bmsgaGFzIGNvbW1pdHRlZDogb25seVxuICAgKiB0aGUgY2h1bmsgY2FycnlpbmcgdGhlIHByZS1jbGFpbWVkIGlubGluZSBwYWlycyBnYXRlcyB0aGUgaGFuZGxlcidzXG4gICAqIHJldHVybiAoaXRzIGNsYWltcyBhcmUgd2hhdCB0aGUgY2FsbGVyIHN0YXJ0cyBib2RpZXMgZnJvbSksIHdoaWxlIHRoZVxuICAgKiB0cmFpbGluZyBjaHVua3MnIGNvbW1pdHMgKGFuZCBldmVyeSBjaHVuaydzIGluLWZsdXNoIHN0ZXAtbWVzc2FnZVxuICAgKiBwdWJsaXNoZXMpIHJpZGUge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmRlZmVycmVkQmF0Y2hXb3JrfS4gQVxuICAgKiBjYWxsZXIgdGhhdCBvcHRzIGluIE1VU1QgYXdhaXQgdGhhdCBwcm9taXNlIGJlZm9yZSBhY2tpbmcgaXRzIGRlbGl2ZXJ5OlxuICAgKiB0aGUgZHVyYWJpbGl0eSBjb250cmFjdCAoXCJldmVyeSBjcmVhdGUgZHVyYWJsZSBiZWZvcmUgYWNrXCIpIG1vdmVzIGZyb21cbiAgICogdGhlIGhhbmRsZXIncyByZXR1cm4gdG8gdGhhdCBqb2luLCBhbmQgbm90aGluZyBlbHNlIHJlLWRyaXZlcyBhIGxvc3RcbiAgICogdHJhaWxpbmcgY2h1bmsuIENhbGxlcnMgdGhhdCBkb24ndCBvcHQgaW4gKHRlcm1pbmFsIGRyYWluLCBkZWZhdWx0KVxuICAgKiBrZWVwIHRoZSBldmVyeXRoaW5nLWR1cmFibGUtYXQtcmV0dXJuIGJlaGF2aW9yLlxuICAgKi9cbiAgYWxsb3dEZWZlcnJlZEJhdGNoV29yaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGhhbmRsaW5nIGEgc3VzcGVuc2lvbi4gUmV0dXJucyBwZW5kaW5nIHN0ZXAgaXRlbXMgc28gdGhlIGNhbGxlclxuICogY2FuIGRlY2lkZSB3aGljaCB0byBleGVjdXRlIGlubGluZSB2cyBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0IHtcbiAgLyoqIFBlbmRpbmcgc3RlcCBpdGVtcyB3aXRoIGV2ZW50cyBjcmVhdGVkIGJ1dCBOT1QgcXVldWVkICovXG4gIHBlbmRpbmdTdGVwczogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1bXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBmb3Igd2hpY2ggdGhpcyBzdXNwZW5zaW9uIGNhbGwgYWN0dWFsbHkgd3JvdGUgdGhlXG4gICAqIHN0ZXBfY3JlYXRlZCBldmVudCAoYXMgb3Bwb3NlZCB0byBjYXRjaGluZyBFbnRpdHlDb25mbGljdEVycm9yIGJlY2F1c2VcbiAgICogYSBjb25jdXJyZW50IGhhbmRsZXIgd3JvdGUgaXQgZmlyc3QpLiBPbmx5IHRoZSBoYW5kbGVyIHRoYXQgd3JvdGUgdGhlXG4gICAqIHN0ZXBfY3JlYXRlZCBldmVudCBzaG91bGQgcXVldWUgLyBpbmxpbmUtZXhlY3V0ZSB0aGUgc3RlcDsgdGhpc1xuICAgKiBndWFyYW50ZWVzIGEgc2luZ2xlIG93bmVyIHBlciBzdGVwLCBldmVuIHdoZW4gbXVsdGlwbGUgaGFuZGxlcnMgcmFjZVxuICAgKiBpbnRvIHRoZSBzYW1lIGJhdGNoIGJvdW5kYXJ5LlxuICAgKi9cbiAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkczogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBDb3JyZWxhdGlvbiBJRHMgb2Ygc3RlcHMgd2hvc2UgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemUuIEVhY2ggd2FzXG4gICAqIGZpbmFsaXplZCBoZXJlIGFzIGBzdGVwX2NyZWF0ZWRgICh3aXRoIGEgcGxhY2Vob2xkZXIgaW5wdXQ7IHRoZSByZWFsXG4gICAqIGlucHV0IGlzIHByZWNpc2VseSB3aGF0IHJlZnVzZWQgdG8gc2VyaWFsaXplKSBmb2xsb3dlZCBieSBgc3RlcF9mYWlsZWRgXG4gICAqIGNhcnJ5aW5nIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IsIHNvIHRoZSBuZXh0IHJlcGxheSByZWplY3RzIHRoZSBzdGVwJ3NcbiAgICogcHJvbWlzZSBhbmQgYSB0cnkvY2F0Y2ggYXJvdW5kIHRoZSBzdGVwIGNhbGwgb2JzZXJ2ZXMgdGhlIGVycm9yLFxuICAgKiBleGFjdGx5IGxpa2UgYSBzdGVwLWJvZHkgZmFpbHVyZS4gTm8gc3RlcC1leGVjdXRpb24gbWVzc2FnZSBpc1xuICAgKiBkaXNwYXRjaGVkIGZvciB0aGVzZSwgc28gdGhlIGNhbGxlciBNVVNUIGZvcmNlIGFuIGluLXByb2Nlc3MgcmVwbGF5OlxuICAgKiB3aGVuIHRoZSBmYWlsZWQgc3RlcCB3YXMgdGhlIG9ubHkgcGVuZGluZyB3b3JrLCBub3RoaW5nIGVsc2Ugd2lsbCBldmVyXG4gICAqIHJlLWludm9rZSB0aGUgcnVuIHRvIG9ic2VydmUgdGhlIHRlcm1pbmFsIGV2ZW50LlxuICAgKi9cbiAgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB0aGlzIHN1c3BlbnNpb24gY2FsbCBhbHJlYWR5IHB1Ymxpc2hlZFxuICAgKiBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBtZXNzYWdlcyBmb3IsIHZpYSByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCAodGhlXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIHBhcmFsbGVsaXplZCB3aXRoIGEgYHN0ZXBJbnB1dGAtY2FycnlpbmcgcXVldWVcbiAgICogcHVibGlzaCkuIFRoZSBjYWxsZXIgTVVTVCBOT1QgZGlzcGF0Y2ggdGhlc2UgYWdhaW46IHRoZSBtZXNzYWdlIGlzXG4gICAqIGFscmVhZHkgb3V0IChhIGR1cGxpY2F0ZSB3b3VsZCBiZSBkZWR1cGVkIGJ5IGl0cyBpZGVtcG90ZW5jeSBrZXksIGJ1dFxuICAgKiBjb3N0cyBhIHdhc3RlZCByb3VuZC10cmlwKS4gRW1wdHkgd2hlbiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMuc3RlcERpc3BhdGNofVxuICAgKiB3YXMgbm90IHByb3ZpZGVkIG9yIG5vIHN0ZXAgd2FzIGVsaWdpYmxlLlxuICAgKi9cbiAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGV2ZW50cyB0aGlzIHBoYXNlJ3Mgd3JpdGVzIHJlcG9ydGVkIGJhY2sgYXMgb2NjdXB5aW5nIHNsb3RzIHRoZXlcbiAgICogc2tpcHBlZCBvdmVyLCBhbHJlYWR5IG1lcmdlZCBpbnRvIHRoZSBjYWxsZXIncyBgZXZlbnRMb2cuZXZlbnRzYC4gTm9uemVyb1xuICAgKiBtZWFucyB0aGUgYXJyYXkgd2FzIHJlb3JkZXJlZCB0byByZXN0b3JlIHNsb3Qgb3JkZXIsIHNvIGFueSBpbmRleCB0aGVcbiAgICogY2FsbGVyIGNhY2hlZCBpbnRvIGl0IChwYXlsb2FkIHByZXdhcm0gc2NhbiBwb3NpdGlvbikgaXMgc3RhbGUuXG4gICAqL1xuICByZXBvcnRlZEV2ZW50Q291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzdGVwcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCB3cml0ZXMgd2VyZSBpbnRlbnRpb25hbGx5IGRlZmVycmVkIHNvIHRoZVxuICAgKiBjYWxsZXIgY2FuIHJ1biB0aGVtIGlubGluZSB2aWEgbGF6eSBgc3RlcF9zdGFydGVkYCBldmVudHMgKHdoaWNoIGNyZWF0ZVxuICAgKiB0aGUgc3RlcCBvbiB0aGUgZmx5KSwgc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gVXAgdG9cbiAgICogYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIGFyZSBkZWZlcnJlZDsgdGhlIGNhbGxlciBydW5zIHRoZW0gaW5saW5lIGluXG4gICAqIHBhcmFsbGVsIGFuZCBxdWV1ZXMgdGhlIHJlc3QuIEVtcHR5IHdoZW4gbm8gc3RlcCB3YXMgZGVmZXJyZWQgKG5vdGhpbmdcbiAgICogcGVuZGluZywgb3IgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIGlzIHByZXNlbnQgc28gbm90aGluZyBpc1xuICAgKiBleGVjdXRlZCBpbmxpbmUpLiBUaGUgY2FsbGVyIHBhc3NlcyBlYWNoIGBkZWh5ZHJhdGVkSW5wdXRgIHN0cmFpZ2h0IHRvXG4gICAqIGBleGVjdXRlU3RlcGAsIHdoaWNoIHNlbmRzIGl0IGFzIHRoZSBgc3RlcF9zdGFydGVkYCBwYXlsb2FkLiBUaGUgYXRvbWljXG4gICAqIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBgc3RlcF9zdGFydGVkYCBpcyB0aGUgZXhhY3RseS1vbmUtb3duZXIgZ2F0ZSB0aGF0XG4gICAqIHRoZSBzdGFuZGFsb25lIGBzdGVwX2NyZWF0ZWRgIHByb3ZpZGVkIGJlZm9yZTogdGhlIGxvc2VyIG9mIHRoZSByYWNlIGdldHNcbiAgICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgc2tpcHBlZGAgYW5kIGRvZXMgbm90IHJ1biB0aGUgYm9keS5cbiAgICovXG4gIGxhenlJbmxpbmVTdGVwczogQXJyYXk8e1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgIGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gIH0+O1xuICAvKipcbiAgICogUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0cywgYnkgY29ycmVsYXRpb24gaWQ6IHRoZSBwZXItc3RlcCB2ZXJkaWN0cyBvZlxuICAgKiB0aGUgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlycyB0aGUgYmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZFxuICAgKiBmb3IgdGhlIGxhenktaW5saW5lIHN0ZXBzLiBBIHN0ZXAgd2l0aCBhbiBlbnRyeSBoZXJlIGlzIHBhc3NlZCB0b1xuICAgKiBgZXhlY3V0ZVN0ZXBgIGFzIGBwcmVjbGFpbWVkU3RhcnRgIElOU1RFQUQgb2YgYGxhenlTdGVwSW5wdXRgOiBpdHNcbiAgICogaW5wdXQgYWxyZWFkeSByb2RlIHRoZSBwYWlyLCBhbmQgdGhlIGNsYWltIGlzIHNldHRsZWQ6IGBvd25lZDogdHJ1ZWBcbiAgICogY2FycmllcyB0aGUgc3RhcnRlZCBhdHRlbXB0LTEgZW50aXR5IChpbnB1dCByZS1hdHRhY2hlZCkgc28gdGhlIGJvZHlcbiAgICogcnVucyBzdHJhaWdodCBvZmYgdGhlIGJhdGNoIGNvbW1pdCB3aXRoIG5vIHN0YXJ0IHdyaXRlIG9mIGl0cyBvd247XG4gICAqIGBvd25lZDogZmFsc2VgIGxvc3QgdGhlIHBhaXIncyBhdG9taWMgY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudFxuICAgKiB3cml0ZXIsIGFuZCBleGVjdXRlU3RlcCByZXR1cm5zIGBza2lwcGVkYCB3aXRob3V0IHJ1bm5pbmcgdGhlIGJvZHksXG4gICAqIHRoZSBzYW1lIG91dGNvbWUgYXMgbG9zaW5nIHRoZSBsYXp5IGNsYWltLiBFbXB0eSB3aGVuZXZlciB0aGUgZm9sZCBkaWRcbiAgICogbm90IGVuZ2FnZSAoYmF0Y2hpbmcgb2ZmLCBubyBgb3duZXJNZXNzYWdlSWRgLCBvciB0aGUgbG9uZS1pbmxpbmUgY2FzZSxcbiAgICogd2hpY2gga2VlcHMgdGhlIG9wdGltaXN0aWMgbGF6eSBwYXRoIGFuZCBpdHMgY2xhaW0vYm9keSBvdmVybGFwKS5cbiAgICpcbiAgICogQ3Jhc2ggd2luZG93OiB0aGUgcGFpciBjb21taXRzIGJlZm9yZSB0aGUgY2FsbGVyIHJ1bnMgdGhlIGJvZHksIHNvIGFcbiAgICogY3Jhc2ggYmV0d2VlbiB0aGVtIGxlYXZlcyBhIHN0YXJ0ZWQgc3RlcCBzdGFtcGVkIHdpdGggdGhpcyBtZXNzYWdlJ3NcbiAgICogSUQuIFJlZGVsaXZlcnkgb2YgdGhlIHNhbWUgbWVzc2FnZSByZS1leGVjdXRlcyBpdCB2aWEgdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBhdGgsIHRoZSBleGFjdCBtYWNoaW5lcnkgdGhlIGxhenkgY2xhaW0ncyBjcmFzaCB3aW5kb3cgYWxyZWFkeSB1c2VzLlxuICAgKi9cbiAgaW5saW5lQ2xhaW1zOiBNYXA8c3RyaW5nLCBQcmVjbGFpbWVkSW5saW5lU3RhcnQ+O1xuICAvKipcbiAgICogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgYmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCwgd2hlbiBpdCByYW4uIFRoZSBiYXRjaCdzXG4gICAqIG93biBldmVudHMgYXJlIG5vdCBpbiB0aGUgY2FsbGVyJ3MgbG9hZGVkIGxvZyAodGhlIG5leHQgcmVsb2FkIHBpY2tzXG4gICAqIHRoZW0gdXApLCBzbyB0aGUgY2FsbGVyIGZvbGRzIHRoaXMgY2VpbGluZyBpbnRvIHRoZSBzbG90IHNuYXBzaG90IGl0XG4gICAqIGhhbmRzIHRoZSBpbmxpbmUgZXhlY3V0aW9uczsgb3RoZXJ3aXNlIGV2ZXJ5IGlubGluZSB0ZXJtaW5hbCB3cml0ZVxuICAgKiB3b3VsZCBuYW1lIGEgcHJlLWJhdGNoIHBvc2l0aW9uIGFuZCBiZSBhbnN3ZXJlZCB3aXRoIGEgc2tpcHBlZC1zbG90XG4gICAqIHJlcG9ydCBlY2hvaW5nIHRoZSBldmVudHMgdGhpcyBzdXNwZW5zaW9uIGp1c3Qgd3JvdGUuIFVuZGVyXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5hbGxvd0RlZmVycmVkQmF0Y2hXb3JrfSB0aGlzIGNvdmVycyB0aGVcbiAgICogY2h1bmtzIHRoYXQgaGFkIGNvbW1pdHRlZCBieSB0aGUgaGFuZGxlcidzIHJldHVybiAoYWx3YXlzIHRoZSBwYWlyXG4gICAqIGNodW5rKTsgYSB0cmFpbGluZyBjaHVuayB0aGF0IGNvbW1pdHMgbGF0ZXIgaXMgZWNob2VkIGJhY2sgb24gdGhlXG4gICAqIHRlcm1pbmFsIHdyaXRlcyBsaWtlIGFueSBmb3JlaWduIGV2ZW50OiByZXBvcnRzIHRoZSBleGVjdXRvciByZWFkcyBmb3JcbiAgICogcG9zaXRpb24gYW5kIGRpc2NhcmRzLlxuICAgKlxuICAgKiBTbyB0aGUgZWNobyBpcyBvbmx5IGZ1bGx5IHN1cHByZXNzZWQgZm9yIGEgU0lOR0xFLWNodW5rIGZvbGQuIE9uIGFcbiAgICogbXVsdGktY2h1bmsgZmFuLW91dCB0aGUgYm9kaWVzIHN0YXJ0IG9mZiB0aGUgcGFpciBjaHVuayB3aGlsZSB0cmFpbGluZ1xuICAgKiBjaHVua3MgYXJlIHN0aWxsIGluIGZsaWdodCwgYW5kIGFuIGlubGluZSB0ZXJtaW5hbCB3cml0ZSBpc3N1ZWQgaW4gdGhhdFxuICAgKiB3aW5kb3cgc3RpbGwgbmFtZXMgYSBwb3NpdGlvbiBiZWxvdyB0aGVtIGFuZCBzdGlsbCBkcmF3cyBhIHJlcG9ydCBmb3JcbiAgICogdGhlaXIgZXZlbnRzLiBCb3VuZGVkICh0cmFpbGluZyBjaHVua3Mgb25seSwgbGFyZ2UgZmFuLW91dHMgb25seSkgYW5kXG4gICAqIHNlbGYtY29ycmVjdGluZyBvbiB0aGUgbmV4dCByZWxvYWQsIGFuZCByZWNvcmRlZCBzbyBhIHJlcG9ydCBzZWVuIHRoZXJlXG4gICAqIHJlYWRzIGFzIGV4cGVjdGVkIHJhdGhlciB0aGFuIGFzIGEgYnVnLlxuICAgKi9cbiAgYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXRjaGVkIGZhbi1vdXQncyBkZWZlcnJlZCB3b3JrLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIG9wdGVkXG4gICAqIGluIHZpYSB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMuYWxsb3dEZWZlcnJlZEJhdGNoV29ya30gYW5kXG4gICAqIHRyYWlsaW5nIHdvcmsgZXhpc3RzOiB0aGUgY29tbWl0cyBvZiBldmVyeSBjaHVuayBleGNlcHQgdGhlIHBhaXIgY2h1bmssXG4gICAqIHBsdXMgZXZlcnkgY2h1bmsncyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzIChlYWNoIGNoYWluZWQgb24gSVRTIE9XTlxuICAgKiBjaHVuaydzIGNvbW1pdCwgc28gcHVibGlzaC1hZnRlci1jcmVhdGUgaG9sZHMgcGVyIHN0ZXApLiBUaGUgY2FsbGVyXG4gICAqIE1VU1QgYXdhaXQgaXQgYmVmb3JlIGFja2luZzogYSByZWplY3Rpb24gaGVyZSBpcyBhIGZhaWxlZCBzdXNwZW5zaW9uXG4gICAqIHdyaXRlIGFuZCBmYWlscyB0aGUgZGVsaXZlcnkgZXhhY3RseSBhcyBpdCB3b3VsZCBoYXZlIGF0IHRoZSBoYW5kbGVyJ3NcbiAgICogcmV0dXJuLiBTdGVwcyB3aG9zZSBtZXNzYWdlcyB0aGlzIHdvcmsgcHVibGlzaGVzIGFyZSBhbHJlYWR5IGluXG4gICAqIHtAbGluayBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHN9IGF0IHJldHVybiB0aW1lLlxuICAgKi9cbiAgZGVmZXJyZWRCYXRjaFdvcms/OiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIHNvb25lc3QgcGVuZGluZyB3YWl0LCBpZiBhbnk6IHNlY29uZHMgdW50aWwgaXQgZWxhcHNlcyBhbmQgdGhlXG4gICAqIGNvcnJlbGF0aW9uSWQgb2YgdGhlIHdhaXQgdGhhdCBwcm9kdWNlZCB0aGF0IHRpbWVvdXQuIFRoZVxuICAgKiBjb3JyZWxhdGlvbklkIHNlZWRzIHRoZSBpZGVtcG90ZW5jeSBrZXkgZm9yIHRoZSB3YWl0LWNvbnRpbnVhdGlvblxuICAgKiBxdWV1ZSBtZXNzYWdlIHNvIHRoYXQgcmVwZWF0ZWQgc3VzcGVuc2lvbiBwYXNzZXMgb3ZlciB0aGUgc2FtZVxuICAgKiBwZW5kaW5nIHdhaXQgY29sbGFwc2UgaW50byBhIHNpbmdsZSBkZWxheWVkIGNvbnRpbnVhdGlvbi5cbiAgICovXG4gIHdhaXRUaW1lb3V0PzogeyBzZWNvbmRzOiBudW1iZXI7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9O1xuICAvKipcbiAgICogV2hldGhlciBhIGhvb2sgY3JlYXRlIGNvbW1pdHRlZCBhIGBob29rX2NvbmZsaWN0YCDigJQgdGhlIHRva2VuIHdhcyBhbHJlYWR5XG4gICAqIGNsYWltZWQsIHNvIHRoaXMgcnVuJ3MgaG9vayB3YXMgbmV2ZXIgY3JlYXRlZCBhbmQgdGhlIHdvcmtmbG93IG11c3RcbiAgICogb2JzZXJ2ZSB0aGUgY29uZmxpY3QgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhpcyBzdXNwZW5zaW9uIHNjaGVkdWxlZCBydW5zLlxuICAgKiBUaGUgY2FsbGVyIGFuc3dlcnMgaXQgYnkgYWR2YW5jaW5nIHRoZSB3b3JrZmxvdyBvdmVyIHRoZSBjb21taXR0ZWQgZXZlbnQuXG4gICAqL1xuICBoYXNIb29rQ29uZmxpY3Q6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBuZWVkcyB0aGUgd29ya2Zsb3cgdG8gY29udGludWUgaW1tZWRpYXRlbHkgKi9cbiAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUgaG9va3MgdGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZCBhIGBob29rX2NyZWF0ZWRgXG4gICAqIGZvciB3aGlsZSBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgd2FzIHdhaXRpbmcgb24gaXQg4oCUIHRoZSBldmVudHNcbiAgICogdGhhdCByZXNvbHZlIHRob3NlIGF3YWl0ZXJzIG9uIHRoZSBuZXh0IHBhc3MuIEVtcHR5IGV4YWN0bHkgd2hlblxuICAgKiB7QGxpbmsgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbn0gaXMgZmFsc2UuXG4gICAqXG4gICAqIFJlcG9ydGVkIGJ5IGlkLCBub3QganVzdCBjb3VudGVkLCBzbyBhIGNhbGxlciB0aGF0IGNvbnRpbnVlcyBpbiB0aGlzXG4gICAqIHByb2Nlc3MgY2FuIHRlbGwgYSBjb250aW51YXRpb24gdGhhdCBnb3Qgc29tZXdoZXJlIGZyb20gb25lIHRoYXQgaXNcbiAgICogcmVwZWF0aW5nOiBhIHdvcmtmbG93IG1heSBjcmVhdGUgb25lIGF3YWl0ZWQgaG9vayBhZnRlciBhbm90aGVyLCBhbmQgZWFjaFxuICAgKiBuZXcgaWQgaXMgYSBwYXNzIHRoYXQgbWFkZSBwcm9ncmVzcywgd2hpbGUgdGhlIHNhbWUgaWQgY29taW5nIGJhY2sgbWVhbnNcbiAgICogdGhlIHBhc3MgcmFuIG92ZXIgYSBsb2cgdGhhdCBzdGlsbCBkaWQgbm90IGhvbGQgaXRzIGV2ZW50IGFuZCBjb250aW51aW5nXG4gICAqIGFnYWluIGNhbm5vdCBjaGFuZ2UgdGhhdC5cbiAgICovXG4gIGF3YWl0ZWRIb29rQ29ycmVsYXRpb25JZHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gaWRzIG9mIHRoZSBob29rcyB3aG9zZSBjcmVhdGUgY29tbWl0dGVkIGEgYGhvb2tfY29uZmxpY3RgLlxuICAgKiBFbXB0eSBleGFjdGx5IHdoZW4ge0BsaW5rIGhhc0hvb2tDb25mbGljdH0gaXMgZmFsc2UuXG4gICAqXG4gICAqIEJ5IGlkIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGF3YWl0ZWRIb29rQ29ycmVsYXRpb25JZHN9LCBhbmRcbiAgICogYWdhaW5zdCB0aGUgc2FtZSBoYXphcmQ6IGEgY29uZmxpY3QgaXMgcmVzb2x2ZWQgYnkgdGhlIGBob29rX2NvbmZsaWN0YFxuICAgKiB0aGlzIHN1c3BlbnNpb24gY29tbWl0dGVkLCBhbmQgdW50aWwgdGhlIHdvcmtmbG93IG9ic2VydmVzIGl0IHRoZSBob29rXG4gICAqIHN0YXlzIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSBhbmQgdGhlIG5leHQgcGFzcyB3cml0ZXMgdGhlIGNyZWF0ZSBhZ2Fpbi5cbiAgICogQSBmcmVzaCBpZCBpcyBwcm9ncmVzczsgdGhlIHNhbWUgaWQgY29taW5nIGJhY2sgaXMgYSBwYXNzIHRoYXQgcmFuIG92ZXIgYVxuICAgKiBsb2cgd2hpY2ggc3RpbGwgZGlkIG5vdCBob2xkIHRoZSBldmVudCwgc28gY29udGludWluZyBhZ2FpbiBjYW5ub3QgY2hhbmdlXG4gICAqIHRoYXQuXG4gICAqL1xuICBob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWxsZXIncyBgZXZlbnRMb2dgIG5vdyBob2xkcyBldmVyeSBldmVudCB0aGlzIHN1c3BlbnNpb25cbiAgICogY29tbWl0dGVkLCBzbyBhIGNhbGxlciB0aGF0IGNvbnRpbnVlcyBpbiB0aGlzIHByb2Nlc3MgY2FuIHJlcGxheSDigJQgb3JcbiAgICogcmVzdW1lIGEgcmV0YWluZWQgVk0g4oCUIHN0cmFpZ2h0IG9mZiBpdCB3aXRoIG5vIHJlYWQuXG4gICAqXG4gICAqIFRydWUgb25seSB3aGVuIHRoZSBob29rIGNyZWF0ZSdzIGlubGluZSBkZWx0YSBjYW1lIGJhY2sgY29tcGxldGUgYW5kIHdhc1xuICAgKiBmb2xkZWQgaW4gKHNlZSBgaG9va0RlbHRhQ3Vyc29yYCBiZWxvdyksIGFuZCBub3RoaW5nIGVsc2UgaW4gdGhpc1xuICAgKiBzdXNwZW5zaW9uIHdyb3RlIGFuIGV2ZW50LiBGYWxzZSB3aGVuZXZlciBhIHJlYWQgaXMgbmVlZGVkIGZpcnN0OiBub1xuICAgKiBkZWx0YSB3YXMgYXNrZWQgZm9yIG9yIHJldHVybmVkLCBpdCB3YXMgdHJ1bmNhdGVkLCBvciBhIHN0ZXAgLyB3YWl0IC9cbiAgICogYXR0cmlidXRlIC8gYWJvcnQgd3JpdGUgbGFuZGVkIGFib3ZlIGl0IGFuZCBpcyB0aGVyZWZvcmUgbm90IGluIGl0LlxuICAgKlxuICAgKiBJbmRpZmZlcmVudCB0byB3aGljaCBldmVudCB0aGUgY3JlYXRlIGNvbW1pdHRlZDogdGhlIGRlbHRhIGlzIHRoZSBzbGljZVxuICAgKiBvZiB0aGUgbG9nIGFmdGVyIHRoZSBjYWxsZXIncyBjdXJzb3IgZWl0aGVyIHdheSwgc28gaXQgY2FycmllcyBhXG4gICAqIGBob29rX2NvbmZsaWN0YCBleGFjdGx5IGFzIGl0IGNhcnJpZXMgYSBgaG9va19jcmVhdGVkYC5cbiAgICovXG4gIGV2ZW50TG9nQ2FycmllZEZvcndhcmQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIG5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIHdlcmUgd3JpdHRlbiBmb3IgcmVwbGF5LiAqL1xuICBoYXNBdHRyaWJ1dGVFdmVudHM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3VzcGVuc2lvbiBjcmVhdGVkIGFueSBob29rIChgaG9va19jcmVhdGVkYCkgZXZlbnRzLiBVbmxpa2VcbiAgICogYGhhc0hvb2tDb25mbGljdGAgLyBgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbmAsIHRoaXMgaXMgdHJ1ZSBldmVuIGZvciBhIHBsYWluXG4gICAqIGZpcmUtYW5kLWZvcmdldCBob29rIHdpdGggbm8gY29uZmxpY3QgYW5kIG5vIGF3YWl0ZXIuIFR1cmJvIG1vZGUgdXNlcyBpdCB0b1xuICAgKiBkZXRlY3QgXCJhIGhvb2sgd2FzIGNyZWF0ZWQgdGhpcyBzdXNwZW5zaW9uXCIgYW5kIHN0b3AgZm9yY2luZyBvcHRpbWlzdGljXG4gICAqIGlubGluZSBzdGFydCAoYSBob29rIGludHJvZHVjZXMgbGF0ZXIgcmVzdW1lIGludm9jYXRpb25zIHRoYXQgY291bGQgcmFjZSkuXG4gICAqL1xuICBoYXNIb29rRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyBzcGVudCBjb21taXR0aW5nIHRoaXMgc3VzcGVuc2lvbidzIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiAoMCB3aGVuIGl0IGNyZWF0ZWQgbm9uZSkuIFRoZSBjYWxsZXIgYWNjdW11bGF0ZXMgdGhpcyBhY3Jvc3MgaXRlcmF0aW9uc1xuICAgKiBhbmQgc3VidHJhY3RzIGl0IGZyb20gdGhlIFRURlMgbGF0ZW5jeSBtZWFzdXJlbWVudCwgc28gdGltZSBzcGVudFxuICAgKiBkdXJhYmx5IGNyZWF0aW5nIHRoZSB1c2VyJ3MgaG9va3MgZG9lc24ndCBjb3VudCBhcyBydW50aW1lIG92ZXJoZWFkLlxuICAgKi9cbiAgaG9va0NyZWF0aW9uTXM6IG51bWJlcjtcbiAgLyoqIEV4YWN0IG51bWJlciBvZiB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbnMgb2JzZXJ2ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uICovXG4gIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQ6IG51bWJlcjtcbiAgLyoqIEJvdW5kZWQgc2FtcGxlIHVzZWQgb25seSBmb3IgcmV0ZW50aW9uIGRpYWdub3N0aWNzLiAqL1xuICBzZXJpYWxpemF0aW9uQmxvY2tlcnM6IFN1c3BlbnNpb25TZXJpYWxpemF0aW9uQmxvY2tlcltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1c3BlbnNpb25TZXJpYWxpemF0aW9uQmxvY2tlciBleHRlbmRzIEd1ZXN0Q29kZUV4ZWN1dGlvbiB7XG4gIHNvdXJjZTogJ3N0ZXBfaW5wdXQnIHwgJ2hvb2tfbWV0YWRhdGEnIHwgJ2hvb2tfYWJvcnQnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUhvb2tFdmVudCh7XG4gIHJ1bklkLFxuICBob29rRXZlbnQsXG4gIHF1ZXVlSXRlbSxcbiAgcmVxdWVzdElkLFxuICBzaW5jZUN1cnNvcixcbiAgY3JlYXRlRXZlbnQsXG59OiB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGhvb2tFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJzb3IgdG8gYXNrIHRoZSBXb3JsZCBmb3IgdGhlIGV2ZW50LWxvZyBkZWx0YSBhZ2FpbnN0LCBvciB1bmRlZmluZWQgdG9cbiAgICogbm90IGFzay4gU2VlIGBob29rRGVsdGFDdXJzb3JgIGluIHtAbGluayBoYW5kbGVTdXNwZW5zaW9ufSBmb3Igd2hlbiBpdCBpc1xuICAgKiBzZXQgYW5kIHdoeSBpdCBpcyBhdCBtb3N0IG9uZSB3cml0ZSBwZXIgc3VzcGVuc2lvbi5cbiAgICovXG4gIHNpbmNlQ3Vyc29yPzogc3RyaW5nO1xuICBjcmVhdGVFdmVudDogKFxuICAgIGRhdGE6IENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuICApID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xufSk6IFByb21pc2U8e1xuICBoYXNIb29rQ29uZmxpY3Q6IGJvb2xlYW47XG4gIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IGJvb2xlYW47XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoaG9va0V2ZW50LCB7XG4gICAgICByZXF1ZXN0SWQsXG4gICAgICAuLi4oc2luY2VDdXJzb3IgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzaW5jZUN1cnNvciB9KSxcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCByZXR1cm5lZCBhIGhvb2tfY29uZmxpY3QgZXZlbnQgaW5zdGVhZCBvZiBob29rX2NyZWF0ZWQuXG4gICAgLy8gVGhlIGhvb2tfY29uZmxpY3QgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYW5kIGlzIHdoYXQgdGhlIG5leHRcbiAgICAvLyBwYXNzIGNvbnN1bWVzIHRvIHNldHRsZSB0aGUgaG9vaydzIGF3YWl0ZXJzIOKAlCByZWplY3RpbmcgYSBwYXlsb2FkIGF3YWl0LFxuICAgIC8vIHJlc29sdmluZyBhIGBob29rLmdldENvbmZsaWN0KClgIHdpdGggdGhlIGNvbmZsaWN0aW5nIHJ1bi4gQW4gaW5saW5lXG4gICAgLy8gZGVsdGEgYXNrZWQgZm9yIGFib3ZlIGNhcnJpZXMgaXQganVzdCBhcyBpdCB3b3VsZCBoYXZlIGNhcnJpZWQgdGhlXG4gICAgLy8gaG9va19jcmVhdGVkLCBzbyB0aGUgY2FsbGVyIGNhbiBhZHZhbmNlIG92ZXIgaXQgd2l0aG91dCBhIHJlLWludm9jYXRpb24uXG4gICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogdHJ1ZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vaycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICBgY3JlYXRlSG9vayBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgIHRocm93IGZhdGFsO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgYSB3b3JrZmxvdyBzdXNwZW5zaW9uIGJ5IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoaG9va3MsIHN0ZXBzLCB3YWl0cykuXG4gKiBDcmVhdGVzIGV2ZW50cyBmb3IgYWxsIG9wZXJhdGlvbnMgYnV0IGRvZXMgTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXM7IHJldHVybnMgdGhlIHBlbmRpbmdcbiAqIHN0ZXBzIHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGljaCB0byBleGVjdXRlIGlubGluZSB2cyBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICpcbiAqIFByb2Nlc3Npbmcgb3JkZXI6XG4gKiAxLiBIb29rcyBhcmUgcHJvY2Vzc2VkIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnNcbiAqIDIuIFN0ZXAgZXZlbnRzIGFuZCB3YWl0IGV2ZW50cyBhcmUgY3JlYXRlZCBpbiBwYXJhbGxlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3VzcGVuc2lvbih7XG4gIHN1c3BlbnNpb24sXG4gIHdvcmxkLFxuICBydW4sXG4gIHNwYW4sXG4gIHJlcXVlc3RJZCxcbiAgZXZlbnRMb2csXG4gIHJ1blJlYWR5QmFycmllcixcbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgc3RlcERpc3BhdGNoLFxuICBvd25lck1lc3NhZ2VJZCxcbiAgYWxsb3dEZWZlcnJlZEJhdGNoV29yayxcbn06IFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zKTogUHJvbWlzZTxTdXNwZW5zaW9uSGFuZGxlclJlc3VsdD4ge1xuICBjb25zdCBydW5JZCA9IHJ1bi5ydW5JZDtcblxuICAvLyBUdXJibyBtb2RlOiBob2xkIGV2ZXJ5IHdvcmxkIHdyaXRlIGJlbG93IHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgKnNldHRsZWQqLCBzbyB3ZSBuZXZlciB3cml0ZSBhIHN0ZXAvaG9vay93YWl0IGV2ZW50IGZvciBhXG4gIC8vIHJ1biB0aGF0IGRvZXMgbm90IGV4aXN0IHlldC4gQSBuby1vcCBvdXRzaWRlIHR1cmJvIChiYXJyaWVyIHVuZGVmaW5lZCkgYW5kXG4gIC8vIG9uIHRoZSBwdXJlIGlubGluZSBob3QgcGF0aCwgd2hpY2ggZGVmZXJzIGFsbCBzdGVwcyBhbmQgd3JpdGVzIG5vdGhpbmcuXG4gIC8vIEF3YWl0aW5nIHRoZSBzYW1lICh1c3VhbGx5IGFscmVhZHktc2V0dGxlZCkgcHJvbWlzZSBtb3JlIHRoYW4gb25jZSBpcyBjaGVhcC5cbiAgLy8gQSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHlcbiAgLy8gZmFpbGVkIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBzdWJzZXF1ZW50IHdyaXRlIHN1cmZhY2VzIHRoZSByZWFsXG4gIC8vIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMuXG4gIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBd2FpdCBldmVyeSBvcGVyYXRpb24gaW4gYSBzdXNwZW5zaW9uIHBoYXNlIGJlZm9yZSBsZXR0aW5nIGEgZmFpbHVyZVxuICAgKiBlc2NhcGUsIHByZWZlcnJpbmcgYSBzdGFsZS1zbmFwc2hvdCAoNDEyKSByZWplY3Rpb24gd2hlbiBvbmUgb2NjdXJyZWQuXG4gICAqXG4gICAqIGBQcm9taXNlLmFsbGAgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvcGVyYXRpb24gZG9lcyBhbmQgbGVhdmVzIGl0cyBzaWJsaW5nc1xuICAgKiBpbiBmbGlnaHQuIFRoYXQgbWF0dGVycyBmb3IgYSA0MTI6IHRoZSBjYWxsZXIgcmVhY3RzIGJ5IHJlbG9hZGluZyB0aGUgZXZlbnRcbiAgICogbG9nIGFuZCByZXN0YXJ0aW5nIHRoZSByZXBsYXksIHNvIGEgc2libGluZyBjcmVhdGUgdGhhdCBsYW5kcyBhZnRlciB0aGVcbiAgICogcmVqZWN0aW9uIGVzY2FwZWQgY29tbWl0cyBhbiBldmVudCB3aG9zZSBjb3JyZWxhdGlvbiBpZCBjYW1lIGZyb20gdGhlXG4gICAqIGFiYW5kb25lZCByZXBsYXkncyBzZWVkZWQgc2VxdWVuY2UgKGFuIGV2ZW50IHRoZSBmcmVzaCByZXBsYXkgbmV2ZXJcbiAgICogcHJvZHVjZXMpLCBhbmQgaXQgcmFjZXMgdGhlIHJlc3RhcnQncyByZWxvYWQgd2hpbGUgZG9pbmcgc28uIFNldHRsaW5nIGZpcnN0XG4gICAqIG1ha2VzIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgZmluYWwgYmVmb3JlIHRoZSBjYWxsZXIgYWN0cyBvbiB0aGUgZmFpbHVyZS5cbiAgICogSXQgbWlycm9ycyB0aGUgcnVudGltZSdzIGlubGluZSBzdGVwIGNsYWltLCB3aGljaCBzZXR0bGVzIHRoZSBpbi1mbGlnaHRcbiAgICogc3RlcCBleGVjdXRpb25zIGJlZm9yZSBlc2NhbGF0aW5nIGEgNDEyLlxuICAgKlxuICAgKiBBIDQxMiBpcyBwcmVmZXJyZWQgb3ZlciBhbnkgb3RoZXIgcmVqZWN0aW9uIGluIHRoZSBzYW1lIHBoYXNlIGJlY2F1c2UgaXRcbiAgICogaGFzIGEgZGVmaW5lZCwgY2hlYXAgcmVjb3ZlcnkgKHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZykgd2hpbGUgdGhlXG4gICAqIG90aGVycyBkbyBub3QuIEEgZGV0ZXJtaW5pc3RpYyBmYWlsdXJlIHN1Y2ggYXMgYW4gYXR0cmlidXRlLXZhbGlkYXRpb25cbiAgICogYEZhdGFsRXJyb3JgIHJlY3VycyBvbiB0aGUgcmVzdGFydCBhbmQgZmFpbHMgdGhlIHJ1biB0aGVuLCBhdCB0aGUgY29zdCBvZlxuICAgKiBvbmUgZXh0cmEgcmVwbGF5LlxuICAgKi9cbiAgY29uc3Qgc2V0dGxlUGhhc2UgPSBhc3luYyAob3BzOiBQcm9taXNlPHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZWFzb25zID0gKGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChvcHMpKVxuICAgICAgLmZpbHRlcigocik6IHIgaXMgUHJvbWlzZVJlamVjdGVkUmVzdWx0ID0+IHIuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICAgLm1hcCgocikgPT4gci5yZWFzb24pO1xuICAgIGlmIChyZWFzb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRocm93IHJlYXNvbnMuZmluZCgocikgPT4gUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMocikpID8/IHJlYXNvbnNbMF07XG4gIH07XG5cbiAgLy8gRXZlcnkgc3VzcGVuc2lvbiB3cml0ZSBjYXJyaWVzIHJlcGxheS1yZWNvdmVyeSB0ZWxlbWV0cnkgb24gdGhlIGZpcnN0IG9uZVxuICAvLyB0aGF0IGNvbW1pdHMgYWZ0ZXIgcmVwbGF5IHJlY292ZXJlZC4gQWxsIHN1c3BlbnNpb24gZXZlbnRzIGFyZVxuICAvLyBub24tcnVuX2NyZWF0ZWQgZXZlbnRzIG9uIHRoaXMgcnVuJ3MgYHJ1bklkYC5cbiAgY29uc3QgcmVwb3J0ZXIgPSByZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgY29uc3QgY3JlYXRlRXZlbnQgPSAoZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LCBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtcykgPT5cbiAgICByZXBvcnRlci53aXRoRXZlbnRDcmVhdGUocGFyYW1zLCAocCkgPT5cbiAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgKTtcbiAgLy8gQWRkcyB0aGUgb3B0aW1pc3RpYy1jb25jdXJyZW5jeSBndWFyZCB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgYSBsb2FkZWRcbiAgLy8gZXZlbnQgbG9nOyB3aXRob3V0IG9uZSBpdCBjcmVhdGVzIGRpcmVjdGx5IChjYWxsZXJzIHdpdGggbm8gcmVwbGF5XG4gIC8vIHNuYXBzaG90LCBlLmcuIHRlc3RzKS4gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLFxuICAvLyB3aGljaCByZXN0YXJ0cyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nLiBJdCBpcyBub3QgcmV0cmllZCBoZXJlLFxuICAvLyBiZWNhdXNlIHRoZSBldmVudCdzIGNvcnJlbGF0aW9uIGlkIHdhcyBtaW50ZWQgYnkgKnRoaXMqIHJlcGxheSdzIHNlZWRlZFxuICAvLyBzZXF1ZW5jZSwgc28gcmUtY29tbWl0dGluZyBpdCBhZ2FpbnN0IGEgY29ycmVjdGVkIGxvZyB3b3VsZCBwZXJzaXN0IGFuXG4gIC8vIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IHByb2R1Y2VzLlxuICBsZXQgcmVwb3J0ZWRFdmVudHMgPSAwO1xuICAvLyBXcml0ZXMgdGhpcyBzdXNwZW5zaW9uIGlzc3VlZCwgYW5kIHdoZXRoZXIgb25lIG9mIHRoZW0gaGFuZGVkIGJhY2sgYVxuICAvLyBjb21wbGV0ZSBpbmxpbmUgZGVsdGEgdGhhdCB3YXMgZm9sZGVkIGludG8gdGhlIGNhbGxlcidzIGxvZy4gVG9nZXRoZXIgdGhleVxuICAvLyBhbnN3ZXIgYGV2ZW50TG9nQ2FycmllZEZvcndhcmRgOiB0aGUgZGVsdGEgY292ZXJzIHRoZSBsb2cgdXAgdG8gdGhlIHdyaXRlXG4gIC8vIHRoYXQgcmV0dXJuZWQgaXQsIHNvIGl0IGFjY291bnRzIGZvciBldmVyeSBldmVudCB0aGlzIHN1c3BlbnNpb24gY29tbWl0dGVkXG4gIC8vIG9ubHkgaWYgdGhhdCB3cml0ZSB3YXMgdGhlIG9ubHkgb25lLlxuICBsZXQgZ3VhcmRlZFdyaXRlcyA9IDA7XG4gIGxldCBkZWx0YUFic29yYmVkID0gZmFsc2U7XG4gIGNvbnN0IGNyZWF0ZUd1YXJkZWQ6IEV2ZW50Q3JlYXRvciA9IGFzeW5jIChkYXRhLCBwYXJhbXMpID0+IHtcbiAgICBndWFyZGVkV3JpdGVzKys7XG4gICAgaWYgKCFldmVudExvZykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50KGRhdGEsIHBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGV2ZW50TG9nO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KGRhdGEsIHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIC4uLnNsb3RTbmFwc2hvdFBhcmFtcyhsb2cuZXZlbnRzKSxcbiAgICB9KTtcbiAgICAvLyBBbiBpbmxpbmUgZGVsdGEgdGhpcyBjYWxsIGFza2VkIGZvciAoYHNpbmNlQ3Vyc29yYCkgaXMgZXZlcnl0aGluZyB0aGVcbiAgICAvLyBsb2cgZ2FpbmVkIHNpbmNlIHRoYXQgY3Vyc29yLCB0aGlzIHdyaXRlIGluY2x1ZGVkLCBzbyBpdCBpcyBmb2xkZWQgb250b1xuICAgIC8vIHRoZSB0YWlsIGFuZCBjYXJyaWVzIHRoZSBjdXJzb3Igd2l0aCBpdCDigJQgdW5saWtlIGEgc2tpcHBlZC1zbG90IHJlcG9ydCxcbiAgICAvLyB3aGljaCBpcyBhIHdpbmRvdyBzdHJpY3RseSBiZWxvdyB0aGUgd3JpdGUgYW5kIGhhcyB0byBiZSBzb3J0ZWQgYmFja1xuICAgIC8vIGludG8gcGxhY2UuIEEgV29ybGQgcmV0dXJucyBvbmUgb3IgdGhlIG90aGVyLCBuZXZlciBib3RoICh0aGUgZGVsdGEgaXMgYVxuICAgIC8vIHN0cmljdCBzdXBlcnNldCksIHNvIHRoZSB0d28gYXJlIGhhbmRsZWQgYXBhcnQgcmF0aGVyIHRoYW4gbWVyZ2VkLlxuICAgIC8vXG4gICAgLy8gRGVjbGluaW5nIGlzIGFsd2F5cyBzYWZlIOKAlCBhbiB1bmFic29yYmVkIGRlbHRhIGlzIG9uZSB0aGUgbmV4dCByZWFkXG4gICAgLy8gcmV0dXJucyDigJQgc28gdGhlIGd1YXJkcyBtYXRjaCB0aGUgcmVwbGF5IGxvb3AncyBgYWJzb3JiQ3JlYXRlRGVsdGFgOiBhXG4gICAgLy8gdHJ1bmNhdGVkIHBhZ2UgKGBoYXNNb3JlYCkgaXMgZHJvcHBlZCB3aG9sZSByYXRoZXIgdGhhbiBhZHZhbmNpbmcgdGhlXG4gICAgLy8gY3Vyc29yIHBhc3QgZXZlbnRzIGl0IGRpZCBub3QgY2FycnksIGFuZCB0aGUgbG9nIG11c3Qgc3RpbGwgYmUgd2hlcmUgdGhlXG4gICAgLy8gcmVxdWVzdCB3YXMgY29tcHV0ZWQgZnJvbSwgc2luY2UgYXBwZW5kaW5nIGRvZXMgbm90IHJlLXNvcnQuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXM/LnNpbmNlQ3Vyc29yID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKFxuICAgICAgICBsb2cuY3Vyc29yID09PSBwYXJhbXMuc2luY2VDdXJzb3IgJiZcbiAgICAgICAgcmVzdWx0LmV2ZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHJlc3VsdC5oYXNNb3JlICE9PSB0cnVlXG4gICAgICApIHtcbiAgICAgICAgYXBwZW5kRXZlbnRMb2cobG9nLCB7IGV2ZW50czogcmVzdWx0LmV2ZW50cywgY3Vyc29yOiByZXN1bHQuY3Vyc29yIH0pO1xuICAgICAgICBkZWx0YUFic29yYmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEJ1bXAtYW5kLXJlcG9ydDogdGhlIHdyaXRlIGxhbmRlZCBhYm92ZSB0aGUgc2xvdCBpdCBhc2tlZCBmb3IsIHNvIHRoZVxuICAgIC8vIHJlcG9ydCBob2xkcyB0aGUgZXZlbnRzIGl0IHdhcyBkZWNpZGVkIHdpdGhvdXQuIEFic29yYmluZyBoZXJlIHJhdGhlclxuICAgIC8vIHRoYW4gYXQgZWFjaCBjYWxsIHNpdGUgbWVhbnMgdGhlIHJlc3Qgb2YgdGhpcyBwaGFzZSdzIHdyaXRlcyAod2hpY2ggcmVhZFxuICAgIC8vIHRoZSBzYW1lIGFycmF5IHRvIGJ1aWxkIHRoZWlyIG93biBzbmFwc2hvdCkgYXNrIGZvciBhIHNsb3QgYWJvdmUgdGhlbSxcbiAgICAvLyBhbmQgdGhlIHJlcGxheSB0aGF0IHJlc3VtZXMgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAgICBjb25zdCByZXBvcnQgPSBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChsb2cuZXZlbnRzLCByZXN1bHQpO1xuICAgIHJlcG9ydGVkRXZlbnRzICs9IHJlcG9ydC5hZGRlZDtcbiAgICBpZiAocmVwb3J0LnRydW5jYXRlZCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRHJvcHBlZCBhIHRydW5jYXRlZCBza2lwcGVkLXNsb3QgcmVwb3J0Jywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICBvZmZlcmVkOiByZXBvcnQub2ZmZXJlZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmVwb3J0LmFkZGVkID4gMCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiB3cml0ZSBza2lwcGVkIG9jY3VwaWVkIHNsb3RzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICByZXBvcnRlZDogcmVwb3J0LmFkZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIC8vIFNlcGFyYXRlIHF1ZXVlIGl0ZW1zIGJ5IHR5cGVcbiAgY29uc3Qgc3RlcEl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3N0ZXAnXG4gICk7XG4gIGNvbnN0IGFsbEhvb2tJdGVtcyA9IHN1c3BlbnNpb24uaXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBIb29rSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdob29rJ1xuICApO1xuICBjb25zdCB3YWl0SXRlbXMgPSBzdXNwZW5zaW9uLml0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnd2FpdCdcbiAgKTtcbiAgY29uc3QgYXR0cmlidXRlSXRlbXMgPSBzdXNwZW5zaW9uLml0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdhdHRyaWJ1dGUnXG4gICk7XG5cbiAgY29uc3QgaG9va3NOZWVkaW5nQ3JlYXRpb24gPSBhbGxIb29rSXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiAhaXRlbS5oYXNDcmVhdGVkRXZlbnRcbiAgKTtcblxuICAvLyBHcm91cCBob29rIGl0ZW1zIHRoYXQgbmVlZCB3b3JrIGJ5IHRva2VuLCBwcmVzZXJ2aW5nIHF1ZXVlLWluc2VydGlvblxuICAvLyAod29ya2Zsb3cgY29kZSkgb3JkZXIgd2l0aGluIGVhY2ggdG9rZW4uIE9wZXJhdGlvbnMgb24gb25lIHRva2VuIG11c3RcbiAgLy8gYXBwbHkgaW4gY29kZSBvcmRlcjogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIHJlbGVhc2VzIHRoZSB0b2tlblxuICAvLyBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpcyB2YWxpZGF0ZWQgKG90aGVyd2lzZSB0aGVcbiAgLy8gbmV3IGhvb2sgcmVjb3JkcyBhIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duXG4gIC8vIGRpc3Bvc2VkIGhvb2spLCB3aGlsZSBhIGhvb2sgY3JlYXRlZCBhbmQgZGlzcG9zZWQgd2l0aGluIHRoZSBzYW1lXG4gIC8vIHN1c3BlbnNpb24gaXMgc3RpbGwgY3JlYXRlZCBiZWZvcmUgaXQgaXMgZGlzcG9zZWQuIERpZmZlcmVudCB0b2tlbnNcbiAgLy8gaGF2ZSBubyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIGFyZSBwcm9jZXNzZWQgaW4gcGFyYWxsZWwuXG4gIGNvbnN0IGhvb2tJdGVtc0J5VG9rZW4gPSBuZXcgTWFwPHN0cmluZywgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1bXT4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFsbEhvb2tJdGVtcykge1xuICAgIGlmIChpdGVtLmhhc0NyZWF0ZWRFdmVudCAmJiAhaXRlbS5kaXNwb3NlZCkge1xuICAgICAgY29udGludWU7IC8vIGFscmVhZHkgY29tbWl0dGVkIGFuZCBzdGlsbCBsaXZlOiBub3RoaW5nIHRvIGRvXG4gICAgfVxuICAgIGNvbnN0IGdyb3VwID0gaG9va0l0ZW1zQnlUb2tlbi5nZXQoaXRlbS50b2tlbik7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rSXRlbXNCeVRva2VuLnNldChpdGVtLnRva2VuLCBbaXRlbV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuXG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gR2F0ZSBwYXlsb2FkIGNvbXByZXNzaW9uIG9uIHRoZSBydW4ncyBzcGVjVmVyc2lvbi5cbiAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuXG4gIGxldCBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50ID0gMDtcbiAgY29uc3Qgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXSA9IFtdO1xuICBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVJbnB1dChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBjb250ZXh0OiBQaWNrPFN1c3BlbnNpb25TZXJpYWxpemF0aW9uQmxvY2tlciwgJ3NvdXJjZScgfCAnY29ycmVsYXRpb25JZCc+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZERhdGE+IHtcbiAgICBjb25zdCBzdGF0czogR3Vlc3RDb2RlU3RhdHMgPSB7IGV4ZWN1dGlvbnM6IFtdIH07XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBzdXNwZW5zaW9uLmdsb2JhbFRoaXMsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjb21wcmVzc2lvbixcbiAgICAgICAgc3RhdHNcbiAgICAgICkpIGFzIFNlcmlhbGl6ZWREYXRhO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50ICs9XG4gICAgICAgIHN0YXRzLnRvdGFsRXhlY3V0aW9ucyA/PyBzdGF0cy5leGVjdXRpb25zLmxlbmd0aDtcbiAgICAgIHNlcmlhbGl6YXRpb25CbG9ja2Vycy5wdXNoKFxuICAgICAgICAuLi5zdGF0cy5leGVjdXRpb25zXG4gICAgICAgICAgLnNsaWNlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIEdVRVNUX0NPREVfRVhFQ1VUSU9OX1NBTVBMRV9MSU1JVCAtIHNlcmlhbGl6YXRpb25CbG9ja2Vycy5sZW5ndGhcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoZXhlY3V0aW9uKSA9PiAoeyAuLi5jb250ZXh0LCAuLi5leGVjdXRpb24gfSkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKFxuICAgIHF1ZXVlSXRlbTogSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaG9va0Rpc3Bvc2VkRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnIGFzIGNvbnN0LFxuICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICBldmVudERhdGE6IHtcbiAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChob29rRGlzcG9zZWRFdmVudCwgeyByZXF1ZXN0SWQgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIC8vIEhvb2sgd2FzIGFscmVhZHkgZGlzcG9zZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24sIHNhZmUgdG8gc2tpcFxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ0hvb2sgYWxyZWFkeSBkaXNwb3NlZCwgc2tpcHBpbmcgZHVwbGljYXRlIGRpc3Bvc2FsJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vayBkaXNwb3NhbCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAvLyBIb29rIG1heSBoYXZlIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvciBuZXZlciBjcmVhdGVkXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnSG9vayBub3QgZm91bmQgZm9yIGRpc3Bvc2FsLCBjb250aW51aW5nJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGhvb2tzIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnMuXG4gIC8vIFRyYWNrIGFueSBob29rIGNvbmZsaWN0cyB0aGF0IG9jY3VyIOKAlCB0aGVzZSBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBzb1xuICAvLyBpdCBjYW4gYWR2YW5jZSB0aGUgd29ya2Zsb3cgb3ZlciB0aGUgY29tbWl0dGVkIGBob29rX2NvbmZsaWN0YCBiZWZvcmVcbiAgLy8gYW55dGhpbmcgZWxzZSB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGVkIHJ1bnMuXG4gIGNvbnN0IGhvb2tDb25mbGljdENvcnJlbGF0aW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaG9va0NyZWF0aW9uTXMgPSAwO1xuXG4gIC8vIEFzayB0aGUgaG9vayBjcmVhdGUgZm9yIHRoZSBldmVudC1sb2cgZGVsdGEgc2luY2UgdGhlIGN1cnNvciB0aGUgY2FsbGVyJ3NcbiAgLy8gbG9nIHdhcyByZWFkIGF0LiBUaGUgaG9vaydzIGF3YWl0ZXJzIGFyZSBzZXR0bGVkIGJ5IHRoZSBldmVudCB0aGlzIHdyaXRlXG4gIC8vIGNvbW1pdHMgYW5kIGJ5IG5vdGhpbmcgZWxzZSDigJQgYSBgaG9va19jcmVhdGVkYCBmb3IgYSBjbGVhbiByZWdpc3RyYXRpb24sXG4gIC8vIGEgYGhvb2tfY29uZmxpY3RgIHdoZW4gdGhlIHRva2VuIHdhcyBhbHJlYWR5IGNsYWltZWQg4oCUIHNvIHRoZSBjYWxsZXIgY2FuXG4gIC8vIGNvbnRpbnVlIHRoZSB3b3JrZmxvdyBpbiBpdHMgb3duIHByb2Nlc3Mgb24gZWl0aGVyIG91dGNvbWUsIGJ1dCBvbmx5IG92ZXJcbiAgLy8gYSBsb2cgdGhhdCBob2xkcyB0aGF0IGV2ZW50LCBhbmQgdGhpcyB3cml0ZSBpcyB0aGUgb25lIHJlcXVlc3QgdGhhdCBjYW5cbiAgLy8gaGFuZCBpdCBiYWNrIHRvZ2V0aGVyIHdpdGggYW55dGhpbmcgYW5vdGhlciB3cml0ZXIgbGFuZGVkIGluIHRoZSBtZWFudGltZS5cbiAgLy8gT3B0aW9uYWwgYnkgY29udHJhY3Q6IGEgV29ybGQgdGhhdCBpZ25vcmVzIGBzaW5jZUN1cnNvcmAgcmV0dXJucyBubyBkZWx0YVxuICAvLyBhbmQgdGhlIGNhbGxlciByZWFkcyBpbnN0ZWFkLlxuICAvL1xuICAvLyBBc2tlZCBmb3Igb24gdGhlIHNpbmdsZS1ob29rIHN1c3BlbnNpb24gb25seS4gVHdvIGNyZWF0ZXMgaXNzdWVkIGZyb20gb25lXG4gIC8vIHNuYXBzaG90IGVhY2ggZGlmZiBhZ2FpbnN0IHRoZSBzYW1lIGN1cnNvciwgYW5kIG9ubHkgdGhlIGZpcnN0IGRlbHRhIGJhY2tcbiAgLy8gY2FuIGJlIGZvbGRlZCBpbiAodGhlIGN1cnNvciBtb3ZlcyB3aXRoIGl0KSwgc28gdGhlIGxvZyB3b3VsZCBlbmQgdXAgc2hvcnRcbiAgLy8gb2YgdGhlIG90aGVyJ3MgZXZlbnQgd2l0aCBub3RoaW5nIHRvIHNheSBzby5cbiAgY29uc3QgaG9va0RlbHRhQ3Vyc29yID1cbiAgICBob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGV2ZW50TG9nPy5jdXJzb3IgPT09ICdzdHJpbmcnXG4gICAgICA/IGV2ZW50TG9nLmN1cnNvclxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGhvb2tJdGVtc0J5VG9rZW4uc2l6ZSA+IDApIHtcbiAgICBjb25zdCBob29rUGhhc2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICBhd2FpdCBzZXR0bGVQaGFzZShcbiAgICAgIFsuLi5ob29rSXRlbXNCeVRva2VuLnZhbHVlcygpXS5tYXAoYXN5bmMgKGl0ZW1zKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgbGV0IGNyZWF0aW9uQ29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBob29rTWV0YWRhdGEgPVxuICAgICAgICAgICAgICB0eXBlb2YgcXVldWVJdGVtLm1ldGFkYXRhID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiBhd2FpdCBkZWh5ZHJhdGVJbnB1dChxdWV1ZUl0ZW0ubWV0YWRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaG9va19tZXRhZGF0YScsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBob29rRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgICAgICAgICAgICB0b2tlblJldGVudGlvblVudGlsOiBxdWV1ZUl0ZW0udG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogaG9va01ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGlzV2ViaG9vazogcXVldWVJdGVtLmlzV2ViaG9vayA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICAuLi4ocXVldWVJdGVtLmlzU3lzdGVtICYmIHsgaXNTeXN0ZW06IHRydWUgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSG9va0V2ZW50KHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGhvb2tFdmVudCxcbiAgICAgICAgICAgICAgcXVldWVJdGVtLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpbmNlQ3Vyc29yOiBob29rRGVsdGFDdXJzb3IsXG4gICAgICAgICAgICAgIGNyZWF0ZUV2ZW50OiBjcmVhdGVHdWFyZGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICBob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkcy5wdXNoKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzLnB1c2gocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRpb25Db25mbGljdGVkID0gcmVzdWx0Lmhhc0hvb2tDb25mbGljdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEaXNwb3NlIGFmdGVyIGNyZWF0aW9uIGZvciBob29rcyBib3JuIGFuZCBkaXNwb3NlZCB3aXRoaW4gdGhpc1xuICAgICAgICAgIC8vIGJhdGNoLiBBIGhvb2sgd2hvc2UgY3JlYXRpb24gY29uZmxpY3RlZCB3YXMgbmV2ZXIgY3JlYXRlZCwgc29cbiAgICAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3Bvc2UuXG4gICAgICAgICAgaWYgKHF1ZXVlSXRlbS5kaXNwb3NlZCAmJiAhY3JlYXRpb25Db25mbGljdGVkKSB7XG4gICAgICAgICAgICBhd2FpdCBkaXNwb3NlSG9vayhxdWV1ZUl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIGhvb2tDcmVhdGlvbk1zID0gRGF0ZS5ub3coKSAtIGhvb2tQaGFzZVN0YXJ0O1xuICB9XG5cbiAgLy8gUHJvY2VzcyBhYm9ydCByZXF1ZXN0czogcmVzdW1lIHRoZSBob29rIHdpdGggYWJvcnQgcGF5bG9hZCBhbmQgd3JpdGUgc3RyZWFtIHBhY2tldFxuICBjb25zdCBob29rc05lZWRpbmdBYm9ydCA9IGFsbEhvb2tJdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pID0+IGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgJiYgIWl0ZW0uZGlzcG9zZWRcbiAgKTtcblxuICBpZiAoaG9va3NOZWVkaW5nQWJvcnQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgYXdhaXQgc2V0dGxlUGhhc2UoXG4gICAgICBob29rc05lZWRpbmdBYm9ydC5tYXAoYXN5bmMgKHF1ZXVlSXRlbSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCBmb3Igc3RvcmFnZVxuICAgICAgICAgIGNvbnN0IGFib3J0UGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZUlucHV0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb246IHF1ZXVlSXRlbS5hYm9ydFJlYXNvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ2hvb2tfYWJvcnQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGhvb2tfcmVjZWl2ZWQgZXZlbnQgd2l0aCBhYm9ydCBwYXlsb2FkXG4gICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgIHBheWxvYWQ6IGFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBXcml0ZSBzdHJlYW0gY2FuY2VsbGF0aW9uIHBhY2tldCBmb3IgcmVhbC10aW1lIHN0ZXAgcHJvcGFnYXRpb24uXG4gICAgICAgICAgLy8gUmV1c2UgdGhlIHNhbWUgZGVoeWRyYXRlZCBwYXlsb2FkIGFzIHRoZSBob29rIGV2ZW50IHNvIHRoZSByZWFzb25cbiAgICAgICAgICAvLyByb3VuZC10cmlwcyB0aHJvdWdoIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCAvIGBoeWRyYXRlU3RlcEFyZ3VtZW50c2BcbiAgICAgICAgICAvLyAoaGFuZGxlcyBET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGVuY3J5cHRpb24sIGV0Yy4pIGluc3RlYWQgb2ZcbiAgICAgICAgICAvLyBiYXJlIEpTT04uc3RyaW5naWZ5IHdoaWNoIGxvc2VzIHR5cGUgaW5mb3JtYXRpb24gYW5kIGRyb3BzIHVuZGVmaW5lZC5cbiAgICAgICAgICAvLyBzdHJlYW1OYW1lIGlzIHNldCBvbiB0aGUgcXVldWUgaXRlbSBhdCBjb250cm9sbGVyIGNvbnN0cnVjdGlvbiB0aW1lXG4gICAgICAgICAgLy8gKHNlZSB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzKS5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4ocXVldWVJdGVtLnRva2VuKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUoXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lLFxuICAgICAgICAgICAgICBhYm9ydFBheWxvYWQgYXMgVWludDhBcnJheVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlOiBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlIGZhbGxiYWNrXG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAnRmFpbGVkIHRvIHdyaXRlIGFib3J0IHN0cmVhbSBwYWNrZXQsIGhvb2sgZXZlbnQgd2lsbCBwcm92aWRlIGZhbGxiYWNrJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBhYm9ydCcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHN0ZXAgZXZlbnRzIGZvciBzdGVwcyB0aGF0IGRvbid0IGhhdmUgdGhlbSB5ZXQuXG4gIC8vIFVubGlrZSBWMSwgd2UgZG8gTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXMgZnJvbSBoZXJlOiB0aGUgY2FsbGVyXG4gIC8vIGRlY2lkZXMgd2hpY2ggc3RlcHMgdG8gZXhlY3V0ZSBpbmxpbmUgdnMuIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gIC8vIFdhaXQgZXZlbnRzIGFyZSBhbHNvIGNyZWF0ZWQgaW4gcGFyYWxsZWwgYmVsb3cuXG4gIGNvbnN0IHN0ZXBzTmVlZGluZ0NyZWF0aW9uID0gbmV3IFNldChcbiAgICBzdGVwSXRlbXNcbiAgICAgIC5maWx0ZXIoKHF1ZXVlSXRlbSkgPT4gIXF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQpXG4gICAgICAubWFwKChxdWV1ZUl0ZW0pID0+IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKVxuICApO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBmb3Igd2hpY2ggVEhJUyBzdXNwZW5zaW9uIGNhbGwgYWN0dWFsbHkgd3JvdGUgdGhlXG4gIC8vIHN0ZXBfY3JlYXRlZCBldmVudC4gUG9wdWxhdGVkIGJ5IHRoZSBvcHMgYmVsb3cgYWZ0ZXIgYSBzdWNjZXNzZnVsXG4gIC8vIGV2ZW50cy5jcmVhdGUsIHVzZWQgYnkgdGhlIGNhbGxlciB0byBjbGFpbSBvd25lcnNoaXAgYW5kIGF2b2lkXG4gIC8vIHJhY2luZyB3aXRoIGNvbmN1cnJlbnQgaGFuZGxlcnMgb24gc3RlcCBleGVjdXRpb24uXG4gIGNvbnN0IGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBDb3JyZWxhdGlvbiBJRHMgb2Ygc3RlcHMgZmluYWxpemVkIGFzIGZhaWxlZCBiZWNhdXNlIHRoZWlyIGFyZ3VtZW50c1xuICAvLyByZWZ1c2VkIHRvIHNlcmlhbGl6ZTogc2VlIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwIGJlbG93LlxuICBjb25zdCBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQSBzdGVwIHdob3NlIGFyZ3VtZW50cyBmYWlsIHRvIHNlcmlhbGl6ZSBpcyBkZXRlcm1pbmlzdGljOiBldmVyeSByZXBsYXlcbiAgICogcmUtZGVyaXZlcyB0aGUgc2FtZSB1bnNlcmlhbGl6YWJsZSB2YWx1ZSwgc28gcmVkZWxpdmVyaW5nIHRoZVxuICAgKiBvcmNoZXN0cmF0b3IgbWVzc2FnZSBjYW4gbmV2ZXIgc3VjY2VlZC4gSW5zdGVhZCBvZiByZWplY3RpbmcgdGhlIHdob2xlXG4gICAqIHN1c3BlbnNpb24gKHdoaWNoIGZhaWxzIHRoZSBydW4gZnJvbSB0aGUgb3V0c2lkZSwgd2hlcmUgbm8gdXNlciBjb2RlIGNhblxuICAgKiBvYnNlcnZlIGl0KSwgdHJlYXQgaXQgZXhhY3RseSBsaWtlIGEgc3RlcC1ib2R5IGZhaWx1cmU6IHdyaXRlXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdpdGggYSBwbGFjZWhvbGRlciBpbnB1dCAoZXZlcnkgV29ybGQgcmVxdWlyZXMgdGhlIHN0ZXBcbiAgICogZW50aXR5IHRvIGV4aXN0IGJlZm9yZSBhIHRlcm1pbmFsIHN0ZXAgZXZlbnQsIGFuZCB0aGUgcmVhbCBpbnB1dCBpc1xuICAgKiBwcmVjaXNlbHkgd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZSkgZm9sbG93ZWQgYnkgYHN0ZXBfZmFpbGVkYCBjYXJyeWluZ1xuICAgKiB0aGUgU2VyaWFsaXphdGlvbkVycm9yLiBUaGUgbmV4dCByZXBsYXkgcmVqZWN0cyB0aGUgc3RlcCdzIHByb21pc2Ugd2l0aFxuICAgKiBpdCwgc28gYSB0cnkvY2F0Y2ggYXJvdW5kIHRoZSBzdGVwIGNhbGwgb2JzZXJ2ZXMgdGhlIGVycm9yOyB1bmNhdWdodCwgaXRcbiAgICogcHJvcGFnYXRlcyBvdXQgb2YgdGhlIHdvcmtmbG93IGJvZHkgYW5kIGZhaWxzIHRoZSBydW4gYXMgYSBVU0VSX0VSUk9SLFxuICAgKiB3aXRob3V0IGJ1cm5pbmcgcXVldWUgcmVkZWxpdmVyaWVzIGVpdGhlciB3YXkuXG4gICAqL1xuICBjb25zdCBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcCA9IGFzeW5jIChcbiAgICBxdWV1ZUl0ZW06IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICAgIGVycm9yOiBTZXJpYWxpemF0aW9uRXJyb3JcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgJ1N0ZXAgYXJndW1lbnRzIGZhaWxlZCB0byBzZXJpYWxpemU7IGZhaWxpbmcgdGhlIHN0ZXAgc28gdGhlICcgK1xuICAgICAgICAnd29ya2Zsb3cgY2FuIG9ic2VydmUgdGhlIGVycm9yJyxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH1cbiAgICApO1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgLy8gTWFya2VyIHBsYWNlaG9sZGVyIChub3QgZW1wdHkgYXJncyk6IGJ5dGUtaWRlbnRpY2FsLXRvLXplcm8tYXJncyB3b3VsZFxuICAgIC8vIG1ha2UgYHdvcmtmbG93IGluc3BlY3Qgc3RlcHNgIHNob3cgXCJubyBhcmd1bWVudHNcIiBmb3IgdGhlIG9uZSBzdGVwXG4gICAgLy8gd2hvc2UgZW50aXJlIHByb2JsZW0gd2FzIGl0cyBhcmd1bWVudHMuXG4gICAgY29uc3QgcGxhY2Vob2xkZXJJbnB1dCA9IChhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgdW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlcigpLFxuICAgICAgcnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgZmFsc2UsXG4gICAgICBjb21wcmVzc2lvblxuICAgICkpIGFzIFNlcmlhbGl6ZWREYXRhO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBsYWNlaG9sZGVySW5wdXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChjcmVhdGVFcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGNyZWF0ZUVycikpIHtcbiAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgYWxyZWFkeSBjcmVhdGVkIHRoZSBzdGVwOiB0aGUgZmFpbHVyZSBpc1xuICAgICAgICAvLyBkZXRlcm1pbmlzdGljLCBzbyBpdCBpcyByYWNpbmcgdG93YXJkIHRoZSBzYW1lIHN0ZXBfZmFpbGVkIGJlbG93LlxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgbWVzc2FnZTogY3JlYXRlRXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoY3JlYXRlRXJyKSkge1xuICAgICAgICAvLyBSdW4gYWxyZWFkeSBmaW5pc2hlZDogbm90aGluZyB0byBvYnNlcnZlIHRoZSBmYWlsdXJlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjcmVhdGVFcnI7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgaXRzZWxmIGlzIGEgcGxhaW4gV29ya2Zsb3dFcnJvciAobmFtZSwgbWVzc2FnZSB3aXRoXG4gICAgICAgICAgICAvLyBmcmFtZWQgaGludCwgY2F1c2UgY2hhaW4pLCBzZXJpYWxpemFibGUgZXZlbiB0aG91Z2ggdGhlIHN0ZXBcbiAgICAgICAgICAgIC8vIGlucHV0IHdhcyBub3QuIEVycm9yIGRldGVjdGlvbiBpcyByZWFsbS1pbmRlcGVuZGVudFxuICAgICAgICAgICAgLy8gKHR5cGVzLmlzTmF0aXZlRXJyb3IpLCBzbyB0aGUgaG9zdC1jcmVhdGVkIGVycm9yIHNlcmlhbGl6ZXNcbiAgICAgICAgICAgIC8vIHRoZSBzYW1lIHVuZGVyIGVpdGhlciBnbG9iYWw7IHRoZSBWTSBnbG9iYWwgaXMgcGFzc2VkIGZvclxuICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgd2l0aCBldmVyeSBvdGhlciBkZWh5ZHJhdGlvbiBpbiB0aGlzIGZpbGUgYW5kIHNvXG4gICAgICAgICAgICAvLyBhbnkgVk0tcmVhbG0gdmFsdWVzIGd1ZXN0IGNvZGUgdGhyZXcgaW50byB0aGUgY2F1c2UgY2hhaW5cbiAgICAgICAgICAgIC8vIChnZXR0ZXJzL3Byb3hpZXMgZXhlY3V0ZWQgZHVyaW5nIHRoZSBmYWlsZWQgZGVoeWRyYXRpb24pIGFyZVxuICAgICAgICAgICAgLy8gZGV0ZWN0ZWQgYnkgdGhlIHJlYWxtLXNlbnNpdGl2ZSByZWR1Y2Vycy5cbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycikpIHtcbiAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRlcm1pbmFsIChhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSB0aGUgc2FtZVxuICAgICAgICAvLyBkZXRlcm1pbmlzdGljIGZhaWx1cmUpIG9yIHRoZSBydW4gYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIG9yIHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgIH1cbiAgICB9XG4gICAgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgLy8gUmVsZWFzZSB0aGUgaW5saW5lIHNsb3QgYm9va2tlZXBpbmc6IHRoZSBzdGVwIG5ldmVyIHJ1bnMsIHNvIGl0IG11c3RcbiAgICAvLyBub3QgYXBwZWFyIGluIHRoZSByZWJ1aWx0IGBsYXp5SW5saW5lU3RlcHNgLiAoSXRzIHNsb3QgaW4gdGhlIGZpcnN0LU5cbiAgICAvLyBzZWxlY3Rpb24gYW5kIGluIGBpbmxpbmVQYWlyRm9sZEVsaWdpYmxlYCdzIGFyaXRobWV0aWMgd2FzIGNvbnN1bWVkXG4gICAgLy8gYmVmb3JlIGRlaHlkcmF0aW9uIGNvdWxkIHJldmVhbCB0aGUgZmFpbHVyZSwgaW5oZXJlbnQgdG8gc2VsZWN0aW5nXG4gICAgLy8gYmVmb3JlIHNlcmlhbGl6aW5nLCBhbmQgYm91bmRlZCB0byBvbmUgd2FzdGVkIHNsb3Qgb24gYSBwYXNzIHRoYXRcbiAgICAvLyBlbmRzIGluIGEgZm9yY2VkIHJlcGxheSBhbnl3YXkuKVxuICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5kZWxldGUocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICB9O1xuXG4gIC8vIExhenkgaW5saW5lIHN0YXJ0OiBkZWZlciB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvciB1cCB0b1xuICAvLyBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgdGhlIGNhbGxlciB3aWxsIHJ1biBpbmxpbmUgKGluIHBhcmFsbGVsKS4gRWFjaFxuICAvLyBzdGVwIGlzIGNyZWF0ZWQgb24gdGhlIGZseSBieSB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCBleGVjdXRlU3RlcCBzZW5kc1xuICAvLyAoc2F2aW5nIGEgcm91bmQtdHJpcCBwZXIgc3RlcCkuIFdlIG5ldmVyIGRlZmVyIHdoZW4gYSBgaG9vay5nZXRDb25mbGljdCgpYFxuICAvLyBhd2FpdGVyIGlzIHByZXNlbnQsIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSBjYWxsZXIgZXhlY3V0ZXMgbm90aGluZyBpbmxpbmVcbiAgLy8gKGl0IGNvbnRpbnVlcyB0aGUgd29ya2Zsb3cgdG8gcmVzb2x2ZSB0aGUgYXdhaXRlciBpbnN0ZWFkKSwgc28gZGVmZXJyaW5nXG4gIC8vIHdvdWxkIGxlYXZlIHRoZSBzdGVwcyB1bmNyZWF0ZWQgYW5kIHVucXVldWVkLiBXZSBwaWNrIHRoZSBmaXJzdCBOIHVuY3JlYXRlZFxuICAvLyBzdGVwcyDigJQgbWF0Y2hpbmcgdGhlIGNhbGxlcidzIGlubGluZS1jYW5kaWRhdGUgc2VsZWN0aW9uIOKAlCBhbmQgZGVoeWRyYXRlXG4gIC8vIHRoZWlyIGlucHV0IGhlcmUgc28gZXhlY3V0ZVN0ZXAgY2FuIHNoaXAgaXQgYXMgdGhlIHN0ZXBfc3RhcnRlZCBwYXlsb2FkLlxuICBjb25zdCBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkcy5sZW5ndGggPT09IDBcbiAgICAgID8gc3RlcEl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gc3RlcHNOZWVkaW5nQ3JlYXRpb24uaGFzKGl0ZW0uY29ycmVsYXRpb25JZCkpXG4gICAgICAgICAgLnNsaWNlKDAsIGdldE1heElubGluZVN0ZXBzKCkpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jb3JyZWxhdGlvbklkKVxuICAgICAgOiBbXVxuICApO1xuICAvLyBDb2xsZWN0ZWQgYnkgY29ycmVsYXRpb25JZCBiZWNhdXNlIHRoZSBwZXItc3RlcCBvcHMgYmVsb3cgcnVuIGNvbmN1cnJlbnRseVxuICAvLyBhbmQgc2V0dGxlIG91dCBvZiBvcmRlci4gV2UgcmVidWlsZCB0aGUgYXJyYXkgaW4gZGV0ZXJtaW5pc3RpY1xuICAvLyBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYCBvcmRlciAodGhlIG9yZGVyZWQgc2xpY2UgYWJvdmUpIGFmdGVyIHRoZSBvcHNcbiAgLy8gc2V0dGxlLCBzbyB0aGUgaW5saW5lIGJhdGNoIG9yZGVyIGlzIHN0YWJsZSByZWdhcmRsZXNzIG9mIGRlaHlkcmF0aW9uIHRpbWluZy5cbiAgY29uc3QgbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZCA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydsYXp5SW5saW5lU3RlcHMnXVtudW1iZXJdXG4gID4oKTtcblxuICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBtZXNzYWdlIHdhcyBhbHJlYWR5XG4gIC8vIHB1Ymxpc2hlZCBieSB0aGUgcmVzaWxpZW50LWRpc3BhdGNoIG9wcyBiZWxvdyAoYWxvbmdzaWRlIHRoZSBzdGVwX2NyZWF0ZWRcbiAgLy8gd3JpdGUpLiBSZXBvcnRlZCB0byB0aGUgY2FsbGVyIHNvIGl0cyBkaXNwYXRjaCBwYXNzIHNraXBzIHRoZW0uXG4gIGNvbnN0IHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIGVsaWdpYmlsaXR5LCBzaGFyZWQgYnkgZXZlcnkgc3RlcCBvcCBiZWxvdyAodGhlXG4gIC8vIHBlci1zdGVwIGlucHV0LXNpemUgY2hlY2sgaXMgYXBwbGllZCBpbnNpZGUgdGhlIG9wKS4gQWxsIG11c3QgaG9sZDpcbiAgLy9cbiAgLy8gIC0gVGhlIGNhbGxlciBwcm92aWRlZCBhIGRpc3BhdGNoIHRhcmdldCAoYHN0ZXBEaXNwYXRjaGApOiB0ZXJtaW5hbFxuICAvLyAgICBkcmFpbnMgYW5kIG90aGVyIGNyZWF0ZS1vbmx5IGNhbGxlcnMgbmV2ZXIgcXVldWUuXG4gIC8vICAtIFRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgKGBXT1JLRkxPV19SRVNJTElFTlRfU1RFUF9ESVNQQVRDSGAgb3B0LWluKS5cbiAgLy8gICAgSXQgaXMgb2ZmIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgcHVibGlzaCByYWNlcyB0aGUgY3JlYXRlJ3MgdmVyZGljdCxcbiAgLy8gICAgYW5kIGEgY3JlYXRlIGNhbiBjb21lIGJhY2sgcmVmdXNlZDogYXMgYSBkdXBsaWNhdGUgdGhlIHJlcGxheSBzaG91bGRcbiAgLy8gICAgc3RvcCBwdXJzdWluZywgb3IgKG9uIGEgV29ybGQgdGhhdCB3b3VsZCByYXRoZXIgcmVmdXNlIGEgc3RhbGUgd3JpdGVcbiAgLy8gICAgdGhhbiByZXBvcnQgd2hhdCBpdCBtaXNzZWQpIGFzIGEgNDEyLiBFaXRoZXIgd2F5IHRoZSBxdWV1ZSBtZXNzYWdlXG4gIC8vICAgIGNhcnJ5aW5nIHRoZSBwYXlsb2FkIGlzIGFscmVhZHkgb3V0LCBhbmQgdGhlIGNvbnN1bWVyIGNhbiBtYXRlcmlhbGl6ZSBhXG4gIC8vICAgIHN0ZXAgd2hvc2UgY3JlYXRlIHdhcyByZWZ1c2VkLiBOb3RoaW5nIG9yZGVycyB0aGF0IHZlcmRpY3QgYmVmb3JlIHRoZVxuICAvLyAgICBjb25zdW1lcidzIHJlZGVsaXZlcnkgcmUtZW5zdXJlLCBzbyBubyBiYWNrZW5kLXNpZGUgcmV2b2NhdGlvblxuICAvLyAgICBib29ra2VlcGluZyBjYW4gY2xvc2UgdGhlIHdpbmRvdzogYSBiZXN0LWVmZm9ydCBtYXJrZXIgdGhhdCBmYWlscyBvcGVuXG4gIC8vICAgIGNhbm5vdCBjYXJyeSBhIGNvcnJlY3RuZXNzIHByb3BlcnR5LiBUaGUgc2VxdWVudGlhbCBwYXRoIGlzIHRoZSBvbmx5XG4gIC8vICAgIHRoaW5nIHRoYXQgZ2l2ZXMgdGhlIG1lc3NhZ2UgYSBoYXBwZW5zLWFmdGVyIGVkZ2Ugb3ZlciB0aGUgdmVyZGljdC5cbiAgLy8gIC0gVGhlIHJ1bidzIHF1ZXVlIHRyYW5zcG9ydCBwcmVzZXJ2ZXMgYmluYXJ5IHBheWxvYWRzIChDQk9SLFxuICAvLyAgICBzcGVjVmVyc2lvbiA+PSAzKTogYHN0ZXBJbnB1dC5pbnB1dGAgaXMgdGhlIHNlcmlhbGl6ZWQgKHBvc3NpYmx5XG4gIC8vICAgIGVuY3J5cHRlZCkgaW5wdXQgYnl0ZXMsIHdoaWNoIHRoZSBKU09OIHRyYW5zcG9ydCB3b3VsZCBtYW5nbGUuXG4gIGNvbnN0IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgPVxuICAgIHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcblxuICAvLyBCYXRjaGVkIGZhbi1vdXQ6IGZvbGQgdGhpcyBzdXNwZW5zaW9uJ3Mgc3RlcF9jcmVhdGVkICsgd2FpdF9jcmVhdGVkXG4gIC8vIHdyaXRlcyBpbnRvIG9uZSBgZXZlbnRzLmNyZWF0ZUJhdGNoYCBjYWxsIChvbmUgZHVyYWJsZSB3cml0ZSwgcGVyLWV2ZW50XG4gIC8vIG91dGNvbWVzKSBpbnN0ZWFkIG9mIG9uZSB3cml0ZSBwZXIgZXZlbnQuIEVuZ2FnZXMgb25seSBmb3IgYSBDTEVBTlxuICAvLyBmYW4tb3V0IChubyBhdHRyaWJ1dGUgd3JpdGVzLCBubyBob29rIHdyaXRlcywgbm8gcmVzaWxpZW50IGRpc3BhdGNoXG4gIC8vIHdob3NlIGNyZWF0ZXMgYXJlIGVhY2ggcGFpcmVkIHdpdGggYSBxdWV1ZSBwdWJsaXNoKSBvbiBhIFdvcmxkIHRoYXRcbiAgLy8gaW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgbWV0aG9kIGFuZCBhIHJ1biB3aG9zZSBldmVudHMgYXJlIHNsb3QtbnVtYmVyZWQuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgZ2F0ZSBrZWVwcyB0aGUgc2luZ2xlLWV2ZW50IHBhdGggYnl0ZS1mb3ItYnl0ZS5cbiAgY29uc3QgYmF0Y2hGYW5vdXRFbGlnaWJsZSA9XG4gICAgaXNCYXRjaFRyYW5zaXRpb25zRW5hYmxlZCgpICYmXG4gICAgdHlwZW9mIHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFkgJiZcbiAgICAhcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgIGFsbEhvb2tJdGVtcy5sZW5ndGggPT09IDAgJiZcbiAgICBhdHRyaWJ1dGVJdGVtcy5sZW5ndGggPT09IDA7XG4gIC8qKlxuICAgKiBUaGUgZm9sZCdzIGNvbGxlY3Rpb24sIGluIHNjaGVkdWxpbmcgb3JkZXIgKHN0ZXBzIGluIHN0ZXBJdGVtcyBvcmRlcixcbiAgICogdGhlbiB3YWl0cykuIFN0ZXAgZW50cmllcyBhcmUgZW5xdWV1ZWQgYnkgdGhlaXIgcHJlcCBwcm9taXNlcyAoaW5wdXRcbiAgICogZGVoeWRyYXRpb24gcnVucyBjb25jdXJyZW50bHksIHNvIGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgYG9yZGVyYCwgbm90IGJ5XG4gICAqIGNvbXBsZXRpb24pOyB0aGUgc2luZ2xlIGZsdXNoIG9wIGJlbG93IGF3YWl0cyBldmVyeSBwcmVwLCBzb3J0cywgYW5kXG4gICAqIGNvbW1pdHMgdGhlIHdob2xlIHNldCB0aHJvdWdoIGBjcmVhdGVCYXRjaGAuXG4gICAqL1xuICBjb25zdCBiYXRjaFF1ZXVlOiB7XG4gICAgb3JkZXI6IG51bWJlcjtcbiAgICBraW5kOiAnc3RlcCcgfCAnd2FpdCcgfCAnaW5saW5lLWNyZWF0ZWQnIHwgJ2lubGluZS1zdGFydGVkJztcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzdGVwJ3MgbmFtZSwgc2V0IG9uIHN0ZXAtY2Fycnlpbmcga2luZHMgKHRoZSBpbi1mbHVzaCBwdWJsaXNoZXNcbiAgICAgKiAgYW5kIHRoZSBkaXNwYXRjaCBpZGVtcG90ZW5jeSBrZXkgbmVlZCBpdCkuICovXG4gICAgc3RlcE5hbWU/OiBzdHJpbmc7XG4gICAgZXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdDtcbiAgfVtdID0gW107XG4gIGNvbnN0IGJhdGNoUHJlcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIFByZS1jbGFpbWVkIGlubGluZSBwYWlyczogZm9sZCBlYWNoIGxhenktaW5saW5lIHN0ZXAncyBkZWZlcnJlZFxuICAvLyBgc3RlcF9jcmVhdGVkYCAoY2FycnlpbmcgaXRzIGlucHV0KSBBTkQgaXRzIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIChiYXJlLFxuICAvLyBvd25lcnNoaXAtc3RhbXBlZCkgaW50byB0aGUgYmF0Y2gsIHNvIHRoZSB3aG9sZSBmYW4tb3V0ICh0aGUgaW5saW5lXG4gIC8vIHN0ZXBzJyBjbGFpbXMgaW5jbHVkZWQpIGNvbW1pdHMgaW4gdGhlIG9uZSBkdXJhYmxlIHdyaXRlIGFuZCB0aGUgY2FsbGVyXG4gIC8vIHN0YXJ0cyB0aGUgYm9kaWVzIHN0cmFpZ2h0IG9mZiB0aGF0IGNvbW1pdCBpbnN0ZWFkIG9mIHBvc3Rpbmcgb25lIGNsYWltXG4gIC8vIHBlciBpbmxpbmUgc3RlcC4gVGhlIGxvbmUtaW5saW5lIGNhc2UgKG5vdGhpbmcgZWxzZSB0byBiYXRjaCB3aXRoKSBpc1xuICAvLyBleGNsdWRlZDogYSBwYWlyLW9ubHkgYmF0Y2ggY29zdHMgdGhlIHNhbWUgcm91bmQgdHJpcCBhcyB0aGUgc2luZ2xlIGxhenlcbiAgLy8gY2xhaW0gd2hpbGUgZ2l2aW5nIHVwIHRoZSBvcHRpbWlzdGljIGNsYWltL2JvZHkgb3ZlcmxhcCBhbmQgdGhlXG4gIC8vIGJ1bXAtYW5kLXJlcG9ydCB0aGF0IGBjcmVhdGVHdWFyZGVkYCBwcm92aWRlcywgc28gaXQgc3RheXMgb24gdGhlIGxhenlcbiAgLy8gcGF0aC4gUmVxdWlyZXMgdGhlIGNhbGxlcidzIGBvd25lck1lc3NhZ2VJZGA6IHRoZSBzdGFydGVkIHJvdyBtdXN0XG4gIC8vIHN0YW1wIG93bmVyc2hpcCBleGFjdGx5IGxpa2UgdGhlIGxhenkgY2xhaW0gaXQgcmVwbGFjZXMgKGFuZCBhIGNhbGxlclxuICAvLyB0aGF0IGRvZXMgbm90IGlubGluZS1leGVjdXRlIG5ldmVyIHByb3ZpZGVzIG9uZSkuXG4gIGNvbnN0IHVuY3JlYXRlZFdhaXRDb3VudCA9IHdhaXRJdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pID0+ICFpdGVtLmhhc0NyZWF0ZWRFdmVudFxuICApLmxlbmd0aDtcbiAgY29uc3QgaW5saW5lUGFpckZvbGRFbGlnaWJsZSA9XG4gICAgYmF0Y2hGYW5vdXRFbGlnaWJsZSAmJlxuICAgIG93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDAgJiZcbiAgICAobGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgPj0gMiB8fFxuICAgICAgc3RlcHNOZWVkaW5nQ3JlYXRpb24uc2l6ZSAtXG4gICAgICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5zaXplICtcbiAgICAgICAgdW5jcmVhdGVkV2FpdENvdW50ID49XG4gICAgICAgIDEpO1xuICBjb25zdCBpbmxpbmVDbGFpbXM6IFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydpbmxpbmVDbGFpbXMnXSA9IG5ldyBNYXAoKTtcbiAgbGV0IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmc6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgdHJhY2UgY2FycmllciBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2hlcywgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlclxuICAvLyBzdXNwZW5zaW9uICh0aGUgcGVyLXN0ZXAgb3BzIHJ1biBjb25jdXJyZW50bHkgYW5kIHNoYXJlIGl0KS5cbiAgbGV0IHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjogUHJvbWlzZTxUcmFjZUNhcnJpZXI+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxUcmFjZUNhcnJpZXI+ID0+IHtcbiAgICBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPz89XG4gICAgICBzdGVwRGlzcGF0Y2g/LmdldFRyYWNlQ2FycmllcigpID8/IFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgcmV0dXJuIHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjtcbiAgfTtcblxuICAvLyBQcm9kdWNlci1zaWRlIHJlc2lsaWVudCByZWNvdmVyeSBjb3VudCBmb3IgdGhlIHN1c3BlbnNpb24gc3BhbiBhdHRyaWJ1dGUuXG4gIGxldCByZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCA9IDA7XG5cbiAgLy8gU3RlcHM6IGNyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnRzIChubyBxdWV1aW5nLCBWMiByZXR1cm5zIHBlbmRpbmcgc3RlcHNcbiAgLy8gdG8gY2FsbGVyLCBFWENFUFQgb24gdGhlIHJlc2lsaWVudCBkaXNwYXRjaCBwYXRoLCB3aGljaCBwYXJhbGxlbGl6ZXMgdGhlXG4gIC8vIGNyZWF0ZSB3aXRoIHRoZSBzdGVwJ3MgcXVldWUgcHVibGlzaCBhbmQgcmVwb3J0cyBpdCBpblxuICAvLyBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCkuXG4gIGxldCBiYXRjaE9yZGVyQ291bnRlciA9IDA7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHN0ZXBJdGVtcykge1xuICAgIGlmIChzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAvLyBEZXRlcm1pbmlzdGljIHBvc2l0aW9uIGluIHRoZSBiYXRjaGVkIGZvbGQgKGFzc2lnbmVkIGluIHN0ZXBJdGVtc1xuICAgICAgLy8gb3JkZXIsIGJlZm9yZSB0aGUgY29uY3VycmVudCBkZWh5ZHJhdGlvbiBydW5zKS4gQSBwYWlyLWZvbGRlZCBpbmxpbmVcbiAgICAgIC8vIHN0ZXAgb2NjdXBpZXMgdHdvIGNvbnNlY3V0aXZlIHBvc2l0aW9ucyAoY3JlYXRlZCByb3cgdGhlbiBzdGFydGVkXG4gICAgICAvLyByb3cpLCB3aGljaCB0aGUgZmx1c2gga2VlcHMgYWRqYWNlbnQgYW5kIG5ldmVyIHNwbGl0cyBhY3Jvc3MgY2h1bmtzLFxuICAgICAgLy8gc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUuXG4gICAgICBjb25zdCBwYWlyRm9sZGVkID1cbiAgICAgICAgaW5saW5lUGFpckZvbGRFbGlnaWJsZSAmJlxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHN0ZXBPcmRlciA9IGJhdGNoT3JkZXJDb3VudGVyO1xuICAgICAgYmF0Y2hPcmRlckNvdW50ZXIgKz0gcGFpckZvbGRlZCA/IDIgOiAxO1xuICAgICAgY29uc3Qgc3RlcE9wID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0ID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFyZ3M6IHF1ZXVlSXRlbS5hcmdzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogcXVldWVJdGVtLmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgICB0aGlzVmFsOiBxdWV1ZUl0ZW0udGhpc1ZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ3N0ZXBfaW5wdXQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIVNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBlLmcuIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6IGFuIFNESyBmYXVsdCwgbm90IGEgdXNlciB2YWx1ZVxuICAgICAgICAgICAgLy8gcHJvYmxlbS4gS2VlcCBpdHMgaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIGFuZCBjdXJyZW50XG4gICAgICAgICAgICAvLyBmYWlsLXRoZS1zdXNwZW5zaW9uIGJlaGF2aW9yLlxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN0ZXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgLy8gTm8gZGlzcGF0Y2ggdGFyZ2V0IG1lYW5zIG5vIHJlcGxheSB3aWxsIG9ic2VydmUgYVxuICAgICAgICAgICAgLy8gZmluYWxpemF0aW9uOiB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBkcmFpbiAob3IgYSBjcmVhdGUtb25seVxuICAgICAgICAgICAgLy8gdGVzdCBjYWxsZXIpLiBUaGUgcnVuIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBzb1xuICAgICAgICAgICAgLy8gd3JpdGluZyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBoZXJlIHdvdWxkIGxlYXZlIGUuZy4gYVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIG5vdGhpbmcgY2FuIGV2ZXJcbiAgICAgICAgICAgIC8vIG9ic2VydmUsIHJlYWRpbmcgYXMgYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLiBSZXRocm93XG4gICAgICAgICAgICAvLyBpbnN0ZWFkOyB0aGUgZHJhaW4ncyBvd24gY2F0Y2ggc3dhbGxvd3MgaXQsIHByZXNlcnZpbmcgaXRzXG4gICAgICAgICAgICAvLyBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgKG5vIHJvd3MgZm9yIHRoZSB1bmF3YWl0ZWQgc3RlcCkuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwKHF1ZXVlSXRlbSwgZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmZXJyZWQgKGxhenkpIGlubGluZSBzdGVwOiBza2lwIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUg4oCUIHRoZVxuICAgICAgICAvLyBjYWxsZXIncyBpbmxpbmUgZXhlY3V0ZVN0ZXAgd2lsbCBzZW5kIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmdcbiAgICAgICAgLy8gdGhpcyBpbnB1dCwgYW5kIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIChlbnRpdHkgKyBzeW50aGV0aWNcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KSBhdG9taWNhbGx5LiBXZSBkbyBOT1QgYWRkIGl0IHRvXG4gICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM7IG93bmVyc2hpcCBpcyBkZWNpZGVkIGJ5IHRoYXQgbGF6eVxuICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQncyBhdG9taWMgY3JlYXRlLWNsYWltIGluc3RlYWQuXG4gICAgICAgIGlmIChsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgIGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuc2V0KHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHBhaXJGb2xkZWQpIHtcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIHBhaXIgdGhlIGRlZmVycmFsIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNhbGxlcidzIGxhenkgYHN0ZXBfc3RhcnRlZGA6IHRoZSBjcmVhdGVkIHJvdyBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgLy8gaW5wdXQgKHBheWxvYWRzIHJpZGUgY3JlYXRlcyBpbiBhIGJhdGNoKSwgdGhlIHN0YXJ0ZWQgcm93IGlzXG4gICAgICAgICAgICAvLyBiYXJlIGFuZCBzdGFtcHMgdGhpcyBpbnZvY2F0aW9uJ3Mgb3duZXJzaGlwLCB0aGUgc2FtZSBjbGFpbVxuICAgICAgICAgICAgLy8gc2hhcGUgdGhlIGxhenkgc3RhcnQgd291bGQgaGF2ZSBzZW50LCBzZXR0bGVkIGJ5IHRoZSBiYXRjaC5cbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtY3JlYXRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlciArIDEsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtc3RhcnRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrZWQgYnkgaW5saW5lUGFpckZvbGRFbGlnaWJsZTsgc3ByZWFkIGtlZXBzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmFycm93LXRocm91Z2gtY2xvc3VyZSBwcm9ibGVtIGF3YXkgZnJvbSB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgICAgIC4uLihvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkID8geyBvd25lck1lc3NhZ2VJZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0IChgcnVuSW5wdXRgKSBhbmRcbiAgICAgICAgLy8gcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuIE9ubHkgZm9yIGlucHV0cyB0aGVcbiAgICAgICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgY3JlYXRlR3VhcmRlZChzdGVwRXZlbnQsIHsgcmVxdWVzdElkIH0pLFxuICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBpbXBsaWVkIGJ5IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGVcbiAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHN0ZXBJbnB1dDogeyBpbnB1dDogZGVoeWRyYXRlZElucHV0IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFNhbWUga2V5IGFzIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzIGFuZCBhbnkgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3MsIHNvIHJlZHVuZGFudCBwdWJsaXNoZXMgZm9yIHRoaXMgc3RlcCBkZWR1cGUuIFRoZVxuICAgICAgICAgICAgICAvLyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgc28gYSByZXZva2VkIG1lc3NhZ2UgZm9yIGFcbiAgICAgICAgICAgICAgLy8gcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCBjYW5ub3QgYWJzb3JiIHRoZSBjb3JyZWN0ZWRcbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUncyBkaXNwYXRjaDogc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0uc3RlcE5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIHN1c3BlbnNpb24gcGFzczogd2l0aG91dFxuICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZSBhbG9uZSwgYW5kIGlmIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBubyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuXG4gICAgICAgICAgLy8gUHJvcGFnYXRpbmcgcmVkZWxpdmVycyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoXG4gICAgICAgICAgLy8gcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcyxcbiAgICAgICAgICAvLyB0aGUgc2FtZSByZWNvdmVyeSBhcyB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCwgc2FtZSBhcyB0aGUgc2VxdWVudGlhbFxuICAgICAgICAgICAgICAvLyBwYXRoLiBUaGUgc3RlcCBtZXNzYWdlIGlzIGFscmVhZHkgb3V0OyBhIGR1cGxpY2F0ZSBwdWJsaXNoXG4gICAgICAgICAgICAgIC8vIGJ5IHRoYXQgaGFuZGxlciBkZWR1cGVzIG9uIHRoZSBzaGFyZWQgaWRlbXBvdGVuY3kga2V5LlxuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSZXNpbGllbnQ6IHRoZSB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkgKDQyOSAvIDV4eCAvXG4gICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlcyB0aGUgc3RlcF9jcmVhdGVkIGJlZm9yZSBleGVjdXRpbmcuXG4gICAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKys7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnU3RlcCBjcmVhdGlvbiBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgc3RlcCB3YXMgJyArXG4gICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50IHdpbGwgJyArXG4gICAgICAgICAgICAgICAgICAnYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHRoZSBiYXRjaCBpbnN0ZWFkIG9mIHdyaXRpbmcgaGVyZS4gVGhlIGVuY2xvc2luZ1xuICAgICAgICAgIC8vIHByb21pc2Ugam9pbnMgYGJhdGNoUHJlcHNgIChzZWUgdGhlIGxvb3AgYmVsb3cpLCBzbyB0aGUgZmx1c2hcbiAgICAgICAgICAvLyBvcCBjYW5ub3QgcnVuIGJlZm9yZSB0aGlzIHN0ZXAncyBpbnB1dCBmaW5pc2hlZCBkZWh5ZHJhdGluZy5cbiAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlcixcbiAgICAgICAgICAgIGtpbmQ6ICdzdGVwJyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGV2ZW50OiBzdGVwRXZlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgICAgb3BzLnB1c2goc3RlcE9wKTtcbiAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBvcCB3YWl0cyBmb3IgZXZlcnkgcHJlcCBiZWZvcmUgY29tbWl0dGluZzsgYSBwcmVwIHRoYXRcbiAgICAgICAgLy8gcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlcyB0aHJvdWdoIGBvcHNgLCBzbyB0aGUgZmx1c2gncyBvd24gd2FpdFxuICAgICAgICAvLyBzd2FsbG93cyBpdCBhbmQgY29tbWl0cyB3aGF0ZXZlciB3YXMgc3VjY2Vzc2Z1bGx5IGVucXVldWVkLFxuICAgICAgICAvLyBwcmVzZXJ2aW5nIHRvZGF5J3MgcGVyLW9wIGluZGVwZW5kZW5jZS5cbiAgICAgICAgYmF0Y2hQcmVwcy5wdXNoKHN0ZXBPcC5jYXRjaCgoKSA9PiB7fSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB3YWl0IGV2ZW50cyAoc2FtZSBhcyBWMSlcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0RXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgcmVzdW1lQXQ6IHF1ZXVlSXRlbS5yZXN1bWVBdCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBXYWl0cyBuZWVkIG5vIGRlaHlkcmF0aW9uLCBzbyB0aGV5IGVucXVldWUgc3luY2hyb25vdXNseSwgYWZ0ZXJcbiAgICAgICAgLy8gZXZlcnkgc3RlcCdzIG9yZGVyIHNsb3QsIHByZXNlcnZpbmcgc3RlcHMtdGhlbi13YWl0cyBzY2hlZHVsaW5nXG4gICAgICAgIC8vIG9yZGVyIGluIHRoZSBsb2cuXG4gICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgb3JkZXI6IGJhdGNoT3JkZXJDb3VudGVyKyssXG4gICAgICAgICAga2luZDogJ3dhaXQnLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50OiB3YWl0RXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh3YWl0RXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmF0Y2hlZCBmb2xkJ3MgZmx1c2g6IHRoZSBjbGVhbiBmYW4tb3V0IGNvbW1pdHMgdGhyb3VnaFxuICAvLyBgY3JlYXRlQmF0Y2hgIGluIGNodW5rcyBvZiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUywgYWxsIGNodW5rcyBJTlxuICAvLyBGTElHSFQgQ09OQ1VSUkVOVExZLiBTbG90IGFzc2lnbm1lbnQgaXMgdGhlIHNlcnZlcidzLCBzbyBwYXJhbGxlbFxuICAvLyBjaHVua3MgcmFjZSBmb3Igc2xvdCByYW5nZXMgZXhhY3RseSBsaWtlIHRoZSBwcmUtZm9sZCBwYXRoJ3MgcGFyYWxsZWxcbiAgLy8gc2luZ2xlIHdyaXRlcyBkaWQ7IGVudGl0eSBjb25kaXRpb25zLCBub3QgY29tbWl0IG9yZGVyLCBjYXJyeVxuICAvLyBjb3JyZWN0bmVzcyAoc2libGluZyBmYW4tb3V0IGV2ZW50cyBoYXZlIG5vIGNyb3NzLW9yZGVyIHRoZSByZXBsYXlcbiAgLy8gZGVwZW5kcyBvbjsgaXQgbWF0Y2hlcyBieSBjb3JyZWxhdGlvbiBpZCkuIEVhY2ggZXZlbnQgcmVwb3J0cyB0aGVcbiAgLy8gb3V0Y29tZSBpdHMgb3duIHNpbmdsZSBjcmVhdGUgd291bGQgaGF2ZSBoYWQ6IGEgNDA5IGlzIHRoZSBzYW1lXG4gIC8vIGFscmVhZHktZXhpc3RzIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgsIGFueXRoaW5nIGVsc2UgZmFpbHMgdGhlXG4gIC8vIGRlbGl2ZXJ5IHRoZSB3YXkgYSBzaW5nbGUtcGF0aCByZWplY3Rpb24gd291bGQuXG4gIC8vXG4gIC8vIExhdGVuY3kgc2hhcGU6IG9ubHkgdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnNcbiAgLy8gZ2F0ZXMgdGhlIGhhbmRsZXIncyByZXR1cm4gKHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBvZmYgaXRzIGNsYWltcykuXG4gIC8vIEV2ZXJ5IG90aGVyIGNodW5rJ3MgY29tbWl0IChhbmQgZXZlcnkgY2h1bmsncyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzLFxuICAvLyB3aGljaCBmaXJlIHRoZSBtb21lbnQgSVRTIGNyZWF0ZXMgYXJlIGR1cmFibGUpIHJpZGVzXG4gIC8vIGBkZWZlcnJlZEJhdGNoV29ya2Agd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGluLCBqb2luZWQgYmVmb3JlIGFjay4gQSBzbG93XG4gIC8vIHNpYmxpbmcgY2h1bmsgdGhlcmVmb3JlIGRlbGF5cyBuZWl0aGVyIHRoZSBpbmxpbmUgYm9kaWVzIG5vciBhbm90aGVyXG4gIC8vIGNodW5rJ3MgcXVldWUgbWVzc2FnZXMsIHdoaWxlIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIHN0aWxsIGhvbGRzIHBlclxuICAvLyBzdGVwOiBhIHN0ZXAncyBtZXNzYWdlIGlzIG9ubHkgZXZlciBzZW50IGFmdGVyIHRoZSBjaHVuayBjYXJyeWluZyBpdHNcbiAgLy8gY3JlYXRlIGhhcyBjb21taXR0ZWQuXG4gIGxldCBkZWZlcnJlZEJhdGNoV29yazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGJhdGNoRmFub3V0RWxpZ2libGUpIHtcbiAgICBvcHMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFByZXBzIHRoYXQgcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlIHRocm91Z2ggdGhlaXIgb3duIGBvcHNgXG4gICAgICAgIC8vIGVudHJpZXM7IHRoZSBmb2xkIGNvbW1pdHMgd2hhdGV2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZCxcbiAgICAgICAgLy8gcHJlc2VydmluZyB0b2RheSdzIHBlci1vcCBpbmRlcGVuZGVuY2UuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoUHJlcHMpO1xuICAgICAgICBpZiAoYmF0Y2hRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IFsuLi5iYXRjaFF1ZXVlXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgIC8vIEEgYmF0Y2ggb2YgT05FIGdhaW5zIG5vdGhpbmcgb3ZlciB0aGUgc2luZ2xlIHdyaXRlIChzYW1lIHJvdW5kXG4gICAgICAgIC8vIHRyaXApIGFuZCBsb3NlcyB0aGUgc2xvdC1zbmFwc2hvdCBwYXJhbXMgKyBidW1wLWFuZC1yZXBvcnQgdGhhdFxuICAgICAgICAvLyBjcmVhdGVHdWFyZGVkIHByb3ZpZGVzLCBzbyBhIGxvbmUgZWFnZXIgZXZlbnQgdGFrZXMgdGhlIG9yZGluYXJ5XG4gICAgICAgIC8vIHNpbmdsZSBwYXRoLCB3aXRoIHRoZSBzYW1lIGNvbmZsaWN0IHRvbGVyYW5jZSBhbmQgb3duZXJzaGlwXG4gICAgICAgIC8vIGJvb2trZWVwaW5nIGl0IHdvdWxkIGhhdmUgaGFkIHdpdGhvdXQgdGhlIGZvbGQuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IFtlbnRyeV0gPSBlbnRyaWVzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGVudHJ5LmV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWVkIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYyBiZWxvdy4gV2l0aCBjaHVua3NcbiAgICAgICAgLy8gY29tbWl0dGluZyBpbiBwYXJhbGxlbCB0aGVyZSBpcyBubyBwZXItY2h1bmsgXCJleHBlY3RlZCBuZXh0IHNsb3RcIjtcbiAgICAgICAgLy8gdGhlIHdob2xlIGZvbGQncyBjb21taXR0ZWQgc3BhbiBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWVkXG4gICAgICAgIC8vIG9uY2UgZXZlcnkgY2h1bmsgaGFzIHNldHRsZWQ6IGNvbW1pdHRlZCBzbG90cyBhcmUgZGVuc2UgcGVyIHRoZVxuICAgICAgICAvLyBXb3JsZCdzIGludmFyaWFudCwgc28gYW55IGV4Y2VzcyBvZiAobWF4IGNvbW1pdHRlZCBzbG90IOKIkiBzZWVkICtcbiAgICAgICAgLy8gMSkgb3ZlciB0aGUgZm9sZCdzIG93biBjb21taXR0ZWQgY291bnQgaXMgZXZlbnRzIE9USEVSIHdyaXRlcnNcbiAgICAgICAgLy8gbGFuZGVkIGluIGJldHdlZW4uXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkRmlyc3RTbG90ID0gZXZlbnRMb2dcbiAgICAgICAgICA/IChtYXhFdmVudFNsb3QoZXZlbnRMb2cuZXZlbnRzKSA/PyAwKSArIDFcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUGFpci1hd2FyZSBjaHVua2luZzogYSBwcmUtY2xhaW1lZCBwYWlyJ3MgdHdvIHJvd3MgbXVzdCBsYW5kIGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGNyZWF0ZUJhdGNoIGNhbGwgKGFkamFjZW50LCBzbyBhIFdvcmxkIGNhbiBmb2xkIHRoZW1cbiAgICAgICAgLy8gaW50byBvbmUgYm9ybi1ydW5uaW5nIGNyZWF0ZSkgYW5kIG5ldmVyIHN0cmFkZGxlIGEgY2h1bmtcbiAgICAgICAgLy8gYm91bmRhcnksIHdoaWNoIHdvdWxkIHR1cm4gdGhlIHN0YXJ0ZWQgcm93IGludG8gYSBzdGFuZGFsb25lXG4gICAgICAgIC8vIGNsYWltIHJhY2luZyBpdHMgb3duIGNyZWF0ZSdzIGNvbW1pdC5cbiAgICAgICAgY29uc3QgY2h1bmtzOiAodHlwZW9mIGVudHJpZXMpW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgIGxldCBjdXJyZW50OiB0eXBlb2YgZW50cmllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBlbnRyaWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBwYWlyTGVhZCA9XG4gICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dD8ua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJyAmJlxuICAgICAgICAgICAgICBuZXh0LmNvcnJlbGF0aW9uSWQgPT09IGVudHJ5LmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gcGFpckxlYWQgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICsgdGFrZSA+IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBpZiAocGFpckxlYWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSBjaHVua3MucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwcyB3aG9zZSBxdWV1ZSBtZXNzYWdlcyBUSElTIEZMVVNIIHdpbGwgcHVibGlzaCAodGhlIGVhZ2VyXG4gICAgICAgIC8vIGNyZWF0ZXMpLCByZWNvcmRlZCBiZWZvcmUgYW55IGNodW5rIHNldHRsZXMgc28gdGhlIGNhbGxlcidzXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhc3MgKHdoaWNoIHJ1bnMgb2ZmIHRoZSBoYW5kbGVyJ3MgcmV0dXJuKSBza2lwcyB0aGVtLlxuICAgICAgICAvLyBUaGUgc2VuZHMgYXJlIGd1YXJhbnRlZWQtb3ItZmFpbGVkIGJ5IHRoZSB0cmFpbGluZyB3b3JrIHRoZVxuICAgICAgICAvLyBjYWxsZXIgam9pbnMgYmVmb3JlIGFja2luZywgc28gXCJ3aWxsIGJlIHB1Ymxpc2hlZCBieSB0aGlzIGZsdXNoXCJcbiAgICAgICAgLy8gYW5kIFwiYWxyZWFkeSBwdWJsaXNoZWRcIiBhcmUgZXF1aXZhbGVudCBmcm9tIHRoZSBjYWxsZXIncyBzaWRlLlxuICAgICAgICBjb25zdCBwdWJsaXNoRWFnZXJTdGVwcyA9IHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHVibGlzaEVhZ2VyU3RlcHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChlbnRyeS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWxsaWVzIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYywgZm9sZGVkIGFjcm9zc1xuICAgICAgICAvLyB0aGUgY29uY3VycmVudCBjaHVua3MgYW5kIHJlYWQgb25jZSBhbGwgb2YgdGhlbSBzZXR0bGVkLlxuICAgICAgICBsZXQgY29tbWl0dGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgbWF4Q29tbWl0dGVkU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNvbW1pdENodW5rID0gYXN5bmMgKGNodW5rOiB0eXBlb2YgZW50cmllcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIC8vIEFuY2hvcnMgZm9yIHRoZSBwcmUtY2xhaW1lZCBzdGVwcycgdGVsZW1ldHJ5OiB0aGUgUE9TVCBpbnN0YW50XG4gICAgICAgICAgLy8gaXMgdGhlIGNsYWltJ3MgXCJzdGFydCBQT1NUIHNlbnRcIiAoUlNGUydzIGVuZCksIHRoZSByZXR1cm4gaXMgdGhlXG4gICAgICAgICAgLy8gY2xhaW0ncyBjb21wbGV0aW9uIChUVFIncyBUNiksIHRoZSBzYW1lIHR3byBpbnN0YW50cyB0aGUgbGF6eVxuICAgICAgICAgIC8vIGNsYWltJ3Mgb3duIFBPU1Qgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICAgICAgICBjb25zdCBiYXRjaFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBiYXRjaEZhbm91dEVsaWdpYmxlIGltcGxpZXMgcHJlc2VuY2VcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCEoXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGNodW5rLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXJ0ZWQgcm93IGlzIHRoZSBzdGVwJ3MgZXhlY3V0aW5nIGNsYWltLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRlLWluc3RhbmNlIGF0dHJpYnV0aW9uIHRoZSBzaW5nbGUgY2xhaW0gc2VuZHMgdmlhXG4gICAgICAgICAgICAgIC8vIENyZWF0ZUV2ZW50UGFyYW1zLlxuICAgICAgICAgICAgICAuLi4oZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICAgID8geyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAvLyBQZXItd3JpdGUgcmVxdWVzdCBhdHRyaWJ1dGlvbiwgc2FtZSBhcyB0aGUgc2luZ2xlIHBhdGgnc1xuICAgICAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCjigKYsIHsgcmVxdWVzdElkIH0pLlxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2h1bmtbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWlyIGNvbW1pdHRlZDogdGhpcyBpbnZvY2F0aW9uIG93bnMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBydW5zIHRoZSBib2R5IHdpdGggbm8gY2xhaW0gb2YgaXRzIG93bi4gVGhlXG4gICAgICAgICAgICAgICAgLy8gcmVhZGJhY2sgZW50aXR5IGlzIGF1dGhvcml0YXRpdmUgd2hlcmUgcHJlc2VudDsgYSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgb21pdHRlZCBpdCBnZXRzIHRoZSBzYW1lIGxvY2FsbHkgc3ludGhlc2l6ZWQgcnVubmluZ1xuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQtMSB0aGUgb3B0aW1pc3RpYyBwYXRoIGV4ZWN1dGVzIGFnYWluc3QuIEVpdGhlclxuICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgaW5wdXQgaXMgcmUtYXR0YWNoZWQgbG9jYWxseTogYmF0Y2ggcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHJlZnMgbGF6aWx5LCBhbmQgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3QgYnl0ZXMgdGhlIHBhaXIncyBjcmVhdGVkIHJvdyBjYXJyaWVkLiAoVGhlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAvLyByb3cncyBzdWNjZXNzIGlzIGRlbGliZXJhdGVseSBOT1QgbWVtYmVyc2hpcCBpblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IGZvciBpbmxpbmUgc3RlcHMgb3duZXJzaGlwIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0ZWQgcm93J3MgdmVyZGljdCwgYW5kIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzXG4gICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5saW5lIGNvcnJlbGF0aW9uIGlkcyByZWdhcmRsZXNzLilcbiAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoXG4gICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHNhbWUgcHJlcCBvcCB0aGF0IGVucXVldWVkIHRoZSBwYWlyIHNldFxuICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRyeSwgYW5kIHRoZSBmbHVzaCBhd2FpdGVkIGV2ZXJ5IHByZXAgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGZyZWUgaWYgaXQgZXZlciBmaXJlcywgdGhvdWdoOiB0aGUgcGFpciBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGhlcmUsIHNvIHRoaXMgdGhyb3dzIHdpdGggdGhlIHN0ZXAgY2xhaW1lZCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBib2R5IG5ldmVyIHJ1bi4gVGhlIGRlbGl2ZXJ5IGZhaWxzLCBhbmQgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMgaXQgdGhyb3VnaCBvd25lZC1yZWNvdmVyeSAodGhlIHN0ZXAgY2FycmllcyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwIHN0YW1wKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdCBqdXN0XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGNsZWFubHkuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbm8gZGVoeWRyYXRlZCBpbnB1dCBmb3IgcHJlLWNsYWltZWQgc3RlcCAke2VudHJ5LmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRTdGVwOiBTdGFydGVkU3RlcCA9IGl0ZW0uc3RlcD8uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbS5zdGVwLCBzdGFydGVkQXQ6IGl0ZW0uc3RlcC5zdGFydGVkQXQgfVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBkZWh5ZHJhdGVkLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICAgICAgICBvd25lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhcnRlZFN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiYXRjaFBvc3RTZW50QXRNcyxcbiAgICAgICAgICAgICAgICAgIGNsYWltQ29tcGxldGVkQXRNcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBsb3N0IGl0cyBhdG9taWMgY3JlYXRlLWNsYWltOiBhIGNvbmN1cnJlbnQgd3JpdGVyXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvd25zIHRoaXMgc3RlcCAoYW4gZWFybGllciBkZWxpdmVyeSdzIGNyZWF0ZSwgb3IgYVxuICAgICAgICAgICAgICAgIC8vIHJhY2luZyBoYW5kbGVyJ3MgY2xhaW0pLiBSZWNvcmRlZCBhcyBhIGxvc3QgY2xhaW06IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlcidzIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBib2R5LCB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gQSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgZm9sZHMgdGhlIHBhaXIgcmVwb3J0cyB0aGUgNDA5IG9uIGJvdGggcm93cyAoc2V0XG4gICAgICAgICAgICAgICAgLy8gdHdpY2UsIGhhcm1sZXNzKTsgb25lIHRoYXQgZXZhbHVhdGVzIHJvd3MgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgc3RhcnRlZCByb3cgKHByb2Nlc3NlZCBzZWNvbmQpIGRlY2lkZSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBzaW5nbGUgcGF0aCdzIHNlbWFudGljcyAoY3JlYXRlIGxvc3QgKyBjbGFpbVxuICAgICAgICAgICAgICAgIC8vIHdvbiBzdGlsbCBydW5zIHRoZSBib2R5OyBjcmVhdGUgd29uICsgY2xhaW0gbG9zdCBza2lwcykuXG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7IG93bmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0lubGluZSBzdGVwIHByZS1jbGFpbSBsb3N0LCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNhbWUgdG9sZXJhbmNlIGFzIHRoZSBzaW5nbGUgcGF0aCdzIEVudGl0eUNvbmZsaWN0RXJyb3I6IGFcbiAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBvciBlYXJsaWVyIGRlbGl2ZXJ5IGFscmVhZHkgY3JlYXRlZCBpdC5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdzdGVwJ1xuICAgICAgICAgICAgICAgICAgPyAnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZydcbiAgICAgICAgICAgICAgICAgIDogJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYGJhdGNoZWQgJHtlbnRyeS5ldmVudC5ldmVudFR5cGV9IGZvciAke2VudHJ5LmNvcnJlbGF0aW9uSWR9IGAgK1xuICAgICAgICAgICAgICAgIGBmYWlsZWQ6ICR7aXRlbS5lcnJvcn06ICR7aXRlbS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHsgc3RhdHVzOiBpdGVtLnN0YXR1cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIaWdoZXN0IHNsb3QgdGhpcyBjaHVuayBjb21taXR0ZWQ6IHRoZSBjZWlsaW5nIHRoZSBjYWxsZXIgZm9sZHNcbiAgICAgICAgICAvLyBpbnRvIHRoZSBpbmxpbmUgZXhlY3V0aW9ucycgc2xvdCBzbmFwc2hvdCAoc2VlXG4gICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZykgYW5kIG9uZSBpbnB1dFxuICAgICAgICAgIC8vIG9mIHRoZSBpbnRlcmxlYXZpbmcgZGlhZ25vc3RpYy5cbiAgICAgICAgICBjb25zdCBjaHVua01heFNsb3QgPSBtYXhFdmVudFNsb3QoXG4gICAgICAgICAgICByZXN1bHRzLmZsYXRNYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmV2ZW50ID8gW2l0ZW0uZXZlbnRdIDogW11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNodW5rTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAoYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIGNodW5rTWF4U2xvdCA+IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nID0gY2h1bmtNYXhTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21taXR0ZWRDb3VudCArPSByZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaHVua01heFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKG1heENvbW1pdHRlZFNsb3QgPT09IHVuZGVmaW5lZCB8fCBjaHVua01heFNsb3QgPiBtYXhDb21taXR0ZWRTbG90KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCA9IGNodW5rTWF4U2xvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgY2h1bmsncyBlYWdlciBzdGVwcycgcXVldWUgbWVzc2FnZXMgdGhlIG1vbWVudCBJVFNcbiAgICAgICAgLy8gY3JlYXRlcyBhcmUgZHVyYWJsZSwgdGhlIHBlci1jaHVuayBoYWxmIG9mIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlLlxuICAgICAgICAvLyBTYW1lIG1lc3NhZ2Ugc2hhcGUgYW5kIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBhcyB0aGVcbiAgICAgICAgLy8gY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzcywgc28gYW55dGhpbmcgZG91YmxlLXB1Ymxpc2hlZCBkZWR1cGVzLlxuICAgICAgICBjb25zdCBwdWJsaXNoQ2h1bmtTdGVwcyA9IGFzeW5jIChcbiAgICAgICAgICBjaHVuazogdHlwZW9mIGVudHJpZXNcbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgaWYgKCFwdWJsaXNoRWFnZXJTdGVwcykgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHN0ZXBFbnRyaWVzID0gY2h1bmsuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gJ3N0ZXAnKTtcbiAgICAgICAgICBpZiAoc3RlcEVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBzdGVwRW50cmllcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBwdWJsaXNoRWFnZXJTdGVwcyBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGVudHJ5LnN0ZXBOYW1lISxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGVwTmFtZSFcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBMYXVuY2ggZXZlcnkgY2h1bmsncyBQT1NUIG5vdzsgY2hhaW4gZWFjaCBjaHVuaydzIHB1Ymxpc2hlcyBvbiBpdHNcbiAgICAgICAgLy8gT1dOIGNvbW1pdC4gQSBjaHVuayB3aG9zZSBjb21taXQgcmVqZWN0ZWQga2VlcHMgaXRzIG1lc3NhZ2VzXG4gICAgICAgIC8vIHVuc2VudCAodGhlIHJlamVjdGlvbiBmYWlscyB0aGUgZGVsaXZlcnk7IHJlZGVsaXZlcnkgcmUtY3JlYXRlc1xuICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcywgZGVkdXBlZCBieSB0aGUgaWRlbXBvdGVuY3kga2V5cykuXG4gICAgICAgIGNvbnN0IGNvbW1pdHMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gY29tbWl0Q2h1bmsoY2h1bmspKTtcbiAgICAgICAgY29uc3QgcHVibGlzaGVzID0gY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29tbWl0c1tpbmRleF07XG4gICAgICAgICAgYXdhaXQgcHVibGlzaENodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gTGV0IGV2ZXJ5IHNpYmxpbmcgc2V0dGxlIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGZpcnN0IGZhaWx1cmU6IGFcbiAgICAgICAgICAvLyBjaHVuayB0aGF0IGNvbW1pdHRlZCBtdXN0IHN0aWxsIGdldCBpdHMgcHVibGlzaGVzIG91dCBldmVuIHdoZW5cbiAgICAgICAgICAvLyBhbm90aGVyIGNodW5rIGZhaWxlZCwgYW5kIHRoZSBjYWxsZXIgYWNrcyBvbmx5IGFmdGVyIHRoaXNcbiAgICAgICAgICAvLyByZXNvbHZlcy5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5jb21taXRzLCAuLi5wdWJsaXNoZXNdKTtcbiAgICAgICAgICAvLyBGb3JlaWduLWludGVybGVhdmluZyB2aXNpYmlsaXR5OiB0aGUgYmF0Y2ggZW5kcG9pbnQgaGFzIG5vXG4gICAgICAgICAgLy8gYnVtcC1hbmQtcmVwb3J0LCBzbyBldmVudHMgb3RoZXIgd3JpdGVycyBsYW5kZWQgYmV0d2VlbiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBhbmQgdGhlc2UgY29tbWl0cyBwdXNoZWQgdGhlIGZvbGQgdG8gaGlnaGVyIHNsb3RzXG4gICAgICAgICAgLy8gV0lUSE9VVCBoYW5kaW5nIHVzIHRoZSBza2lwcGVkIGV2ZW50cy4gU2FtZSBhY2NlcHRlZCBleHBvc3VyZVxuICAgICAgICAgIC8vIGFzIGEgZHJvcHBlZCB0cnVuY2F0ZWQgcmVwb3J0IG9uIHRoZSBzaW5nbGUgcGF0aDogdGhlIGxvY2FsXG4gICAgICAgICAgLy8gbG9nIHN0YXlzIGEgc3RyaWN0IHByZWZpeCBhbmQgdGhlIG5leHQgcmVsb2FkIG9ic2VydmVzIHRoZW0uXG4gICAgICAgICAgLy8gTG9nZ2VkIHNvIGEgYnVtcCBpcyBkaWFnbm9zYWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmxlYXZlZCA9XG4gICAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgLSBleHBlY3RlZEZpcnN0U2xvdCArIDEgLSBjb21taXR0ZWRDb3VudDtcbiAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZCA+IDApIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnQmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCBhYm92ZSBzbmFwc2hvdCcsIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEZpcnN0U2xvdCxcbiAgICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90LFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZENvdW50LFxuICAgICAgICAgICAgICAgIGludGVybGVhdmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmFpbHVyZSA9IHNldHRsZWQuZmluZChcbiAgICAgICAgICAgIChvdXRjb21lKTogb3V0Y29tZSBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT5cbiAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdyZWplY3RlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLnJlYXNvbjtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyBFVkVSWSBjaHVuayBjYXJyeWluZyBwYWlycyBnYXRlcyB0aGUgcmV0dXJuLCBub3QganVzdCB0aGUgZmlyc3Q6XG4gICAgICAgIC8vIGEgcGFpciB3aG9zZSBjb21taXQgdGhlIGNhbGxlciBoYXMgbm90IHNlZW4geWllbGRzIG5vXG4gICAgICAgIC8vIGBpbmxpbmVDbGFpbXNgIGVudHJ5LCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBsYXp5XG4gICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgd291bGQgcmFjZSB0aGlzIHNhbWUgZm9sZCdzIHN0aWxsLWluLWZsaWdodFxuICAgICAgICAvLyBwYWlyIGZvciB0aGUgc2FtZSBzdGVwLiBUb2RheSBwYWlycyBhbHdheXMgbGFuZCBpbiBvbmUgY2h1bmtcbiAgICAgICAgLy8gKHRoZXkgc29ydCBmaXJzdCwgYW5kIHR3byByb3dzIHBlciBpbmxpbmUgc3RlcCBmaXQgaW5zaWRlIG9uZVxuICAgICAgICAvLyBjaHVuaywgcGlubmVkIGJ5IGNvbnN0YW50cy50ZXN0LnRzKSwgc28gdGhpcyBpcyBhdCBtb3N0IG9uZVxuICAgICAgICAvLyBjb21taXQ7IHRoZSBmaWx0ZXIgaXMgd2hhdCBrZWVwcyB0aGUgcHJvcGVydHkgdHJ1ZSBpZiBlaXRoZXIgY2FwXG4gICAgICAgIC8vIG1vdmVzLlxuICAgICAgICBjb25zdCBwYWlyQ29tbWl0cyA9IGNodW5rcy5mbGF0TWFwKChjaHVuaywgaW5kZXgpID0+XG4gICAgICAgICAgY2h1bmsuc29tZSgoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcpXG4gICAgICAgICAgICA/IFtjb21taXRzW2luZGV4XV1cbiAgICAgICAgICAgIDogW11cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFsbG93RGVmZXJyZWRCYXRjaFdvcmspIHtcbiAgICAgICAgICAvLyBUaGUgdHJhaWxpbmcgd29yayBpcyB0aGUgY2FsbGVyJ3MgdG8gam9pbiBiZWZvcmUgYWNrLiBBdHRhY2ggYVxuICAgICAgICAgIC8vIGhhbmRsZXIgbm93IHNvIGEgcmVqZWN0aW9uIHRoYXQgcmFjZXMgdGhhdCBqb2luIChvciBhIGZvcmVncm91bmRcbiAgICAgICAgICAvLyBmYWlsdXJlIHRoYXQgcHJldmVudHMgdGhlIGNhbGxlciBmcm9tIGV2ZXIgcmVhY2hpbmcgaXQpIGlzIG5ldmVyXG4gICAgICAgICAgLy8gYW4gdW5oYW5kbGVkUmVqZWN0aW9uOyBhd2FpdGluZyB0aGUgcHJvbWlzZSBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICB0cmFpbGluZy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgZGVmZXJyZWRCYXRjaFdvcmsgPSB0cmFpbGluZztcbiAgICAgICAgICAvLyBPbmx5IHRoZSBwYWlyIGNodW5rcyBnYXRlIHRoZSByZXR1cm46IHRoZWlyIGNsYWltcyBhcmUgd2hhdCB0aGVcbiAgICAgICAgICAvLyBjYWxsZXIgc3RhcnRzIHRoZSBpbmxpbmUgYm9kaWVzIGZyb20uIFdpdGggbm8gcGFpcnMgdGhlcmUgaXNcbiAgICAgICAgICAvLyBub3RoaW5nIHRoZSBjYWxsZXIncyBwb3N0LXJldHVybiB3b3JrIHJlYWRzIGZyb20gdGhlIGNvbW1pdHMsXG4gICAgICAgICAgLy8gc28gbm90aGluZyBnYXRlcy5cbiAgICAgICAgICBpZiAocGFpckNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGFpckNvbW1pdHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIEEgcGFpciBjaHVuayBmYWlsZWQsIHNvIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgaXMgTk9UIHRoZVxuICAgICAgICAgICAgICAvLyBjYWxsZXIncyB0byBqb2luIGFueSBtb3JlOiBgZGVmZXJyZWRCYXRjaFdvcmtgIG5ldmVyXG4gICAgICAgICAgICAgIC8vIHJlYWNoZXMgaXQgb25jZSBoYW5kbGVTdXNwZW5zaW9uIHRocm93cy4gU2V0dGxlIHRoZSByZXN0XG4gICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmVqZWN0aW9uIGVzY2FwZXMsIGZvciB0aGUgcmVhc29uIGBzZXR0bGVQaGFzZWBcbiAgICAgICAgICAgICAgLy8gZ2l2ZXM6IGEgc2libGluZyBjcmVhdGUgbGFuZGluZyBhZnRlciB0aGUgdGhyb3cgY29tbWl0cyBhblxuICAgICAgICAgICAgICAvLyBldmVudCBmcm9tIHRoZSBhYmFuZG9uZWQgcmVwbGF5J3Mgc2VlZGVkIHNlcXVlbmNlIGFuZCByYWNlc1xuICAgICAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzdGFydCByZWxvYWQgd2hpbGUgZG9pbmcgc28uXG4gICAgICAgICAgICAgIGF3YWl0IHRyYWlsaW5nLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0cmFpbGluZztcbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBhdHRyaWJ1dGVJdGVtcykge1xuICAgIG9wcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIC8vIEd1YXJkZWQgbGlrZSBldmVyeSBvdGhlciBzdXNwZW5zaW9uIHdyaXRlOiBhbiBhdHRyX3NldCBpcyBhXG4gICAgICAgICAgLy8gcmVwbGF5LWRlcml2ZWQgZXZlbnQgd2l0aCBhIGNvcnJlbGF0aW9uIGlkIGZyb20gdGhpcyByZXBsYXknc1xuICAgICAgICAgIC8vIHNlZWRlZCBzZXF1ZW5jZSwgc28gaXQgbXVzdCBub3QgbGFuZCBvbiBhIGxvZyB0aGUgcmVwbGF5IG5ldmVyXG4gICAgICAgICAgLy8gc2F3LiBSZWplY3RpbmcgaXQgaXMgY2hlYXA6IGEgcnVuIHdpdGggYXR0cmlidXRlIGV2ZW50cyBhbHJlYWR5XG4gICAgICAgICAgLy8gZm9yY2VzIGFuIGluLXByb2Nlc3MgcmVwbGF5LCBzbyB0aGUgcmVzdGFydCBjb3N0cyB0aGUgcmVwbGF5IGl0XG4gICAgICAgICAgLy8gd2FzIGdvaW5nIHRvIGRvIGFueXdheS5cbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdHRyX3NldCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHF1ZXVlSXRlbS5jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHdyaXRlcjogeyB0eXBlOiAnd29ya2Zsb3cnIH0sXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1dvcmxkVmFsaWRhdGlvbkZhaWx1cmUoZXJyKSkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5pc3RpYyB2YWxpZGF0aW9uIHJlamVjdGlvbiBmcm9tIHRoZSBXb3JsZCwgZS5nLiB0aGVcbiAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgcGVyLXJ1biBhdHRyaWJ1dGUgY2FwLCB3aGljaCBvbmx5IHRoZSBXb3JsZCBjYW5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgdGhlIHJ1bidzIGV4aXN0aW5nIGF0dHJpYnV0ZXMuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJlcGxheXMgdGhlIHdvcmtmbG93IGludG8gdGhlIGV4YWN0IHNhbWVcbiAgICAgICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgZXhhY3Qgc2FtZSByZWplY3Rpb24sIHNvIHJldHJ5aW5nIGNhbiBuZXZlclxuICAgICAgICAgICAgLy8gc3VjY2VlZC4gU3VyZmFjZSBpdCBhcyBhIEZhdGFsRXJyb3Igc28gdGhlIGNhbGxlciBmYWlscyB0aGVcbiAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIGl0IGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgc2V0QXR0cmlidXRlcyBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgIHRocm93IGZhdGFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEF3YWl0IHRoZSBzdGVwX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgZXZlbnQgY3JlYXRlcyBiZWZvcmUgcmV0dXJuaW5nLlxuICAvLyBUaGUgY2FsbGVyICh3b3JrZmxvd0VudHJ5cG9pbnQpIG9ubHkgZW5xdWV1ZXMgdGhlIHN0ZXAtZGlzcGF0Y2ggcXVldWVcbiAgLy8gbWVzc2FnZXMgQUZURVIgaGFuZGxlU3VzcGVuc2lvbiByZXNvbHZlcywgYW5kIHRoZSBxdWV1ZSBoYW5kbGVyIGFja3NcbiAgLy8gdGhlIG9yY2hlc3RyYXRvciBtZXNzYWdlIG9ubHkgYWZ0ZXIgdGhlIGNhbGxlciByZXNvbHZlcy4gU28gdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyBldmVudHMgbXVzdCBiZSBkdXJhYmxlIGhlcmUsIGFuZCB0aGUgZGlzcGF0Y2ggc2VuZHMgbXVzdCBjb21wbGV0ZSBpbiB0aGUgY2FsbGVyLFxuICAvLyBhbGwgYmVmb3JlIGFjay4gSWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBiZWZvcmUgdGhpcyByZXNvbHZlcywgdGhlIG9yY2hlc3RyYXRvclxuICAvLyBtZXNzYWdlIGlzIG5vdCBhY2tlZCBhbmQgVlFTIHJlZGVsaXZlcnMsIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAvLyBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMsIGFuZCByZWNvdmVycyB0aGUgcnVuIGluc3RlYWQgb2Ygb3JwaGFuaW5nIGl0LlxuICBhd2FpdCBzZXR0bGVQaGFzZShvcHMpO1xuXG4gIC8vIFJlYnVpbGQgdGhlIGlubGluZSBiYXRjaCBpbiBkZXRlcm1pbmlzdGljIG9yZGVyLiBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYFxuICAvLyBpcyBhIFNldCBzZWVkZWQgZnJvbSB0aGUgb3JkZXJlZCBmaXJzdC1OIHNsaWNlLCBzbyBpdGVyYXRpbmcgaXQgcHJlc2VydmVzXG4gIC8vIHN0ZXBJdGVtcyBvcmRlcjsgZXZlcnkgaWQgaW4gaXQgd2FzIHNldCBieSB0aGUgbGF6eSBicmFuY2ggYWJvdmUuXG4gIGNvbnN0IGxhenlJbmxpbmVTdGVwczogU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddID0gW107XG4gIGZvciAoY29uc3QgY29ycmVsYXRpb25JZCBvZiBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMpIHtcbiAgICBjb25zdCBsYXp5U3RlcCA9IGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgIGlmIChsYXp5U3RlcCkgbGF6eUlubGluZVN0ZXBzLnB1c2gobGF6eVN0ZXApO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgKG1pbmltdW0gdGltZW91dClcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHdhaXRJdGVtcykge1xuICAgIGNvbnN0IHJlc3VtZUF0TXMgPSBxdWV1ZUl0ZW0ucmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KTtcbiAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCk7XG4gICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgIHNvb25lc3RXYWl0ID0ge1xuICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnd29ya2Zsb3dfc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RlcHNDcmVhdGVkKHN0ZXBJdGVtcy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0hvb2tzQ3JlYXRlZChob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1dhaXRzQ3JlYXRlZCh3YWl0SXRlbXMubGVuZ3RoKSxcbiAgICAuLi4oZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLnNpemUgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1N0ZXBzRmFpbGVkU2VyaWFsaXphdGlvbihcbiAgICAgICAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZVxuICAgICAgICApXG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5TdGVwUmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQpXG4gICAgICA6IHt9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwZW5kaW5nU3RlcHM6IHN0ZXBJdGVtcyxcbiAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcyxcbiAgICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgbGF6eUlubGluZVN0ZXBzLFxuICAgIGlubGluZUNsYWltcyxcbiAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nLFxuICAgIGRlZmVycmVkQmF0Y2hXb3JrLFxuICAgIC8vIE9uIGhvb2sgY29uZmxpY3QgdGhlIGNhbGxlciBhZHZhbmNlcyB0aGUgd29ya2Zsb3cgb3ZlciB0aGUgY29uZmxpY3RcbiAgICAvLyBiZWZvcmUgc2NoZWR1bGluZyBhbnl0aGluZyBhbmQgbmV2ZXIgcmVhZHMgdGhlIHdhaXQgdGltZW91dCwgc28gZG9uJ3RcbiAgICAvLyByZXBvcnQgb25lLiBUaGUgbmV4dCBwYXNzLCB3aGljaCBzZWVzIHRoZSBjb25mbGljdCBzZXR0bGVkLCByZXBvcnRzIGl0LlxuICAgIHdhaXRUaW1lb3V0OlxuICAgICAgaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMubGVuZ3RoID4gMCA/IHVuZGVmaW5lZCA6IHNvb25lc3RXYWl0LFxuICAgIGhhc0hvb2tDb25mbGljdDogaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMubGVuZ3RoID4gMCxcbiAgICBob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkcyxcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzLmxlbmd0aCA+IDAsXG4gICAgYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkcyxcbiAgICAvLyBUaGUgZGVsdGEgYWNjb3VudHMgZm9yIHRoZSB3aG9sZSBsb2cgb25seSBpZiB0aGUgd3JpdGUgdGhhdCByZXR1cm5lZCBpdFxuICAgIC8vIHdhcyB0aGlzIHN1c3BlbnNpb24ncyBvbmx5IG9uZSDigJQgYW55dGhpbmcgd3JpdHRlbiBhZnRlciBpdCBsYW5kZWQgYWJvdmVcbiAgICAvLyB0aGUgZGVsdGEgYW5kIGlzIG1pc3NpbmcgZnJvbSB0aGUgY2FsbGVyJ3MgbG9nLlxuICAgIGV2ZW50TG9nQ2FycmllZEZvcndhcmQ6IGRlbHRhQWJzb3JiZWQgJiYgZ3VhcmRlZFdyaXRlcyA9PT0gMSxcbiAgICBoYXNBdHRyaWJ1dGVFdmVudHM6IGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA+IDAsXG4gICAgaGFzSG9va0V2ZW50czogaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoID4gMCxcbiAgICBob29rQ3JlYXRpb25NcyxcbiAgICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50LFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VycyxcbiAgICByZXBvcnRlZEV2ZW50Q291bnQ6IHJlcG9ydGVkRXZlbnRzLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gYGV2ZW50cy5jcmVhdGVgIHJlamVjdGlvbiBpcyBkZXRlcm1pbmlzdGljIFdvcmxkIHZhbGlkYXRpb25cbiAqIHJhdGhlciB0aGFuIGEgdHJhbnNpZW50L3N0b3JhZ2UgZXJyb3IuIExvY2FsIFdvcmxkc1xuICogKHdvcmxkLWxvY2FsLCB3b3JsZC1wb3N0Z3JlcykgdGhyb3cgYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgZGlyZWN0bHk7XG4gKiByZW1vdGUgV29ybGRzIHN1cmZhY2UgdGhlIGVxdWl2YWxlbnQgc2VydmVyLXNpZGUgcmVqZWN0aW9uIGFzIGFcbiAqIGBXb3JrZmxvd1dvcmxkRXJyb3JgIHdpdGggSFRUUCBzdGF0dXMgNDAwLiBUaGUgbmFtZSBjaGVjayBjb3ZlcnNcbiAqIGBBdHRyaWJ1dGVWYWxpZGF0aW9uRXJyb3JgIGluc3RhbmNlcyBmcm9tIGEgZGlmZmVyZW50IGNvcHkgb2ZcbiAqIGBAd29ya2Zsb3cvd29ybGRgIHRoYW4gdGhlIG9uZSB0aGlzIHBhY2thZ2UgcmVzb2x2ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcikgcmV0dXJuIHRydWU7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0F0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikgJiYgZXJyLnN0YXR1cyA9PT0gNDAwO1xufVxuIl19
|
|
1458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBS3hCLG9CQUFvQixFQUNwQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1DQUFtQyxHQU1wQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIseUJBQXlCLEVBQ3pCLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixjQUFjLEVBR2QsWUFBWSxFQUNaLFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGtCQUFrQixF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QUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgdHlwZSBTZXJpYWxpemVkRGF0YSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbiAgdHlwZSBTdGFydGVkU3RlcCxcbiAgdHlwZSBUcmFjZUNhcnJpZXIsXG4gIHR5cGUgVmFsaWRRdWV1ZU5hbWUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQsXG4gIHR5cGUgR3Vlc3RDb2RlRXhlY3V0aW9uLFxuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4gfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMsXG4gIE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIGFwcGVuZEV2ZW50TG9nLFxuICB0eXBlIEV2ZW50Q3JlYXRvcixcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbWF4RXZlbnRTbG90LFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHF1ZXVlTWVzc2FnZXMsXG4gIHJ1bkRpc3BhdGNoQ29udGV4dCxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFByZWNsYWltZWRJbmxpbmVTdGFydCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyIH0gZnJvbSAnLi91bnNlcmlhbGl6YWJsZS1zdGVwLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcyB7XG4gIHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW46IFdvcmtmbG93UnVuO1xuICBzcGFuPzogU3BhbjtcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUncyBsb2FkZWQgZXZlbnQgbG9nLiBFdmVyeSBldmVudCBjcmVhdGlvbiB0aGlzIHN1c3BlbnNpb24gbWFrZXNcbiAgICogbmFtZXMgdGhlIHBvc2l0aW9uIGl0IHdhcyBkZXJpdmVkIGZyb20sIHNvIGEgYmFja2VuZCB0aGF0IGhhcyByZWNvcmRlZFxuICAgKiBldmVudHMgdGhlIHJlcGxheSBkaWQgbm90IHNlZSBjYW4gcmVwb3J0IHRoZW0gYmFjayBvbiB0aGUgd3JpdGUsIG9yLCBpZlxuICAgKiBpdCB3b3VsZCByYXRoZXIgcmVmdXNlIHRoYW4gcmVwb3J0LCByZWplY3QgaXQgd2l0aCBhIDQxMi4gQSByZWplY3Rpb24gaXNcbiAgICogbm90IHJldHJpZWQgaGVyZTogdGhlIGV2ZW50J3MgY29ycmVsYXRpb24gaWQgd2FzIG1pbnRlZCBieSAqdGhpcyogcmVwbGF5J3NcbiAgICogc2VlZGVkIHNlcXVlbmNlLCBzbyByZS1jb21taXR0aW5nIGl0IGFnYWluc3QgYSBjb3JyZWN0ZWQgbG9nIHdvdWxkIHBlcnNpc3RcbiAgICogYW4gZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgcHJvZHVjZXMuIFRoZSBjYWxsZXIgcmVzdGFydHMgdGhlIHJlcGxheVxuICAgKiBpbnN0ZWFkLlxuICAgKlxuICAgKiBFeHRlbmRlZCBpbiBwbGFjZSBieSB3aGF0IHRob3NlIHdyaXRlcyByZXBvcnQgYmFjayDigJQgdGhlIGV2ZW50cyBvbiBzbG90c1xuICAgKiB0aGV5IHNraXBwZWQgb3ZlciwgYW5kIChvbiB0aGUgaG9vayBjcmVhdGUpIHRoZSBpbmxpbmUgZGVsdGEgc2luY2UgaXRzXG4gICAqIGN1cnNvci4gV2hldGhlciB0aGUgbG9nIGlzIGNvbXBsZXRlIGFmdGVyd2FyZHMgaXMgYW5zd2VyZWQgYnlcbiAgICoge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmV2ZW50TG9nQ2FycmllZEZvcndhcmR9LlxuICAgKi9cbiAgZXZlbnRMb2c/OiBMb2FkZWRFdmVudExvZztcbiAgLyoqXG4gICAqIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAodGhlIHJ1biBleGlzdHMpLiBXaGVuIHByZXNlbnQsIGV2ZXJ5IHdvcmxkIHdyaXRlXG4gICAqIHRoaXMgc3VzcGVuc2lvbiBwZXJmb3JtcyAoYGhvb2tfY3JlYXRlZGAsIGB3YWl0X2NyZWF0ZWRgLCBlYWdlciBvdmVyZmxvd1xuICAgKiBgc3RlcF9jcmVhdGVkYCwg4oCmKSBpcyBnYXRlZCBvbiBpdCBzbyB0aGUgd3JpdGUgbmV2ZXIgcmFjZXMgYWhlYWQgb2YgdGhlXG4gICAqIHJ1bidzIGNyZWF0aW9uLiBUaGUgcHVyZSBpbmxpbmUgaG90IHBhdGggZGVmZXJzIGFsbCBvZiBpdHMgc3RlcHMgYW5kIHdyaXRlc1xuICAgKiBub3RoaW5nIGhlcmUsIHNvIGl0IG5ldmVyIGF3YWl0cyB0aGlzIGJhcnJpZXIuIGB1bmRlZmluZWRgIG91dHNpZGUgdHVyYm8sXG4gICAqIHdoZXJlIGBydW5fc3RhcnRlZGAgd2FzIGFscmVhZHkgYXdhaXRlZCB1cCBmcm9udC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBPbmUtc2hvdCB0ZWxlbWV0cnkgcmVwb3J0ZXIsIGFjdGl2YXRlZCBvbmx5IGFmdGVyIHJlcGxheSBoYXMgcmVjb3ZlcmVkLiAqL1xuICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyPzogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcjtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB3aGVuIHByb3ZpZGVkIChhbmQgdGhlIHBlci1zdGVwIGVsaWdpYmlsaXR5IGdhdGVzXG4gICAqIHBhc3MsIHNlZSB0aGUgc3RlcCBvcHMgYmVsb3cpLCBlYWNoIG5ld2x5IGNyZWF0ZWQgbm9uLWlubGluZSBzdGVwJ3NcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgaXMgcGFyYWxsZWxpemVkIHdpdGggaXRzIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlXG4gICAqIHB1Ymxpc2gsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIHN0ZXAgaW5wdXRcbiAgICogKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZVxuICAgKiBkaXJlY3Qgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5xdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHN9IHNvIHRoZSBjYWxsZXJcbiAgICogc2tpcHMgdGhlbSBpbiBpdHMgb3duIGRpc3BhdGNoIHBhc3MuIE9taXR0ZWQgYnkgY2FsbGVycyB0aGF0IG11c3Qgbm90XG4gICAqIHF1ZXVlICh0ZXJtaW5hbCBkcmFpbiwgdGVzdHMpOyBjcmVhdGVzIHRoZW4gYmVoYXZlIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgc3RlcERpc3BhdGNoPzoge1xuICAgIC8qKiBUaGUgdW5pZmllZCB3b3JrZmxvdyBxdWV1ZSB0aGlzIHJ1bidzIHN0ZXAgbWVzc2FnZXMgYXJlIHB1Ymxpc2hlZCB0by4gKi9cbiAgICBxdWV1ZU5hbWU6IFZhbGlkUXVldWVOYW1lO1xuICAgIC8qKlxuICAgICAqIExhemlseSByZXNvbHZlcyB0aGUgdHJhY2UgY2FycmllciB0byBzdGFtcCBvbiB0aGUgc3RlcCBtZXNzYWdlcy5cbiAgICAgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIHBlciBzdXNwZW5zaW9uIChtZW1vaXplZCBoZXJlKS5cbiAgICAgKi9cbiAgICBnZXRUcmFjZUNhcnJpZXI6ICgpID0+IFByb21pc2U8VHJhY2VDYXJyaWVyPjtcbiAgfTtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcDogdGhlIHF1ZXVlIG1lc3NhZ2UgSUQgb2YgdGhlIGludm9jYXRpb24gdGhpc1xuICAgKiBzdXNwZW5zaW9uIHJ1bnMgaW4gKHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gcHJlc2VudCBBTkQgdGhlXG4gICAqIGJhdGNoZWQgZmFuLW91dCBlbmdhZ2VzLCB0aGUgbGF6eS1pbmxpbmUgc3RlcHMnIGRlZmVycmVkIHdyaXRlcyBhcmVcbiAgICogZm9sZGVkIGludG8gdGhlIGJhdGNoIGFzIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpcnMgKHRoZVxuICAgKiBzdGFydGVkIHJvdyBzdGFtcGVkIHdpdGggdGhpcyBJRCwgZXhhY3RseSBsaWtlIHRoZSBsYXp5IGNsYWltIGl0XG4gICAqIHJlcGxhY2VzKSwgcHJlLWNsYWltaW5nIHRoZSBzdGVwcyB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHJ1biBpbmxpbmUuIFNlZVxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zfS4gQ2FsbGVycyB0aGF0IG5ldmVyXG4gICAqIGlubGluZS1leGVjdXRlICh0ZXJtaW5hbCBkcmFpbikgb21pdCBpdCwga2VlcGluZyB0aGVpciBsYXp5IHN0ZXBzIG9uIHRoZVxuICAgKiBwbGFpbiBkZWZlcnJlZCBwYXRoLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXQgcmV0dXJuIGJlZm9yZSBldmVyeSBjaHVuayBoYXMgY29tbWl0dGVkOiBvbmx5XG4gICAqIHRoZSBjaHVuayBjYXJyeWluZyB0aGUgcHJlLWNsYWltZWQgaW5saW5lIHBhaXJzIGdhdGVzIHRoZSBoYW5kbGVyJ3NcbiAgICogcmV0dXJuIChpdHMgY2xhaW1zIGFyZSB3aGF0IHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBmcm9tKSwgd2hpbGUgdGhlXG4gICAqIHRyYWlsaW5nIGNodW5rcycgY29tbWl0cyAoYW5kIGV2ZXJ5IGNodW5rJ3MgaW4tZmx1c2ggc3RlcC1tZXNzYWdlXG4gICAqIHB1Ymxpc2hlcykgcmlkZSB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmt9LiBBXG4gICAqIGNhbGxlciB0aGF0IG9wdHMgaW4gTVVTVCBhd2FpdCB0aGF0IHByb21pc2UgYmVmb3JlIGFja2luZyBpdHMgZGVsaXZlcnk6XG4gICAqIHRoZSBkdXJhYmlsaXR5IGNvbnRyYWN0IChcImV2ZXJ5IGNyZWF0ZSBkdXJhYmxlIGJlZm9yZSBhY2tcIikgbW92ZXMgZnJvbVxuICAgKiB0aGUgaGFuZGxlcidzIHJldHVybiB0byB0aGF0IGpvaW4sIGFuZCBub3RoaW5nIGVsc2UgcmUtZHJpdmVzIGEgbG9zdFxuICAgKiB0cmFpbGluZyBjaHVuay4gQ2FsbGVycyB0aGF0IGRvbid0IG9wdCBpbiAodGVybWluYWwgZHJhaW4sIGRlZmF1bHQpXG4gICAqIGtlZXAgdGhlIGV2ZXJ5dGhpbmctZHVyYWJsZS1hdC1yZXR1cm4gYmVoYXZpb3IuXG4gICAqL1xuICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgaGFuZGxpbmcgYSBzdXNwZW5zaW9uLiBSZXR1cm5zIHBlbmRpbmcgc3RlcCBpdGVtcyBzbyB0aGUgY2FsbGVyXG4gKiBjYW4gZGVjaWRlIHdoaWNoIHRvIGV4ZWN1dGUgaW5saW5lIHZzIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQge1xuICAvKiogUGVuZGluZyBzdGVwIGl0ZW1zIHdpdGggZXZlbnRzIGNyZWF0ZWQgYnV0IE5PVCBxdWV1ZWQgKi9cbiAgcGVuZGluZ1N0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCB0aGlzIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IChhcyBvcHBvc2VkIHRvIGNhdGNoaW5nIEVudGl0eUNvbmZsaWN0RXJyb3IgYmVjYXVzZVxuICAgKiBhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCkuIE9ubHkgdGhlIGhhbmRsZXIgdGhhdCB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IHNob3VsZCBxdWV1ZSAvIGlubGluZS1leGVjdXRlIHRoZSBzdGVwOyB0aGlzXG4gICAqIGd1YXJhbnRlZXMgYSBzaW5nbGUgb3duZXIgcGVyIHN0ZXAsIGV2ZW4gd2hlbiBtdWx0aXBsZSBoYW5kbGVycyByYWNlXG4gICAqIGludG8gdGhlIHNhbWUgYmF0Y2ggYm91bmRhcnkuXG4gICAqL1xuICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZS4gRWFjaCB3YXNcbiAgICogZmluYWxpemVkIGhlcmUgYXMgYHN0ZXBfY3JlYXRlZGAgKHdpdGggYSBwbGFjZWhvbGRlciBpbnB1dDsgdGhlIHJlYWxcbiAgICogaW5wdXQgaXMgcHJlY2lzZWx5IHdoYXQgcmVmdXNlZCB0byBzZXJpYWxpemUpIGZvbGxvd2VkIGJ5IGBzdGVwX2ZhaWxlZGBcbiAgICogY2FycnlpbmcgdGhlIFNlcmlhbGl6YXRpb25FcnJvciwgc28gdGhlIG5leHQgcmVwbGF5IHJlamVjdHMgdGhlIHN0ZXAnc1xuICAgKiBwcm9taXNlIGFuZCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcyB0aGUgZXJyb3IsXG4gICAqIGV4YWN0bHkgbGlrZSBhIHN0ZXAtYm9keSBmYWlsdXJlLiBObyBzdGVwLWV4ZWN1dGlvbiBtZXNzYWdlIGlzXG4gICAqIGRpc3BhdGNoZWQgZm9yIHRoZXNlLCBzbyB0aGUgY2FsbGVyIE1VU1QgZm9yY2UgYW4gaW4tcHJvY2VzcyByZXBsYXk6XG4gICAqIHdoZW4gdGhlIGZhaWxlZCBzdGVwIHdhcyB0aGUgb25seSBwZW5kaW5nIHdvcmssIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXJcbiAgICogcmUtaW52b2tlIHRoZSBydW4gdG8gb2JzZXJ2ZSB0aGUgdGVybWluYWwgZXZlbnQuXG4gICAqL1xuICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHRoaXMgc3VzcGVuc2lvbiBjYWxsIGFscmVhZHkgcHVibGlzaGVkXG4gICAqIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2VzIGZvciwgdmlhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoICh0aGVcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgcGFyYWxsZWxpemVkIHdpdGggYSBgc3RlcElucHV0YC1jYXJyeWluZyBxdWV1ZVxuICAgKiBwdWJsaXNoKS4gVGhlIGNhbGxlciBNVVNUIE5PVCBkaXNwYXRjaCB0aGVzZSBhZ2FpbjogdGhlIG1lc3NhZ2UgaXNcbiAgICogYWxyZWFkeSBvdXQgKGEgZHVwbGljYXRlIHdvdWxkIGJlIGRlZHVwZWQgYnkgaXRzIGlkZW1wb3RlbmN5IGtleSwgYnV0XG4gICAqIGNvc3RzIGEgd2FzdGVkIHJvdW5kLXRyaXApLiBFbXB0eSB3aGVuIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2h9XG4gICAqIHdhcyBub3QgcHJvdmlkZWQgb3Igbm8gc3RlcCB3YXMgZWxpZ2libGUuXG4gICAqL1xuICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogSG93IG1hbnkgZXZlbnRzIHRoaXMgcGhhc2UncyB3cml0ZXMgcmVwb3J0ZWQgYmFjayBhcyBvY2N1cHlpbmcgc2xvdHMgdGhleVxuICAgKiBza2lwcGVkIG92ZXIsIGFscmVhZHkgbWVyZ2VkIGludG8gdGhlIGNhbGxlcidzIGBldmVudExvZy5ldmVudHNgLiBOb256ZXJvXG4gICAqIG1lYW5zIHRoZSBhcnJheSB3YXMgcmVvcmRlcmVkIHRvIHJlc3RvcmUgc2xvdCBvcmRlciwgc28gYW55IGluZGV4IHRoZVxuICAgKiBjYWxsZXIgY2FjaGVkIGludG8gaXQgKHBheWxvYWQgcHJld2FybSBzY2FuIHBvc2l0aW9uKSBpcyBzdGFsZS5cbiAgICovXG4gIHJlcG9ydGVkRXZlbnRDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0ZXBzIHdob3NlIGBzdGVwX2NyZWF0ZWRgIHdyaXRlcyB3ZXJlIGludGVudGlvbmFsbHkgZGVmZXJyZWQgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gcnVuIHRoZW0gaW5saW5lIHZpYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyAod2hpY2ggY3JlYXRlXG4gICAqIHRoZSBzdGVwIG9uIHRoZSBmbHkpLCBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBVcCB0b1xuICAgKiBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgYXJlIGRlZmVycmVkOyB0aGUgY2FsbGVyIHJ1bnMgdGhlbSBpbmxpbmUgaW5cbiAgICogcGFyYWxsZWwgYW5kIHF1ZXVlcyB0aGUgcmVzdC4gRW1wdHkgd2hlbiBubyBzdGVwIHdhcyBkZWZlcnJlZCAobm90aGluZ1xuICAgKiBwZW5kaW5nLCBvciBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgaXMgcHJlc2VudCBzbyBub3RoaW5nIGlzXG4gICAqIGV4ZWN1dGVkIGlubGluZSkuIFRoZSBjYWxsZXIgcGFzc2VzIGVhY2ggYGRlaHlkcmF0ZWRJbnB1dGAgc3RyYWlnaHQgdG9cbiAgICogYGV4ZWN1dGVTdGVwYCwgd2hpY2ggc2VuZHMgaXQgYXMgdGhlIGBzdGVwX3N0YXJ0ZWRgIHBheWxvYWQuIFRoZSBhdG9taWNcbiAgICogY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIGBzdGVwX3N0YXJ0ZWRgIGlzIHRoZSBleGFjdGx5LW9uZS1vd25lciBnYXRlIHRoYXRcbiAgICogdGhlIHN0YW5kYWxvbmUgYHN0ZXBfY3JlYXRlZGAgcHJvdmlkZWQgYmVmb3JlOiB0aGUgbG9zZXIgb2YgdGhlIHJhY2UgZ2V0c1xuICAgKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGBza2lwcGVkYCBhbmQgZG9lcyBub3QgcnVuIHRoZSBib2R5LlxuICAgKi9cbiAgbGF6eUlubGluZVN0ZXBzOiBBcnJheTx7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgZGVoeWRyYXRlZElucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgfT47XG4gIC8qKlxuICAgKiBQcmUtY2xhaW1lZCBpbmxpbmUgc3RhcnRzLCBieSBjb3JyZWxhdGlvbiBpZDogdGhlIHBlci1zdGVwIHZlcmRpY3RzIG9mXG4gICAqIHRoZSBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXJzIHRoZSBiYXRjaGVkIGZhbi1vdXQgY29tbWl0dGVkXG4gICAqIGZvciB0aGUgbGF6eS1pbmxpbmUgc3RlcHMuIEEgc3RlcCB3aXRoIGFuIGVudHJ5IGhlcmUgaXMgcGFzc2VkIHRvXG4gICAqIGBleGVjdXRlU3RlcGAgYXMgYHByZWNsYWltZWRTdGFydGAgSU5TVEVBRCBvZiBgbGF6eVN0ZXBJbnB1dGA6IGl0c1xuICAgKiBpbnB1dCBhbHJlYWR5IHJvZGUgdGhlIHBhaXIsIGFuZCB0aGUgY2xhaW0gaXMgc2V0dGxlZDogYG93bmVkOiB0cnVlYFxuICAgKiBjYXJyaWVzIHRoZSBzdGFydGVkIGF0dGVtcHQtMSBlbnRpdHkgKGlucHV0IHJlLWF0dGFjaGVkKSBzbyB0aGUgYm9keVxuICAgKiBydW5zIHN0cmFpZ2h0IG9mZiB0aGUgYmF0Y2ggY29tbWl0IHdpdGggbm8gc3RhcnQgd3JpdGUgb2YgaXRzIG93bjtcbiAgICogYG93bmVkOiBmYWxzZWAgbG9zdCB0aGUgcGFpcidzIGF0b21pYyBjcmVhdGUtY2xhaW0gdG8gYSBjb25jdXJyZW50XG4gICAqIHdyaXRlciwgYW5kIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGUgYm9keSxcbiAgICogdGhlIHNhbWUgb3V0Y29tZSBhcyBsb3NpbmcgdGhlIGxhenkgY2xhaW0uIEVtcHR5IHdoZW5ldmVyIHRoZSBmb2xkIGRpZFxuICAgKiBub3QgZW5nYWdlIChiYXRjaGluZyBvZmYsIG5vIGBvd25lck1lc3NhZ2VJZGAsIG9yIHRoZSBsb25lLWlubGluZSBjYXNlLFxuICAgKiB3aGljaCBrZWVwcyB0aGUgb3B0aW1pc3RpYyBsYXp5IHBhdGggYW5kIGl0cyBjbGFpbS9ib2R5IG92ZXJsYXApLlxuICAgKlxuICAgKiBDcmFzaCB3aW5kb3c6IHRoZSBwYWlyIGNvbW1pdHMgYmVmb3JlIHRoZSBjYWxsZXIgcnVucyB0aGUgYm9keSwgc28gYVxuICAgKiBjcmFzaCBiZXR3ZWVuIHRoZW0gbGVhdmVzIGEgc3RhcnRlZCBzdGVwIHN0YW1wZWQgd2l0aCB0aGlzIG1lc3NhZ2Unc1xuICAgKiBJRC4gUmVkZWxpdmVyeSBvZiB0aGUgc2FtZSBtZXNzYWdlIHJlLWV4ZWN1dGVzIGl0IHZpYSB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICogcGF0aCwgdGhlIGV4YWN0IG1hY2hpbmVyeSB0aGUgbGF6eSBjbGFpbSdzIGNyYXNoIHdpbmRvdyBhbHJlYWR5IHVzZXMuXG4gICAqL1xuICBpbmxpbmVDbGFpbXM6IE1hcDxzdHJpbmcsIFByZWNsYWltZWRJbmxpbmVTdGFydD47XG4gIC8qKlxuICAgKiBUaGUgYmF0Y2hlZCBmYW4tb3V0J3MgZGVmZXJyZWQgd29yaywgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGNhbGxlciBvcHRlZFxuICAgKiBpbiB2aWEge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLmFsbG93RGVmZXJyZWRCYXRjaFdvcmt9IGFuZFxuICAgKiB0cmFpbGluZyB3b3JrIGV4aXN0czogdGhlIGNvbW1pdHMgb2YgZXZlcnkgY2h1bmsgZXhjZXB0IHRoZSBwYWlyIGNodW5rLFxuICAgKiBwbHVzIGV2ZXJ5IGNodW5rJ3Mgc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyAoZWFjaCBjaGFpbmVkIG9uIElUUyBPV05cbiAgICogY2h1bmsncyBjb21taXQsIHNvIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIGhvbGRzIHBlciBzdGVwKS4gVGhlIGNhbGxlclxuICAgKiBNVVNUIGF3YWl0IGl0IGJlZm9yZSBhY2tpbmc6IGEgcmVqZWN0aW9uIGhlcmUgaXMgYSBmYWlsZWQgc3VzcGVuc2lvblxuICAgKiB3cml0ZSBhbmQgZmFpbHMgdGhlIGRlbGl2ZXJ5IGV4YWN0bHkgYXMgaXQgd291bGQgaGF2ZSBhdCB0aGUgaGFuZGxlcidzXG4gICAqIHJldHVybi4gU3RlcHMgd2hvc2UgbWVzc2FnZXMgdGhpcyB3b3JrIHB1Ymxpc2hlcyBhcmUgYWxyZWFkeSBpblxuICAgKiB7QGxpbmsgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzfSBhdCByZXR1cm4gdGltZS5cbiAgICovXG4gIGRlZmVycmVkQmF0Y2hXb3JrPzogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCwgaWYgYW55OiBzZWNvbmRzIHVudGlsIGl0IGVsYXBzZXMgYW5kIHRoZVxuICAgKiBjb3JyZWxhdGlvbklkIG9mIHRoZSB3YWl0IHRoYXQgcHJvZHVjZWQgdGhhdCB0aW1lb3V0LiBUaGVcbiAgICogY29ycmVsYXRpb25JZCBzZWVkcyB0aGUgaWRlbXBvdGVuY3kga2V5IGZvciB0aGUgd2FpdC1jb250aW51YXRpb25cbiAgICogcXVldWUgbWVzc2FnZSBzbyB0aGF0IHJlcGVhdGVkIHN1c3BlbnNpb24gcGFzc2VzIG92ZXIgdGhlIHNhbWVcbiAgICogcGVuZGluZyB3YWl0IGNvbGxhcHNlIGludG8gYSBzaW5nbGUgZGVsYXllZCBjb250aW51YXRpb24uXG4gICAqL1xuICB3YWl0VGltZW91dD86IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBob29rIGNyZWF0ZSBjb21taXR0ZWQgYSBgaG9va19jb25mbGljdGAg4oCUIHRoZSB0b2tlbiB3YXMgYWxyZWFkeVxuICAgKiBjbGFpbWVkLCBzbyB0aGlzIHJ1bidzIGhvb2sgd2FzIG5ldmVyIGNyZWF0ZWQgYW5kIHRoZSB3b3JrZmxvdyBtdXN0XG4gICAqIG9ic2VydmUgdGhlIGNvbmZsaWN0IGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoaXMgc3VzcGVuc2lvbiBzY2hlZHVsZWQgcnVucy5cbiAgICogVGhlIGNhbGxlciBhbnN3ZXJzIGl0IGJ5IGFkdmFuY2luZyB0aGUgd29ya2Zsb3cgb3ZlciB0aGUgY29tbWl0dGVkIGV2ZW50LlxuICAgKi9cbiAgaGFzSG9va0NvbmZsaWN0OiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgdGhlIHdvcmtmbG93IHRvIGNvbnRpbnVlIGltbWVkaWF0ZWx5ICovXG4gIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb3JyZWxhdGlvbiBpZHMgb2YgdGhlIGhvb2tzIHRoaXMgc3VzcGVuc2lvbiBjb21taXR0ZWQgYSBgaG9va19jcmVhdGVkYFxuICAgKiBmb3Igd2hpbGUgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIHdhcyB3YWl0aW5nIG9uIGl0IOKAlCB0aGUgZXZlbnRzXG4gICAqIHRoYXQgcmVzb2x2ZSB0aG9zZSBhd2FpdGVycyBvbiB0aGUgbmV4dCBwYXNzLiBFbXB0eSBleGFjdGx5IHdoZW5cbiAgICoge0BsaW5rIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb259IGlzIGZhbHNlLlxuICAgKlxuICAgKiBSZXBvcnRlZCBieSBpZCwgbm90IGp1c3QgY291bnRlZCwgc28gYSBjYWxsZXIgdGhhdCBjb250aW51ZXMgaW4gdGhpc1xuICAgKiBwcm9jZXNzIGNhbiB0ZWxsIGEgY29udGludWF0aW9uIHRoYXQgZ290IHNvbWV3aGVyZSBmcm9tIG9uZSB0aGF0IGlzXG4gICAqIHJlcGVhdGluZzogYSB3b3JrZmxvdyBtYXkgY3JlYXRlIG9uZSBhd2FpdGVkIGhvb2sgYWZ0ZXIgYW5vdGhlciwgYW5kIGVhY2hcbiAgICogbmV3IGlkIGlzIGEgcGFzcyB0aGF0IG1hZGUgcHJvZ3Jlc3MsIHdoaWxlIHRoZSBzYW1lIGlkIGNvbWluZyBiYWNrIG1lYW5zXG4gICAqIHRoZSBwYXNzIHJhbiBvdmVyIGEgbG9nIHRoYXQgc3RpbGwgZGlkIG5vdCBob2xkIGl0cyBldmVudCBhbmQgY29udGludWluZ1xuICAgKiBhZ2FpbiBjYW5ub3QgY2hhbmdlIHRoYXQuXG4gICAqL1xuICBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUgaG9va3Mgd2hvc2UgY3JlYXRlIGNvbW1pdHRlZCBhIGBob29rX2NvbmZsaWN0YC5cbiAgICogRW1wdHkgZXhhY3RseSB3aGVuIHtAbGluayBoYXNIb29rQ29uZmxpY3R9IGlzIGZhbHNlLlxuICAgKlxuICAgKiBCeSBpZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzfSwgYW5kXG4gICAqIGFnYWluc3QgdGhlIHNhbWUgaGF6YXJkOiBhIGNvbmZsaWN0IGlzIHJlc29sdmVkIGJ5IHRoZSBgaG9va19jb25mbGljdGBcbiAgICogdGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZCwgYW5kIHVudGlsIHRoZSB3b3JrZmxvdyBvYnNlcnZlcyBpdCB0aGUgaG9va1xuICAgKiBzdGF5cyBpbiB0aGUgaW52b2NhdGlvbnMgcXVldWUgYW5kIHRoZSBuZXh0IHBhc3Mgd3JpdGVzIHRoZSBjcmVhdGUgYWdhaW4uXG4gICAqIEEgZnJlc2ggaWQgaXMgcHJvZ3Jlc3M7IHRoZSBzYW1lIGlkIGNvbWluZyBiYWNrIGlzIGEgcGFzcyB0aGF0IHJhbiBvdmVyIGFcbiAgICogbG9nIHdoaWNoIHN0aWxsIGRpZCBub3QgaG9sZCB0aGUgZXZlbnQsIHNvIGNvbnRpbnVpbmcgYWdhaW4gY2Fubm90IGNoYW5nZVxuICAgKiB0aGF0LlxuICAgKi9cbiAgaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsbGVyJ3MgYGV2ZW50TG9nYCBub3cgaG9sZHMgZXZlcnkgZXZlbnQgdGhpcyBzdXNwZW5zaW9uXG4gICAqIGNvbW1pdHRlZCwgc28gYSBjYWxsZXIgdGhhdCBjb250aW51ZXMgaW4gdGhpcyBwcm9jZXNzIGNhbiByZXBsYXkg4oCUIG9yXG4gICAqIHJlc3VtZSBhIHJldGFpbmVkIFZNIOKAlCBzdHJhaWdodCBvZmYgaXQgd2l0aCBubyByZWFkLlxuICAgKlxuICAgKiBUcnVlIG9ubHkgd2hlbiB0aGUgaG9vayBjcmVhdGUncyBpbmxpbmUgZGVsdGEgY2FtZSBiYWNrIGNvbXBsZXRlIGFuZCB3YXNcbiAgICogZm9sZGVkIGluIChzZWUgYGhvb2tEZWx0YUN1cnNvcmAgYmVsb3cpLCBhbmQgbm90aGluZyBlbHNlIGluIHRoaXNcbiAgICogc3VzcGVuc2lvbiB3cm90ZSBhbiBldmVudC4gRmFsc2Ugd2hlbmV2ZXIgYSByZWFkIGlzIG5lZWRlZCBmaXJzdDogbm9cbiAgICogZGVsdGEgd2FzIGFza2VkIGZvciBvciByZXR1cm5lZCwgaXQgd2FzIHRydW5jYXRlZCwgb3IgYSBzdGVwIC8gd2FpdCAvXG4gICAqIGF0dHJpYnV0ZSAvIGFib3J0IHdyaXRlIGxhbmRlZCBhYm92ZSBpdCBhbmQgaXMgdGhlcmVmb3JlIG5vdCBpbiBpdC5cbiAgICpcbiAgICogSW5kaWZmZXJlbnQgdG8gd2hpY2ggZXZlbnQgdGhlIGNyZWF0ZSBjb21taXR0ZWQ6IHRoZSBkZWx0YSBpcyB0aGUgc2xpY2VcbiAgICogb2YgdGhlIGxvZyBhZnRlciB0aGUgY2FsbGVyJ3MgY3Vyc29yIGVpdGhlciB3YXksIHNvIGl0IGNhcnJpZXMgYVxuICAgKiBgaG9va19jb25mbGljdGAgZXhhY3RseSBhcyBpdCBjYXJyaWVzIGEgYGhvb2tfY3JlYXRlZGAuXG4gICAqL1xuICBldmVudExvZ0NhcnJpZWRGb3J3YXJkOiBib29sZWFuO1xuICAvKiogV2hldGhlciBuYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyB3ZXJlIHdyaXR0ZW4gZm9yIHJlcGxheS4gKi9cbiAgaGFzQXR0cmlidXRlRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1c3BlbnNpb24gY3JlYXRlZCBhbnkgaG9vayAoYGhvb2tfY3JlYXRlZGApIGV2ZW50cy4gVW5saWtlXG4gICAqIGBoYXNIb29rQ29uZmxpY3RgIC8gYGhhc0F3YWl0ZWRIb29rQ3JlYXRpb25gLCB0aGlzIGlzIHRydWUgZXZlbiBmb3IgYSBwbGFpblxuICAgKiBmaXJlLWFuZC1mb3JnZXQgaG9vayB3aXRoIG5vIGNvbmZsaWN0IGFuZCBubyBhd2FpdGVyLiBUdXJibyBtb2RlIHVzZXMgaXQgdG9cbiAgICogZGV0ZWN0IFwiYSBob29rIHdhcyBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvblwiIGFuZCBzdG9wIGZvcmNpbmcgb3B0aW1pc3RpY1xuICAgKiBpbmxpbmUgc3RhcnQgKGEgaG9vayBpbnRyb2R1Y2VzIGxhdGVyIHJlc3VtZSBpbnZvY2F0aW9ucyB0aGF0IGNvdWxkIHJhY2UpLlxuICAgKi9cbiAgaGFzSG9va0V2ZW50czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyB0aGlzIHN1c3BlbnNpb24ncyBgaG9va19jcmVhdGVkYCBldmVudHNcbiAgICogKDAgd2hlbiBpdCBjcmVhdGVkIG5vbmUpLiBUaGUgY2FsbGVyIGFjY3VtdWxhdGVzIHRoaXMgYWNyb3NzIGl0ZXJhdGlvbnNcbiAgICogYW5kIHN1YnRyYWN0cyBpdCBmcm9tIHRoZSBUVEZTIGxhdGVuY3kgbWVhc3VyZW1lbnQsIHNvIHRpbWUgc3BlbnRcbiAgICogZHVyYWJseSBjcmVhdGluZyB0aGUgdXNlcidzIGhvb2tzIGRvZXNuJ3QgY291bnQgYXMgcnVudGltZSBvdmVyaGVhZC5cbiAgICovXG4gIGhvb2tDcmVhdGlvbk1zOiBudW1iZXI7XG4gIC8qKiBFeGFjdCBudW1iZXIgb2Ygd29ya2Zsb3ctY29kZSBleGVjdXRpb25zIG9ic2VydmVkIGR1cmluZyBzZXJpYWxpemF0aW9uLiAqL1xuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OiBudW1iZXI7XG4gIC8qKiBCb3VuZGVkIHNhbXBsZSB1c2VkIG9ubHkgZm9yIHJldGVudGlvbiBkaWFnbm9zdGljcy4gKi9cbiAgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIgZXh0ZW5kcyBHdWVzdENvZGVFeGVjdXRpb24ge1xuICBzb3VyY2U6ICdzdGVwX2lucHV0JyB8ICdob29rX21ldGFkYXRhJyB8ICdob29rX2Fib3J0JztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVIb29rRXZlbnQoe1xuICBydW5JZCxcbiAgaG9va0V2ZW50LFxuICBxdWV1ZUl0ZW0sXG4gIHJlcXVlc3RJZCxcbiAgc2luY2VDdXJzb3IsXG4gIGNyZWF0ZUV2ZW50LFxufToge1xuICBydW5JZDogc3RyaW5nO1xuICBob29rRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdDtcbiAgcXVldWVJdGVtOiBIb29rSW52b2NhdGlvblF1ZXVlSXRlbTtcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3Vyc29yIHRvIGFzayB0aGUgV29ybGQgZm9yIHRoZSBldmVudC1sb2cgZGVsdGEgYWdhaW5zdCwgb3IgdW5kZWZpbmVkIHRvXG4gICAqIG5vdCBhc2suIFNlZSBgaG9va0RlbHRhQ3Vyc29yYCBpbiB7QGxpbmsgaGFuZGxlU3VzcGVuc2lvbn0gZm9yIHdoZW4gaXQgaXNcbiAgICogc2V0IGFuZCB3aHkgaXQgaXMgYXQgbW9zdCBvbmUgd3JpdGUgcGVyIHN1c3BlbnNpb24uXG4gICAqL1xuICBzaW5jZUN1cnNvcj86IHN0cmluZztcbiAgY3JlYXRlRXZlbnQ6IChcbiAgICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gICAgcGFyYW1zPzogQ3JlYXRlRXZlbnRQYXJhbXNcbiAgKSA9PiBQcm9taXNlPEV2ZW50UmVzdWx0Pjtcbn0pOiBQcm9taXNlPHtcbiAgaGFzSG9va0NvbmZsaWN0OiBib29sZWFuO1xuICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBib29sZWFuO1xufT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KGhvb2tFdmVudCwge1xuICAgICAgcmVxdWVzdElkLFxuICAgICAgLi4uKHNpbmNlQ3Vyc29yID09PSB1bmRlZmluZWQgPyB7fSA6IHsgc2luY2VDdXJzb3IgfSksXG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd29ybGQgcmV0dXJuZWQgYSBob29rX2NvbmZsaWN0IGV2ZW50IGluc3RlYWQgb2YgaG9va19jcmVhdGVkLlxuICAgIC8vIFRoZSBob29rX2NvbmZsaWN0IGV2ZW50IGlzIHN0b3JlZCBpbiB0aGUgZXZlbnQgbG9nIGFuZCBpcyB3aGF0IHRoZSBuZXh0XG4gICAgLy8gcGFzcyBjb25zdW1lcyB0byBzZXR0bGUgdGhlIGhvb2sncyBhd2FpdGVycyDigJQgcmVqZWN0aW5nIGEgcGF5bG9hZCBhd2FpdCxcbiAgICAvLyByZXNvbHZpbmcgYSBgaG9vay5nZXRDb25mbGljdCgpYCB3aXRoIHRoZSBjb25mbGljdGluZyBydW4uIEFuIGlubGluZVxuICAgIC8vIGRlbHRhIGFza2VkIGZvciBhYm92ZSBjYXJyaWVzIGl0IGp1c3QgYXMgaXQgd291bGQgaGF2ZSBjYXJyaWVkIHRoZVxuICAgIC8vIGhvb2tfY3JlYXRlZCwgc28gdGhlIGNhbGxlciBjYW4gYWR2YW5jZSBvdmVyIGl0IHdpdGhvdXQgYSByZS1pbnZvY2F0aW9uLlxuICAgIGlmIChyZXN1bHQuZXZlbnQ/LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHRydWUsXG4gICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IHF1ZXVlSXRlbS5oYXNDb25mbGljdEF3YWl0ZXIgPT09IHRydWUsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdIb29rIGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogZmFsc2UsXG4gICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246IHF1ZXVlSXRlbS5oYXNDb25mbGljdEF3YWl0ZXIgPT09IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGhvb2snLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChpc1dvcmxkVmFsaWRhdGlvbkZhaWx1cmUoZXJyKSkge1xuICAgICAgY29uc3QgZmF0YWwgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgYGNyZWF0ZUhvb2sgZmFpbGVkIFdvcmxkIHZhbGlkYXRpb246ICR7XG4gICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgICAgZmF0YWwuY2F1c2UgPSBlcnI7XG4gICAgICB0aHJvdyBmYXRhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgd29ya2Zsb3cgc3VzcGVuc2lvbiBieSBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgKGhvb2tzLCBzdGVwcywgd2FpdHMpLlxuICogQ3JlYXRlcyBldmVudHMgZm9yIGFsbCBvcGVyYXRpb25zIGJ1dCBkb2VzIE5PVCBxdWV1ZSBzdGVwIG1lc3NhZ2VzOyByZXR1cm5zIHRoZSBwZW5kaW5nXG4gKiBzdGVwcyBzbyB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgd2hpY2ggdG8gZXhlY3V0ZSBpbmxpbmUgdnMgcXVldWUgdG8gYmFja2dyb3VuZC5cbiAqXG4gKiBQcm9jZXNzaW5nIG9yZGVyOlxuICogMS4gSG9va3MgYXJlIHByb2Nlc3NlZCBmaXJzdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIHdlYmhvb2sgcmVjZWl2ZXJzXG4gKiAyLiBTdGVwIGV2ZW50cyBhbmQgd2FpdCBldmVudHMgYXJlIGNyZWF0ZWQgaW4gcGFyYWxsZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN1c3BlbnNpb24oe1xuICBzdXNwZW5zaW9uLFxuICB3b3JsZCxcbiAgcnVuLFxuICBzcGFuLFxuICByZXF1ZXN0SWQsXG4gIGV2ZW50TG9nLFxuICBydW5SZWFkeUJhcnJpZXIsXG4gIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gIHN0ZXBEaXNwYXRjaCxcbiAgb3duZXJNZXNzYWdlSWQsXG4gIGFsbG93RGVmZXJyZWRCYXRjaFdvcmssXG59OiBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcyk6IFByb21pc2U8U3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQ+IHtcbiAgY29uc3QgcnVuSWQgPSBydW4ucnVuSWQ7XG5cbiAgLy8gVHVyYm8gbW9kZTogaG9sZCBldmVyeSB3b3JsZCB3cml0ZSBiZWxvdyB1bnRpbCB0aGUgYmFja2dyb3VuZGVkXG4gIC8vIGBydW5fc3RhcnRlZGAgaGFzICpzZXR0bGVkKiwgc28gd2UgbmV2ZXIgd3JpdGUgYSBzdGVwL2hvb2svd2FpdCBldmVudCBmb3IgYVxuICAvLyBydW4gdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQuIEEgbm8tb3Agb3V0c2lkZSB0dXJibyAoYmFycmllciB1bmRlZmluZWQpIGFuZFxuICAvLyBvbiB0aGUgcHVyZSBpbmxpbmUgaG90IHBhdGgsIHdoaWNoIGRlZmVycyBhbGwgc3RlcHMgYW5kIHdyaXRlcyBub3RoaW5nLlxuICAvLyBBd2FpdGluZyB0aGUgc2FtZSAodXN1YWxseSBhbHJlYWR5LXNldHRsZWQpIHByb21pc2UgbW9yZSB0aGFuIG9uY2UgaXMgY2hlYXAuXG4gIC8vIEEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvciBvcmRlcmluZyBvbmx5OiBpZiBgcnVuX3N0YXJ0ZWRgIHRydWx5XG4gIC8vIGZhaWxlZCB0aGUgcnVuIGRvZXMgbm90IGV4aXN0LCBzbyB0aGUgc3Vic2VxdWVudCB3cml0ZSBzdXJmYWNlcyB0aGUgcmVhbFxuICAvLyBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZSByZWRlbGl2ZXJzLlxuICBjb25zdCBlbnN1cmVSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBydW5SZWFkeUJhcnJpZXI7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSwgc2VlIGFib3ZlLlxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQXdhaXQgZXZlcnkgb3BlcmF0aW9uIGluIGEgc3VzcGVuc2lvbiBwaGFzZSBiZWZvcmUgbGV0dGluZyBhIGZhaWx1cmVcbiAgICogZXNjYXBlLCBwcmVmZXJyaW5nIGEgc3RhbGUtc25hcHNob3QgKDQxMikgcmVqZWN0aW9uIHdoZW4gb25lIG9jY3VycmVkLlxuICAgKlxuICAgKiBgUHJvbWlzZS5hbGxgIHJlamVjdHMgYXMgc29vbiBhcyBvbmUgb3BlcmF0aW9uIGRvZXMgYW5kIGxlYXZlcyBpdHMgc2libGluZ3NcbiAgICogaW4gZmxpZ2h0LiBUaGF0IG1hdHRlcnMgZm9yIGEgNDEyOiB0aGUgY2FsbGVyIHJlYWN0cyBieSByZWxvYWRpbmcgdGhlIGV2ZW50XG4gICAqIGxvZyBhbmQgcmVzdGFydGluZyB0aGUgcmVwbGF5LCBzbyBhIHNpYmxpbmcgY3JlYXRlIHRoYXQgbGFuZHMgYWZ0ZXIgdGhlXG4gICAqIHJlamVjdGlvbiBlc2NhcGVkIGNvbW1pdHMgYW4gZXZlbnQgd2hvc2UgY29ycmVsYXRpb24gaWQgY2FtZSBmcm9tIHRoZVxuICAgKiBhYmFuZG9uZWQgcmVwbGF5J3Mgc2VlZGVkIHNlcXVlbmNlIChhbiBldmVudCB0aGUgZnJlc2ggcmVwbGF5IG5ldmVyXG4gICAqIHByb2R1Y2VzKSwgYW5kIGl0IHJhY2VzIHRoZSByZXN0YXJ0J3MgcmVsb2FkIHdoaWxlIGRvaW5nIHNvLiBTZXR0bGluZyBmaXJzdFxuICAgKiBtYWtlcyB0aGlzIHBoYXNlJ3Mgd3JpdGUgc2V0IGZpbmFsIGJlZm9yZSB0aGUgY2FsbGVyIGFjdHMgb24gdGhlIGZhaWx1cmUuXG4gICAqIEl0IG1pcnJvcnMgdGhlIHJ1bnRpbWUncyBpbmxpbmUgc3RlcCBjbGFpbSwgd2hpY2ggc2V0dGxlcyB0aGUgaW4tZmxpZ2h0XG4gICAqIHN0ZXAgZXhlY3V0aW9ucyBiZWZvcmUgZXNjYWxhdGluZyBhIDQxMi5cbiAgICpcbiAgICogQSA0MTIgaXMgcHJlZmVycmVkIG92ZXIgYW55IG90aGVyIHJlamVjdGlvbiBpbiB0aGUgc2FtZSBwaGFzZSBiZWNhdXNlIGl0XG4gICAqIGhhcyBhIGRlZmluZWQsIGNoZWFwIHJlY292ZXJ5IChyZXBsYXkgZnJvbSBhIGNvcnJlY3RlZCBsb2cpIHdoaWxlIHRoZVxuICAgKiBvdGhlcnMgZG8gbm90LiBBIGRldGVybWluaXN0aWMgZmFpbHVyZSBzdWNoIGFzIGFuIGF0dHJpYnV0ZS12YWxpZGF0aW9uXG4gICAqIGBGYXRhbEVycm9yYCByZWN1cnMgb24gdGhlIHJlc3RhcnQgYW5kIGZhaWxzIHRoZSBydW4gdGhlbiwgYXQgdGhlIGNvc3Qgb2ZcbiAgICogb25lIGV4dHJhIHJlcGxheS5cbiAgICovXG4gIGNvbnN0IHNldHRsZVBoYXNlID0gYXN5bmMgKG9wczogUHJvbWlzZTx1bmtub3duPltdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVhc29ucyA9IChhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQob3BzKSlcbiAgICAgIC5maWx0ZXIoKHIpOiByIGlzIFByb21pc2VSZWplY3RlZFJlc3VsdCA9PiByLnN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICAgIC5tYXAoKHIpID0+IHIucmVhc29uKTtcbiAgICBpZiAocmVhc29ucy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aHJvdyByZWFzb25zLmZpbmQoKHIpID0+IFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHIpKSA/PyByZWFzb25zWzBdO1xuICB9O1xuXG4gIC8vIEV2ZXJ5IHN1c3BlbnNpb24gd3JpdGUgY2FycmllcyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5IG9uIHRoZSBmaXJzdCBvbmVcbiAgLy8gdGhhdCBjb21taXRzIGFmdGVyIHJlcGxheSByZWNvdmVyZWQuIEFsbCBzdXNwZW5zaW9uIGV2ZW50cyBhcmVcbiAgLy8gbm9uLXJ1bl9jcmVhdGVkIGV2ZW50cyBvbiB0aGlzIHJ1bidzIGBydW5JZGAuXG4gIGNvbnN0IHJlcG9ydGVyID0gcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA/PyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmluZXJ0KCk7XG4gIGNvbnN0IGNyZWF0ZUV2ZW50ID0gKGRhdGE6IENyZWF0ZUV2ZW50UmVxdWVzdCwgcGFyYW1zPzogQ3JlYXRlRXZlbnRQYXJhbXMpID0+XG4gICAgcmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKHBhcmFtcywgKHApID0+XG4gICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBkYXRhLCBwKVxuICAgICk7XG4gIC8vIEFkZHMgdGhlIG9wdGltaXN0aWMtY29uY3VycmVuY3kgZ3VhcmQgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIGEgbG9hZGVkXG4gIC8vIGV2ZW50IGxvZzsgd2l0aG91dCBvbmUgaXQgY3JlYXRlcyBkaXJlY3RseSAoY2FsbGVycyB3aXRoIG5vIHJlcGxheVxuICAvLyBzbmFwc2hvdCwgZS5nLiB0ZXN0cykuIEEgc3RhbGUgKDQxMikgcmVqZWN0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlcixcbiAgLy8gd2hpY2ggcmVzdGFydHMgdGhlIHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZy4gSXQgaXMgbm90IHJldHJpZWQgaGVyZSxcbiAgLy8gYmVjYXVzZSB0aGUgZXZlbnQncyBjb3JyZWxhdGlvbiBpZCB3YXMgbWludGVkIGJ5ICp0aGlzKiByZXBsYXkncyBzZWVkZWRcbiAgLy8gc2VxdWVuY2UsIHNvIHJlLWNvbW1pdHRpbmcgaXQgYWdhaW5zdCBhIGNvcnJlY3RlZCBsb2cgd291bGQgcGVyc2lzdCBhblxuICAvLyBldmVudCBubyBjb3JyZWN0IHJlcGxheSBwcm9kdWNlcy5cbiAgbGV0IHJlcG9ydGVkRXZlbnRzID0gMDtcbiAgLy8gV3JpdGVzIHRoaXMgc3VzcGVuc2lvbiBpc3N1ZWQsIGFuZCB3aGV0aGVyIG9uZSBvZiB0aGVtIGhhbmRlZCBiYWNrIGFcbiAgLy8gY29tcGxldGUgaW5saW5lIGRlbHRhIHRoYXQgd2FzIGZvbGRlZCBpbnRvIHRoZSBjYWxsZXIncyBsb2cuIFRvZ2V0aGVyIHRoZXlcbiAgLy8gYW5zd2VyIGBldmVudExvZ0NhcnJpZWRGb3J3YXJkYDogdGhlIGRlbHRhIGNvdmVycyB0aGUgbG9nIHVwIHRvIHRoZSB3cml0ZVxuICAvLyB0aGF0IHJldHVybmVkIGl0LCBzbyBpdCBhY2NvdW50cyBmb3IgZXZlcnkgZXZlbnQgdGhpcyBzdXNwZW5zaW9uIGNvbW1pdHRlZFxuICAvLyBvbmx5IGlmIHRoYXQgd3JpdGUgd2FzIHRoZSBvbmx5IG9uZS5cbiAgbGV0IGd1YXJkZWRXcml0ZXMgPSAwO1xuICBsZXQgZGVsdGFBYnNvcmJlZCA9IGZhbHNlO1xuICBjb25zdCBjcmVhdGVHdWFyZGVkOiBFdmVudENyZWF0b3IgPSBhc3luYyAoZGF0YSwgcGFyYW1zKSA9PiB7XG4gICAgZ3VhcmRlZFdyaXRlcysrO1xuICAgIGlmICghZXZlbnRMb2cpIHtcbiAgICAgIHJldHVybiBjcmVhdGVFdmVudChkYXRhLCBwYXJhbXMpO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSBldmVudExvZztcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChkYXRhLCB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICAuLi5zbG90U25hcHNob3RQYXJhbXMobG9nLmV2ZW50cyksXG4gICAgfSk7XG4gICAgLy8gQW4gaW5saW5lIGRlbHRhIHRoaXMgY2FsbCBhc2tlZCBmb3IgKGBzaW5jZUN1cnNvcmApIGlzIGV2ZXJ5dGhpbmcgdGhlXG4gICAgLy8gbG9nIGdhaW5lZCBzaW5jZSB0aGF0IGN1cnNvciwgdGhpcyB3cml0ZSBpbmNsdWRlZCwgc28gaXQgaXMgZm9sZGVkIG9udG9cbiAgICAvLyB0aGUgdGFpbCBhbmQgY2FycmllcyB0aGUgY3Vyc29yIHdpdGggaXQg4oCUIHVubGlrZSBhIHNraXBwZWQtc2xvdCByZXBvcnQsXG4gICAgLy8gd2hpY2ggaXMgYSB3aW5kb3cgc3RyaWN0bHkgYmVsb3cgdGhlIHdyaXRlIGFuZCBoYXMgdG8gYmUgc29ydGVkIGJhY2tcbiAgICAvLyBpbnRvIHBsYWNlLiBBIFdvcmxkIHJldHVybnMgb25lIG9yIHRoZSBvdGhlciwgbmV2ZXIgYm90aCAodGhlIGRlbHRhIGlzIGFcbiAgICAvLyBzdHJpY3Qgc3VwZXJzZXQpLCBzbyB0aGUgdHdvIGFyZSBoYW5kbGVkIGFwYXJ0IHJhdGhlciB0aGFuIG1lcmdlZC5cbiAgICAvL1xuICAgIC8vIERlY2xpbmluZyBpcyBhbHdheXMgc2FmZSDigJQgYW4gdW5hYnNvcmJlZCBkZWx0YSBpcyBvbmUgdGhlIG5leHQgcmVhZFxuICAgIC8vIHJldHVybnMg4oCUIHNvIHRoZSBndWFyZHMgbWF0Y2ggdGhlIHJlcGxheSBsb29wJ3MgYGFic29yYkNyZWF0ZURlbHRhYDogYVxuICAgIC8vIHRydW5jYXRlZCBwYWdlIChgaGFzTW9yZWApIGlzIGRyb3BwZWQgd2hvbGUgcmF0aGVyIHRoYW4gYWR2YW5jaW5nIHRoZVxuICAgIC8vIGN1cnNvciBwYXN0IGV2ZW50cyBpdCBkaWQgbm90IGNhcnJ5LCBhbmQgdGhlIGxvZyBtdXN0IHN0aWxsIGJlIHdoZXJlIHRoZVxuICAgIC8vIHJlcXVlc3Qgd2FzIGNvbXB1dGVkIGZyb20sIHNpbmNlIGFwcGVuZGluZyBkb2VzIG5vdCByZS1zb3J0LlxuICAgIGlmICh0eXBlb2YgcGFyYW1zPy5zaW5jZUN1cnNvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbG9nLmN1cnNvciA9PT0gcGFyYW1zLnNpbmNlQ3Vyc29yICYmXG4gICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZXN1bHQuaGFzTW9yZSAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIGFwcGVuZEV2ZW50TG9nKGxvZywgeyBldmVudHM6IHJlc3VsdC5ldmVudHMsIGN1cnNvcjogcmVzdWx0LmN1cnNvciB9KTtcbiAgICAgICAgZGVsdGFBYnNvcmJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IHRoZSB3cml0ZSBsYW5kZWQgYWJvdmUgdGhlIHNsb3QgaXQgYXNrZWQgZm9yLCBzbyB0aGVcbiAgICAvLyByZXBvcnQgaG9sZHMgdGhlIGV2ZW50cyBpdCB3YXMgZGVjaWRlZCB3aXRob3V0LiBBYnNvcmJpbmcgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGF0IGVhY2ggY2FsbCBzaXRlIG1lYW5zIHRoZSByZXN0IG9mIHRoaXMgcGhhc2UncyB3cml0ZXMgKHdoaWNoIHJlYWRcbiAgICAvLyB0aGUgc2FtZSBhcnJheSB0byBidWlsZCB0aGVpciBvd24gc25hcHNob3QpIGFzayBmb3IgYSBzbG90IGFib3ZlIHRoZW0sXG4gICAgLy8gYW5kIHRoZSByZXBsYXkgdGhhdCByZXN1bWVzIGZyb20gdGhpcyBsb2cgc2VlcyB0aGVtIHdpdGhvdXQgYSByZWxvYWQuXG4gICAgY29uc3QgcmVwb3J0ID0gYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQobG9nLmV2ZW50cywgcmVzdWx0KTtcbiAgICByZXBvcnRlZEV2ZW50cyArPSByZXBvcnQuYWRkZWQ7XG4gICAgaWYgKHJlcG9ydC50cnVuY2F0ZWQpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0Ryb3BwZWQgYSB0cnVuY2F0ZWQgc2tpcHBlZC1zbG90IHJlcG9ydCcsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgb2ZmZXJlZDogcmVwb3J0Lm9mZmVyZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcG9ydC5hZGRlZCA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gd3JpdGUgc2tpcHBlZCBvY2N1cGllZCBzbG90cycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgcmVwb3J0ZWQ6IHJlcG9ydC5hZGRlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBTZXBhcmF0ZSBxdWV1ZSBpdGVtcyBieSB0eXBlXG4gIGNvbnN0IHN0ZXBJdGVtcyA9IHN1c3BlbnNpb24uaXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzdGVwJ1xuICApO1xuICBjb25zdCBhbGxIb29rSXRlbXMgPSBzdXNwZW5zaW9uLml0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnaG9vaydcbiAgKTtcbiAgY29uc3Qgd2FpdEl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3dhaXQnXG4gICk7XG4gIGNvbnN0IGF0dHJpYnV0ZUl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnYXR0cmlidXRlJ1xuICApO1xuXG4gIGNvbnN0IGhvb2tzTmVlZGluZ0NyZWF0aW9uID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gIWl0ZW0uaGFzQ3JlYXRlZEV2ZW50XG4gICk7XG5cbiAgLy8gR3JvdXAgaG9vayBpdGVtcyB0aGF0IG5lZWQgd29yayBieSB0b2tlbiwgcHJlc2VydmluZyBxdWV1ZS1pbnNlcnRpb25cbiAgLy8gKHdvcmtmbG93IGNvZGUpIG9yZGVyIHdpdGhpbiBlYWNoIHRva2VuLiBPcGVyYXRpb25zIG9uIG9uZSB0b2tlbiBtdXN0XG4gIC8vIGFwcGx5IGluIGNvZGUgb3JkZXI6IGEgZGlzcG9zZSgpIG9mIGFuIGVhcmxpZXIgaG9vayByZWxlYXNlcyB0aGUgdG9rZW5cbiAgLy8gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkIChvdGhlcndpc2UgdGhlXG4gIC8vIG5ldyBob29rIHJlY29yZHMgYSBzcHVyaW91cyBob29rX2NvbmZsaWN0IGFnYWluc3QgdGhlIHJ1bidzIG93blxuICAvLyBkaXNwb3NlZCBob29rKSwgd2hpbGUgYSBob29rIGNyZWF0ZWQgYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGUgc2FtZVxuICAvLyBzdXNwZW5zaW9uIGlzIHN0aWxsIGNyZWF0ZWQgYmVmb3JlIGl0IGlzIGRpc3Bvc2VkLiBEaWZmZXJlbnQgdG9rZW5zXG4gIC8vIGhhdmUgbm8gY2xhaW0gaW50ZXJhY3Rpb24sIHNvIHRva2VuIGdyb3VwcyBhcmUgcHJvY2Vzc2VkIGluIHBhcmFsbGVsLlxuICBjb25zdCBob29rSXRlbXNCeVRva2VuID0gbmV3IE1hcDxzdHJpbmcsIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtW10+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhbGxIb29rSXRlbXMpIHtcbiAgICBpZiAoaXRlbS5oYXNDcmVhdGVkRXZlbnQgJiYgIWl0ZW0uZGlzcG9zZWQpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBhbHJlYWR5IGNvbW1pdHRlZCBhbmQgc3RpbGwgbGl2ZTogbm90aGluZyB0byBkb1xuICAgIH1cbiAgICBjb25zdCBncm91cCA9IGhvb2tJdGVtc0J5VG9rZW4uZ2V0KGl0ZW0udG9rZW4pO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va0l0ZW1zQnlUb2tlbi5zZXQoaXRlbS50b2tlbiwgW2l0ZW1dKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1blxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gIC8vIEdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbiBvbiB0aGUgcnVuJ3Mgc3BlY1ZlcnNpb24uXG4gIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcblxuICBsZXQgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCA9IDA7XG4gIGNvbnN0IHNlcmlhbGl6YXRpb25CbG9ja2VyczogU3VzcGVuc2lvblNlcmlhbGl6YXRpb25CbG9ja2VyW10gPSBbXTtcbiAgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlSW5wdXQoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgY29udGV4dDogUGljazxTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIsICdzb3VyY2UnIHwgJ2NvcnJlbGF0aW9uSWQnPlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWREYXRhPiB7XG4gICAgY29uc3Qgc3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0geyBleGVjdXRpb25zOiBbXSB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgIHN0YXRzXG4gICAgICApKSBhcyBTZXJpYWxpemVkRGF0YTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCArPVxuICAgICAgICBzdGF0cy50b3RhbEV4ZWN1dGlvbnMgPz8gc3RhdHMuZXhlY3V0aW9ucy5sZW5ndGg7XG4gICAgICBzZXJpYWxpemF0aW9uQmxvY2tlcnMucHVzaChcbiAgICAgICAgLi4uc3RhdHMuZXhlY3V0aW9uc1xuICAgICAgICAgIC5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQgLSBzZXJpYWxpemF0aW9uQmxvY2tlcnMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGV4ZWN1dGlvbikgPT4gKHsgLi4uY29udGV4dCwgLi4uZXhlY3V0aW9uIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkaXNwb3NlSG9vayhcbiAgICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhvb2tEaXNwb3NlZEV2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICBldmVudFR5cGU6ICdob29rX2Rpc3Bvc2VkJyBhcyBjb25zdCxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICB9LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoaG9va0Rpc3Bvc2VkRXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAvLyBIb29rIHdhcyBhbHJlYWR5IGRpc3Bvc2VkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uLCBzYWZlIHRvIHNraXBcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdIb29rIGFscmVhZHkgZGlzcG9zZWQsIHNraXBwaW5nIGR1cGxpY2F0ZSBkaXNwb3NhbCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGhvb2sgZGlzcG9zYWwnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgLy8gSG9vayBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb3IgbmV2ZXIgY3JlYXRlZFxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgbm90IGZvdW5kIGZvciBkaXNwb3NhbCwgY29udGludWluZycsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBob29rcyBmaXJzdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIHdlYmhvb2sgcmVjZWl2ZXJzLlxuICAvLyBUcmFjayBhbnkgaG9vayBjb25mbGljdHMgdGhhdCBvY2N1ciDigJQgdGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgc29cbiAgLy8gaXQgY2FuIGFkdmFuY2UgdGhlIHdvcmtmbG93IG92ZXIgdGhlIGNvbW1pdHRlZCBgaG9va19jb25mbGljdGAgYmVmb3JlXG4gIC8vIGFueXRoaW5nIGVsc2UgdGhpcyBzdXNwZW5zaW9uIHNjaGVkdWxlZCBydW5zLlxuICBjb25zdCBob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGhvb2tDcmVhdGlvbk1zID0gMDtcblxuICAvLyBBc2sgdGhlIGhvb2sgY3JlYXRlIGZvciB0aGUgZXZlbnQtbG9nIGRlbHRhIHNpbmNlIHRoZSBjdXJzb3IgdGhlIGNhbGxlcidzXG4gIC8vIGxvZyB3YXMgcmVhZCBhdC4gVGhlIGhvb2sncyBhd2FpdGVycyBhcmUgc2V0dGxlZCBieSB0aGUgZXZlbnQgdGhpcyB3cml0ZVxuICAvLyBjb21taXRzIGFuZCBieSBub3RoaW5nIGVsc2Ug4oCUIGEgYGhvb2tfY3JlYXRlZGAgZm9yIGEgY2xlYW4gcmVnaXN0cmF0aW9uLFxuICAvLyBhIGBob29rX2NvbmZsaWN0YCB3aGVuIHRoZSB0b2tlbiB3YXMgYWxyZWFkeSBjbGFpbWVkIOKAlCBzbyB0aGUgY2FsbGVyIGNhblxuICAvLyBjb250aW51ZSB0aGUgd29ya2Zsb3cgaW4gaXRzIG93biBwcm9jZXNzIG9uIGVpdGhlciBvdXRjb21lLCBidXQgb25seSBvdmVyXG4gIC8vIGEgbG9nIHRoYXQgaG9sZHMgdGhhdCBldmVudCwgYW5kIHRoaXMgd3JpdGUgaXMgdGhlIG9uZSByZXF1ZXN0IHRoYXQgY2FuXG4gIC8vIGhhbmQgaXQgYmFjayB0b2dldGhlciB3aXRoIGFueXRoaW5nIGFub3RoZXIgd3JpdGVyIGxhbmRlZCBpbiB0aGUgbWVhbnRpbWUuXG4gIC8vIE9wdGlvbmFsIGJ5IGNvbnRyYWN0OiBhIFdvcmxkIHRoYXQgaWdub3JlcyBgc2luY2VDdXJzb3JgIHJldHVybnMgbm8gZGVsdGFcbiAgLy8gYW5kIHRoZSBjYWxsZXIgcmVhZHMgaW5zdGVhZC5cbiAgLy9cbiAgLy8gQXNrZWQgZm9yIG9uIHRoZSBzaW5nbGUtaG9vayBzdXNwZW5zaW9uIG9ubHkuIFR3byBjcmVhdGVzIGlzc3VlZCBmcm9tIG9uZVxuICAvLyBzbmFwc2hvdCBlYWNoIGRpZmYgYWdhaW5zdCB0aGUgc2FtZSBjdXJzb3IsIGFuZCBvbmx5IHRoZSBmaXJzdCBkZWx0YSBiYWNrXG4gIC8vIGNhbiBiZSBmb2xkZWQgaW4gKHRoZSBjdXJzb3IgbW92ZXMgd2l0aCBpdCksIHNvIHRoZSBsb2cgd291bGQgZW5kIHVwIHNob3J0XG4gIC8vIG9mIHRoZSBvdGhlcidzIGV2ZW50IHdpdGggbm90aGluZyB0byBzYXkgc28uXG4gIGNvbnN0IGhvb2tEZWx0YUN1cnNvciA9XG4gICAgaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoID09PSAxICYmIHR5cGVvZiBldmVudExvZz8uY3Vyc29yID09PSAnc3RyaW5nJ1xuICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmIChob29rSXRlbXNCeVRva2VuLnNpemUgPiAwKSB7XG4gICAgY29uc3QgaG9va1BoYXNlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgYXdhaXQgc2V0dGxlUGhhc2UoXG4gICAgICBbLi4uaG9va0l0ZW1zQnlUb2tlbi52YWx1ZXMoKV0ubWFwKGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgIGxldCBjcmVhdGlvbkNvbmZsaWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgaG9va01ldGFkYXRhID1cbiAgICAgICAgICAgICAgdHlwZW9mIHF1ZXVlSXRlbS5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogYXdhaXQgZGVoeWRyYXRlSW5wdXQocXVldWVJdGVtLm1ldGFkYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hvb2tfbWV0YWRhdGEnLFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaG9va0V2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDogcXVldWVJdGVtLnRva2VuUmV0ZW50aW9uVW50aWwsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBpc1dlYmhvb2s6IHF1ZXVlSXRlbS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5pc1N5c3RlbSAmJiB7IGlzU3lzdGVtOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUhvb2tFdmVudCh7XG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBob29rRXZlbnQsXG4gICAgICAgICAgICAgIHF1ZXVlSXRlbSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBzaW5jZUN1cnNvcjogaG9va0RlbHRhQ3Vyc29yLFxuICAgICAgICAgICAgICBjcmVhdGVFdmVudDogY3JlYXRlR3VhcmRlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMucHVzaChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkcy5wdXNoKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyZWF0aW9uQ29uZmxpY3RlZCA9IHJlc3VsdC5oYXNIb29rQ29uZmxpY3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGlzcG9zZSBhZnRlciBjcmVhdGlvbiBmb3IgaG9va3MgYm9ybiBhbmQgZGlzcG9zZWQgd2l0aGluIHRoaXNcbiAgICAgICAgICAvLyBiYXRjaC4gQSBob29rIHdob3NlIGNyZWF0aW9uIGNvbmZsaWN0ZWQgd2FzIG5ldmVyIGNyZWF0ZWQsIHNvXG4gICAgICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBkaXNwb3NlLlxuICAgICAgICAgIGlmIChxdWV1ZUl0ZW0uZGlzcG9zZWQgJiYgIWNyZWF0aW9uQ29uZmxpY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgZGlzcG9zZUhvb2socXVldWVJdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICBob29rQ3JlYXRpb25NcyA9IERhdGUubm93KCkgLSBob29rUGhhc2VTdGFydDtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgYWJvcnQgcmVxdWVzdHM6IHJlc3VtZSB0aGUgaG9vayB3aXRoIGFib3J0IHBheWxvYWQgYW5kIHdyaXRlIHN0cmVhbSBwYWNrZXRcbiAgY29uc3QgaG9va3NOZWVkaW5nQWJvcnQgPSBhbGxIb29rSXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiBpdGVtLmFib3J0UmVxdWVzdGVkICYmICFpdGVtLmRpc3Bvc2VkXG4gICk7XG5cbiAgaWYgKGhvb2tzTmVlZGluZ0Fib3J0Lmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgIGF3YWl0IHNldHRsZVBoYXNlKFxuICAgICAgaG9va3NOZWVkaW5nQWJvcnQubWFwKGFzeW5jIChxdWV1ZUl0ZW0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgICBjb25zdCBhYm9ydFBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVJbnB1dChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBxdWV1ZUl0ZW0uYWJvcnRSZWFzb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzb3VyY2U6ICdob29rX2Fib3J0JyxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBob29rX3JlY2VpdmVkIGV2ZW50IHdpdGggYWJvcnQgcGF5bG9hZFxuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoe1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICB0b2tlbjogcXVldWVJdGVtLnRva2VuLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gV3JpdGUgc3RyZWFtIGNhbmNlbGxhdGlvbiBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwIHByb3BhZ2F0aW9uLlxuICAgICAgICAgIC8vIFJldXNlIHRoZSBzYW1lIGRlaHlkcmF0ZWQgcGF5bG9hZCBhcyB0aGUgaG9vayBldmVudCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgLy8gcm91bmQtdHJpcHMgdGhyb3VnaCBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgLyBgaHlkcmF0ZVN0ZXBBcmd1bWVudHNgXG4gICAgICAgICAgLy8gKGhhbmRsZXMgRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBlbmNyeXB0aW9uLCBldGMuKSBpbnN0ZWFkIG9mXG4gICAgICAgICAgLy8gYmFyZSBKU09OLnN0cmluZ2lmeSB3aGljaCBsb3NlcyB0eXBlIGluZm9ybWF0aW9uIGFuZCBkcm9wcyB1bmRlZmluZWQuXG4gICAgICAgICAgLy8gc3RyZWFtTmFtZSBpcyBzZXQgb24gdGhlIHF1ZXVlIGl0ZW0gYXQgY29udHJvbGxlciBjb25zdHJ1Y3Rpb24gdGltZVxuICAgICAgICAgIC8vIChzZWUgd29ya2Zsb3cvYWJvcnQtY29udHJvbGxlci50cykuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkRnJvbVRva2VuKHF1ZXVlSXRlbS50b2tlbik7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZSxcbiAgICAgICAgICAgICAgYWJvcnRQYXlsb2FkIGFzIFVpbnQ4QXJyYXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZTogaG9vayBldmVudCBwcm92aWRlcyB0aGUgZHVyYWJsZSBmYWxsYmFja1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0LCBob29rIGV2ZW50IHdpbGwgcHJvdmlkZSBmYWxsYmFjaycsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgYWJvcnQnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBzdGVwIGV2ZW50cyBmb3Igc3RlcHMgdGhhdCBkb24ndCBoYXZlIHRoZW0geWV0LlxuICAvLyBVbmxpa2UgVjEsIHdlIGRvIE5PVCBxdWV1ZSBzdGVwIG1lc3NhZ2VzIGZyb20gaGVyZTogdGhlIGNhbGxlclxuICAvLyBkZWNpZGVzIHdoaWNoIHN0ZXBzIHRvIGV4ZWN1dGUgaW5saW5lIHZzLiBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICAvLyBXYWl0IGV2ZW50cyBhcmUgYWxzbyBjcmVhdGVkIGluIHBhcmFsbGVsIGJlbG93LlxuICBjb25zdCBzdGVwc05lZWRpbmdDcmVhdGlvbiA9IG5ldyBTZXQoXG4gICAgc3RlcEl0ZW1zXG4gICAgICAuZmlsdGVyKChxdWV1ZUl0ZW0pID0+ICFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KVxuICAgICAgLm1hcCgocXVldWVJdGVtKSA9PiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZClcbiAgKTtcblxuICAvLyBDb3JyZWxhdGlvbiBJRHMgZm9yIHdoaWNoIFRISVMgc3VzcGVuc2lvbiBjYWxsIGFjdHVhbGx5IHdyb3RlIHRoZVxuICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnQuIFBvcHVsYXRlZCBieSB0aGUgb3BzIGJlbG93IGFmdGVyIGEgc3VjY2Vzc2Z1bFxuICAvLyBldmVudHMuY3JlYXRlLCB1c2VkIGJ5IHRoZSBjYWxsZXIgdG8gY2xhaW0gb3duZXJzaGlwIGFuZCBhdm9pZFxuICAvLyByYWNpbmcgd2l0aCBjb25jdXJyZW50IGhhbmRsZXJzIG9uIHN0ZXAgZXhlY3V0aW9uLlxuICBjb25zdCBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIGZpbmFsaXplZCBhcyBmYWlsZWQgYmVjYXVzZSB0aGVpciBhcmd1bWVudHNcbiAgLy8gcmVmdXNlZCB0byBzZXJpYWxpemU6IHNlZSBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcCBiZWxvdy5cbiAgY29uc3QgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEEgc3RlcCB3aG9zZSBhcmd1bWVudHMgZmFpbCB0byBzZXJpYWxpemUgaXMgZGV0ZXJtaW5pc3RpYzogZXZlcnkgcmVwbGF5XG4gICAqIHJlLWRlcml2ZXMgdGhlIHNhbWUgdW5zZXJpYWxpemFibGUgdmFsdWUsIHNvIHJlZGVsaXZlcmluZyB0aGVcbiAgICogb3JjaGVzdHJhdG9yIG1lc3NhZ2UgY2FuIG5ldmVyIHN1Y2NlZWQuIEluc3RlYWQgb2YgcmVqZWN0aW5nIHRoZSB3aG9sZVxuICAgKiBzdXNwZW5zaW9uICh3aGljaCBmYWlscyB0aGUgcnVuIGZyb20gdGhlIG91dHNpZGUsIHdoZXJlIG5vIHVzZXIgY29kZSBjYW5cbiAgICogb2JzZXJ2ZSBpdCksIHRyZWF0IGl0IGV4YWN0bHkgbGlrZSBhIHN0ZXAtYm9keSBmYWlsdXJlOiB3cml0ZVxuICAgKiBgc3RlcF9jcmVhdGVkYCB3aXRoIGEgcGxhY2Vob2xkZXIgaW5wdXQgKGV2ZXJ5IFdvcmxkIHJlcXVpcmVzIHRoZSBzdGVwXG4gICAqIGVudGl0eSB0byBleGlzdCBiZWZvcmUgYSB0ZXJtaW5hbCBzdGVwIGV2ZW50LCBhbmQgdGhlIHJlYWwgaW5wdXQgaXNcbiAgICogcHJlY2lzZWx5IHdoYXQgcmVmdXNlZCB0byBzZXJpYWxpemUpIGZvbGxvd2VkIGJ5IGBzdGVwX2ZhaWxlZGAgY2FycnlpbmdcbiAgICogdGhlIFNlcmlhbGl6YXRpb25FcnJvci4gVGhlIG5leHQgcmVwbGF5IHJlamVjdHMgdGhlIHN0ZXAncyBwcm9taXNlIHdpdGhcbiAgICogaXQsIHNvIGEgdHJ5L2NhdGNoIGFyb3VuZCB0aGUgc3RlcCBjYWxsIG9ic2VydmVzIHRoZSBlcnJvcjsgdW5jYXVnaHQsIGl0XG4gICAqIHByb3BhZ2F0ZXMgb3V0IG9mIHRoZSB3b3JrZmxvdyBib2R5IGFuZCBmYWlscyB0aGUgcnVuIGFzIGEgVVNFUl9FUlJPUixcbiAgICogd2l0aG91dCBidXJuaW5nIHF1ZXVlIHJlZGVsaXZlcmllcyBlaXRoZXIgd2F5LlxuICAgKi9cbiAgY29uc3QgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXAgPSBhc3luYyAoXG4gICAgcXVldWVJdGVtOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgICBlcnJvcjogU2VyaWFsaXphdGlvbkVycm9yXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICdTdGVwIGFyZ3VtZW50cyBmYWlsZWQgdG8gc2VyaWFsaXplOyBmYWlsaW5nIHRoZSBzdGVwIHNvIHRoZSAnICtcbiAgICAgICAgJ3dvcmtmbG93IGNhbiBvYnNlcnZlIHRoZSBlcnJvcicsXG4gICAgICB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9XG4gICAgKTtcbiAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgIC8vIE1hcmtlciBwbGFjZWhvbGRlciAobm90IGVtcHR5IGFyZ3MpOiBieXRlLWlkZW50aWNhbC10by16ZXJvLWFyZ3Mgd291bGRcbiAgICAvLyBtYWtlIGB3b3JrZmxvdyBpbnNwZWN0IHN0ZXBzYCBzaG93IFwibm8gYXJndW1lbnRzXCIgZm9yIHRoZSBvbmUgc3RlcFxuICAgIC8vIHdob3NlIGVudGlyZSBwcm9ibGVtIHdhcyBpdHMgYXJndW1lbnRzLlxuICAgIGNvbnN0IHBsYWNlaG9sZGVySW5wdXQgPSAoYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgIHVuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIoKSxcbiAgICAgIHJ1bklkLFxuICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgIGZhbHNlLFxuICAgICAgY29tcHJlc3Npb25cbiAgICApKSBhcyBTZXJpYWxpemVkRGF0YTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBwbGFjZWhvbGRlcklucHV0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoY3JlYXRlRXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhjcmVhdGVFcnIpKSB7XG4gICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIGFscmVhZHkgY3JlYXRlZCB0aGUgc3RlcDogdGhlIGZhaWx1cmUgaXNcbiAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYywgc28gaXQgaXMgcmFjaW5nIHRvd2FyZCB0aGUgc2FtZSBzdGVwX2ZhaWxlZCBiZWxvdy5cbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdTdGVwIGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIG1lc3NhZ2U6IGNyZWF0ZUVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGNyZWF0ZUVycikpIHtcbiAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQ6IG5vdGhpbmcgdG8gb2JzZXJ2ZSB0aGUgZmFpbHVyZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlRXJyO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyBhcyBjb25zdCxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGl0c2VsZiBpcyBhIHBsYWluIFdvcmtmbG93RXJyb3IgKG5hbWUsIG1lc3NhZ2Ugd2l0aFxuICAgICAgICAgICAgLy8gZnJhbWVkIGhpbnQsIGNhdXNlIGNoYWluKSwgc2VyaWFsaXphYmxlIGV2ZW4gdGhvdWdoIHRoZSBzdGVwXG4gICAgICAgICAgICAvLyBpbnB1dCB3YXMgbm90LiBFcnJvciBkZXRlY3Rpb24gaXMgcmVhbG0taW5kZXBlbmRlbnRcbiAgICAgICAgICAgIC8vICh0eXBlcy5pc05hdGl2ZUVycm9yKSwgc28gdGhlIGhvc3QtY3JlYXRlZCBlcnJvciBzZXJpYWxpemVzXG4gICAgICAgICAgICAvLyB0aGUgc2FtZSB1bmRlciBlaXRoZXIgZ2xvYmFsOyB0aGUgVk0gZ2xvYmFsIGlzIHBhc3NlZCBmb3JcbiAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IHdpdGggZXZlcnkgb3RoZXIgZGVoeWRyYXRpb24gaW4gdGhpcyBmaWxlIGFuZCBzb1xuICAgICAgICAgICAgLy8gYW55IFZNLXJlYWxtIHZhbHVlcyBndWVzdCBjb2RlIHRocmV3IGludG8gdGhlIGNhdXNlIGNoYWluXG4gICAgICAgICAgICAvLyAoZ2V0dGVycy9wcm94aWVzIGV4ZWN1dGVkIGR1cmluZyB0aGUgZmFpbGVkIGRlaHlkcmF0aW9uKSBhcmVcbiAgICAgICAgICAgIC8vIGRldGVjdGVkIGJ5IHRoZSByZWFsbS1zZW5zaXRpdmUgcmVkdWNlcnMuXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBzdXNwZW5zaW9uLmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICAgIC8vIFN0ZXAgYWxyZWFkeSB0ZXJtaW5hbCAoYSBjb25jdXJyZW50IGhhbmRsZXIgd3JvdGUgdGhlIHNhbWVcbiAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBmYWlsdXJlKSBvciB0aGUgcnVuIGFscmVhZHkgZmluaXNoZWQuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBvciBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogZmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICB9XG4gICAgfVxuICAgIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgIC8vIFJlbGVhc2UgdGhlIGlubGluZSBzbG90IGJvb2trZWVwaW5nOiB0aGUgc3RlcCBuZXZlciBydW5zLCBzbyBpdCBtdXN0XG4gICAgLy8gbm90IGFwcGVhciBpbiB0aGUgcmVidWlsdCBgbGF6eUlubGluZVN0ZXBzYC4gKEl0cyBzbG90IGluIHRoZSBmaXJzdC1OXG4gICAgLy8gc2VsZWN0aW9uIGFuZCBpbiBgaW5saW5lUGFpckZvbGRFbGlnaWJsZWAncyBjb3VudCB3YXMgY29uc3VtZWRcbiAgICAvLyBiZWZvcmUgZGVoeWRyYXRpb24gY291bGQgcmV2ZWFsIHRoZSBmYWlsdXJlLCBpbmhlcmVudCB0byBzZWxlY3RpbmdcbiAgICAvLyBiZWZvcmUgc2VyaWFsaXppbmcsIGFuZCBib3VuZGVkIHRvIG9uZSB3YXN0ZWQgc2xvdCBvbiBhIHBhc3MgdGhhdFxuICAgIC8vIGVuZHMgaW4gYSBmb3JjZWQgcmVwbGF5IGFueXdheS4pXG4gICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLmRlbGV0ZShxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gIH07XG5cbiAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IGRlZmVyIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yIHVwIHRvXG4gIC8vIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyB0aGUgY2FsbGVyIHdpbGwgcnVuIGlubGluZSAoaW4gcGFyYWxsZWwpLiBFYWNoXG4gIC8vIHN0ZXAgaXMgY3JlYXRlZCBvbiB0aGUgZmx5IGJ5IHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV4ZWN1dGVTdGVwIHNlbmRzXG4gIC8vIChzYXZpbmcgYSByb3VuZC10cmlwIHBlciBzdGVwKS4gV2UgbmV2ZXIgZGVmZXIgd2hlbiBhIGBob29rLmdldENvbmZsaWN0KClgXG4gIC8vIGF3YWl0ZXIgaXMgcHJlc2VudCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIGNhbGxlciBleGVjdXRlcyBub3RoaW5nIGlubGluZVxuICAvLyAoaXQgY29udGludWVzIHRoZSB3b3JrZmxvdyB0byByZXNvbHZlIHRoZSBhd2FpdGVyIGluc3RlYWQpLCBzbyBkZWZlcnJpbmdcbiAgLy8gd291bGQgbGVhdmUgdGhlIHN0ZXBzIHVuY3JlYXRlZCBhbmQgdW5xdWV1ZWQuIFdlIHBpY2sgdGhlIGZpcnN0IE4gdW5jcmVhdGVkXG4gIC8vIHN0ZXBzIOKAlCBtYXRjaGluZyB0aGUgY2FsbGVyJ3MgaW5saW5lLWNhbmRpZGF0ZSBzZWxlY3Rpb24g4oCUIGFuZCBkZWh5ZHJhdGVcbiAgLy8gdGhlaXIgaW5wdXQgaGVyZSBzbyBleGVjdXRlU3RlcCBjYW4gc2hpcCBpdCBhcyB0aGUgc3RlcF9zdGFydGVkIHBheWxvYWQuXG4gIGNvbnN0IGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPihcbiAgICBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBzdGVwSXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMoaXRlbS5jb3JyZWxhdGlvbklkKSlcbiAgICAgICAgICAuc2xpY2UoMCwgZ2V0TWF4SW5saW5lU3RlcHMoKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmNvcnJlbGF0aW9uSWQpXG4gICAgICA6IFtdXG4gICk7XG4gIC8vIENvbGxlY3RlZCBieSBjb3JyZWxhdGlvbklkIGJlY2F1c2UgdGhlIHBlci1zdGVwIG9wcyBiZWxvdyBydW4gY29uY3VycmVudGx5XG4gIC8vIGFuZCBzZXR0bGUgb3V0IG9mIG9yZGVyLiBXZSByZWJ1aWxkIHRoZSBhcnJheSBpbiBkZXRlcm1pbmlzdGljXG4gIC8vIGBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHNgIG9yZGVyICh0aGUgb3JkZXJlZCBzbGljZSBhYm92ZSkgYWZ0ZXIgdGhlIG9wc1xuICAvLyBzZXR0bGUsIHNvIHRoZSBpbmxpbmUgYmF0Y2ggb3JkZXIgaXMgc3RhYmxlIHJlZ2FyZGxlc3Mgb2YgZGVoeWRyYXRpb24gdGltaW5nLlxuICBjb25zdCBsYXp5SW5saW5lQnlDb3JyZWxhdGlvbklkID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddW251bWJlcl1cbiAgPigpO1xuXG4gIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHdob3NlIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2Ugd2FzIGFscmVhZHlcbiAgLy8gcHVibGlzaGVkIGJ5IHRoZSByZXNpbGllbnQtZGlzcGF0Y2ggb3BzIGJlbG93IChhbG9uZ3NpZGUgdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyB3cml0ZSkuIFJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgc28gaXRzIGRpc3BhdGNoIHBhc3Mgc2tpcHMgdGhlbS5cbiAgY29uc3QgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApLiBBbGwgbXVzdCBob2xkOlxuICAvL1xuICAvLyAgLSBUaGUgY2FsbGVyIHByb3ZpZGVkIGEgZGlzcGF0Y2ggdGFyZ2V0IChgc3RlcERpc3BhdGNoYCk6IHRlcm1pbmFsXG4gIC8vICAgIGRyYWlucyBhbmQgb3RoZXIgY3JlYXRlLW9ubHkgY2FsbGVycyBuZXZlciBxdWV1ZS5cbiAgLy8gIC0gVGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAoYFdPUktGTE9XX1JFU0lMSUVOVF9TVEVQX0RJU1BBVENIYCBvcHQtaW4pLlxuICAvLyAgICBJdCBpcyBvZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBwdWJsaXNoIHJhY2VzIHRoZSBjcmVhdGUncyB2ZXJkaWN0LFxuICAvLyAgICBhbmQgYSBjcmVhdGUgY2FuIGNvbWUgYmFjayByZWZ1c2VkOiBhcyBhIGR1cGxpY2F0ZSB0aGUgcmVwbGF5IHNob3VsZFxuICAvLyAgICBzdG9wIHB1cnN1aW5nLCBvciAob24gYSBXb3JsZCB0aGF0IHdvdWxkIHJhdGhlciByZWZ1c2UgYSBzdGFsZSB3cml0ZVxuICAvLyAgICB0aGFuIHJlcG9ydCB3aGF0IGl0IG1pc3NlZCkgYXMgYSA0MTIuIEVpdGhlciB3YXkgdGhlIHF1ZXVlIG1lc3NhZ2VcbiAgLy8gICAgY2FycnlpbmcgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBvdXQsIGFuZCB0aGUgY29uc3VtZXIgY2FuIG1hdGVyaWFsaXplIGFcbiAgLy8gICAgc3RlcCB3aG9zZSBjcmVhdGUgd2FzIHJlZnVzZWQuIE5vdGhpbmcgb3JkZXJzIHRoYXQgdmVyZGljdCBiZWZvcmUgdGhlXG4gIC8vICAgIGNvbnN1bWVyJ3MgcmVkZWxpdmVyeSByZS1lbnN1cmUsIHNvIG5vIGJhY2tlbmQtc2lkZSByZXZvY2F0aW9uXG4gIC8vICAgIGJvb2trZWVwaW5nIGNhbiBjbG9zZSB0aGUgd2luZG93OiBhIGJlc3QtZWZmb3J0IG1hcmtlciB0aGF0IGZhaWxzIG9wZW5cbiAgLy8gICAgY2Fubm90IGNhcnJ5IGEgY29ycmVjdG5lc3MgcHJvcGVydHkuIFRoZSBzZXF1ZW50aWFsIHBhdGggaXMgdGhlIG9ubHlcbiAgLy8gICAgdGhpbmcgdGhhdCBnaXZlcyB0aGUgbWVzc2FnZSBhIGhhcHBlbnMtYWZ0ZXIgZWRnZSBvdmVyIHRoZSB2ZXJkaWN0LlxuICAvLyAgLSBUaGUgcnVuJ3MgcXVldWUgdHJhbnNwb3J0IHByZXNlcnZlcyBiaW5hcnkgcGF5bG9hZHMgKENCT1IsXG4gIC8vICAgIHNwZWNWZXJzaW9uID49IDMpOiBgc3RlcElucHV0LmlucHV0YCBpcyB0aGUgc2VyaWFsaXplZCAocG9zc2libHlcbiAgLy8gICAgZW5jcnlwdGVkKSBpbnB1dCBieXRlcywgd2hpY2ggdGhlIEpTT04gdHJhbnNwb3J0IHdvdWxkIG1hbmdsZS5cbiAgY29uc3QgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSA9XG4gICAgc3RlcERpc3BhdGNoICE9PSB1bmRlZmluZWQgJiZcbiAgICBpc1Jlc2lsaWVudFN0ZXBEaXNwYXRjaEVuYWJsZWQoKSAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUO1xuXG4gIC8vIEJhdGNoZWQgZmFuLW91dDogZm9sZCB0aGlzIHN1c3BlbnNpb24ncyBzdGVwX2NyZWF0ZWQgKyB3YWl0X2NyZWF0ZWRcbiAgLy8gd3JpdGVzIGludG8gb25lIGBldmVudHMuY3JlYXRlQmF0Y2hgIGNhbGwgKG9uZSBkdXJhYmxlIHdyaXRlLCBwZXItZXZlbnRcbiAgLy8gb3V0Y29tZXMpIGluc3RlYWQgb2Ygb25lIHdyaXRlIHBlciBldmVudC4gRW5nYWdlcyBvbmx5IGZvciBhIENMRUFOXG4gIC8vIGZhbi1vdXQgKG5vIGF0dHJpYnV0ZSB3cml0ZXMsIG5vIGhvb2sgd3JpdGVzLCBubyByZXNpbGllbnQgZGlzcGF0Y2hcbiAgLy8gd2hvc2UgY3JlYXRlcyBhcmUgZWFjaCBwYWlyZWQgd2l0aCBhIHF1ZXVlIHB1Ymxpc2gpIG9uIGEgV29ybGQgdGhhdFxuICAvLyBpbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBtZXRob2QgYW5kIGEgcnVuIHdob3NlIGV2ZW50cyBhcmUgc2xvdC1udW1iZXJlZC5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBnYXRlIGtlZXBzIHRoZSBzaW5nbGUtZXZlbnQgcGF0aCBieXRlLWZvci1ieXRlLlxuICBjb25zdCBiYXRjaEZhbm91dEVsaWdpYmxlID1cbiAgICBpc0JhdGNoVHJhbnNpdGlvbnNFbmFibGVkKCkgJiZcbiAgICB0eXBlb2Ygd29ybGQuZXZlbnRzLmNyZWF0ZUJhdGNoID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHJ1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSAmJlxuICAgICFyZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlICYmXG4gICAgYWxsSG9va0l0ZW1zLmxlbmd0aCA9PT0gMCAmJlxuICAgIGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgLyoqXG4gICAqIFRoZSBmb2xkJ3MgY29sbGVjdGlvbiwgaW4gc2NoZWR1bGluZyBvcmRlciAoc3RlcHMgaW4gc3RlcEl0ZW1zIG9yZGVyLFxuICAgKiB0aGVuIHdhaXRzKS4gU3RlcCBlbnRyaWVzIGFyZSBlbnF1ZXVlZCBieSB0aGVpciBwcmVwIHByb21pc2VzIChpbnB1dFxuICAgKiBkZWh5ZHJhdGlvbiBydW5zIGNvbmN1cnJlbnRseSwgc28gZW50cmllcyBhcmUgb3JkZXJlZCBieSBgb3JkZXJgLCBub3QgYnlcbiAgICogY29tcGxldGlvbik7IHRoZSBzaW5nbGUgZmx1c2ggb3AgYmVsb3cgYXdhaXRzIGV2ZXJ5IHByZXAsIHNvcnRzLCBhbmRcbiAgICogY29tbWl0cyB0aGUgd2hvbGUgc2V0IHRocm91Z2ggYGNyZWF0ZUJhdGNoYC5cbiAgICovXG4gIGNvbnN0IGJhdGNoUXVldWU6IHtcbiAgICBvcmRlcjogbnVtYmVyO1xuICAgIGtpbmQ6ICdzdGVwJyB8ICd3YWl0JyB8ICdpbmxpbmUtY3JlYXRlZCcgfCAnaW5saW5lLXN0YXJ0ZWQnO1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIHN0ZXAncyBuYW1lLCBzZXQgb24gc3RlcC1jYXJyeWluZyBraW5kcyAodGhlIGluLWZsdXNoIHB1Ymxpc2hlc1xuICAgICAqICBhbmQgdGhlIGRpc3BhdGNoIGlkZW1wb3RlbmN5IGtleSBuZWVkIGl0KS4gKi9cbiAgICBzdGVwTmFtZT86IHN0cmluZztcbiAgICBldmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICB9W10gPSBbXTtcbiAgY29uc3QgYmF0Y2hQcmVwczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgLy8gUHJlLWNsYWltZWQgaW5saW5lIHBhaXJzOiBmb2xkIGVhY2ggbGF6eS1pbmxpbmUgc3RlcCdzIGRlZmVycmVkXG4gIC8vIGBzdGVwX2NyZWF0ZWRgIChjYXJyeWluZyBpdHMgaW5wdXQpIEFORCBpdHMgYHN0ZXBfc3RhcnRlZGAgY2xhaW0gKGJhcmUsXG4gIC8vIG93bmVyc2hpcC1zdGFtcGVkKSBpbnRvIHRoZSBiYXRjaCwgc28gdGhlIGlubGluZSBzdGVwcycgY2xhaW1zIGNvbW1pdCBpblxuICAvLyBvbmUgZHVyYWJsZSB3cml0ZSAodGhlIHBhaXIgY2h1bmssIHNlZSB0aGUgZmx1c2ggYmVsb3cpIGFuZCB0aGUgY2FsbGVyXG4gIC8vIHN0YXJ0cyB0aGUgYm9kaWVzIHN0cmFpZ2h0IG9mZiB0aGF0IGNvbW1pdCBpbnN0ZWFkIG9mIHBvc3Rpbmcgb25lIGNsYWltXG4gIC8vIHBlciBpbmxpbmUgc3RlcC4gUmVxdWlyZXMgVFdPIG9yIG1vcmUgaW5saW5lIHN0ZXBzLCBhbmQgbm90aGluZyBlbHNlOlxuICAvLyB0aGUgcGFpcnMgY29tbWl0IGluIGEgY2h1bmsgb2YgdGhlaXIgb3duLCBzbyBwbGFpbiBjcmVhdGVzIGFsb25nc2lkZVxuICAvLyB0aGVtIHNoYXJlIG5vIHJvdW5kIHRyaXAgd2l0aCB0aGUgcGFpcnMgYW5kIGNhbm5vdCBtYWtlIGEgbG9uZSBwYWlyXG4gIC8vIHdvcnRoIGZvbGRpbmcuIEEgbG9uZSBpbmxpbmUgc3RlcCBpcyBiZXR0ZXIgc2VydmVkIGJ5IHRoZSBsYXp5XG4gIC8vIGBzdGVwX3N0YXJ0ZWRgOiBvbmUgcm93IGluc3RlYWQgb2YgdHdvLCBvcHRpbWlzdGljLXN0YXJ0IGNhcGFibGUgKHRoZVxuICAvLyBjbGFpbSBvdmVybGFwcyB0aGUgYm9keSksIHdpdGggdGhlIHNsb3Qtc25hcHNob3QgcGFyYW1zIGFuZFxuICAvLyBidW1wLWFuZC1yZXBvcnQgYGNyZWF0ZUd1YXJkZWRgIHByb3ZpZGVzLCBhbGwgb2Ygd2hpY2ggYSBwYWlyLW9ubHlcbiAgLy8gYmF0Y2ggb2Ygb25lIHBhaXIgZ2l2ZXMgdXAgZm9yIHRoZSBzYW1lIHJvdW5kIHRyaXAuIFR3byBvciBtb3JlIGlubGluZVxuICAvLyBzdGVwcyBiZWNvbWUgT05FIHBhaXIgY2h1bmsgaW5zdGVhZCBvZiBOIHBhcmFsbGVsIGxhenkgY2xhaW1zLCB3aGljaCBpc1xuICAvLyB0aGUgc2F2aW5nLiBBIGxvbmUgaW5saW5lIHN0ZXAgYWxvbmdzaWRlIGVhZ2VyIGNyZWF0ZXMgdGhlcmVmb3JlIHRha2VzXG4gIC8vIHRoZSBsYXp5IHBhdGggd2hpbGUgdGhlIGNyZWF0ZXMgc3RpbGwgYmF0Y2guIEFsc28gcmVxdWlyZXMgdGhlIGNhbGxlcidzXG4gIC8vIGBvd25lck1lc3NhZ2VJZGA6IHRoZSBzdGFydGVkIHJvdyBtdXN0IHN0YW1wIG93bmVyc2hpcCBleGFjdGx5IGxpa2UgdGhlXG4gIC8vIGxhenkgY2xhaW0gaXQgcmVwbGFjZXMgKGFuZCBhIGNhbGxlciB0aGF0IGRvZXMgbm90IGlubGluZS1leGVjdXRlIG5ldmVyXG4gIC8vIHByb3ZpZGVzIG9uZSkuXG4gIGNvbnN0IGlubGluZVBhaXJGb2xkRWxpZ2libGUgPVxuICAgIGJhdGNoRmFub3V0RWxpZ2libGUgJiZcbiAgICBvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgPj0gMjtcbiAgY29uc3QgaW5saW5lQ2xhaW1zOiBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdFsnaW5saW5lQ2xhaW1zJ10gPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIHRyYWNlIGNhcnJpZXIgZm9yIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoZXMsIHJlc29sdmVkIGF0IG1vc3Qgb25jZSBwZXJcbiAgLy8gc3VzcGVuc2lvbiAodGhlIHBlci1zdGVwIG9wcyBydW4gY29uY3VycmVudGx5IGFuZCBzaGFyZSBpdCkuXG4gIGxldCBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXI6IFByb21pc2U8VHJhY2VDYXJyaWVyPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyID0gKCk6IFByb21pc2U8VHJhY2VDYXJyaWVyPiA9PiB7XG4gICAgc3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyID8/PVxuICAgICAgc3RlcERpc3BhdGNoPy5nZXRUcmFjZUNhcnJpZXIoKSA/PyBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgIHJldHVybiBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXI7XG4gIH07XG5cbiAgLy8gUHJvZHVjZXItc2lkZSByZXNpbGllbnQgcmVjb3ZlcnkgY291bnQgZm9yIHRoZSBzdXNwZW5zaW9uIHNwYW4gYXR0cmlidXRlLlxuICBsZXQgcmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQgPSAwO1xuXG4gIC8vIFN0ZXBzOiBjcmVhdGUgc3RlcF9jcmVhdGVkIGV2ZW50cyAobm8gcXVldWluZywgVjIgcmV0dXJucyBwZW5kaW5nIHN0ZXBzXG4gIC8vIHRvIGNhbGxlciwgRVhDRVBUIG9uIHRoZSByZXNpbGllbnQgZGlzcGF0Y2ggcGF0aCwgd2hpY2ggcGFyYWxsZWxpemVzIHRoZVxuICAvLyBjcmVhdGUgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggYW5kIHJlcG9ydHMgaXQgaW5cbiAgLy8gYHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc2ApLlxuICBsZXQgYmF0Y2hPcmRlckNvdW50ZXIgPSAwO1xuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBzdGVwSXRlbXMpIHtcbiAgICBpZiAoc3RlcHNOZWVkaW5nQ3JlYXRpb24uaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgLy8gRGV0ZXJtaW5pc3RpYyBwb3NpdGlvbiBpbiB0aGUgYmF0Y2hlZCBmb2xkIChhc3NpZ25lZCBpbiBzdGVwSXRlbXNcbiAgICAgIC8vIG9yZGVyLCBiZWZvcmUgdGhlIGNvbmN1cnJlbnQgZGVoeWRyYXRpb24gcnVucykuIEEgcGFpci1mb2xkZWQgaW5saW5lXG4gICAgICAvLyBzdGVwIG9jY3VwaWVzIHR3byBjb25zZWN1dGl2ZSBwb3NpdGlvbnMgKGNyZWF0ZWQgcm93IHRoZW4gc3RhcnRlZFxuICAgICAgLy8gcm93KSwgd2hpY2ggdGhlIGZsdXNoIGtlZXBzIGFkamFjZW50LCBuZXZlciBzcGxpdHMgYWNyb3NzIGNodW5rcyxcbiAgICAgIC8vIGFuZCBjb21taXRzIGluIGEgcGFpci1vbmx5IGNodW5rIGFoZWFkIG9mIHRoZSBwbGFpbiBjcmVhdGVzLCBzbyBhXG4gICAgICAvLyBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUuXG4gICAgICBjb25zdCBwYWlyRm9sZGVkID1cbiAgICAgICAgaW5saW5lUGFpckZvbGRFbGlnaWJsZSAmJlxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHN0ZXBPcmRlciA9IGJhdGNoT3JkZXJDb3VudGVyO1xuICAgICAgYmF0Y2hPcmRlckNvdW50ZXIgKz0gcGFpckZvbGRlZCA/IDIgOiAxO1xuICAgICAgY29uc3Qgc3RlcE9wID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0ID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFyZ3M6IHF1ZXVlSXRlbS5hcmdzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogcXVldWVJdGVtLmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgICB0aGlzVmFsOiBxdWV1ZUl0ZW0udGhpc1ZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ3N0ZXBfaW5wdXQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIVNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBlLmcuIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6IGFuIFNESyBmYXVsdCwgbm90IGEgdXNlciB2YWx1ZVxuICAgICAgICAgICAgLy8gcHJvYmxlbS4gS2VlcCBpdHMgaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIGFuZCBjdXJyZW50XG4gICAgICAgICAgICAvLyBmYWlsLXRoZS1zdXNwZW5zaW9uIGJlaGF2aW9yLlxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN0ZXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgLy8gTm8gZGlzcGF0Y2ggdGFyZ2V0IG1lYW5zIG5vIHJlcGxheSB3aWxsIG9ic2VydmUgYVxuICAgICAgICAgICAgLy8gZmluYWxpemF0aW9uOiB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBkcmFpbiAob3IgYSBjcmVhdGUtb25seVxuICAgICAgICAgICAgLy8gdGVzdCBjYWxsZXIpLiBUaGUgcnVuIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBzb1xuICAgICAgICAgICAgLy8gd3JpdGluZyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBoZXJlIHdvdWxkIGxlYXZlIGUuZy4gYVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIG5vdGhpbmcgY2FuIGV2ZXJcbiAgICAgICAgICAgIC8vIG9ic2VydmUsIHJlYWRpbmcgYXMgYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLiBSZXRocm93XG4gICAgICAgICAgICAvLyBpbnN0ZWFkOyB0aGUgZHJhaW4ncyBvd24gY2F0Y2ggc3dhbGxvd3MgaXQsIHByZXNlcnZpbmcgaXRzXG4gICAgICAgICAgICAvLyBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgKG5vIHJvd3MgZm9yIHRoZSB1bmF3YWl0ZWQgc3RlcCkuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwKHF1ZXVlSXRlbSwgZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmZXJyZWQgKGxhenkpIGlubGluZSBzdGVwOiBza2lwIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUg4oCUIHRoZVxuICAgICAgICAvLyBjYWxsZXIncyBpbmxpbmUgZXhlY3V0ZVN0ZXAgd2lsbCBzZW5kIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmdcbiAgICAgICAgLy8gdGhpcyBpbnB1dCwgYW5kIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIChlbnRpdHkgKyBzeW50aGV0aWNcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KSBhdG9taWNhbGx5LiBXZSBkbyBOT1QgYWRkIGl0IHRvXG4gICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM7IG93bmVyc2hpcCBpcyBkZWNpZGVkIGJ5IHRoYXQgbGF6eVxuICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQncyBhdG9taWMgY3JlYXRlLWNsYWltIGluc3RlYWQuXG4gICAgICAgIGlmIChsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgIGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuc2V0KHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHBhaXJGb2xkZWQpIHtcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIHBhaXIgdGhlIGRlZmVycmFsIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNhbGxlcidzIGxhenkgYHN0ZXBfc3RhcnRlZGA6IHRoZSBjcmVhdGVkIHJvdyBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgLy8gaW5wdXQgKHBheWxvYWRzIHJpZGUgY3JlYXRlcyBpbiBhIGJhdGNoKSwgdGhlIHN0YXJ0ZWQgcm93IGlzXG4gICAgICAgICAgICAvLyBiYXJlIGFuZCBzdGFtcHMgdGhpcyBpbnZvY2F0aW9uJ3Mgb3duZXJzaGlwLCB0aGUgc2FtZSBjbGFpbVxuICAgICAgICAgICAgLy8gc2hhcGUgdGhlIGxhenkgc3RhcnQgd291bGQgaGF2ZSBzZW50LCBzZXR0bGVkIGJ5IHRoZSBiYXRjaC5cbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtY3JlYXRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlciArIDEsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtc3RhcnRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrZWQgYnkgaW5saW5lUGFpckZvbGRFbGlnaWJsZTsgc3ByZWFkIGtlZXBzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmFycm93LXRocm91Z2gtY2xvc3VyZSBwcm9ibGVtIGF3YXkgZnJvbSB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgICAgIC4uLihvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkID8geyBvd25lck1lc3NhZ2VJZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0IChgcnVuSW5wdXRgKSBhbmRcbiAgICAgICAgLy8gcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuIE9ubHkgZm9yIGlucHV0cyB0aGVcbiAgICAgICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgY3JlYXRlR3VhcmRlZChzdGVwRXZlbnQsIHsgcmVxdWVzdElkIH0pLFxuICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBpbXBsaWVkIGJ5IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGVcbiAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHN0ZXBJbnB1dDogeyBpbnB1dDogZGVoeWRyYXRlZElucHV0IH0sXG4gICAgICAgICAgICAgICAgcnVuQ29udGV4dDogcnVuRGlzcGF0Y2hDb250ZXh0KHJ1biksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFNhbWUga2V5IGFzIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzIGFuZCBhbnkgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3MsIHNvIHJlZHVuZGFudCBwdWJsaXNoZXMgZm9yIHRoaXMgc3RlcCBkZWR1cGUuIFRoZVxuICAgICAgICAgICAgICAvLyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgc28gYSByZXZva2VkIG1lc3NhZ2UgZm9yIGFcbiAgICAgICAgICAgICAgLy8gcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCBjYW5ub3QgYWJzb3JiIHRoZSBjb3JyZWN0ZWRcbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUncyBkaXNwYXRjaDogc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0uc3RlcE5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIHN1c3BlbnNpb24gcGFzczogd2l0aG91dFxuICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZSBhbG9uZSwgYW5kIGlmIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBubyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuXG4gICAgICAgICAgLy8gUHJvcGFnYXRpbmcgcmVkZWxpdmVycyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoXG4gICAgICAgICAgLy8gcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcyxcbiAgICAgICAgICAvLyB0aGUgc2FtZSByZWNvdmVyeSBhcyB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCwgc2FtZSBhcyB0aGUgc2VxdWVudGlhbFxuICAgICAgICAgICAgICAvLyBwYXRoLiBUaGUgc3RlcCBtZXNzYWdlIGlzIGFscmVhZHkgb3V0OyBhIGR1cGxpY2F0ZSBwdWJsaXNoXG4gICAgICAgICAgICAgIC8vIGJ5IHRoYXQgaGFuZGxlciBkZWR1cGVzIG9uIHRoZSBzaGFyZWQgaWRlbXBvdGVuY3kga2V5LlxuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSZXNpbGllbnQ6IHRoZSB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkgKDQyOSAvIDV4eCAvXG4gICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlcyB0aGUgc3RlcF9jcmVhdGVkIGJlZm9yZSBleGVjdXRpbmcuXG4gICAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKys7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnU3RlcCBjcmVhdGlvbiBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgc3RlcCB3YXMgJyArXG4gICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50IHdpbGwgJyArXG4gICAgICAgICAgICAgICAgICAnYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHRoZSBiYXRjaCBpbnN0ZWFkIG9mIHdyaXRpbmcgaGVyZS4gVGhlIGVuY2xvc2luZ1xuICAgICAgICAgIC8vIHByb21pc2Ugam9pbnMgYGJhdGNoUHJlcHNgIChzZWUgdGhlIGxvb3AgYmVsb3cpLCBzbyB0aGUgZmx1c2hcbiAgICAgICAgICAvLyBvcCBjYW5ub3QgcnVuIGJlZm9yZSB0aGlzIHN0ZXAncyBpbnB1dCBmaW5pc2hlZCBkZWh5ZHJhdGluZy5cbiAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlcixcbiAgICAgICAgICAgIGtpbmQ6ICdzdGVwJyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGV2ZW50OiBzdGVwRXZlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgICAgb3BzLnB1c2goc3RlcE9wKTtcbiAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBvcCB3YWl0cyBmb3IgZXZlcnkgcHJlcCBiZWZvcmUgY29tbWl0dGluZzsgYSBwcmVwIHRoYXRcbiAgICAgICAgLy8gcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlcyB0aHJvdWdoIGBvcHNgLCBzbyB0aGUgZmx1c2gncyBvd24gd2FpdFxuICAgICAgICAvLyBzd2FsbG93cyBpdCBhbmQgY29tbWl0cyB3aGF0ZXZlciB3YXMgc3VjY2Vzc2Z1bGx5IGVucXVldWVkLFxuICAgICAgICAvLyBwcmVzZXJ2aW5nIHRvZGF5J3MgcGVyLW9wIGluZGVwZW5kZW5jZS5cbiAgICAgICAgYmF0Y2hQcmVwcy5wdXNoKHN0ZXBPcC5jYXRjaCgoKSA9PiB7fSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB3YWl0IGV2ZW50cyAoc2FtZSBhcyBWMSlcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0RXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgcmVzdW1lQXQ6IHF1ZXVlSXRlbS5yZXN1bWVBdCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBXYWl0cyBuZWVkIG5vIGRlaHlkcmF0aW9uLCBzbyB0aGV5IGVucXVldWUgc3luY2hyb25vdXNseSwgYWZ0ZXJcbiAgICAgICAgLy8gZXZlcnkgc3RlcCdzIG9yZGVyIHNsb3QsIHByZXNlcnZpbmcgc3RlcHMtdGhlbi13YWl0cyBzY2hlZHVsaW5nXG4gICAgICAgIC8vIG9yZGVyIGluIHRoZSBsb2cuXG4gICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgb3JkZXI6IGJhdGNoT3JkZXJDb3VudGVyKyssXG4gICAgICAgICAga2luZDogJ3dhaXQnLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50OiB3YWl0RXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh3YWl0RXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmF0Y2hlZCBmb2xkJ3MgZmx1c2g6IHRoZSBjbGVhbiBmYW4tb3V0IGNvbW1pdHMgdGhyb3VnaFxuICAvLyBgY3JlYXRlQmF0Y2hgIGluIGNodW5rcyBvZiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUywgYWxsIGNodW5rcyBJTlxuICAvLyBGTElHSFQgQ09OQ1VSUkVOVExZLiBTbG90IGFzc2lnbm1lbnQgaXMgdGhlIHNlcnZlcidzLCBzbyBwYXJhbGxlbFxuICAvLyBjaHVua3MgcmFjZSBmb3Igc2xvdCByYW5nZXMgZXhhY3RseSBsaWtlIHRoZSBwcmUtZm9sZCBwYXRoJ3MgcGFyYWxsZWxcbiAgLy8gc2luZ2xlIHdyaXRlcyBkaWQ7IGVudGl0eSBjb25kaXRpb25zLCBub3QgY29tbWl0IG9yZGVyLCBjYXJyeVxuICAvLyBjb3JyZWN0bmVzcyAoc2libGluZyBmYW4tb3V0IGV2ZW50cyBoYXZlIG5vIGNyb3NzLW9yZGVyIHRoZSByZXBsYXlcbiAgLy8gZGVwZW5kcyBvbjsgaXQgbWF0Y2hlcyBieSBjb3JyZWxhdGlvbiBpZCkuIEVhY2ggZXZlbnQgcmVwb3J0cyB0aGVcbiAgLy8gb3V0Y29tZSBpdHMgb3duIHNpbmdsZSBjcmVhdGUgd291bGQgaGF2ZSBoYWQ6IGEgNDA5IGlzIHRoZSBzYW1lXG4gIC8vIGFscmVhZHktZXhpc3RzIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgsIGFueXRoaW5nIGVsc2UgZmFpbHMgdGhlXG4gIC8vIGRlbGl2ZXJ5IHRoZSB3YXkgYSBzaW5nbGUtcGF0aCByZWplY3Rpb24gd291bGQuXG4gIC8vXG4gIC8vIExhdGVuY3kgc2hhcGU6IG9ubHkgdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnNcbiAgLy8gZ2F0ZXMgdGhlIGhhbmRsZXIncyByZXR1cm4gKHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBvZmYgaXRzIGNsYWltcyksXG4gIC8vIGFuZCB0aGF0IGNodW5rIGNhcnJpZXMgTk9USElORyBlbHNlLCBzbyBpdHMgY29tbWl0IGlzIGFzIHNtYWxsIGFzIHRoZVxuICAvLyBpbmxpbmUgc2xpY2UgKHNlZSB0aGUgY2h1bmtpbmcgYmVsb3cpLlxuICAvLyBFdmVyeSBvdGhlciBjaHVuaydzIGNvbW1pdCAoYW5kIGV2ZXJ5IGNodW5rJ3Mgc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyxcbiAgLy8gd2hpY2ggZmlyZSB0aGUgbW9tZW50IElUUyBjcmVhdGVzIGFyZSBkdXJhYmxlKSByaWRlc1xuICAvLyBgZGVmZXJyZWRCYXRjaFdvcmtgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBpbiwgam9pbmVkIGJlZm9yZSBhY2suIEEgc2xvd1xuICAvLyBzaWJsaW5nIGNodW5rIHRoZXJlZm9yZSBkZWxheXMgbmVpdGhlciB0aGUgaW5saW5lIGJvZGllcyBub3IgYW5vdGhlclxuICAvLyBjaHVuaydzIHF1ZXVlIG1lc3NhZ2VzLCB3aGlsZSBwdWJsaXNoLWFmdGVyLWNyZWF0ZSBzdGlsbCBob2xkcyBwZXJcbiAgLy8gc3RlcDogYSBzdGVwJ3MgbWVzc2FnZSBpcyBvbmx5IGV2ZXIgc2VudCBhZnRlciB0aGUgY2h1bmsgY2FycnlpbmcgaXRzXG4gIC8vIGNyZWF0ZSBoYXMgY29tbWl0dGVkLlxuICBsZXQgZGVmZXJyZWRCYXRjaFdvcms6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgb3BzLnB1c2goXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBQcmVwcyB0aGF0IHJlamVjdGVkIGFscmVhZHkgc3VyZmFjZSB0aHJvdWdoIHRoZWlyIG93biBgb3BzYFxuICAgICAgICAvLyBlbnRyaWVzOyB0aGUgZm9sZCBjb21taXRzIHdoYXRldmVyIHdhcyBzdWNjZXNzZnVsbHkgZW5xdWV1ZWQsXG4gICAgICAgIC8vIHByZXNlcnZpbmcgdG9kYXkncyBwZXItb3AgaW5kZXBlbmRlbmNlLlxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChiYXRjaFByZXBzKTtcbiAgICAgICAgaWYgKGJhdGNoUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbLi4uYmF0Y2hRdWV1ZV0uc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAvLyBUaGUgb3JkaW5hcnkgc2luZ2xlIHBhdGggZm9yIGEgbG9uZSBwbGFpbiBlbnRyeTogYSBiYXRjaCBvZiBPTkVcbiAgICAgICAgLy8gZ2FpbnMgbm90aGluZyBvdmVyIHRoZSBzaW5nbGUgd3JpdGUgKHNhbWUgcm91bmQgdHJpcCkgYW5kIGxvc2VzXG4gICAgICAgIC8vIHRoZSBzbG90LXNuYXBzaG90IHBhcmFtcyArIGJ1bXAtYW5kLXJlcG9ydCB0aGF0IGNyZWF0ZUd1YXJkZWRcbiAgICAgICAgLy8gcHJvdmlkZXMsIHNvIGEgbG9uZSBlYWdlciBldmVudCBpcyB3cml0dGVuIHRoZSB3YXkgaXQgd291bGQgaGF2ZVxuICAgICAgICAvLyBiZWVuIHdpdGhvdXQgdGhlIGZvbGQsIHdpdGggdGhlIHNhbWUgY29uZmxpY3QgdG9sZXJhbmNlIGFuZFxuICAgICAgICAvLyBvd25lcnNoaXAgYm9va2tlZXBpbmcuIFVzZWQgd2hlbiB0aGUgd2hvbGUgZm9sZCBpcyBvbmUgZW50cnlcbiAgICAgICAgLy8gKGJlbG93KSBhbmQgd2hlbiB0aGUgcGxhaW4gcGFydGl0aW9uIGJlc2lkZSB0aGUgcGFpcnMgaXMgb25lXG4gICAgICAgIC8vIGVudHJ5ICh0aGUgY2h1bmtpbmcgZnVydGhlciBkb3duKS4gQmVzaWRlIGEgcGFpciBjaHVuayBpdCBjb21taXRzXG4gICAgICAgIC8vIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBoYW5kbGVyJ3MgcmV0dXJuLCBsaWtlIGEgdHJhaWxpbmcgY2h1bms7IHRoZVxuICAgICAgICAvLyBpbmxpbmUgYm9kaWVzIGRvIG5vdCBkZXBlbmQgb24gaXQgKGV4ZWN1dG9yIHdyaXRlcyBjYXJyeSBubyBzbG90XG4gICAgICAgIC8vIHNuYXBzaG90LCBzbyB0aGVyZSBpcyBubyBwb3NpdGlvbiBmb3IgaXQgdG8gbW92ZSkuXG4gICAgICAgIGNvbnN0IGNvbW1pdFNpbmdsZSA9IGFzeW5jIChcbiAgICAgICAgICBlbnRyeTogKHR5cGVvZiBlbnRyaWVzKVtudW1iZXJdXG4gICAgICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGVudHJ5LmV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBhd2FpdCBjb21taXRTaW5nbGUoZW50cmllc1swXSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlZWQgZm9yIHRoZSBmb3JlaWduLWludGVybGVhdmluZyBkaWFnbm9zdGljIGJlbG93LiBXaXRoIGNodW5rc1xuICAgICAgICAvLyBjb21taXR0aW5nIGluIHBhcmFsbGVsIHRoZXJlIGlzIG5vIHBlci1jaHVuayBcImV4cGVjdGVkIG5leHQgc2xvdFwiO1xuICAgICAgICAvLyB0aGUgd2hvbGUgZm9sZCdzIGNvbW1pdHRlZCBzcGFuIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIHNlZWRcbiAgICAgICAgLy8gb25jZSBldmVyeSBjaHVuayBoYXMgc2V0dGxlZDogY29tbWl0dGVkIHNsb3RzIGFyZSBkZW5zZSBwZXIgdGhlXG4gICAgICAgIC8vIFdvcmxkJ3MgaW52YXJpYW50LCBzbyBhbnkgZXhjZXNzIG9mIChtYXggY29tbWl0dGVkIHNsb3Qg4oiSIHNlZWQgK1xuICAgICAgICAvLyAxKSBvdmVyIHRoZSBmb2xkJ3Mgb3duIGNvbW1pdHRlZCBjb3VudCBpcyBldmVudHMgT1RIRVIgd3JpdGVyc1xuICAgICAgICAvLyBsYW5kZWQgaW4gYmV0d2Vlbi5cbiAgICAgICAgY29uc3QgZXhwZWN0ZWRGaXJzdFNsb3QgPSBldmVudExvZ1xuICAgICAgICAgID8gKG1heEV2ZW50U2xvdChldmVudExvZy5ldmVudHMpID8/IDApICsgMVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBQYWlyLWF3YXJlIGNodW5raW5nLiBUd28gcnVsZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIDEuIEEgcHJlLWNsYWltZWQgcGFpcidzIHR3byByb3dzIG11c3QgbGFuZCBpbiB0aGUgc2FtZSBjcmVhdGVCYXRjaFxuICAgICAgICAvLyAgICBjYWxsIChhZGphY2VudCwgc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZ1xuICAgICAgICAvLyAgICBjcmVhdGUpIGFuZCBuZXZlciBzdHJhZGRsZSBhIGNodW5rIGJvdW5kYXJ5LCB3aGljaCB3b3VsZCB0dXJuXG4gICAgICAgIC8vICAgIHRoZSBzdGFydGVkIHJvdyBpbnRvIGEgc3RhbmRhbG9uZSBjbGFpbSByYWNpbmcgaXRzIG93blxuICAgICAgICAvLyAgICBjcmVhdGUncyBjb21taXQuXG4gICAgICAgIC8vIDIuIFRoZSBwYWlycyBjb21taXQgaW4gY2h1bmsocykgb2YgVEhFSVIgT1dOLCBhaGVhZCBvZiB0aGUgcGxhaW5cbiAgICAgICAgLy8gICAgYHN0ZXBgL2B3YWl0YCBjcmVhdGVzLCB3aGljaCBmaWxsIHRoZSBzdWJzZXF1ZW50IGNodW5rcy4gVGhlXG4gICAgICAgIC8vICAgIHBhaXIgY2h1bmsgaXMgdGhlIG9uZSBjb21taXQgdGhlIGlubGluZSBib2RpZXMgd2FpdCBmb3IgKHNlZVxuICAgICAgICAvLyAgICBgcGFpckNvbW1pdHNgIGJlbG93KSwgYW5kIG9uIHRoZSBWZXJjZWwgYmFja2VuZCBpdHMgbGF0ZW5jeVxuICAgICAgICAvLyAgICBzY2FsZXMgd2l0aCB0aGUgdHJhbnNhY3Rpb24ncyBpdGVtIGNvdW50OiBtZWFzdXJlZCBvbiAzMi1icmFuY2hcbiAgICAgICAgLy8gICAgZmFuLW91dHMsIGJhdGNoZXMgb2YgPD04IGV2ZW50cyBjb21taXQgaW4gfjU2IG1zIHA1MCBzZXJ2ZXItc2lkZVxuICAgICAgICAvLyAgICB3aGVyZSBiYXRjaGVzIG9mIDI0LTMyIGV2ZW50cyB0YWtlIH4xMTAgbXMuIFBhZGRpbmcgdGhlIHBhaXJcbiAgICAgICAgLy8gICAgY2h1bmsgd2l0aCBwbGFpbiBjcmVhdGVzIHVwIHRvIHRoZSBjYXAgdGhlcmVmb3JlIGhlbGQgdGhlXG4gICAgICAgIC8vICAgIGJvZGllcyBmb3IgdGhlIHBsYWluIGNyZWF0ZXMnIGNvbW1pdCwgd2hpY2ggbm90aGluZyBlbHNlXG4gICAgICAgIC8vICAgIG5lZWRlZDogYSBwbGFpbiBjcmVhdGUgZ2F0ZXMgb25seSBpdHMgb3duIHF1ZXVlIHB1Ymxpc2gsIGFuZFxuICAgICAgICAvLyAgICB0aGF0IGZpcmVzIG9mZiB3aGljaGV2ZXIgc2libGluZyBjaHVuayBjYXJyaWVzIGl0LiBTcGxpdHRpbmdcbiAgICAgICAgLy8gICAgdGhlbSBrZWVwcyB0aGUgcGFpciBjaHVuayBzbWFsbCAodHdvIHJvd3MgcGVyIGlubGluZSBzdGVwKSBhbmRcbiAgICAgICAgLy8gICAgbGV0cyB0aGUgcGxhaW4gY3JlYXRlcyBjb21taXQgY29uY3VycmVudGx5IGJlc2lkZSBpdC5cbiAgICAgICAgY29uc3QgY2h1bmtFbnRyaWVzID0gKGxpc3Q6IHR5cGVvZiBlbnRyaWVzKTogKHR5cGVvZiBlbnRyaWVzKVtdID0+IHtcbiAgICAgICAgICBjb25zdCBvdXQ6ICh0eXBlb2YgZW50cmllcylbXSA9IFtdO1xuICAgICAgICAgIGxldCBjdXJyZW50OiB0eXBlb2YgZW50cmllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBsaXN0W2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBwYWlyTGVhZCA9XG4gICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dD8ua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJyAmJlxuICAgICAgICAgICAgICBuZXh0LmNvcnJlbGF0aW9uSWQgPT09IGVudHJ5LmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gcGFpckxlYWQgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICsgdGFrZSA+IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBpZiAocGFpckxlYWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSBvdXQucHVzaChjdXJyZW50KTtcbiAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgICAgICAvLyBCb3RoIHBhcnRpdGlvbnMga2VlcCBgZW50cmllc2AnIG9yZGVyLCBzbyBhIHBhaXIncyB0d28gcm93c1xuICAgICAgICAvLyAoY29uc2VjdXRpdmUgYG9yZGVyYCB2YWx1ZXMsIGVucXVldWVkIHRvZ2V0aGVyKSBzdGF5IGFkamFjZW50IGluXG4gICAgICAgIC8vIHRoZSBwYWlyIHBhcnRpdGlvbi5cbiAgICAgICAgY29uc3QgaXNQYWlyUm93ID0gKGVudHJ5OiAodHlwZW9mIGVudHJpZXMpW251bWJlcl0pOiBib29sZWFuID0+XG4gICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1jcmVhdGVkJyB8fCBlbnRyeS5raW5kID09PSAnaW5saW5lLXN0YXJ0ZWQnO1xuICAgICAgICBjb25zdCBwYWlyQ2h1bmtzID0gY2h1bmtFbnRyaWVzKFxuICAgICAgICAgIGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gaXNQYWlyUm93KGVudHJ5KSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGxhaW5FbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhaXNQYWlyUm93KGVudHJ5KSk7XG4gICAgICAgIC8vIEEgcGxhaW4gcGFydGl0aW9uIG9mIGV4YWN0bHkgT05FIGVudHJ5IGlzIHRoZSBiYXRjaC1vZi1vbmUgY2FzZVxuICAgICAgICAvLyBhZ2Fpbiwgbm93IHRoYXQgdGhlIHBhaXJzIG5vIGxvbmdlciBzaGFyZSBpdHMgY2h1bms6IGl0IHRha2VzIHRoZVxuICAgICAgICAvLyBzaW5nbGUgcGF0aCAoYGNvbW1pdFNpbmdsZWApIHJhdGhlciB0aGFuIGEgb25lLXJvdyBjcmVhdGVCYXRjaCxcbiAgICAgICAgLy8gYW5kIGlzIGNhcnJpZWQgYXMgYSBvbmUtZW50cnkgY2h1bmsgc28gdGhlIHBlci1jaHVuayBwdWJsaXNoIGFuZFxuICAgICAgICAvLyBzZXR0bGUgbWFjaGluZXJ5IGJlbG93IHRyZWF0cyBpdCBsaWtlIGFueSBzaWJsaW5nLiAoQSBvbmUtcm93XG4gICAgICAgIC8vIHJlbWFpbmRlciBvZiBhIExBUkdFUiBwbGFpbiBwYXJ0aXRpb24gc3RpbGwgYmF0Y2hlczogaXQgaXMgdGhlXG4gICAgICAgIC8vIHByZS1zcGxpdCBiZWhhdmlvciwgdW5jaGFuZ2VkIGhlcmUuKVxuICAgICAgICBjb25zdCBwbGFpbkNodW5rcyA9XG4gICAgICAgICAgcGxhaW5FbnRyaWVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBbcGxhaW5FbnRyaWVzXVxuICAgICAgICAgICAgOiBjaHVua0VudHJpZXMocGxhaW5FbnRyaWVzKTtcbiAgICAgICAgY29uc3Qgc2luZ2xlQ2h1bmsgPVxuICAgICAgICAgIHBsYWluRW50cmllcy5sZW5ndGggPT09IDEgPyBwbGFpbkNodW5rc1swXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2h1bmtzOiAodHlwZW9mIGVudHJpZXMpW10gPSBbLi4ucGFpckNodW5rcywgLi4ucGxhaW5DaHVua3NdO1xuICAgICAgICAvLyBTdGVwcyB3aG9zZSBxdWV1ZSBtZXNzYWdlcyBUSElTIEZMVVNIIHdpbGwgcHVibGlzaCAodGhlIGVhZ2VyXG4gICAgICAgIC8vIGNyZWF0ZXMpLCByZWNvcmRlZCBiZWZvcmUgYW55IGNodW5rIHNldHRsZXMgc28gdGhlIGNhbGxlcidzXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhc3MgKHdoaWNoIHJ1bnMgb2ZmIHRoZSBoYW5kbGVyJ3MgcmV0dXJuKSBza2lwcyB0aGVtLlxuICAgICAgICAvLyBUaGUgc2VuZHMgYXJlIGd1YXJhbnRlZWQtb3ItZmFpbGVkIGJ5IHRoZSB0cmFpbGluZyB3b3JrIHRoZVxuICAgICAgICAvLyBjYWxsZXIgam9pbnMgYmVmb3JlIGFja2luZywgc28gXCJ3aWxsIGJlIHB1Ymxpc2hlZCBieSB0aGlzIGZsdXNoXCJcbiAgICAgICAgLy8gYW5kIFwiYWxyZWFkeSBwdWJsaXNoZWRcIiBhcmUgZXF1aXZhbGVudCBmcm9tIHRoZSBjYWxsZXIncyBzaWRlLlxuICAgICAgICBjb25zdCBwdWJsaXNoRWFnZXJTdGVwcyA9IHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHVibGlzaEVhZ2VyU3RlcHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChlbnRyeS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWxsaWVzIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYywgZm9sZGVkIGFjcm9zc1xuICAgICAgICAvLyB0aGUgY29uY3VycmVudCBjaHVua3MgYW5kIHJlYWQgb25jZSBhbGwgb2YgdGhlbSBzZXR0bGVkLlxuICAgICAgICBsZXQgY29tbWl0dGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgbWF4Q29tbWl0dGVkU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNvbW1pdENodW5rID0gYXN5bmMgKGNodW5rOiB0eXBlb2YgZW50cmllcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIC8vIEFuY2hvcnMgZm9yIHRoZSBwcmUtY2xhaW1lZCBzdGVwcycgdGVsZW1ldHJ5OiB0aGUgUE9TVCBpbnN0YW50XG4gICAgICAgICAgLy8gaXMgdGhlIGNsYWltJ3MgXCJzdGFydCBQT1NUIHNlbnRcIiAoUlNGUydzIGVuZCksIHRoZSByZXR1cm4gaXMgdGhlXG4gICAgICAgICAgLy8gY2xhaW0ncyBjb21wbGV0aW9uIChUVFIncyBUNiksIHRoZSBzYW1lIHR3byBpbnN0YW50cyB0aGUgbGF6eVxuICAgICAgICAgIC8vIGNsYWltJ3Mgb3duIFBPU1Qgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICAgICAgICBjb25zdCBiYXRjaFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBiYXRjaEZhbm91dEVsaWdpYmxlIGltcGxpZXMgcHJlc2VuY2VcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCEoXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGNodW5rLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXJ0ZWQgcm93IGlzIHRoZSBzdGVwJ3MgZXhlY3V0aW5nIGNsYWltLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRlLWluc3RhbmNlIGF0dHJpYnV0aW9uIHRoZSBzaW5nbGUgY2xhaW0gc2VuZHMgdmlhXG4gICAgICAgICAgICAgIC8vIENyZWF0ZUV2ZW50UGFyYW1zLlxuICAgICAgICAgICAgICAuLi4oZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICAgID8geyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAvLyBQZXItd3JpdGUgcmVxdWVzdCBhdHRyaWJ1dGlvbiwgc2FtZSBhcyB0aGUgc2luZ2xlIHBhdGgnc1xuICAgICAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCjigKYsIHsgcmVxdWVzdElkIH0pLlxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2h1bmtbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWlyIGNvbW1pdHRlZDogdGhpcyBpbnZvY2F0aW9uIG93bnMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBydW5zIHRoZSBib2R5IHdpdGggbm8gY2xhaW0gb2YgaXRzIG93bi4gVGhlXG4gICAgICAgICAgICAgICAgLy8gcmVhZGJhY2sgZW50aXR5IGlzIGF1dGhvcml0YXRpdmUgd2hlcmUgcHJlc2VudDsgYSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgb21pdHRlZCBpdCBnZXRzIHRoZSBzYW1lIGxvY2FsbHkgc3ludGhlc2l6ZWQgcnVubmluZ1xuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQtMSB0aGUgb3B0aW1pc3RpYyBwYXRoIGV4ZWN1dGVzIGFnYWluc3QuIEVpdGhlclxuICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgaW5wdXQgaXMgcmUtYXR0YWNoZWQgbG9jYWxseTogYmF0Y2ggcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHJlZnMgbGF6aWx5LCBhbmQgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3QgYnl0ZXMgdGhlIHBhaXIncyBjcmVhdGVkIHJvdyBjYXJyaWVkLiAoVGhlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAvLyByb3cncyBzdWNjZXNzIGlzIGRlbGliZXJhdGVseSBOT1QgbWVtYmVyc2hpcCBpblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IGZvciBpbmxpbmUgc3RlcHMgb3duZXJzaGlwIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0ZWQgcm93J3MgdmVyZGljdCwgYW5kIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzXG4gICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5saW5lIGNvcnJlbGF0aW9uIGlkcyByZWdhcmRsZXNzLilcbiAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoXG4gICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHNhbWUgcHJlcCBvcCB0aGF0IGVucXVldWVkIHRoZSBwYWlyIHNldFxuICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRyeSwgYW5kIHRoZSBmbHVzaCBhd2FpdGVkIGV2ZXJ5IHByZXAgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGZyZWUgaWYgaXQgZXZlciBmaXJlcywgdGhvdWdoOiB0aGUgcGFpciBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGhlcmUsIHNvIHRoaXMgdGhyb3dzIHdpdGggdGhlIHN0ZXAgY2xhaW1lZCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBib2R5IG5ldmVyIHJ1bi4gVGhlIGRlbGl2ZXJ5IGZhaWxzLCBhbmQgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMgaXQgdGhyb3VnaCBvd25lZC1yZWNvdmVyeSAodGhlIHN0ZXAgY2FycmllcyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwIHN0YW1wKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdCBqdXN0XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGNsZWFubHkuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbm8gZGVoeWRyYXRlZCBpbnB1dCBmb3IgcHJlLWNsYWltZWQgc3RlcCAke2VudHJ5LmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRTdGVwOiBTdGFydGVkU3RlcCA9IGl0ZW0uc3RlcD8uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbS5zdGVwLCBzdGFydGVkQXQ6IGl0ZW0uc3RlcC5zdGFydGVkQXQgfVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBkZWh5ZHJhdGVkLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICAgICAgICBvd25lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhcnRlZFN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiYXRjaFBvc3RTZW50QXRNcyxcbiAgICAgICAgICAgICAgICAgIGNsYWltQ29tcGxldGVkQXRNcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBsb3N0IGl0cyBhdG9taWMgY3JlYXRlLWNsYWltOiBhIGNvbmN1cnJlbnQgd3JpdGVyXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvd25zIHRoaXMgc3RlcCAoYW4gZWFybGllciBkZWxpdmVyeSdzIGNyZWF0ZSwgb3IgYVxuICAgICAgICAgICAgICAgIC8vIHJhY2luZyBoYW5kbGVyJ3MgY2xhaW0pLiBSZWNvcmRlZCBhcyBhIGxvc3QgY2xhaW06IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlcidzIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBib2R5LCB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gQSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgZm9sZHMgdGhlIHBhaXIgcmVwb3J0cyB0aGUgNDA5IG9uIGJvdGggcm93cyAoc2V0XG4gICAgICAgICAgICAgICAgLy8gdHdpY2UsIGhhcm1sZXNzKTsgb25lIHRoYXQgZXZhbHVhdGVzIHJvd3MgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgc3RhcnRlZCByb3cgKHByb2Nlc3NlZCBzZWNvbmQpIGRlY2lkZSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBzaW5nbGUgcGF0aCdzIHNlbWFudGljcyAoY3JlYXRlIGxvc3QgKyBjbGFpbVxuICAgICAgICAgICAgICAgIC8vIHdvbiBzdGlsbCBydW5zIHRoZSBib2R5OyBjcmVhdGUgd29uICsgY2xhaW0gbG9zdCBza2lwcykuXG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7IG93bmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0lubGluZSBzdGVwIHByZS1jbGFpbSBsb3N0LCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNhbWUgdG9sZXJhbmNlIGFzIHRoZSBzaW5nbGUgcGF0aCdzIEVudGl0eUNvbmZsaWN0RXJyb3I6IGFcbiAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBvciBlYXJsaWVyIGRlbGl2ZXJ5IGFscmVhZHkgY3JlYXRlZCBpdC5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdzdGVwJ1xuICAgICAgICAgICAgICAgICAgPyAnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZydcbiAgICAgICAgICAgICAgICAgIDogJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYGJhdGNoZWQgJHtlbnRyeS5ldmVudC5ldmVudFR5cGV9IGZvciAke2VudHJ5LmNvcnJlbGF0aW9uSWR9IGAgK1xuICAgICAgICAgICAgICAgIGBmYWlsZWQ6ICR7aXRlbS5lcnJvcn06ICR7aXRlbS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHsgc3RhdHVzOiBpdGVtLnN0YXR1cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIaWdoZXN0IHNsb3QgdGhpcyBjaHVuayBjb21taXR0ZWQ6IG9uZSBpbnB1dCBvZiB0aGUgaW50ZXJsZWF2aW5nXG4gICAgICAgICAgLy8gZGlhZ25vc3RpYy5cbiAgICAgICAgICBjb25zdCBjaHVua01heFNsb3QgPSBtYXhFdmVudFNsb3QoXG4gICAgICAgICAgICByZXN1bHRzLmZsYXRNYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmV2ZW50ID8gW2l0ZW0uZXZlbnRdIDogW11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbW1pdHRlZENvdW50ICs9IHJlc3VsdHMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNodW5rTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAobWF4Q29tbWl0dGVkU2xvdCA9PT0gdW5kZWZpbmVkIHx8IGNodW5rTWF4U2xvdCA+IG1heENvbW1pdHRlZFNsb3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90ID0gY2h1bmtNYXhTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQdWJsaXNoIHRoZSBjaHVuaydzIGVhZ2VyIHN0ZXBzJyBxdWV1ZSBtZXNzYWdlcyB0aGUgbW9tZW50IElUU1xuICAgICAgICAvLyBjcmVhdGVzIGFyZSBkdXJhYmxlLCB0aGUgcGVyLWNodW5rIGhhbGYgb2YgcHVibGlzaC1hZnRlci1jcmVhdGUuXG4gICAgICAgIC8vIFNhbWUgbWVzc2FnZSBzaGFwZSBhbmQgc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3kga2V5IGFzIHRoZVxuICAgICAgICAvLyBjYWxsZXIncyBkaXNwYXRjaCBwYXNzLCBzbyBhbnl0aGluZyBkb3VibGUtcHVibGlzaGVkIGRlZHVwZXMuXG4gICAgICAgIGNvbnN0IHB1Ymxpc2hDaHVua1N0ZXBzID0gYXN5bmMgKFxuICAgICAgICAgIGNodW5rOiB0eXBlb2YgZW50cmllc1xuICAgICAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBpZiAoIXB1Ymxpc2hFYWdlclN0ZXBzKSByZXR1cm47XG4gICAgICAgICAgY29uc3Qgc3RlcEVudHJpZXMgPSBjaHVuay5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5raW5kID09PSAnc3RlcCcpO1xuICAgICAgICAgIGlmIChzdGVwRW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAvLyBPbmUgYmF0Y2hlZCBwdWJsaXNoIHBlciBjaHVuayBpbnN0ZWFkIG9mIG9uZSByb3VuZCB0cmlwIHBlciBzdGVwLlxuICAgICAgICAgIC8vIFRoZSBwdWJsaXNoZXMgYXJlIHRoZSBmYW4tb3V0J3Mgc2VyaWFsaXphdGlvbiBwb2ludDogdGhleSByaWRlIHRoZVxuICAgICAgICAgIC8vIHNoYXJlZCA4LWNvbm5lY3Rpb24gSFRUUC8xLjEgYWdlbnQgKHNlZSBgZ2V0UXVldWVEaXNwYXRjaGVyYCBpblxuICAgICAgICAgIC8vIHdvcmxkLXZlcmNlbCksIGFuZCB0aGUgY2FsbGVyIGF3YWl0cyBhbGwgb2YgdGhlbSBiZWZvcmUgcnVubmluZ1xuICAgICAgICAgIC8vIHRoZSBmaXJzdCBpbmxpbmUgc3RlcCBib2R5LCBzbyBOIHJvdW5kIHRyaXBzIGxhbmQgZGlyZWN0bHkgb25cbiAgICAgICAgICAvLyB0aW1lLXRvLWZpcnN0LXN0ZXAuIGBxdWV1ZU1lc3NhZ2VzYCBmYWxscyBiYWNrIHRvIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBzaW5nbGUgc2VuZHMgb24gYSBXb3JsZCB3aXRoIG5vIGJhdGNoIHN1cHBvcnQuXG4gICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlcyhcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBwdWJsaXNoRWFnZXJTdGVwcyBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgICBzdGVwRGlzcGF0Y2ghLnF1ZXVlTmFtZSxcbiAgICAgICAgICAgIHN0ZXBFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBzZXQgb24gZXZlcnkgJ3N0ZXAnIGVudHJ5IGF0IGVucXVldWVcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogZW50cnkuc3RlcE5hbWUhLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBydW5Db250ZXh0OiBydW5EaXNwYXRjaENvbnRleHQocnVuKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3B0czoge1xuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgIGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgZW50cnkuc3RlcE5hbWUhXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTGF1bmNoIGV2ZXJ5IGNodW5rJ3MgUE9TVCBub3cgKHRoZSBsb25lIHBsYWluIGVudHJ5J3MgZ3VhcmRlZFxuICAgICAgICAvLyBzaW5nbGUgY3JlYXRlIGluY2x1ZGVkKTsgY2hhaW4gZWFjaCBjaHVuaydzIHB1Ymxpc2hlcyBvbiBpdHMgT1dOXG4gICAgICAgIC8vIGNvbW1pdCwgc28gcHVibGlzaC1hZnRlci1jcmVhdGUgaG9sZHMgZm9yIHRoZSBzaW5nbGUgdG9vLiBBIGNodW5rXG4gICAgICAgIC8vIHdob3NlIGNvbW1pdCByZWplY3RlZCBrZWVwcyBpdHMgbWVzc2FnZXMgdW5zZW50ICh0aGUgcmVqZWN0aW9uXG4gICAgICAgIC8vIGZhaWxzIHRoZSBkZWxpdmVyeTsgcmVkZWxpdmVyeSByZS1jcmVhdGVzIGFuZCByZS1kaXNwYXRjaGVzLFxuICAgICAgICAvLyBkZWR1cGVkIGJ5IHRoZSBpZGVtcG90ZW5jeSBrZXlzKS5cbiAgICAgICAgY29uc3QgY29tbWl0cyA9IGNodW5rcy5tYXAoKGNodW5rKSA9PlxuICAgICAgICAgIGNodW5rID09PSBzaW5nbGVDaHVuayA/IGNvbW1pdFNpbmdsZShjaHVua1swXSkgOiBjb21taXRDaHVuayhjaHVuaylcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHVibGlzaGVzID0gY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29tbWl0c1tpbmRleF07XG4gICAgICAgICAgYXdhaXQgcHVibGlzaENodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gTGV0IGV2ZXJ5IHNpYmxpbmcgc2V0dGxlIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGZpcnN0IGZhaWx1cmU6IGFcbiAgICAgICAgICAvLyBjaHVuayB0aGF0IGNvbW1pdHRlZCBtdXN0IHN0aWxsIGdldCBpdHMgcHVibGlzaGVzIG91dCBldmVuIHdoZW5cbiAgICAgICAgICAvLyBhbm90aGVyIGNodW5rIGZhaWxlZCwgYW5kIHRoZSBjYWxsZXIgYWNrcyBvbmx5IGFmdGVyIHRoaXNcbiAgICAgICAgICAvLyByZXNvbHZlcy5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5jb21taXRzLCAuLi5wdWJsaXNoZXNdKTtcbiAgICAgICAgICAvLyBGb3JlaWduLWludGVybGVhdmluZyB2aXNpYmlsaXR5OiB0aGUgYmF0Y2ggZW5kcG9pbnQgaGFzIG5vXG4gICAgICAgICAgLy8gYnVtcC1hbmQtcmVwb3J0LCBzbyBldmVudHMgb3RoZXIgd3JpdGVycyBsYW5kZWQgYmV0d2VlbiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBhbmQgdGhlc2UgY29tbWl0cyBwdXNoZWQgdGhlIGZvbGQgdG8gaGlnaGVyIHNsb3RzXG4gICAgICAgICAgLy8gV0lUSE9VVCBoYW5kaW5nIHVzIHRoZSBza2lwcGVkIGV2ZW50cy4gU2FtZSBhY2NlcHRlZCBleHBvc3VyZVxuICAgICAgICAgIC8vIGFzIGEgZHJvcHBlZCB0cnVuY2F0ZWQgcmVwb3J0IG9uIHRoZSBzaW5nbGUgcGF0aDogdGhlIGxvY2FsXG4gICAgICAgICAgLy8gbG9nIHN0YXlzIGEgc3RyaWN0IHByZWZpeCBhbmQgdGhlIG5leHQgcmVsb2FkIG9ic2VydmVzIHRoZW0uXG4gICAgICAgICAgLy8gTG9nZ2VkIHNvIGEgYnVtcCBpcyBkaWFnbm9zYWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmxlYXZlZCA9XG4gICAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgLSBleHBlY3RlZEZpcnN0U2xvdCArIDEgLSBjb21taXR0ZWRDb3VudDtcbiAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZCA+IDApIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnQmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCBhYm92ZSBzbmFwc2hvdCcsIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEZpcnN0U2xvdCxcbiAgICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90LFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZENvdW50LFxuICAgICAgICAgICAgICAgIGludGVybGVhdmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmFpbHVyZSA9IHNldHRsZWQuZmluZChcbiAgICAgICAgICAgIChvdXRjb21lKTogb3V0Y29tZSBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT5cbiAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdyZWplY3RlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLnJlYXNvbjtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyBFVkVSWSBjaHVuayBjYXJyeWluZyBwYWlycyBnYXRlcyB0aGUgcmV0dXJuLCBub3QganVzdCB0aGUgZmlyc3Q6XG4gICAgICAgIC8vIGEgcGFpciB3aG9zZSBjb21taXQgdGhlIGNhbGxlciBoYXMgbm90IHNlZW4geWllbGRzIG5vXG4gICAgICAgIC8vIGBpbmxpbmVDbGFpbXNgIGVudHJ5LCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBsYXp5XG4gICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgd291bGQgcmFjZSB0aGlzIHNhbWUgZm9sZCdzIHN0aWxsLWluLWZsaWdodFxuICAgICAgICAvLyBwYWlyIGZvciB0aGUgc2FtZSBzdGVwLiBUaGUgcGFpcnMgb2NjdXB5IHRoZWlyIG93biBsZWFkaW5nXG4gICAgICAgIC8vIGNodW5rKHMpLCBhbmQgdG9kYXkgdGhhdCBpcyBleGFjdGx5IE9ORSBjaHVuayAodHdvIHJvd3MgcGVyXG4gICAgICAgIC8vIGlubGluZSBzdGVwIGZpdCBpbnNpZGUgb25lIGNodW5rLCBwaW5uZWQgYnkgY29uc3RhbnRzLnRlc3QudHMpLFxuICAgICAgICAvLyBzbyB0aGlzIGlzIGF0IG1vc3Qgb25lIGNvbW1pdDsgdGhlIGZpbHRlciBpcyB3aGF0IGtlZXBzIHRoZVxuICAgICAgICAvLyBwcm9wZXJ0eSB0cnVlIGlmIGVpdGhlciBjYXAgbW92ZXMuXG4gICAgICAgIGNvbnN0IHBhaXJDb21taXRzID0gY2h1bmtzLmZsYXRNYXAoKGNodW5rLCBpbmRleCkgPT5cbiAgICAgICAgICBjaHVuay5zb21lKChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJylcbiAgICAgICAgICAgID8gW2NvbW1pdHNbaW5kZXhdXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICApO1xuICAgICAgICBpZiAoYWxsb3dEZWZlcnJlZEJhdGNoV29yaykge1xuICAgICAgICAgIC8vIFRoZSB0cmFpbGluZyB3b3JrIGlzIHRoZSBjYWxsZXIncyB0byBqb2luIGJlZm9yZSBhY2suIEF0dGFjaCBhXG4gICAgICAgICAgLy8gaGFuZGxlciBub3cgc28gYSByZWplY3Rpb24gdGhhdCByYWNlcyB0aGF0IGpvaW4gKG9yIGEgZm9yZWdyb3VuZFxuICAgICAgICAgIC8vIGZhaWx1cmUgdGhhdCBwcmV2ZW50cyB0aGUgY2FsbGVyIGZyb20gZXZlciByZWFjaGluZyBpdCkgaXMgbmV2ZXJcbiAgICAgICAgICAvLyBhbiB1bmhhbmRsZWRSZWplY3Rpb247IGF3YWl0aW5nIHRoZSBwcm9taXNlIHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgIHRyYWlsaW5nLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICBkZWZlcnJlZEJhdGNoV29yayA9IHRyYWlsaW5nO1xuICAgICAgICAgIC8vIE9ubHkgdGhlIHBhaXIgY2h1bmtzIGdhdGUgdGhlIHJldHVybjogdGhlaXIgY2xhaW1zIGFyZSB3aGF0IHRoZVxuICAgICAgICAgIC8vIGNhbGxlciBzdGFydHMgdGhlIGlubGluZSBib2RpZXMgZnJvbS4gV2l0aCBubyBwYWlycyB0aGVyZSBpc1xuICAgICAgICAgIC8vIG5vdGhpbmcgdGhlIGNhbGxlcidzIHBvc3QtcmV0dXJuIHdvcmsgcmVhZHMgZnJvbSB0aGUgY29tbWl0cyxcbiAgICAgICAgICAvLyBzbyBub3RoaW5nIGdhdGVzLlxuICAgICAgICAgIGlmIChwYWlyQ29tbWl0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwYWlyQ29tbWl0cyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gQSBwYWlyIGNodW5rIGZhaWxlZCwgc28gdGhpcyBwaGFzZSdzIHdyaXRlIHNldCBpcyBOT1QgdGhlXG4gICAgICAgICAgICAgIC8vIGNhbGxlcidzIHRvIGpvaW4gYW55IG1vcmU6IGBkZWZlcnJlZEJhdGNoV29ya2AgbmV2ZXJcbiAgICAgICAgICAgICAgLy8gcmVhY2hlcyBpdCBvbmNlIGhhbmRsZVN1c3BlbnNpb24gdGhyb3dzLiBTZXR0bGUgdGhlIHJlc3RcbiAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZWplY3Rpb24gZXNjYXBlcywgZm9yIHRoZSByZWFzb24gYHNldHRsZVBoYXNlYFxuICAgICAgICAgICAgICAvLyBnaXZlczogYSBzaWJsaW5nIGNyZWF0ZSBsYW5kaW5nIGFmdGVyIHRoZSB0aHJvdyBjb21taXRzIGFuXG4gICAgICAgICAgICAgIC8vIGV2ZW50IGZyb20gdGhlIGFiYW5kb25lZCByZXBsYXkncyBzZWVkZWQgc2VxdWVuY2UgYW5kIHJhY2VzXG4gICAgICAgICAgICAgIC8vIHRoZSBjYWxsZXIncyByZXN0YXJ0IHJlbG9hZCB3aGlsZSBkb2luZyBzby5cbiAgICAgICAgICAgICAgYXdhaXQgdHJhaWxpbmcuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYWlsaW5nO1xuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIGF0dHJpYnV0ZUl0ZW1zKSB7XG4gICAgb3BzLnB1c2goXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgICAgLy8gR3VhcmRlZCBsaWtlIGV2ZXJ5IG90aGVyIHN1c3BlbnNpb24gd3JpdGU6IGFuIGF0dHJfc2V0IGlzIGFcbiAgICAgICAgICAvLyByZXBsYXktZGVyaXZlZCBldmVudCB3aXRoIGEgY29ycmVsYXRpb24gaWQgZnJvbSB0aGlzIHJlcGxheSdzXG4gICAgICAgICAgLy8gc2VlZGVkIHNlcXVlbmNlLCBzbyBpdCBtdXN0IG5vdCBsYW5kIG9uIGEgbG9nIHRoZSByZXBsYXkgbmV2ZXJcbiAgICAgICAgICAvLyBzYXcuIFJlamVjdGluZyBpdCBpcyBjaGVhcDogYSBydW4gd2l0aCBhdHRyaWJ1dGUgZXZlbnRzIGFscmVhZHlcbiAgICAgICAgICAvLyBmb3JjZXMgYW4gaW4tcHJvY2VzcyByZXBsYXksIHNvIHRoZSByZXN0YXJ0IGNvc3RzIHRoZSByZXBsYXkgaXRcbiAgICAgICAgICAvLyB3YXMgZ29pbmcgdG8gZG8gYW55d2F5LlxuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgY2hhbmdlczogcXVldWVJdGVtLmNoYW5nZXMsXG4gICAgICAgICAgICAgICAgd3JpdGVyOiB7IHR5cGU6ICd3b3JrZmxvdycgfSxcbiAgICAgICAgICAgICAgICAuLi4ocXVldWVJdGVtLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1dvcmtmbG93IGF0dHJpYnV0ZSBldmVudCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmlzdGljIHZhbGlkYXRpb24gcmVqZWN0aW9uIGZyb20gdGhlIFdvcmxkLCBlLmcuIHRoZVxuICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBwZXItcnVuIGF0dHJpYnV0ZSBjYXAsIHdoaWNoIG9ubHkgdGhlIFdvcmxkIGNhblxuICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCB0aGUgcnVuJ3MgZXhpc3RpbmcgYXR0cmlidXRlcy4gUmVkZWxpdmVyaW5nIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmVwbGF5cyB0aGUgd29ya2Zsb3cgaW50byB0aGUgZXhhY3Qgc2FtZVxuICAgICAgICAgICAgLy8gd3JpdGUgYW5kIHRoZSBleGFjdCBzYW1lIHJlamVjdGlvbiwgc28gcmV0cnlpbmcgY2FuIG5ldmVyXG4gICAgICAgICAgICAvLyBzdWNjZWVkLiBTdXJmYWNlIGl0IGFzIGEgRmF0YWxFcnJvciBzbyB0aGUgY2FsbGVyIGZhaWxzIHRoZVxuICAgICAgICAgICAgLy8gcnVuIHdpdGggYSBjbGVhciBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgaXQgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgIGNvbnN0IGZhdGFsID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBzZXRBdHRyaWJ1dGVzIGZhaWxlZCBXb3JsZCB2YWxpZGF0aW9uOiAke1xuICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKVxuICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZhdGFsLmNhdXNlID0gZXJyO1xuICAgICAgICAgICAgdGhyb3cgZmF0YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKClcbiAgICApO1xuICB9XG5cbiAgLy8gQXdhaXQgdGhlIHN0ZXBfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCBldmVudCBjcmVhdGVzIGJlZm9yZSByZXR1cm5pbmcuXG4gIC8vIFRoZSBjYWxsZXIgKHdvcmtmbG93RW50cnlwb2ludCkgb25seSBlbnF1ZXVlcyB0aGUgc3RlcC1kaXNwYXRjaCBxdWV1ZVxuICAvLyBtZXNzYWdlcyBBRlRFUiBoYW5kbGVTdXNwZW5zaW9uIHJlc29sdmVzLCBhbmQgdGhlIHF1ZXVlIGhhbmRsZXIgYWNrc1xuICAvLyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugb25seSBhZnRlciB0aGUgY2FsbGVyIHJlc29sdmVzLiBTbyB0aGUgc3RlcF9jcmVhdGVkXG4gIC8vIGV2ZW50cyBtdXN0IGJlIGR1cmFibGUgaGVyZSwgYW5kIHRoZSBkaXNwYXRjaCBzZW5kcyBtdXN0IGNvbXBsZXRlIGluIHRoZSBjYWxsZXIsXG4gIC8vIGFsbCBiZWZvcmUgYWNrLiBJZiB0aGUgcHJvY2VzcyBjcmFzaGVzIGJlZm9yZSB0aGlzIHJlc29sdmVzLCB0aGUgb3JjaGVzdHJhdG9yXG4gIC8vIG1lc3NhZ2UgaXMgbm90IGFja2VkIGFuZCBWUVMgcmVkZWxpdmVycywgcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpXG4gIC8vIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcywgYW5kIHJlY292ZXJzIHRoZSBydW4gaW5zdGVhZCBvZiBvcnBoYW5pbmcgaXQuXG4gIGF3YWl0IHNldHRsZVBoYXNlKG9wcyk7XG5cbiAgLy8gUmVidWlsZCB0aGUgaW5saW5lIGJhdGNoIGluIGRldGVybWluaXN0aWMgb3JkZXIuIGBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHNgXG4gIC8vIGlzIGEgU2V0IHNlZWRlZCBmcm9tIHRoZSBvcmRlcmVkIGZpcnN0LU4gc2xpY2UsIHNvIGl0ZXJhdGluZyBpdCBwcmVzZXJ2ZXNcbiAgLy8gc3RlcEl0ZW1zIG9yZGVyOyBldmVyeSBpZCBpbiBpdCB3YXMgc2V0IGJ5IHRoZSBsYXp5IGJyYW5jaCBhYm92ZS5cbiAgY29uc3QgbGF6eUlubGluZVN0ZXBzOiBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdFsnbGF6eUlubGluZVN0ZXBzJ10gPSBbXTtcbiAgZm9yIChjb25zdCBjb3JyZWxhdGlvbklkIG9mIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcykge1xuICAgIGNvbnN0IGxhenlTdGVwID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgaWYgKGxhenlTdGVwKSBsYXp5SW5saW5lU3RlcHMucHVzaChsYXp5U3RlcCk7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCAobWluaW11bSB0aW1lb3V0KVxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBsZXQgc29vbmVzdFdhaXQ6IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgY29uc3QgcmVzdW1lQXRNcyA9IHF1ZXVlSXRlbS5yZXN1bWVBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgZGVsYXlNcyA9IE1hdGgubWF4KDEwMDAsIHJlc3VtZUF0TXMgLSBub3cpO1xuICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5jZWlsKGRlbGF5TXMgLyAxMDAwKTtcbiAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHRpbWVvdXRTZWNvbmRzIDwgc29vbmVzdFdhaXQuc2Vjb25kcykge1xuICAgICAgc29vbmVzdFdhaXQgPSB7XG4gICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCd3b3JrZmxvd19zdXNwZW5kZWQnKSxcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGVwc0NyZWF0ZWQoc3RlcEl0ZW1zLmxlbmd0aCksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93SG9va3NDcmVhdGVkKGhvb2tzTmVlZGluZ0NyZWF0aW9uLmxlbmd0aCksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93V2FpdHNDcmVhdGVkKHdhaXRJdGVtcy5sZW5ndGgpLFxuICAgIC4uLihmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDBcbiAgICAgID8gQXR0cmlidXRlLldvcmtmbG93U3RlcHNGYWlsZWRTZXJpYWxpemF0aW9uKFxuICAgICAgICAgIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcy5zaXplXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICAgIC4uLihyZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCA+IDBcbiAgICAgID8gQXR0cmlidXRlLlN0ZXBSZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZChyZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZClcbiAgICAgIDoge30pLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHBlbmRpbmdTdGVwczogc3RlcEl0ZW1zLFxuICAgIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcyxcbiAgICBsYXp5SW5saW5lU3RlcHMsXG4gICAgaW5saW5lQ2xhaW1zLFxuICAgIGRlZmVycmVkQmF0Y2hXb3JrLFxuICAgIC8vIE9uIGhvb2sgY29uZmxpY3QgdGhlIGNhbGxlciBhZHZhbmNlcyB0aGUgd29ya2Zsb3cgb3ZlciB0aGUgY29uZmxpY3RcbiAgICAvLyBiZWZvcmUgc2NoZWR1bGluZyBhbnl0aGluZyBhbmQgbmV2ZXIgcmVhZHMgdGhlIHdhaXQgdGltZW91dCwgc28gZG9uJ3RcbiAgICAvLyByZXBvcnQgb25lLiBUaGUgbmV4dCBwYXNzLCB3aGljaCBzZWVzIHRoZSBjb25mbGljdCBzZXR0bGVkLCByZXBvcnRzIGl0LlxuICAgIHdhaXRUaW1lb3V0OlxuICAgICAgaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMubGVuZ3RoID4gMCA/IHVuZGVmaW5lZCA6IHNvb25lc3RXYWl0LFxuICAgIGhhc0hvb2tDb25mbGljdDogaG9va0NvbmZsaWN0Q29ycmVsYXRpb25JZHMubGVuZ3RoID4gMCxcbiAgICBob29rQ29uZmxpY3RDb3JyZWxhdGlvbklkcyxcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBhd2FpdGVkSG9va0NvcnJlbGF0aW9uSWRzLmxlbmd0aCA+IDAsXG4gICAgYXdhaXRlZEhvb2tDb3JyZWxhdGlvbklkcyxcbiAgICAvLyBUaGUgZGVsdGEgYWNjb3VudHMgZm9yIHRoZSB3aG9sZSBsb2cgb25seSBpZiB0aGUgd3JpdGUgdGhhdCByZXR1cm5lZCBpdFxuICAgIC8vIHdhcyB0aGlzIHN1c3BlbnNpb24ncyBvbmx5IG9uZSDigJQgYW55dGhpbmcgd3JpdHRlbiBhZnRlciBpdCBsYW5kZWQgYWJvdmVcbiAgICAvLyB0aGUgZGVsdGEgYW5kIGlzIG1pc3NpbmcgZnJvbSB0aGUgY2FsbGVyJ3MgbG9nLlxuICAgIGV2ZW50TG9nQ2FycmllZEZvcndhcmQ6IGRlbHRhQWJzb3JiZWQgJiYgZ3VhcmRlZFdyaXRlcyA9PT0gMSxcbiAgICBoYXNBdHRyaWJ1dGVFdmVudHM6IGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA+IDAsXG4gICAgaGFzSG9va0V2ZW50czogaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoID4gMCxcbiAgICBob29rQ3JlYXRpb25NcyxcbiAgICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50LFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VycyxcbiAgICByZXBvcnRlZEV2ZW50Q291bnQ6IHJlcG9ydGVkRXZlbnRzLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gYGV2ZW50cy5jcmVhdGVgIHJlamVjdGlvbiBpcyBkZXRlcm1pbmlzdGljIFdvcmxkIHZhbGlkYXRpb25cbiAqIHJhdGhlciB0aGFuIGEgdHJhbnNpZW50L3N0b3JhZ2UgZXJyb3IuIExvY2FsIFdvcmxkc1xuICogKHdvcmxkLWxvY2FsLCB3b3JsZC1wb3N0Z3JlcykgdGhyb3cgYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgZGlyZWN0bHk7XG4gKiByZW1vdGUgV29ybGRzIHN1cmZhY2UgdGhlIGVxdWl2YWxlbnQgc2VydmVyLXNpZGUgcmVqZWN0aW9uIGFzIGFcbiAqIGBXb3JrZmxvd1dvcmxkRXJyb3JgIHdpdGggSFRUUCBzdGF0dXMgNDAwLiBUaGUgbmFtZSBjaGVjayBjb3ZlcnNcbiAqIGBBdHRyaWJ1dGVWYWxpZGF0aW9uRXJyb3JgIGluc3RhbmNlcyBmcm9tIGEgZGlmZmVyZW50IGNvcHkgb2ZcbiAqIGBAd29ya2Zsb3cvd29ybGRgIHRoYW4gdGhlIG9uZSB0aGlzIHBhY2thZ2UgcmVzb2x2ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcikgcmV0dXJuIHRydWU7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0F0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikgJiYgZXJyLnN0YXR1cyA9PT0gNDAwO1xufVxuIl19
|